From 5cdb420ac98dfa2fb51c09ae47c66308271c8d42 Mon Sep 17 00:00:00 2001 From: cvs2svn Date: Wed, 16 Jun 2010 13:10:00 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create tag 'glite-lb- common_R_7_1_2_1'. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Sprout from branch_2_1 2010-06-16 13:09:59 UTC Zdeněk Šustr 'Modified to reflect version 7.1.2-1' Delete: org.glite.jobid.api-c/Makefile org.glite.jobid.api-c/configure org.glite.jobid.api-c/interface/cjobid.h org.glite.jobid.api-c/interface/strmd5.h org.glite.jobid.api-c/project/ChangeLog org.glite.jobid.api-c/project/package.description org.glite.jobid.api-c/project/package.summary org.glite.jobid.api-c/project/version.properties org.glite.jobid.api-c/src/cjobid.c org.glite.jobid.api-c/src/md32_common.h org.glite.jobid.api-c/src/md5.h org.glite.jobid.api-c/src/md5_dgst.c org.glite.jobid.api-c/src/md5_locl.h org.glite.jobid.api-c/src/strmd5.c org.glite.jobid.api-c/test/base64_test.cpp org.glite.jobid.api-cpp/Makefile org.glite.jobid.api-cpp/configure org.glite.jobid.api-cpp/interface/JobId.h org.glite.jobid.api-cpp/project/ChangeLog org.glite.jobid.api-cpp/project/package.description org.glite.jobid.api-cpp/project/package.summary org.glite.jobid.api-cpp/project/version.properties org.glite.jobid.api-java/Makefile org.glite.jobid.api-java/build.xml org.glite.jobid.api-java/configure org.glite.jobid.api-java/nbproject/build-impl.xml org.glite.jobid.api-java/nbproject/genfiles.properties org.glite.jobid.api-java/nbproject/private/config.properties org.glite.jobid.api-java/nbproject/private/private.properties org.glite.jobid.api-java/nbproject/private/private.xml org.glite.jobid.api-java/nbproject/project.properties org.glite.jobid.api-java/nbproject/project.xml org.glite.jobid.api-java/project/ChangeLog org.glite.jobid.api-java/project/package.description org.glite.jobid.api-java/project/package.summary org.glite.jobid.api-java/project/version.properties org.glite.jobid.api-java/src/org/glite/jobid/ExampleJobid.java org.glite.jobid.api-java/src/org/glite/jobid/Jobid.java org.glite.jobid/project/version.properties org.glite.lb.client-java/Makefile org.glite.lb.client-java/configure org.glite.lb.client-java/examples/CreamTest.java org.glite.lb.client-java/examples/NotificationExample.java org.glite.lb.client-java/examples/ProducerTestIL.java org.glite.lb.client-java/examples/ProducerTestLL.java org.glite.lb.client-java/examples/QueryDemo.java org.glite.lb.client-java/examples/SSLClient.java org.glite.lb.client-java/examples/SSLServer.java org.glite.lb.client-java/examples/SimpleLLTest.java org.glite.lb.client-java/project/ChangeLog org.glite.lb.client-java/project/genEventTypes.pl org.glite.lb.client-java/project/package.description org.glite.lb.client-java/project/package.summary org.glite.lb.client-java/project/version.properties org.glite.lb.client-java/src/org/glite/lb/Context.java org.glite.lb.client-java/src/org/glite/lb/ContextDirect.java org.glite.lb.client-java/src/org/glite/lb/ContextIL.java org.glite.lb.client-java/src/org/glite/lb/ContextLL.java org.glite.lb.client-java/src/org/glite/lb/Escape.java org.glite.lb.client-java/src/org/glite/lb/Event.java org.glite.lb.client-java/src/org/glite/lb/EventConvertor.java org.glite.lb.client-java/src/org/glite/lb/ILFileWriter.java org.glite.lb.client-java/src/org/glite/lb/ILProto.java org.glite.lb.client-java/src/org/glite/lb/Job.java org.glite.lb.client-java/src/org/glite/lb/LBCredentials.java org.glite.lb.client-java/src/org/glite/lb/LBException.java org.glite.lb.client-java/src/org/glite/lb/Level.java org.glite.lb.client-java/src/org/glite/lb/NotifParser.java org.glite.lb.client-java/src/org/glite/lb/Notification.java org.glite.lb.client-java/src/org/glite/lb/SSL.java org.glite.lb.client-java/src/org/glite/lb/SSLSend.java org.glite.lb.client-java/src/org/glite/lb/SeqCode.java org.glite.lb.client-java/src/org/glite/lb/ServerConnection.java org.glite.lb.client-java/src/org/glite/lb/Sources.java org.glite.lb.client-java/src/org/glite/lb/Timeval.java org.glite.lb.client-java/src_c/Makefile org.glite.lb.client-java/src_c/send_via_proxy.c org.glite.lb.client-java/src_c/send_via_socket.c org.glite.lb.client/.cvsignore org.glite.lb.client/LICENSE org.glite.lb.client/Makefile org.glite.lb.client/build.xml org.glite.lb.client/configure org.glite.lb.client/doc/README-notify org.glite.lb.client/doc/glite-lb-dump.8 org.glite.lb.client/doc/glite-lb-load.8 org.glite.lb.client/doc/glite-lb-logevent.1 org.glite.lb.client/doc/glite-lb-notify.1 org.glite.lb.client/examples/Makefile org.glite.lb.client/examples/README.examples org.glite.lb.client/examples/abort_job.c org.glite.lb.client/examples/aborted.l org.glite.lb.client/examples/aborted_ft.l org.glite.lb.client/examples/cancelled.l org.glite.lb.client/examples/change_acl.c org.glite.lb.client/examples/chkpt.l org.glite.lb.client/examples/cleared.l org.glite.lb.client/examples/cream_done.l org.glite.lb.client/examples/cream_failed.l org.glite.lb.client/examples/cream_idle.l org.glite.lb.client/examples/cream_pending.l org.glite.lb.client/examples/cream_reallyrunning.l org.glite.lb.client/examples/cream_registered.l org.glite.lb.client/examples/cream_running.l org.glite.lb.client/examples/dagids.c org.glite.lb.client/examples/done.l org.glite.lb.client/examples/done_dag.l org.glite.lb.client/examples/done_failed_events.c org.glite.lb.client/examples/done_ft.l org.glite.lb.client/examples/done_subjob.l org.glite.lb.client/examples/failed_dag.l org.glite.lb.client/examples/failed_subjob.l org.glite.lb.client/examples/feed_shark.c org.glite.lb.client/examples/flood_proxy.c org.glite.lb.client/examples/gen_begin org.glite.lb.client/examples/gen_sample_job org.glite.lb.client/examples/job-status.pl org.glite.lb.client/examples/job_log.c org.glite.lb.client/examples/job_reg.c org.glite.lb.client/examples/job_status.c org.glite.lb.client/examples/log_usertag_proxy.c org.glite.lb.client/examples/multiple_user_jobs.c org.glite.lb.client/examples/notify.pl org.glite.lb.client/examples/parse_eventsfile.c org.glite.lb.client/examples/purge_test org.glite.lb.client/examples/query_ext.c org.glite.lb.client/examples/query_seq_code.c org.glite.lb.client/examples/ready.l org.glite.lb.client/examples/ready_dag.l org.glite.lb.client/examples/ready_subjob.l org.glite.lb.client/examples/resubmission.l org.glite.lb.client/examples/resubmitted.l org.glite.lb.client/examples/running.l org.glite.lb.client/examples/running_dag.l org.glite.lb.client/examples/running_ft.l org.glite.lb.client/examples/running_subjob.l org.glite.lb.client/examples/sandbox_transfers.sh org.glite.lb.client/examples/scheduled.l org.glite.lb.client/examples/scheduled_dag.l org.glite.lb.client/examples/scheduled_subjob.l org.glite.lb.client/examples/shallow_and_full_resub.l org.glite.lb.client/examples/shallow_resub_complex.l org.glite.lb.client/examples/shallow_resub_simple.l org.glite.lb.client/examples/shallow_resub_simple2.l org.glite.lb.client/examples/stats.c org.glite.lb.client/examples/stress_context.c org.glite.lb.client/examples/stresslog.c org.glite.lb.client/examples/submitted.l org.glite.lb.client/examples/submitted_dag.l org.glite.lb.client/examples/submitted_ft_reg.l org.glite.lb.client/examples/submitted_subjob.l org.glite.lb.client/examples/test_changed_jdl.c org.glite.lb.client/examples/test_notif_rotate.pl org.glite.lb.client/examples/ulmfields.pl org.glite.lb.client/examples/user-jobs.pl org.glite.lb.client/examples/user_jobs.c org.glite.lb.client/examples/user_jobs_threaded.c org.glite.lb.client/examples/waiting.l org.glite.lb.client/examples/waiting_dag.l org.glite.lb.client/examples/waiting_subjob.l org.glite.lb.client/examples/webservices/java-trustmanager/Makefile org.glite.lb.client/examples/webservices/java-trustmanager/README org.glite.lb.client/examples/webservices/java-trustmanager/src/LBClientTM.java org.glite.lb.client/examples/webservices/java/Makefile org.glite.lb.client/examples/webservices/java/README org.glite.lb.client/examples/webservices/java/src/ExampleSSLSocketFactory.java org.glite.lb.client/examples/webservices/java/src/LBClientExample.java org.glite.lb.client/examples/webservices/java/src/MyX509KeyManager.java org.glite.lb.client/examples/webservices/java/src/MyX509TrustManager.java org.glite.lb.client/examples/webservices/java/src/log4j.properties org.glite.lb.client/interface/Event.h.T org.glite.lb.client/interface/Job.h org.glite.lb.client/interface/JobStatus.h.T org.glite.lb.client/interface/Notification.h org.glite.lb.client/interface/ServerConnection.h org.glite.lb.client/interface/connection.h org.glite.lb.client/interface/consumer.h org.glite.lb.client/interface/notification.h org.glite.lb.client/interface/prod_proto.h org.glite.lb.client/interface/producer.h.T org.glite.lb.client/interface/stat_fields.h org.glite.lb.client/interface/statistics.h org.glite.lb.client/m4/glite_lb.m4 org.glite.lb.client/project/.cvsignore org.glite.lb.client/project/ChangeLog org.glite.lb.client/project/build.number org.glite.lb.client/project/build.properties org.glite.lb.client/project/configure.properties.xml org.glite.lb.client/project/package.description org.glite.lb.client/project/package.summary org.glite.lb.client/project/properties.xml org.glite.lb.client/project/tar_exclude org.glite.lb.client/project/version.properties org.glite.lb.client/src/Event.cpp.T org.glite.lb.client/src/EventAttrNames.pl org.glite.lb.client/src/Job.cpp org.glite.lb.client/src/JobStatus.cpp.T org.glite.lb.client/src/Notification.cpp org.glite.lb.client/src/ServerConnection.cpp org.glite.lb.client/src/StatusAttrNames.pl org.glite.lb.client/src/args.c.T org.glite.lb.client/src/args.h org.glite.lb.client/src/connection.c org.glite.lb.client/src/consumer.c org.glite.lb.client/src/export.sh org.glite.lb.client/src/logevent.c.T org.glite.lb.client/src/notification.c org.glite.lb.client/src/notify.c org.glite.lb.client/src/perftest_jobreg.c org.glite.lb.client/src/perftest_jobreg.sh org.glite.lb.client/src/perftest_logjobs.c org.glite.lb.client/src/perftest_query.sh org.glite.lb.client/src/prod_proto.c org.glite.lb.client/src/producer.c org.glite.lb.client/src/register_sandbox.c org.glite.lb.client/src/stat_fields.cpp org.glite.lb.client/src/statistics.c org.glite.lb.client/src/uiwrap.T org.glite.lb.client/src/uiwrap.c.T org.glite.lb.client/test/PLOT org.glite.lb.client/test/TEST org.glite.lb.client/test/prod_proto_test.c org.glite.lb.client/test/producer_test.cpp org.glite.lb.doc/GGUS19469-reply.txt org.glite.lb.doc/LICENSE org.glite.lb.doc/Makefile org.glite.lb.doc/configure org.glite.lb.doc/examples/Makefile org.glite.lb.doc/examples/README org.glite.lb.doc/examples/README.queries org.glite.lb.doc/examples/cons_example1.c org.glite.lb.doc/examples/cons_example1.cpp org.glite.lb.doc/examples/cons_example2.c org.glite.lb.doc/examples/cons_example2.cpp org.glite.lb.doc/examples/cons_example3.c org.glite.lb.doc/examples/cons_example3.cpp org.glite.lb.doc/examples/example1.c org.glite.lb.doc/examples/notif_example.c org.glite.lb.doc/examples/prod_example1.c org.glite.lb.doc/examples/util.C org.glite.lb.doc/examples/util.c org.glite.lb.doc/project/ChangeLog org.glite.lb.doc/project/package.description org.glite.lb.doc/project/package.summary org.glite.lb.doc/project/version.properties org.glite.lb.doc/src/LBAG-Abstract.tex org.glite.lb.doc/src/LBAG-Installation.tex org.glite.lb.doc/src/LBAG-Introduction.tex org.glite.lb.doc/src/LBAG-Running.tex org.glite.lb.doc/src/LBAG-Troubleshooting.tex org.glite.lb.doc/src/LBAG.tex org.glite.lb.doc/src/LBDG-Abstract.tex org.glite.lb.doc/src/LBDG-Introduction.tex org.glite.lb.doc/src/LBDG.tex org.glite.lb.doc/src/LBTP-Abstract.tex org.glite.lb.doc/src/LBTP-IntegrationTests.tex org.glite.lb.doc/src/LBTP-InterTests.tex org.glite.lb.doc/src/LBTP-Introduction.tex org.glite.lb.doc/src/LBTP-PerfTests.tex org.glite.lb.doc/src/LBTP-Tests.tex org.glite.lb.doc/src/LBTP.tex org.glite.lb.doc/src/LBUG-Abstract.tex org.glite.lb.doc/src/LBUG-Appendix.tex org.glite.lb.doc/src/LBUG-Introduction.tex org.glite.lb.doc/src/LBUG-Tools.tex org.glite.lb.doc/src/LBUG-Troubleshooting.tex org.glite.lb.doc/src/LBUG.tex org.glite.lb.doc/src/README org.glite.lb.doc/src/README-standards.txt org.glite.lb.doc/src/change_acl.tex org.glite.lb.doc/src/components.tex org.glite.lb.doc/src/consumer_api.tex org.glite.lb.doc/src/copyright.tex org.glite.lb.doc/src/definitions.tex org.glite.lb.doc/src/doxygen.sty org.glite.lb.doc/src/doxyhack.tex org.glite.lb.doc/src/egee.cls org.glite.lb.doc/src/events.tex.T org.glite.lb.doc/src/frontmatter.tex org.glite.lb.doc/src/images/LB-components-LB-WMS.pdf org.glite.lb.doc/src/images/LB-components-gather.pdf org.glite.lb.doc/src/images/LB-components-query.pdf org.glite.lb.doc/src/images/LB-components.pdf org.glite.lb.doc/src/images/cesnet.pdf org.glite.lb.doc/src/images/egee.pdf org.glite.lb.doc/src/images/glite.pdf org.glite.lb.doc/src/images/isi.pdf org.glite.lb.doc/src/images/seqtree.pdf org.glite.lb.doc/src/images/wms2-jobstat.pdf org.glite.lb.doc/src/lbjp.bib org.glite.lb.doc/src/listings.sty org.glite.lb.doc/src/log_usertag.tex org.glite.lb.doc/src/logevent.tex org.glite.lb.doc/src/lstdoc.sty org.glite.lb.doc/src/lstlang1.sty org.glite.lb.doc/src/lstlang2.sty org.glite.lb.doc/src/lstlang3.sty org.glite.lb.doc/src/lstmisc.sty org.glite.lb.doc/src/lstpatch.sty org.glite.lb.doc/src/notification_api.tex org.glite.lb.doc/src/notify.tex org.glite.lb.doc/src/producer_api.tex org.glite.lb.doc/src/status.tex.T org.glite.lb.doc/src/versions.tex org.glite.lb.doc/src/web_services.tex org.glite.lb.glite-LB/Makefile org.glite.lb.glite-LB/configure org.glite.lb.glite-LB/project/ChangeLog org.glite.lb.glite-LB/project/package.description org.glite.lb.glite-LB/project/package.summary org.glite.lb.glite-LB/project/version.properties org.glite.lb.harvester/Makefile org.glite.lb.harvester/configure org.glite.lb.harvester/doc/INSTALL org.glite.lb.harvester/doc/README org.glite.lb.harvester/doc/glite-lb-harvester.sgml org.glite.lb.harvester/examples/test.sh org.glite.lb.harvester/examples/test.sql org.glite.lb.harvester/project/ChangeLog org.glite.lb.harvester/project/package.description org.glite.lb.harvester/project/package.summary org.glite.lb.harvester/project/version.properties org.glite.lb.harvester/src/harvester.c org.glite.lb.logger/.cvsignore org.glite.lb.logger/LICENSE org.glite.lb.logger/Makefile org.glite.lb.logger/build.xml org.glite.lb.logger/config/glite-lb-logger.config.xml org.glite.lb.logger/config/glite-lb-logger.default-properties org.glite.lb.logger/config/startup org.glite.lb.logger/configure org.glite.lb.logger/doc/glite-lb-interlogd.8 org.glite.lb.logger/doc/glite-lb-logd.8 org.glite.lb.logger/project/ChangeLog org.glite.lb.logger/project/build.number org.glite.lb.logger/project/build.properties org.glite.lb.logger/project/configure.properties.xml org.glite.lb.logger/project/package.description org.glite.lb.logger/project/package.summary org.glite.lb.logger/project/properties.xml org.glite.lb.logger/project/tar_exclude org.glite.lb.logger/project/version.properties org.glite.lb.logger/src-nt/Connection.H org.glite.lb.logger/src-nt/Connection.cpp org.glite.lb.logger/src-nt/EventManager.H org.glite.lb.logger/src-nt/EventManager.cpp org.glite.lb.logger/src-nt/Exception.H org.glite.lb.logger/src-nt/HTTPTransport.H org.glite.lb.logger/src-nt/HTTPTransport.cpp org.glite.lb.logger/src-nt/InputChannel.H org.glite.lb.logger/src-nt/InputChannel.cpp org.glite.lb.logger/src-nt/Makefile org.glite.lb.logger/src-nt/Message.H org.glite.lb.logger/src-nt/MessageStore.H org.glite.lb.logger/src-nt/MessageStore.cpp org.glite.lb.logger/src-nt/PlainConnection.H org.glite.lb.logger/src-nt/PlainConnection.cpp org.glite.lb.logger/src-nt/PluginManager.H org.glite.lb.logger/src-nt/PluginManager.cpp org.glite.lb.logger/src-nt/Properties.H org.glite.lb.logger/src-nt/Singleton.H org.glite.lb.logger/src-nt/SocketInput.H org.glite.lb.logger/src-nt/SocketInput.cpp org.glite.lb.logger/src-nt/ThreadPool.H org.glite.lb.logger/src-nt/ThreadPool.cpp org.glite.lb.logger/src-nt/Transport.H org.glite.lb.logger/src-nt/Transport.cpp org.glite.lb.logger/src-nt/main.cpp org.glite.lb.logger/src-nt/test/EventManagerTest.cpp org.glite.lb.logger/src-nt/test/PluginManagerTest.cpp org.glite.lb.logger/src-nt/test/SingletonTest.cpp org.glite.lb.logger/src-nt/test/ThreadPoolTest.cpp org.glite.lb.logger/src-nt/test/test_main.cpp org.glite.lb.logger/src/activemq_cpp_plugin.cpp org.glite.lb.logger/src/event_queue.c org.glite.lb.logger/src/event_store.c org.glite.lb.logger/src/event_store_http.c org.glite.lb.logger/src/http.c org.glite.lb.logger/src/il_error.c org.glite.lb.logger/src/il_error.h org.glite.lb.logger/src/il_master.c org.glite.lb.logger/src/input_queue_socket.c org.glite.lb.logger/src/input_queue_socket_http.c org.glite.lb.logger/src/interlogd.c org.glite.lb.logger/src/interlogd.h org.glite.lb.logger/src/logd.c org.glite.lb.logger/src/logd_proto.c org.glite.lb.logger/src/logd_proto.h org.glite.lb.logger/src/perftest_il.sh org.glite.lb.logger/src/perftest_ll.sh org.glite.lb.logger/src/plugin_mgr.c org.glite.lb.logger/src/queue_mgr.c org.glite.lb.logger/src/queue_mgr_http.c org.glite.lb.logger/src/queue_thread.c org.glite.lb.logger/src/recover.c org.glite.lb.logger/src/send_event.c org.glite.lb.logger/src/send_event_http.c org.glite.lb.logger/src/server_msg.c org.glite.lb.logger/src/server_msg_http.c org.glite.lb.logger/test/IlTestBase.cpp org.glite.lb.logger/test/IlTestBase.h org.glite.lb.logger/test/event_queueTest.cpp org.glite.lb.logger/test/event_storeTest.cpp org.glite.lb.logger/test/il_test.cpp org.glite.lb.logger/test/input_queue_socketTest.cpp org.glite.lb.logger/test/ll_test.cpp org.glite.lb.logger/test/logd_proto_test.c org.glite.lb.logger/test/server_msgTest.cpp org.glite.lb.server/.cvsignore org.glite.lb.server/LICENSE org.glite.lb.server/Makefile org.glite.lb.server/config/glite-lb-dbsetup.sql org.glite.lb.server/config/glite-lb-index.conf.template org.glite.lb.server/config/glite-lb-migrate_db2version20 org.glite.lb.server/config/startup org.glite.lb.server/configure org.glite.lb.server/doc/glite-lb-bkindex.8 org.glite.lb.server/doc/glite-lb-bkserverd.8 org.glite.lb.server/doc/glite-lb-mon-db.1 org.glite.lb.server/interface/index.h org.glite.lb.server/interface/lb_authz.h org.glite.lb.server/interface/pretty_print_wrapper.h org.glite.lb.server/interface/query.h org.glite.lb.server/interface/srv_perf.h org.glite.lb.server/interface/store.h org.glite.lb.server/project/.cvsignore org.glite.lb.server/project/ChangeLog org.glite.lb.server/project/build.number org.glite.lb.server/project/build.properties org.glite.lb.server/project/package.description org.glite.lb.server/project/package.summary org.glite.lb.server/project/tar_exclude org.glite.lb.server/project/version.properties org.glite.lb.server/src/authz_policy.c org.glite.lb.server/src/authz_policy.h org.glite.lb.server/src/bkindex.c org.glite.lb.server/src/bkserverd.c org.glite.lb.server/src/cond_dump.c org.glite.lb.server/src/cond_dump.h org.glite.lb.server/src/db_calls.c org.glite.lb.server/src/db_calls.h org.glite.lb.server/src/db_store.c org.glite.lb.server/src/db_supp.c org.glite.lb.server/src/db_supp.h org.glite.lb.server/src/dump.c org.glite.lb.server/src/get_events.c.T org.glite.lb.server/src/get_events.h org.glite.lb.server/src/il_lbproxy.c org.glite.lb.server/src/il_lbproxy.h org.glite.lb.server/src/il_notification.c org.glite.lb.server/src/il_notification.h org.glite.lb.server/src/index.c.T org.glite.lb.server/src/index_lex.l org.glite.lb.server/src/index_parse.y org.glite.lb.server/src/jobstat.c org.glite.lb.server/src/jobstat.h org.glite.lb.server/src/jobstat_supp.c org.glite.lb.server/src/lb_authz.c org.glite.lb.server/src/lb_html.c org.glite.lb.server/src/lb_html.h org.glite.lb.server/src/lb_http.c org.glite.lb.server/src/lb_http.h org.glite.lb.server/src/lb_proto.c org.glite.lb.server/src/lb_proto.h org.glite.lb.server/src/lb_rss.c org.glite.lb.server/src/lb_rss.h org.glite.lb.server/src/lb_text.c org.glite.lb.server/src/lb_text.h org.glite.lb.server/src/lb_xml_parse.c.T org.glite.lb.server/src/lb_xml_parse.h org.glite.lb.server/src/lb_xml_parse_V21.c.T org.glite.lb.server/src/lb_xml_parse_V21.h org.glite.lb.server/src/lcas_lb.c org.glite.lb.server/src/load.c org.glite.lb.server/src/mon-db.c org.glite.lb.server/src/notif_match.c org.glite.lb.server/src/notification.c org.glite.lb.server/src/openserver.c org.glite.lb.server/src/openserver.h org.glite.lb.server/src/perftest_proxy.sh org.glite.lb.server/src/policy_gram.y org.glite.lb.server/src/policy_lex.l org.glite.lb.server/src/pretty_print_wrapper.cpp org.glite.lb.server/src/purge.h org.glite.lb.server/src/query.c org.glite.lb.server/src/request.c org.glite.lb.server/src/seqcode.c org.glite.lb.server/src/server_notification.h org.glite.lb.server/src/server_state.c org.glite.lb.server/src/server_state.h org.glite.lb.server/src/srv_purge.c org.glite.lb.server/src/stats.c org.glite.lb.server/src/stats.h org.glite.lb.server/src/store.c.T org.glite.lb.server/src/stored_master.c org.glite.lb.server/src/userjobs.c org.glite.lb.server/src/write2rgma.c org.glite.lb.server/src/ws_fault.c org.glite.lb.server/src/ws_fault.h org.glite.lb.server/src/ws_lb4agu.c org.glite.lb.server/src/ws_query.c org.glite.lb.server/src/ws_typemap.dat org.glite.lb.server/src/ws_typemap.h org.glite.lb.server/src/ws_typeref.c.T org.glite.lb.server/src/ws_typeref.h org.glite.lb.server/test/oneJob.qry org.glite.lb.server/test/test_query_events.cpp org.glite.lb.server/test/test_soap_conv.cpp org.glite.lb.server/test/test_trans.sh org.glite.lb.server/test/test_xml.cpp.T org.glite.lb.state-machine/LICENSE org.glite.lb.state-machine/Makefile org.glite.lb.state-machine/configure org.glite.lb.state-machine/interface/intjobstat.h org.glite.lb.state-machine/interface/lb-job-attrs.xsd org.glite.lb.state-machine/interface/lb-job-attrs2.xsd.T org.glite.lb.state-machine/interface/lb-job-record.xsd org.glite.lb.state-machine/interface/process_event.h org.glite.lb.state-machine/interface/seqcode_aux.h org.glite.lb.state-machine/project/ChangeLog org.glite.lb.state-machine/project/package.description org.glite.lb.state-machine/project/package.summary org.glite.lb.state-machine/project/version.properties org.glite.lb.state-machine/src/job_attrs.xsl org.glite.lb.state-machine/src/job_attrs2.xsl org.glite.lb.state-machine/src/jpis_config.xsl org.glite.lb.state-machine/src/lb_plugin.c org.glite.lb.state-machine/src/process_event.c org.glite.lb.state-machine/src/process_event_condor.c org.glite.lb.state-machine/src/process_event_cream.c org.glite.lb.state-machine/src/process_event_file_transfer.c org.glite.lb.state-machine/src/process_event_file_transfer_collection.c org.glite.lb.state-machine/src/process_event_pbs.c org.glite.lb.state-machine/src/seqcode_aux.c org.glite.lb.types/Makefile org.glite.lb.types/MultiStruct.pm org.glite.lb.types/StructField.pm org.glite.lb.types/at3.in org.glite.lb.types/check_version.pl org.glite.lb.types/configure org.glite.lb.types/events.T org.glite.lb.types/project/ChangeLog org.glite.lb.types/project/package.description org.glite.lb.types/project/package.summary org.glite.lb.types/project/version.properties org.glite.lb.types/status.T org.glite.lb.types/types.T org.glite.lb.utils/.cvsignore org.glite.lb.utils/LICENSE org.glite.lb.utils/Makefile org.glite.lb.utils/build.xml org.glite.lb.utils/configure org.glite.lb.utils/doc/README.LB-monitoring org.glite.lb.utils/doc/README.LB-statistics org.glite.lb.utils/doc/glite-lb-mon.1 org.glite.lb.utils/doc/glite-lb-purge.8 org.glite.lb.utils/examples/glite-lb-index.conf org.glite.lb.utils/examples/glite-lb-statistics-gsi.sh org.glite.lb.utils/examples/glite-lb-statistics-rsync.sh org.glite.lb.utils/examples/glite-lb-statistics-sftp.sh org.glite.lb.utils/examples/glite-lb-statistics.sh org.glite.lb.utils/project/ChangeLog org.glite.lb.utils/project/build.number org.glite.lb.utils/project/build.properties org.glite.lb.utils/project/configure.properties.xml org.glite.lb.utils/project/package.description org.glite.lb.utils/project/package.summary org.glite.lb.utils/project/properties.xml org.glite.lb.utils/project/tar_exclude org.glite.lb.utils/project/version.properties org.glite.lb.utils/src/dump.c org.glite.lb.utils/src/dump_exporter.c org.glite.lb.utils/src/glite-lb-bkpurge-offline.sh org.glite.lb.utils/src/load.c org.glite.lb.utils/src/mon.c org.glite.lb.utils/src/notif-keeper.sh org.glite.lb.utils/src/process_attrs.c org.glite.lb.utils/src/process_attrs2.c.T org.glite.lb.utils/src/purge.c org.glite.lb.utils/src/state_history.c org.glite.lb.utils/src/statistics.c org.glite.lb.ws-interface/.Makefile.swp org.glite.lb.ws-interface/.cvsignore org.glite.lb.ws-interface/LICENSE org.glite.lb.ws-interface/Makefile org.glite.lb.ws-interface/build.xml org.glite.lb.ws-interface/configure org.glite.lb.ws-interface/examples/userjobs.pl org.glite.lb.ws-interface/project/ChangeLog org.glite.lb.ws-interface/project/build.number org.glite.lb.ws-interface/project/build.properties org.glite.lb.ws-interface/project/configure.properties.xml org.glite.lb.ws-interface/project/package.description org.glite.lb.ws-interface/project/package.summary org.glite.lb.ws-interface/project/properties.xml org.glite.lb.ws-interface/project/tar_exclude org.glite.lb.ws-interface/project/version.properties org.glite.lb.ws-interface/src/LB.xml org.glite.lb.ws-interface/src/LBTypes.xml.T org.glite.lb.ws-interface/src/README-lb4agu.txt org.glite.lb.ws-interface/src/doc.xml org.glite.lb.ws-interface/src/glue2.xsd org.glite.lb.ws-interface/src/lb4agu.wsdl org.glite.lb.ws-interface/src/puke-ug.xsl org.glite.lb.ws-interface/src/puke-wsdl.xsl org.glite.lb.ws-test/Makefile org.glite.lb.ws-test/configure org.glite.lb.ws-test/examples/ws_comlex.pl org.glite.lb.ws-test/examples/ws_fault.c org.glite.lb.ws-test/examples/ws_fault.h org.glite.lb.ws-test/examples/ws_getversion.c org.glite.lb.ws-test/examples/ws_getversion.pl org.glite.lb.ws-test/examples/ws_joblog.c org.glite.lb.ws-test/examples/ws_joblog.pl org.glite.lb.ws-test/examples/ws_jobstat.c org.glite.lb.ws-test/examples/ws_jobstat.pl org.glite.lb.ws-test/examples/ws_lb4agu_GetActivityInfo.c org.glite.lb.ws-test/examples/ws_lb4agu_GetActivityStatus.c org.glite.lb.ws-test/examples/ws_lb4agu_GetActivityStatus.pl org.glite.lb.ws-test/examples/ws_query_ex.c org.glite.lb.ws-test/examples/ws_status_history_test.sh org.glite.lb.ws-test/examples/ws_typemap.dat org.glite.lb.ws-test/project/ChangeLog org.glite.lb.ws-test/project/package.description org.glite.lb.ws-test/project/package.summary org.glite.lb.ws-test/project/version.properties org.glite.lb.yaim/Makefile org.glite.lb.yaim/config/defaults/glite-lb.pre org.glite.lb.yaim/config/functions/config_gip_lb org.glite.lb.yaim/config/functions/config_glite_lb org.glite.lb.yaim/config/functions/config_info_service_lb org.glite.lb.yaim/config/node-info.d/glite-lb org.glite.lb.yaim/configure org.glite.lb.yaim/project/ChangeLog org.glite.lb.yaim/project/package.description org.glite.lb.yaim/project/package.summary org.glite.lb.yaim/project/version.properties org.glite.lb/.cvsignore org.glite.lb/LICENSE org.glite.lb/build.xml org.glite.lb/configure org.glite.lb/deployment/README org.glite.lb/deployment/deploy_all.diff org.glite.lb/deployment/deploy_jp.diff org.glite.lb/deployment/deploy_lb.diff org.glite.lb/doc/README.lb4vdt org.glite.lb/doc/perf_clear_proxy org.glite.lb/doc/perf_purge org.glite.lb/doc/perf_reg_jobs org.glite.lb/doc/perf_results/il_sci_09062006.txt org.glite.lb/doc/perf_results/il_sci_09062006_01.txt org.glite.lb/doc/perf_results/il_sci_12062006.txt org.glite.lb/doc/perf_results/ll_michal_21062006.txt org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_22062006.txt org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_23062006.txt org.glite.lb/doc/perf_results/proxy_sci_09062006.txt org.glite.lb/doc/perf_run_interlogd org.glite.lb/doc/perf_run_proxy org.glite.lb/doc/perf_run_server org.glite.lb/doc/perf_run_test org.glite.lb/egee_license_check.sh org.glite.lb/etics-tag-branch.pl org.glite.lb/etics-tag-consistency.pl org.glite.lb/etics-tag-with-subsystems-branch.pl org.glite.lb/etics-tag-with-subsystems.pl org.glite.lb/etics-tag.pl org.glite.lb/lb4vdt/LB_install.sh org.glite.lb/lb4vdt/Makefile.inc org.glite.lb/lb4vdt/scripts/org.gridsite.core.build org.glite.lb/project/build.number org.glite.lb/project/build.properties org.glite.lb/project/glite.lb.csf.xml org.glite.lb/project/package.description org.glite.lb/project/package.summary org.glite.lb/project/properties.xml org.glite.lb/project/run-workspace org.glite.lb/project/taskdefs.xml org.glite.lb/project/version.properties org.glite.lbjp-common.db/.cvsignore org.glite.lbjp-common.db/LICENSE org.glite.lbjp-common.db/Makefile org.glite.lbjp-common.db/configure org.glite.lbjp-common.db/doc/C.dox org.glite.lbjp-common.db/examples/db_expire.c org.glite.lbjp-common.db/examples/db_test.c org.glite.lbjp-common.db/interface/db-int.h org.glite.lbjp-common.db/interface/db.h org.glite.lbjp-common.db/project/ChangeLog org.glite.lbjp-common.db/project/get_soname.sh org.glite.lbjp-common.db/project/package.description org.glite.lbjp-common.db/project/package.summary org.glite.lbjp-common.db/project/version.properties org.glite.lbjp-common.db/src/db-mysql.c org.glite.lbjp-common.db/src/db-pg.c org.glite.lbjp-common.db/src/db.c org.glite.lbjp-common.db/test/timezone.cpp org.glite.lbjp-common.jp-interface/Makefile org.glite.lbjp-common.jp-interface/build.xml org.glite.lbjp-common.jp-interface/configure org.glite.lbjp-common.jp-interface/interface/attr.h org.glite.lbjp-common.jp-interface/interface/backend.h org.glite.lbjp-common.jp-interface/interface/builtin_plugins.h org.glite.lbjp-common.jp-interface/interface/context.h org.glite.lbjp-common.jp-interface/interface/file_plugin.h org.glite.lbjp-common.jp-interface/interface/indexdb.h org.glite.lbjp-common.jp-interface/interface/known_attr.h org.glite.lbjp-common.jp-interface/interface/type_plugin.h org.glite.lbjp-common.jp-interface/interface/types.h org.glite.lbjp-common.jp-interface/project/ChangeLog org.glite.lbjp-common.jp-interface/project/package.description org.glite.lbjp-common.jp-interface/project/package.summary org.glite.lbjp-common.jp-interface/project/version.properties org.glite.lbjp-common.jp-interface/src/attr.c org.glite.lbjp-common.jp-interface/src/context.c org.glite.lbjp-common.jp-interface/src/indexdb.c org.glite.lbjp-common.jp-interface/src/utils.c org.glite.lbjp-common.jp-interface/test/type_test.cpp org.glite.lbjp-common.log/LICENSE org.glite.lbjp-common.log/Makefile org.glite.lbjp-common.log/README org.glite.lbjp-common.log/config/log4crc org.glite.lbjp-common.log/config/log4crc.debugging org.glite.lbjp-common.log/configure org.glite.lbjp-common.log/project/ChangeLog org.glite.lbjp-common.log/project/package.description org.glite.lbjp-common.log/project/package.summary org.glite.lbjp-common.log/project/version.properties org.glite.lbjp-common.log/src/log.c org.glite.lbjp-common.log/src/log.h org.glite.lbjp-common.maildir/.cvsignore org.glite.lbjp-common.maildir/Makefile org.glite.lbjp-common.maildir/configure org.glite.lbjp-common.maildir/interface/maildir.h org.glite.lbjp-common.maildir/project/ChangeLog org.glite.lbjp-common.maildir/project/package.description org.glite.lbjp-common.maildir/project/package.summary org.glite.lbjp-common.maildir/project/version.properties org.glite.lbjp-common.maildir/src/maildir.c org.glite.lbjp-common.server-bones/.cvsignore org.glite.lbjp-common.server-bones/Makefile org.glite.lbjp-common.server-bones/configure org.glite.lbjp-common.server-bones/examples/cnt_example.c org.glite.lbjp-common.server-bones/examples/srv_example.c org.glite.lbjp-common.server-bones/interface/srvbones.h org.glite.lbjp-common.server-bones/project/ChangeLog org.glite.lbjp-common.server-bones/project/package.description org.glite.lbjp-common.server-bones/project/package.summary org.glite.lbjp-common.server-bones/project/version.properties org.glite.lbjp-common.server-bones/src/srvbones.c org.glite.lbjp-common.trio/.cvsignore org.glite.lbjp-common.trio/LICENSE org.glite.lbjp-common.trio/Makefile org.glite.lbjp-common.trio/configure org.glite.lbjp-common.trio/interface/escape.h org.glite.lbjp-common.trio/interface/trio.h org.glite.lbjp-common.trio/project/ChangeLog org.glite.lbjp-common.trio/project/package.description org.glite.lbjp-common.trio/project/package.summary org.glite.lbjp-common.trio/project/version.properties org.glite.lbjp-common.trio/src/escape.c org.glite.lbjp-common.trio/src/strio.c org.glite.lbjp-common.trio/src/strio.h org.glite.lbjp-common.trio/src/trio.c org.glite.lbjp-common.trio/src/triop.h org.glite.lbjp-common.trio/test/trio_test.cpp org.glite.lbjp-common/project/version.properties --- org.glite.jobid.api-c/Makefile | 85 - org.glite.jobid.api-c/configure | 843 --- org.glite.jobid.api-c/interface/cjobid.h | 154 - org.glite.jobid.api-c/interface/strmd5.h | 56 - org.glite.jobid.api-c/project/ChangeLog | 25 - org.glite.jobid.api-c/project/package.description | 1 - org.glite.jobid.api-c/project/package.summary | 1 - org.glite.jobid.api-c/project/version.properties | 3 - org.glite.jobid.api-c/src/cjobid.c | 291 - org.glite.jobid.api-c/src/md32_common.h | 640 --- org.glite.jobid.api-c/src/md5.h | 135 - org.glite.jobid.api-c/src/md5_dgst.c | 315 -- org.glite.jobid.api-c/src/md5_locl.h | 193 - org.glite.jobid.api-c/src/strmd5.c | 169 - org.glite.jobid.api-c/test/base64_test.cpp | 91 - org.glite.jobid.api-cpp/Makefile | 57 - org.glite.jobid.api-cpp/configure | 843 --- org.glite.jobid.api-cpp/interface/JobId.h | 351 -- org.glite.jobid.api-cpp/project/ChangeLog | 16 - .../project/package.description | 1 - org.glite.jobid.api-cpp/project/package.summary | 1 - org.glite.jobid.api-cpp/project/version.properties | 3 - org.glite.jobid.api-java/Makefile | 14 - org.glite.jobid.api-java/build.xml | 69 - org.glite.jobid.api-java/configure | 843 --- org.glite.jobid.api-java/nbproject/build-impl.xml | 627 --- .../nbproject/genfiles.properties | 8 - .../nbproject/private/config.properties | 0 .../nbproject/private/private.properties | 6 - .../nbproject/private/private.xml | 4 - .../nbproject/project.properties | 62 - org.glite.jobid.api-java/nbproject/project.xml | 17 - org.glite.jobid.api-java/project/ChangeLog | 6 - .../project/package.description | 1 - org.glite.jobid.api-java/project/package.summary | 1 - .../project/version.properties | 3 - .../src/org/glite/jobid/ExampleJobid.java | 60 - .../src/org/glite/jobid/Jobid.java | 245 - org.glite.jobid/project/version.properties | 3 - org.glite.lb.client-java/Makefile | 70 - org.glite.lb.client-java/configure | 843 --- org.glite.lb.client-java/examples/CreamTest.java | 95 - .../examples/NotificationExample.java | 114 - .../examples/ProducerTestIL.java | 166 - .../examples/ProducerTestLL.java | 184 - org.glite.lb.client-java/examples/QueryDemo.java | 274 - org.glite.lb.client-java/examples/SSLClient.java | 34 - org.glite.lb.client-java/examples/SSLServer.java | 47 - .../examples/SimpleLLTest.java | 54 - org.glite.lb.client-java/project/ChangeLog | 9 - org.glite.lb.client-java/project/genEventTypes.pl | 148 - .../project/package.description | 4 - org.glite.lb.client-java/project/package.summary | 1 - .../project/version.properties | 3 - .../src/org/glite/lb/Context.java | 370 -- .../src/org/glite/lb/ContextDirect.java | 79 - .../src/org/glite/lb/ContextIL.java | 163 - .../src/org/glite/lb/ContextLL.java | 178 - .../src/org/glite/lb/Escape.java | 26 - .../src/org/glite/lb/Event.java | 179 - .../src/org/glite/lb/EventConvertor.java | 1101 ---- .../src/org/glite/lb/ILFileWriter.java | 84 - .../src/org/glite/lb/ILProto.java | 255 - org.glite.lb.client-java/src/org/glite/lb/Job.java | 181 - .../src/org/glite/lb/LBCredentials.java | 135 - .../src/org/glite/lb/LBException.java | 30 - .../src/org/glite/lb/Level.java | 66 - .../src/org/glite/lb/NotifParser.java | 145 - .../src/org/glite/lb/Notification.java | 252 - org.glite.lb.client-java/src/org/glite/lb/SSL.java | 122 - .../src/org/glite/lb/SSLSend.java | 80 - .../src/org/glite/lb/SeqCode.java | 157 - .../src/org/glite/lb/ServerConnection.java | 536 -- .../src/org/glite/lb/Sources.java | 74 - .../src/org/glite/lb/Timeval.java | 89 - org.glite.lb.client-java/src_c/Makefile | 27 - org.glite.lb.client-java/src_c/send_via_proxy.c | 297 - org.glite.lb.client-java/src_c/send_via_socket.c | 219 - org.glite.lb.client/.cvsignore | 2 - org.glite.lb.client/LICENSE | 69 - org.glite.lb.client/Makefile | 362 -- org.glite.lb.client/build.xml | 144 - org.glite.lb.client/configure | 843 --- org.glite.lb.client/doc/README-notify | 106 - org.glite.lb.client/doc/glite-lb-dump.8 | 62 - org.glite.lb.client/doc/glite-lb-load.8 | 50 - org.glite.lb.client/doc/glite-lb-logevent.1 | 98 - org.glite.lb.client/doc/glite-lb-notify.1 | 142 - org.glite.lb.client/examples/Makefile | 79 - org.glite.lb.client/examples/README.examples | 32 - org.glite.lb.client/examples/abort_job.c | 152 - org.glite.lb.client/examples/aborted.l | 2 - org.glite.lb.client/examples/aborted_ft.l | 5 - org.glite.lb.client/examples/cancelled.l | 2 - org.glite.lb.client/examples/change_acl.c | 99 - org.glite.lb.client/examples/chkpt.l | 6 - org.glite.lb.client/examples/cleared.l | 4 - org.glite.lb.client/examples/cream_done.l | 4 - org.glite.lb.client/examples/cream_failed.l | 2 - org.glite.lb.client/examples/cream_idle.l | 4 - org.glite.lb.client/examples/cream_pending.l | 4 - org.glite.lb.client/examples/cream_reallyrunning.l | 2 - org.glite.lb.client/examples/cream_registered.l | 2 - org.glite.lb.client/examples/cream_running.l | 3 - org.glite.lb.client/examples/dagids.c | 82 - org.glite.lb.client/examples/done.l | 4 - org.glite.lb.client/examples/done_dag.l | 4 - org.glite.lb.client/examples/done_failed_events.c | 134 - org.glite.lb.client/examples/done_ft.l | 4 - org.glite.lb.client/examples/done_subjob.l | 4 - org.glite.lb.client/examples/failed_dag.l | 3 - org.glite.lb.client/examples/failed_subjob.l | 3 - org.glite.lb.client/examples/feed_shark.c | 216 - org.glite.lb.client/examples/flood_proxy.c | 98 - org.glite.lb.client/examples/gen_begin | 82 - org.glite.lb.client/examples/gen_sample_job | 155 - org.glite.lb.client/examples/job-status.pl | 69 - org.glite.lb.client/examples/job_log.c | 165 - org.glite.lb.client/examples/job_reg.c | 207 - org.glite.lb.client/examples/job_status.c | 387 -- org.glite.lb.client/examples/log_usertag_proxy.c | 133 - org.glite.lb.client/examples/multiple_user_jobs.c | 142 - org.glite.lb.client/examples/notify.pl | 49 - org.glite.lb.client/examples/parse_eventsfile.c | 137 - org.glite.lb.client/examples/purge_test | 206 - org.glite.lb.client/examples/query_ext.c | 944 ---- org.glite.lb.client/examples/query_seq_code.c | 101 - org.glite.lb.client/examples/ready.l | 18 - org.glite.lb.client/examples/ready_dag.l | 13 - org.glite.lb.client/examples/ready_subjob.l | 8 - org.glite.lb.client/examples/resubmission.l | 19 - org.glite.lb.client/examples/resubmitted.l | 20 - org.glite.lb.client/examples/running.l | 4 - org.glite.lb.client/examples/running_dag.l | 4 - org.glite.lb.client/examples/running_ft.l | 4 - org.glite.lb.client/examples/running_subjob.l | 4 - org.glite.lb.client/examples/sandbox_transfers.sh | 89 - org.glite.lb.client/examples/scheduled.l | 13 - org.glite.lb.client/examples/scheduled_dag.l | 12 - org.glite.lb.client/examples/scheduled_subjob.l | 7 - .../examples/shallow_and_full_resub.l | 40 - .../examples/shallow_resub_complex.l | 48 - .../examples/shallow_resub_simple.l | 30 - .../examples/shallow_resub_simple2.l | 31 - org.glite.lb.client/examples/stats.c | 104 - org.glite.lb.client/examples/stress_context.c | 131 - org.glite.lb.client/examples/stresslog.c | 206 - org.glite.lb.client/examples/submitted.l | 5 - org.glite.lb.client/examples/submitted_dag.l | 4 - org.glite.lb.client/examples/submitted_ft_reg.l | 3 - org.glite.lb.client/examples/submitted_subjob.l | 4 - org.glite.lb.client/examples/test_changed_jdl.c | 63 - org.glite.lb.client/examples/test_notif_rotate.pl | 62 - org.glite.lb.client/examples/ulmfields.pl | 47 - org.glite.lb.client/examples/user-jobs.pl | 61 - org.glite.lb.client/examples/user_jobs.c | 127 - org.glite.lb.client/examples/user_jobs_threaded.c | 242 - org.glite.lb.client/examples/waiting.l | 6 - org.glite.lb.client/examples/waiting_dag.l | 6 - org.glite.lb.client/examples/waiting_subjob.l | 6 - .../webservices/java-trustmanager/Makefile | 29 - .../examples/webservices/java-trustmanager/README | 39 - .../java-trustmanager/src/LBClientTM.java | 81 - .../examples/webservices/java/Makefile | 28 - .../examples/webservices/java/README | 28 - .../java/src/ExampleSSLSocketFactory.java | 125 - .../webservices/java/src/LBClientExample.java | 96 - .../webservices/java/src/MyX509KeyManager.java | 81 - .../webservices/java/src/MyX509TrustManager.java | 100 - .../examples/webservices/java/src/log4j.properties | 30 - org.glite.lb.client/interface/Event.h.T | 325 -- org.glite.lb.client/interface/Job.h | 215 - org.glite.lb.client/interface/JobStatus.h.T | 328 -- org.glite.lb.client/interface/Notification.h | 119 - org.glite.lb.client/interface/ServerConnection.h | 760 --- org.glite.lb.client/interface/connection.h | 43 - org.glite.lb.client/interface/consumer.h | 353 -- org.glite.lb.client/interface/notification.h | 208 - org.glite.lb.client/interface/prod_proto.h | 138 - org.glite.lb.client/interface/producer.h.T | 393 -- org.glite.lb.client/interface/stat_fields.h | 43 - org.glite.lb.client/interface/statistics.h | 77 - org.glite.lb.client/m4/glite_lb.m4 | 172 - org.glite.lb.client/project/.cvsignore | 6 - org.glite.lb.client/project/ChangeLog | 88 - org.glite.lb.client/project/build.number | 2 - org.glite.lb.client/project/build.properties | 0 .../project/configure.properties.xml | 84 - org.glite.lb.client/project/package.description | 1 - org.glite.lb.client/project/package.summary | 1 - org.glite.lb.client/project/properties.xml | 62 - org.glite.lb.client/project/tar_exclude | 10 - org.glite.lb.client/project/version.properties | 3 - org.glite.lb.client/src/Event.cpp.T | 445 -- org.glite.lb.client/src/EventAttrNames.pl | 117 - org.glite.lb.client/src/Job.cpp | 220 - org.glite.lb.client/src/JobStatus.cpp.T | 533 -- org.glite.lb.client/src/Notification.cpp | 357 -- org.glite.lb.client/src/ServerConnection.cpp | 1358 ----- org.glite.lb.client/src/StatusAttrNames.pl | 113 - org.glite.lb.client/src/args.c.T | 605 --- org.glite.lb.client/src/args.h | 52 - org.glite.lb.client/src/connection.c | 816 --- org.glite.lb.client/src/consumer.c | 598 -- org.glite.lb.client/src/export.sh | 106 - org.glite.lb.client/src/logevent.c.T | 349 -- org.glite.lb.client/src/notification.c | 948 ---- org.glite.lb.client/src/notify.c | 545 -- org.glite.lb.client/src/perftest_jobreg.c | 235 - org.glite.lb.client/src/perftest_jobreg.sh | 406 -- org.glite.lb.client/src/perftest_logjobs.c | 364 -- org.glite.lb.client/src/perftest_query.sh | 47 - org.glite.lb.client/src/prod_proto.c | 852 --- org.glite.lb.client/src/producer.c | 1126 ---- org.glite.lb.client/src/register_sandbox.c | 166 - org.glite.lb.client/src/stat_fields.cpp | 140 - org.glite.lb.client/src/statistics.c | 203 - org.glite.lb.client/src/uiwrap.T | 157 - org.glite.lb.client/src/uiwrap.c.T | 34 - org.glite.lb.client/test/PLOT | 64 - org.glite.lb.client/test/TEST | 111 - org.glite.lb.client/test/prod_proto_test.c | 53 - org.glite.lb.client/test/producer_test.cpp | 121 - org.glite.lb.doc/GGUS19469-reply.txt | 158 - org.glite.lb.doc/LICENSE | 69 - org.glite.lb.doc/Makefile | 126 - org.glite.lb.doc/configure | 843 --- org.glite.lb.doc/examples/Makefile | 82 - org.glite.lb.doc/examples/README | 19 - org.glite.lb.doc/examples/README.queries | 511 -- org.glite.lb.doc/examples/cons_example1.c | 137 - org.glite.lb.doc/examples/cons_example1.cpp | 111 - org.glite.lb.doc/examples/cons_example2.c | 151 - org.glite.lb.doc/examples/cons_example2.cpp | 119 - org.glite.lb.doc/examples/cons_example3.c | 136 - org.glite.lb.doc/examples/cons_example3.cpp | 140 - org.glite.lb.doc/examples/example1.c | 66 - org.glite.lb.doc/examples/notif_example.c | 144 - org.glite.lb.doc/examples/prod_example1.c | 125 - org.glite.lb.doc/examples/util.C | 160 - org.glite.lb.doc/examples/util.c | 71 - org.glite.lb.doc/project/ChangeLog | 49 - org.glite.lb.doc/project/package.description | 1 - org.glite.lb.doc/project/package.summary | 1 - org.glite.lb.doc/project/version.properties | 3 - org.glite.lb.doc/src/LBAG-Abstract.tex | 21 - org.glite.lb.doc/src/LBAG-Installation.tex | 638 --- org.glite.lb.doc/src/LBAG-Introduction.tex | 123 - org.glite.lb.doc/src/LBAG-Running.tex | 669 --- org.glite.lb.doc/src/LBAG-Troubleshooting.tex | 32 - org.glite.lb.doc/src/LBAG.tex | 62 - org.glite.lb.doc/src/LBDG-Abstract.tex | 22 - org.glite.lb.doc/src/LBDG-Introduction.tex | 623 --- org.glite.lb.doc/src/LBDG.tex | 110 - org.glite.lb.doc/src/LBTP-Abstract.tex | 23 - org.glite.lb.doc/src/LBTP-IntegrationTests.tex | 116 - org.glite.lb.doc/src/LBTP-InterTests.tex | 26 - org.glite.lb.doc/src/LBTP-Introduction.tex | 148 - org.glite.lb.doc/src/LBTP-PerfTests.tex | 552 -- org.glite.lb.doc/src/LBTP-Tests.tex | 515 -- org.glite.lb.doc/src/LBTP.tex | 66 - org.glite.lb.doc/src/LBUG-Abstract.tex | 22 - org.glite.lb.doc/src/LBUG-Appendix.tex | 142 - org.glite.lb.doc/src/LBUG-Introduction.tex | 930 ---- org.glite.lb.doc/src/LBUG-Tools.tex | 132 - org.glite.lb.doc/src/LBUG-Troubleshooting.tex | 59 - org.glite.lb.doc/src/LBUG.tex | 60 - org.glite.lb.doc/src/README | 13 - org.glite.lb.doc/src/README-standards.txt | 291 - org.glite.lb.doc/src/change_acl.tex | 94 - org.glite.lb.doc/src/components.tex | 166 - org.glite.lb.doc/src/consumer_api.tex | 576 -- org.glite.lb.doc/src/copyright.tex | 40 - org.glite.lb.doc/src/definitions.tex | 54 - org.glite.lb.doc/src/doxygen.sty | 64 - org.glite.lb.doc/src/doxyhack.tex | 47 - org.glite.lb.doc/src/egee.cls | 452 -- org.glite.lb.doc/src/events.tex.T | 35 - org.glite.lb.doc/src/frontmatter.tex | 59 - .../src/images/LB-components-LB-WMS.pdf | Bin 79142 -> 0 bytes .../src/images/LB-components-gather.pdf | Bin 48193 -> 0 bytes .../src/images/LB-components-query.pdf | Bin 47744 -> 0 bytes org.glite.lb.doc/src/images/LB-components.pdf | Bin 86695 -> 0 bytes org.glite.lb.doc/src/images/cesnet.pdf | Bin 4518 -> 0 bytes org.glite.lb.doc/src/images/egee.pdf | Bin 449747 -> 0 bytes org.glite.lb.doc/src/images/glite.pdf | Bin 392014 -> 0 bytes org.glite.lb.doc/src/images/isi.pdf | Bin 19672 -> 0 bytes org.glite.lb.doc/src/images/seqtree.pdf | Bin 5715 -> 0 bytes org.glite.lb.doc/src/images/wms2-jobstat.pdf | Bin 7328 -> 0 bytes org.glite.lb.doc/src/lbjp.bib | 780 --- org.glite.lb.doc/src/listings.sty | 2002 ------- org.glite.lb.doc/src/log_usertag.tex | 82 - org.glite.lb.doc/src/logevent.tex | 66 - org.glite.lb.doc/src/lstdoc.sty | 451 -- org.glite.lb.doc/src/lstlang1.sty | 1226 ----- org.glite.lb.doc/src/lstlang2.sty | 1532 ------ org.glite.lb.doc/src/lstlang3.sty | 1006 ---- org.glite.lb.doc/src/lstmisc.sty | 2086 ------- org.glite.lb.doc/src/lstpatch.sty | 393 -- org.glite.lb.doc/src/notification_api.tex | 226 - org.glite.lb.doc/src/notify.tex | 276 - org.glite.lb.doc/src/producer_api.tex | 201 - org.glite.lb.doc/src/status.tex.T | 19 - org.glite.lb.doc/src/versions.tex | 61 - org.glite.lb.doc/src/web_services.tex | 42 - org.glite.lb.glite-LB/Makefile | 30 - org.glite.lb.glite-LB/configure | 834 --- org.glite.lb.glite-LB/project/ChangeLog | 4 - org.glite.lb.glite-LB/project/package.description | 1 - org.glite.lb.glite-LB/project/package.summary | 1 - org.glite.lb.glite-LB/project/version.properties | 3 - org.glite.lb.harvester/Makefile | 89 - org.glite.lb.harvester/configure | 843 --- org.glite.lb.harvester/doc/INSTALL | 42 - org.glite.lb.harvester/doc/README | 81 - org.glite.lb.harvester/doc/glite-lb-harvester.sgml | 480 -- org.glite.lb.harvester/examples/test.sh | 898 --- org.glite.lb.harvester/examples/test.sql | 55 - org.glite.lb.harvester/project/ChangeLog | 28 - org.glite.lb.harvester/project/package.description | 1 - org.glite.lb.harvester/project/package.summary | 1 - org.glite.lb.harvester/project/version.properties | 2 - org.glite.lb.harvester/src/harvester.c | 2766 ---------- org.glite.lb.logger/.cvsignore | 2 - org.glite.lb.logger/LICENSE | 69 - org.glite.lb.logger/Makefile | 227 - org.glite.lb.logger/build.xml | 131 - .../config/glite-lb-logger.config.xml | 77 - .../config/glite-lb-logger.default-properties | 18 - org.glite.lb.logger/config/startup | 153 - org.glite.lb.logger/configure | 843 --- org.glite.lb.logger/doc/glite-lb-interlogd.8 | 183 - org.glite.lb.logger/doc/glite-lb-logd.8 | 172 - org.glite.lb.logger/project/ChangeLog | 87 - org.glite.lb.logger/project/build.number | 2 - org.glite.lb.logger/project/build.properties | 0 .../project/configure.properties.xml | 65 - org.glite.lb.logger/project/package.description | 1 - org.glite.lb.logger/project/package.summary | 1 - org.glite.lb.logger/project/properties.xml | 59 - org.glite.lb.logger/project/tar_exclude | 10 - org.glite.lb.logger/project/version.properties | 3 - org.glite.lb.logger/src-nt/Connection.H | 51 - org.glite.lb.logger/src-nt/Connection.cpp | 21 - org.glite.lb.logger/src-nt/EventManager.H | 109 - org.glite.lb.logger/src-nt/EventManager.cpp | 40 - org.glite.lb.logger/src-nt/Exception.H | 30 - org.glite.lb.logger/src-nt/HTTPTransport.H | 71 - org.glite.lb.logger/src-nt/HTTPTransport.cpp | 272 - org.glite.lb.logger/src-nt/InputChannel.H | 46 - org.glite.lb.logger/src-nt/InputChannel.cpp | 54 - org.glite.lb.logger/src-nt/Makefile | 51 - org.glite.lb.logger/src-nt/Message.H | 83 - org.glite.lb.logger/src-nt/MessageStore.H | 101 - org.glite.lb.logger/src-nt/MessageStore.cpp | 41 - org.glite.lb.logger/src-nt/PlainConnection.H | 51 - org.glite.lb.logger/src-nt/PlainConnection.cpp | 56 - org.glite.lb.logger/src-nt/PluginManager.H | 86 - org.glite.lb.logger/src-nt/PluginManager.cpp | 23 - org.glite.lb.logger/src-nt/Properties.H | 53 - org.glite.lb.logger/src-nt/Singleton.H | 56 - org.glite.lb.logger/src-nt/SocketInput.H | 49 - org.glite.lb.logger/src-nt/SocketInput.cpp | 88 - org.glite.lb.logger/src-nt/ThreadPool.H | 134 - org.glite.lb.logger/src-nt/ThreadPool.cpp | 430 -- org.glite.lb.logger/src-nt/Transport.H | 50 - org.glite.lb.logger/src-nt/Transport.cpp | 22 - org.glite.lb.logger/src-nt/main.cpp | 55 - .../src-nt/test/EventManagerTest.cpp | 62 - .../src-nt/test/PluginManagerTest.cpp | 75 - org.glite.lb.logger/src-nt/test/SingletonTest.cpp | 72 - org.glite.lb.logger/src-nt/test/ThreadPoolTest.cpp | 207 - org.glite.lb.logger/src-nt/test/test_main.cpp | 49 - org.glite.lb.logger/src/activemq_cpp_plugin.cpp | 400 -- org.glite.lb.logger/src/event_queue.c | 400 -- org.glite.lb.logger/src/event_store.c | 1623 ------ org.glite.lb.logger/src/event_store_http.c | 1130 ---- org.glite.lb.logger/src/http.c | 214 - org.glite.lb.logger/src/il_error.c | 201 - org.glite.lb.logger/src/il_error.h | 49 - org.glite.lb.logger/src/il_master.c | 474 -- org.glite.lb.logger/src/input_queue_socket.c | 292 - org.glite.lb.logger/src/input_queue_socket_http.c | 184 - org.glite.lb.logger/src/interlogd.c | 613 --- org.glite.lb.logger/src/interlogd.h | 326 -- org.glite.lb.logger/src/logd.c | 582 -- org.glite.lb.logger/src/logd_proto.c | 647 --- org.glite.lb.logger/src/logd_proto.h | 62 - org.glite.lb.logger/src/perftest_il.sh | 385 -- org.glite.lb.logger/src/perftest_ll.sh | 144 - org.glite.lb.logger/src/plugin_mgr.c | 87 - org.glite.lb.logger/src/queue_mgr.c | 293 - org.glite.lb.logger/src/queue_mgr_http.c | 181 - org.glite.lb.logger/src/queue_thread.c | 469 -- org.glite.lb.logger/src/recover.c | 92 - org.glite.lb.logger/src/send_event.c | 394 -- org.glite.lb.logger/src/send_event_http.c | 299 - org.glite.lb.logger/src/server_msg.c | 245 - org.glite.lb.logger/src/server_msg_http.c | 145 - org.glite.lb.logger/test/IlTestBase.cpp | 32 - org.glite.lb.logger/test/IlTestBase.h | 27 - org.glite.lb.logger/test/event_queueTest.cpp | 162 - org.glite.lb.logger/test/event_storeTest.cpp | 75 - org.glite.lb.logger/test/il_test.cpp | 61 - .../test/input_queue_socketTest.cpp | 86 - org.glite.lb.logger/test/ll_test.cpp | 136 - org.glite.lb.logger/test/logd_proto_test.c | 60 - org.glite.lb.logger/test/server_msgTest.cpp | 74 - org.glite.lb.server/.cvsignore | 2 - org.glite.lb.server/LICENSE | 69 - org.glite.lb.server/Makefile | 420 -- org.glite.lb.server/config/glite-lb-dbsetup.sql | 158 - .../config/glite-lb-index.conf.template | 8 - .../config/glite-lb-migrate_db2version20 | 166 - org.glite.lb.server/config/startup | 278 - org.glite.lb.server/configure | 843 --- org.glite.lb.server/doc/glite-lb-bkindex.8 | 171 - org.glite.lb.server/doc/glite-lb-bkserverd.8 | 338 -- org.glite.lb.server/doc/glite-lb-mon-db.1 | 57 - org.glite.lb.server/interface/index.h | 59 - org.glite.lb.server/interface/lb_authz.h | 99 - .../interface/pretty_print_wrapper.h | 27 - org.glite.lb.server/interface/query.h | 36 - org.glite.lb.server/interface/srv_perf.h | 47 - org.glite.lb.server/interface/store.h | 69 - org.glite.lb.server/project/.cvsignore | 6 - org.glite.lb.server/project/ChangeLog | 165 - org.glite.lb.server/project/build.number | 2 - org.glite.lb.server/project/build.properties | 0 org.glite.lb.server/project/package.description | 1 - org.glite.lb.server/project/package.summary | 1 - org.glite.lb.server/project/tar_exclude | 10 - org.glite.lb.server/project/version.properties | 3 - org.glite.lb.server/src/authz_policy.c | 179 - org.glite.lb.server/src/authz_policy.h | 72 - org.glite.lb.server/src/bkindex.c | 467 -- org.glite.lb.server/src/bkserverd.c | 1978 ------- org.glite.lb.server/src/cond_dump.c | 234 - org.glite.lb.server/src/cond_dump.h | 26 - org.glite.lb.server/src/db_calls.c | 113 - org.glite.lb.server/src/db_calls.h | 33 - org.glite.lb.server/src/db_store.c | 329 -- org.glite.lb.server/src/db_supp.c | 144 - org.glite.lb.server/src/db_supp.h | 44 - org.glite.lb.server/src/dump.c | 215 - org.glite.lb.server/src/get_events.c.T | 206 - org.glite.lb.server/src/get_events.h | 55 - org.glite.lb.server/src/il_lbproxy.c | 101 - org.glite.lb.server/src/il_lbproxy.h | 36 - org.glite.lb.server/src/il_notification.c | 238 - org.glite.lb.server/src/il_notification.h | 127 - org.glite.lb.server/src/index.c.T | 452 -- org.glite.lb.server/src/index_lex.l | 63 - org.glite.lb.server/src/index_parse.y | 259 - org.glite.lb.server/src/jobstat.c | 1406 ----- org.glite.lb.server/src/jobstat.h | 63 - org.glite.lb.server/src/jobstat_supp.c | 785 --- org.glite.lb.server/src/lb_authz.c | 966 ---- org.glite.lb.server/src/lb_html.c | 392 -- org.glite.lb.server/src/lb_html.h | 37 - org.glite.lb.server/src/lb_http.c | 86 - org.glite.lb.server/src/lb_http.h | 28 - org.glite.lb.server/src/lb_proto.c | 1272 ----- org.glite.lb.server/src/lb_proto.h | 57 - org.glite.lb.server/src/lb_rss.c | 95 - org.glite.lb.server/src/lb_rss.h | 26 - org.glite.lb.server/src/lb_text.c | 260 - org.glite.lb.server/src/lb_text.h | 33 - org.glite.lb.server/src/lb_xml_parse.c.T | 2097 ------- org.glite.lb.server/src/lb_xml_parse.h | 62 - org.glite.lb.server/src/lb_xml_parse_V21.c.T | 1262 ----- org.glite.lb.server/src/lb_xml_parse_V21.h | 40 - org.glite.lb.server/src/lcas_lb.c | 126 - org.glite.lb.server/src/load.c | 241 - org.glite.lb.server/src/mon-db.c | 131 - org.glite.lb.server/src/notif_match.c | 265 - org.glite.lb.server/src/notification.c | 883 --- org.glite.lb.server/src/openserver.c | 116 - org.glite.lb.server/src/openserver.h | 23 - org.glite.lb.server/src/perftest_proxy.sh | 173 - org.glite.lb.server/src/policy_gram.y | 154 - org.glite.lb.server/src/policy_lex.l | 39 - org.glite.lb.server/src/pretty_print_wrapper.cpp | 41 - org.glite.lb.server/src/purge.h | 86 - org.glite.lb.server/src/query.c | 1833 ------- org.glite.lb.server/src/request.c | 102 - org.glite.lb.server/src/seqcode.c | 86 - org.glite.lb.server/src/server_notification.h | 34 - org.glite.lb.server/src/server_state.c | 78 - org.glite.lb.server/src/server_state.h | 29 - org.glite.lb.server/src/srv_purge.c | 1056 ---- org.glite.lb.server/src/stats.c | 493 -- org.glite.lb.server/src/stats.h | 94 - org.glite.lb.server/src/store.c.T | 865 --- org.glite.lb.server/src/stored_master.c | 147 - org.glite.lb.server/src/userjobs.c | 140 - org.glite.lb.server/src/write2rgma.c | 300 - org.glite.lb.server/src/ws_fault.c | 71 - org.glite.lb.server/src/ws_fault.h | 28 - org.glite.lb.server/src/ws_lb4agu.c | 443 -- org.glite.lb.server/src/ws_query.c | 479 -- org.glite.lb.server/src/ws_typemap.dat | 7 - org.glite.lb.server/src/ws_typemap.h | 93 - org.glite.lb.server/src/ws_typeref.c.T | 1224 ----- org.glite.lb.server/src/ws_typeref.h | 111 - org.glite.lb.server/test/oneJob.qry | 32 - org.glite.lb.server/test/test_query_events.cpp | 206 - org.glite.lb.server/test/test_soap_conv.cpp | 340 -- org.glite.lb.server/test/test_trans.sh | 206 - org.glite.lb.server/test/test_xml.cpp.T | 238 - org.glite.lb.state-machine/LICENSE | 69 - org.glite.lb.state-machine/Makefile | 127 - org.glite.lb.state-machine/configure | 843 --- org.glite.lb.state-machine/interface/intjobstat.h | 123 - .../interface/lb-job-attrs.xsd | 139 - .../interface/lb-job-attrs2.xsd.T | 141 - .../interface/lb-job-record.xsd | 95 - .../interface/process_event.h | 24 - org.glite.lb.state-machine/interface/seqcode_aux.h | 39 - org.glite.lb.state-machine/project/ChangeLog | 38 - .../project/package.description | 1 - org.glite.lb.state-machine/project/package.summary | 1 - .../project/version.properties | 3 - org.glite.lb.state-machine/src/job_attrs.xsl | 41 - org.glite.lb.state-machine/src/job_attrs2.xsl | 43 - org.glite.lb.state-machine/src/jpis_config.xsl | 72 - org.glite.lb.state-machine/src/lb_plugin.c | 1913 ------- org.glite.lb.state-machine/src/process_event.c | 1113 ---- .../src/process_event_condor.c | 224 - .../src/process_event_cream.c | 272 - .../src/process_event_file_transfer.c | 151 - .../src/process_event_file_transfer_collection.c | 97 - org.glite.lb.state-machine/src/process_event_pbs.c | 254 - org.glite.lb.state-machine/src/seqcode_aux.c | 348 -- org.glite.lb.types/Makefile | 33 - org.glite.lb.types/MultiStruct.pm | 213 - org.glite.lb.types/StructField.pm | 116 - org.glite.lb.types/at3.in | 97 - org.glite.lb.types/check_version.pl | 52 - org.glite.lb.types/configure | 843 --- org.glite.lb.types/events.T | 466 -- org.glite.lb.types/project/ChangeLog | 22 - org.glite.lb.types/project/package.description | 1 - org.glite.lb.types/project/package.summary | 1 - org.glite.lb.types/project/version.properties | 3 - org.glite.lb.types/status.T | 190 - org.glite.lb.types/types.T | 171 - org.glite.lb.utils/.cvsignore | 2 - org.glite.lb.utils/LICENSE | 69 - org.glite.lb.utils/Makefile | 123 - org.glite.lb.utils/build.xml | 115 - org.glite.lb.utils/configure | 833 --- org.glite.lb.utils/doc/README.LB-monitoring | 34 - org.glite.lb.utils/doc/README.LB-statistics | 41 - org.glite.lb.utils/doc/glite-lb-mon.1 | 51 - org.glite.lb.utils/doc/glite-lb-purge.8 | 103 - org.glite.lb.utils/examples/glite-lb-index.conf | 11 - .../examples/glite-lb-statistics-gsi.sh | 55 - .../examples/glite-lb-statistics-rsync.sh | 47 - .../examples/glite-lb-statistics-sftp.sh | 58 - org.glite.lb.utils/examples/glite-lb-statistics.sh | 66 - org.glite.lb.utils/project/ChangeLog | 25 - org.glite.lb.utils/project/build.number | 2 - org.glite.lb.utils/project/build.properties | 0 .../project/configure.properties.xml | 58 - org.glite.lb.utils/project/package.description | 1 - org.glite.lb.utils/project/package.summary | 1 - org.glite.lb.utils/project/properties.xml | 60 - org.glite.lb.utils/project/tar_exclude | 10 - org.glite.lb.utils/project/version.properties | 3 - org.glite.lb.utils/src/dump.c | 241 - org.glite.lb.utils/src/dump_exporter.c | 407 -- org.glite.lb.utils/src/glite-lb-bkpurge-offline.sh | 190 - org.glite.lb.utils/src/load.c | 221 - org.glite.lb.utils/src/mon.c | 188 - org.glite.lb.utils/src/notif-keeper.sh | 112 - org.glite.lb.utils/src/process_attrs.c | 237 - org.glite.lb.utils/src/process_attrs2.c.T | 102 - org.glite.lb.utils/src/purge.c | 464 -- org.glite.lb.utils/src/state_history.c | 95 - org.glite.lb.utils/src/statistics.c | 208 - org.glite.lb.ws-interface/.Makefile.swp | Bin 12288 -> 0 bytes org.glite.lb.ws-interface/.cvsignore | 2 - org.glite.lb.ws-interface/LICENSE | 69 - org.glite.lb.ws-interface/Makefile | 80 - org.glite.lb.ws-interface/build.xml | 135 - org.glite.lb.ws-interface/configure | 833 --- org.glite.lb.ws-interface/examples/userjobs.pl | 42 - org.glite.lb.ws-interface/project/ChangeLog | 22 - org.glite.lb.ws-interface/project/build.number | 2 - org.glite.lb.ws-interface/project/build.properties | 0 .../project/configure.properties.xml | 53 - .../project/package.description | 1 - org.glite.lb.ws-interface/project/package.summary | 1 - org.glite.lb.ws-interface/project/properties.xml | 73 - org.glite.lb.ws-interface/project/tar_exclude | 0 .../project/version.properties | 3 - org.glite.lb.ws-interface/src/LB.xml | 137 - org.glite.lb.ws-interface/src/LBTypes.xml.T | 308 -- org.glite.lb.ws-interface/src/README-lb4agu.txt | 52 - org.glite.lb.ws-interface/src/doc.xml | 2 - org.glite.lb.ws-interface/src/glue2.xsd | 1371 ----- org.glite.lb.ws-interface/src/lb4agu.wsdl | 188 - org.glite.lb.ws-interface/src/puke-ug.xsl | 151 - org.glite.lb.ws-interface/src/puke-wsdl.xsl | 303 -- org.glite.lb.ws-test/Makefile | 82 - org.glite.lb.ws-test/configure | 843 --- org.glite.lb.ws-test/examples/ws_comlex.pl | 84 - org.glite.lb.ws-test/examples/ws_fault.c | 72 - org.glite.lb.ws-test/examples/ws_fault.h | 23 - org.glite.lb.ws-test/examples/ws_getversion.c | 103 - org.glite.lb.ws-test/examples/ws_getversion.pl | 50 - org.glite.lb.ws-test/examples/ws_joblog.c | 145 - org.glite.lb.ws-test/examples/ws_joblog.pl | 68 - org.glite.lb.ws-test/examples/ws_jobstat.c | 126 - org.glite.lb.ws-test/examples/ws_jobstat.pl | 64 - .../examples/ws_lb4agu_GetActivityInfo.c | 127 - .../examples/ws_lb4agu_GetActivityStatus.c | 127 - .../examples/ws_lb4agu_GetActivityStatus.pl | 60 - org.glite.lb.ws-test/examples/ws_query_ex.c | 231 - .../examples/ws_status_history_test.sh | 101 - org.glite.lb.ws-test/examples/ws_typemap.dat | 7 - org.glite.lb.ws-test/project/ChangeLog | 31 - org.glite.lb.ws-test/project/package.description | 1 - org.glite.lb.ws-test/project/package.summary | 1 - org.glite.lb.ws-test/project/version.properties | 3 - org.glite.lb.yaim/Makefile | 32 - org.glite.lb.yaim/config/defaults/glite-lb.pre | 3 - org.glite.lb.yaim/config/functions/config_gip_lb | 14 - org.glite.lb.yaim/config/functions/config_glite_lb | 386 -- .../config/functions/config_info_service_lb | 92 - org.glite.lb.yaim/config/node-info.d/glite-lb | 14 - org.glite.lb.yaim/configure | 843 --- org.glite.lb.yaim/project/ChangeLog | 21 - org.glite.lb.yaim/project/package.description | 1 - org.glite.lb.yaim/project/package.summary | 1 - org.glite.lb.yaim/project/version.properties | 3 - org.glite.lb/.cvsignore | 2 - org.glite.lb/LICENSE | 69 - org.glite.lb/build.xml | 599 -- org.glite.lb/configure | 843 --- org.glite.lb/deployment/README | 2 - org.glite.lb/deployment/deploy_all.diff | 551 -- org.glite.lb/deployment/deploy_jp.diff | 222 - org.glite.lb/deployment/deploy_lb.diff | 281 - org.glite.lb/doc/README.lb4vdt | 16 - org.glite.lb/doc/perf_clear_proxy | 1 - org.glite.lb/doc/perf_purge | 1 - org.glite.lb/doc/perf_reg_jobs | 1 - org.glite.lb/doc/perf_results/il_sci_09062006.txt | 63 - .../doc/perf_results/il_sci_09062006_01.txt | 129 - org.glite.lb/doc/perf_results/il_sci_12062006.txt | 65 - .../doc/perf_results/ll_michal_21062006.txt | 20 - .../perf_results/proxy2serv_umbar2sci_22062006.txt | 20 - .../perf_results/proxy2serv_umbar2sci_23062006.txt | 25 - .../doc/perf_results/proxy_sci_09062006.txt | 21 - org.glite.lb/doc/perf_run_interlogd | 1 - org.glite.lb/doc/perf_run_proxy | 1 - org.glite.lb/doc/perf_run_server | 1 - org.glite.lb/doc/perf_run_test | 1 - org.glite.lb/egee_license_check.sh | 304 -- org.glite.lb/etics-tag-branch.pl | 172 - org.glite.lb/etics-tag-consistency.pl | 136 - org.glite.lb/etics-tag-with-subsystems-branch.pl | 199 - org.glite.lb/etics-tag-with-subsystems.pl | 312 -- org.glite.lb/etics-tag.pl | 321 -- org.glite.lb/lb4vdt/LB_install.sh | 129 - org.glite.lb/lb4vdt/Makefile.inc | 77 - .../lb4vdt/scripts/org.gridsite.core.build | 11 - org.glite.lb/project/build.number | 2 - org.glite.lb/project/build.properties | 2 - org.glite.lb/project/glite.lb.csf.xml | 398 -- org.glite.lb/project/package.description | 1 - org.glite.lb/project/package.summary | 1 - org.glite.lb/project/properties.xml | 55 - org.glite.lb/project/run-workspace | 10 - org.glite.lb/project/taskdefs.xml | 32 - org.glite.lb/project/version.properties | 3 - org.glite.lbjp-common.db/.cvsignore | 3 - org.glite.lbjp-common.db/LICENSE | 69 - org.glite.lbjp-common.db/Makefile | 205 - org.glite.lbjp-common.db/configure | 843 --- org.glite.lbjp-common.db/doc/C.dox | 16 - org.glite.lbjp-common.db/examples/db_expire.c | 164 - org.glite.lbjp-common.db/examples/db_test.c | 279 - org.glite.lbjp-common.db/interface/db-int.h | 78 - org.glite.lbjp-common.db/interface/db.h | 424 -- org.glite.lbjp-common.db/project/ChangeLog | 56 - org.glite.lbjp-common.db/project/get_soname.sh | 39 - .../project/package.description | 1 - org.glite.lbjp-common.db/project/package.summary | 1 - .../project/version.properties | 3 - org.glite.lbjp-common.db/src/db-mysql.c | 1139 ---- org.glite.lbjp-common.db/src/db-pg.c | 628 --- org.glite.lbjp-common.db/src/db.c | 452 -- org.glite.lbjp-common.db/test/timezone.cpp | 162 - org.glite.lbjp-common.jp-interface/Makefile | 104 - org.glite.lbjp-common.jp-interface/build.xml | 100 - org.glite.lbjp-common.jp-interface/configure | 843 --- .../interface/attr.h | 49 - .../interface/backend.h | 131 - .../interface/builtin_plugins.h | 25 - .../interface/context.h | 43 - .../interface/file_plugin.h | 103 - .../interface/indexdb.h | 76 - .../interface/known_attr.h | 58 - .../interface/type_plugin.h | 91 - .../interface/types.h | 83 - .../project/ChangeLog | 27 - .../project/package.description | 2 - .../project/package.summary | 1 - .../project/version.properties | 3 - org.glite.lbjp-common.jp-interface/src/attr.c | 308 -- org.glite.lbjp-common.jp-interface/src/context.c | 162 - org.glite.lbjp-common.jp-interface/src/indexdb.c | 88 - org.glite.lbjp-common.jp-interface/src/utils.c | 80 - .../test/type_test.cpp | 219 - org.glite.lbjp-common.log/LICENSE | 69 - org.glite.lbjp-common.log/Makefile | 87 - org.glite.lbjp-common.log/README | 18 - org.glite.lbjp-common.log/config/log4crc | 39 - org.glite.lbjp-common.log/config/log4crc.debugging | 37 - org.glite.lbjp-common.log/configure | 843 --- org.glite.lbjp-common.log/project/ChangeLog | 14 - .../project/package.description | 1 - org.glite.lbjp-common.log/project/package.summary | 1 - .../project/version.properties | 4 - org.glite.lbjp-common.log/src/log.c | 146 - org.glite.lbjp-common.log/src/log.h | 122 - org.glite.lbjp-common.maildir/.cvsignore | 1 - org.glite.lbjp-common.maildir/Makefile | 104 - org.glite.lbjp-common.maildir/configure | 843 --- org.glite.lbjp-common.maildir/interface/maildir.h | 43 - org.glite.lbjp-common.maildir/project/ChangeLog | 19 - .../project/package.description | 1 - .../project/package.summary | 1 - .../project/version.properties | 3 - org.glite.lbjp-common.maildir/src/maildir.c | 417 -- org.glite.lbjp-common.server-bones/.cvsignore | 1 - org.glite.lbjp-common.server-bones/Makefile | 97 - org.glite.lbjp-common.server-bones/configure | 843 --- .../examples/cnt_example.c | 196 - .../examples/srv_example.c | 241 - .../interface/srvbones.h | 117 - .../project/ChangeLog | 21 - .../project/package.description | 2 - .../project/package.summary | 1 - .../project/version.properties | 3 - org.glite.lbjp-common.server-bones/src/srvbones.c | 806 --- org.glite.lbjp-common.trio/.cvsignore | 1 - org.glite.lbjp-common.trio/LICENSE | 69 - org.glite.lbjp-common.trio/Makefile | 114 - org.glite.lbjp-common.trio/configure | 843 --- org.glite.lbjp-common.trio/interface/escape.h | 76 - org.glite.lbjp-common.trio/interface/trio.h | 187 - org.glite.lbjp-common.trio/project/ChangeLog | 27 - .../project/package.description | 2 - org.glite.lbjp-common.trio/project/package.summary | 1 - .../project/version.properties | 3 - org.glite.lbjp-common.trio/src/escape.c | 243 - org.glite.lbjp-common.trio/src/strio.c | 581 -- org.glite.lbjp-common.trio/src/strio.h | 227 - org.glite.lbjp-common.trio/src/trio.c | 5705 -------------------- org.glite.lbjp-common.trio/src/triop.h | 138 - org.glite.lbjp-common.trio/test/trio_test.cpp | 103 - org.glite.lbjp-common/project/version.properties | 3 - 766 files changed, 151947 deletions(-) delete mode 100644 org.glite.jobid.api-c/Makefile delete mode 100755 org.glite.jobid.api-c/configure delete mode 100755 org.glite.jobid.api-c/interface/cjobid.h delete mode 100755 org.glite.jobid.api-c/interface/strmd5.h delete mode 100644 org.glite.jobid.api-c/project/ChangeLog delete mode 100644 org.glite.jobid.api-c/project/package.description delete mode 100644 org.glite.jobid.api-c/project/package.summary delete mode 100644 org.glite.jobid.api-c/project/version.properties delete mode 100644 org.glite.jobid.api-c/src/cjobid.c delete mode 100644 org.glite.jobid.api-c/src/md32_common.h delete mode 100644 org.glite.jobid.api-c/src/md5.h delete mode 100644 org.glite.jobid.api-c/src/md5_dgst.c delete mode 100644 org.glite.jobid.api-c/src/md5_locl.h delete mode 100755 org.glite.jobid.api-c/src/strmd5.c delete mode 100644 org.glite.jobid.api-c/test/base64_test.cpp delete mode 100644 org.glite.jobid.api-cpp/Makefile delete mode 100755 org.glite.jobid.api-cpp/configure delete mode 100755 org.glite.jobid.api-cpp/interface/JobId.h delete mode 100644 org.glite.jobid.api-cpp/project/ChangeLog delete mode 100644 org.glite.jobid.api-cpp/project/package.description delete mode 100644 org.glite.jobid.api-cpp/project/package.summary delete mode 100644 org.glite.jobid.api-cpp/project/version.properties delete mode 100644 org.glite.jobid.api-java/Makefile delete mode 100755 org.glite.jobid.api-java/build.xml delete mode 100755 org.glite.jobid.api-java/configure delete mode 100755 org.glite.jobid.api-java/nbproject/build-impl.xml delete mode 100755 org.glite.jobid.api-java/nbproject/genfiles.properties delete mode 100644 org.glite.jobid.api-java/nbproject/private/config.properties delete mode 100755 org.glite.jobid.api-java/nbproject/private/private.properties delete mode 100644 org.glite.jobid.api-java/nbproject/private/private.xml delete mode 100755 org.glite.jobid.api-java/nbproject/project.properties delete mode 100755 org.glite.jobid.api-java/nbproject/project.xml delete mode 100644 org.glite.jobid.api-java/project/ChangeLog delete mode 100644 org.glite.jobid.api-java/project/package.description delete mode 100644 org.glite.jobid.api-java/project/package.summary delete mode 100644 org.glite.jobid.api-java/project/version.properties delete mode 100644 org.glite.jobid.api-java/src/org/glite/jobid/ExampleJobid.java delete mode 100644 org.glite.jobid.api-java/src/org/glite/jobid/Jobid.java delete mode 100644 org.glite.jobid/project/version.properties delete mode 100644 org.glite.lb.client-java/Makefile delete mode 100755 org.glite.lb.client-java/configure delete mode 100644 org.glite.lb.client-java/examples/CreamTest.java delete mode 100644 org.glite.lb.client-java/examples/NotificationExample.java delete mode 100644 org.glite.lb.client-java/examples/ProducerTestIL.java delete mode 100644 org.glite.lb.client-java/examples/ProducerTestLL.java delete mode 100644 org.glite.lb.client-java/examples/QueryDemo.java delete mode 100644 org.glite.lb.client-java/examples/SSLClient.java delete mode 100644 org.glite.lb.client-java/examples/SSLServer.java delete mode 100644 org.glite.lb.client-java/examples/SimpleLLTest.java delete mode 100644 org.glite.lb.client-java/project/ChangeLog delete mode 100644 org.glite.lb.client-java/project/genEventTypes.pl delete mode 100644 org.glite.lb.client-java/project/package.description delete mode 100644 org.glite.lb.client-java/project/package.summary delete mode 100644 org.glite.lb.client-java/project/version.properties delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/Context.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/ContextDirect.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/ContextIL.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/ContextLL.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/Escape.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/Event.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/EventConvertor.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/ILFileWriter.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/ILProto.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/Job.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/LBCredentials.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/LBException.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/Level.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/NotifParser.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/Notification.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/SSL.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/SSLSend.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/SeqCode.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/ServerConnection.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/Sources.java delete mode 100644 org.glite.lb.client-java/src/org/glite/lb/Timeval.java delete mode 100755 org.glite.lb.client-java/src_c/Makefile delete mode 100755 org.glite.lb.client-java/src_c/send_via_proxy.c delete mode 100755 org.glite.lb.client-java/src_c/send_via_socket.c delete mode 100644 org.glite.lb.client/.cvsignore delete mode 100644 org.glite.lb.client/LICENSE delete mode 100644 org.glite.lb.client/Makefile delete mode 100755 org.glite.lb.client/build.xml delete mode 100755 org.glite.lb.client/configure delete mode 100644 org.glite.lb.client/doc/README-notify delete mode 100644 org.glite.lb.client/doc/glite-lb-dump.8 delete mode 100644 org.glite.lb.client/doc/glite-lb-load.8 delete mode 100644 org.glite.lb.client/doc/glite-lb-logevent.1 delete mode 100644 org.glite.lb.client/doc/glite-lb-notify.1 delete mode 100644 org.glite.lb.client/examples/Makefile delete mode 100644 org.glite.lb.client/examples/README.examples delete mode 100644 org.glite.lb.client/examples/abort_job.c delete mode 100644 org.glite.lb.client/examples/aborted.l delete mode 100644 org.glite.lb.client/examples/aborted_ft.l delete mode 100644 org.glite.lb.client/examples/cancelled.l delete mode 100644 org.glite.lb.client/examples/change_acl.c delete mode 100644 org.glite.lb.client/examples/chkpt.l delete mode 100644 org.glite.lb.client/examples/cleared.l delete mode 100644 org.glite.lb.client/examples/cream_done.l delete mode 100644 org.glite.lb.client/examples/cream_failed.l delete mode 100644 org.glite.lb.client/examples/cream_idle.l delete mode 100644 org.glite.lb.client/examples/cream_pending.l delete mode 100644 org.glite.lb.client/examples/cream_reallyrunning.l delete mode 100644 org.glite.lb.client/examples/cream_registered.l delete mode 100644 org.glite.lb.client/examples/cream_running.l delete mode 100644 org.glite.lb.client/examples/dagids.c delete mode 100644 org.glite.lb.client/examples/done.l delete mode 100644 org.glite.lb.client/examples/done_dag.l delete mode 100644 org.glite.lb.client/examples/done_failed_events.c delete mode 100644 org.glite.lb.client/examples/done_ft.l delete mode 100644 org.glite.lb.client/examples/done_subjob.l delete mode 100644 org.glite.lb.client/examples/failed_dag.l delete mode 100644 org.glite.lb.client/examples/failed_subjob.l delete mode 100644 org.glite.lb.client/examples/feed_shark.c delete mode 100644 org.glite.lb.client/examples/flood_proxy.c delete mode 100755 org.glite.lb.client/examples/gen_begin delete mode 100755 org.glite.lb.client/examples/gen_sample_job delete mode 100755 org.glite.lb.client/examples/job-status.pl delete mode 100644 org.glite.lb.client/examples/job_log.c delete mode 100644 org.glite.lb.client/examples/job_reg.c delete mode 100644 org.glite.lb.client/examples/job_status.c delete mode 100644 org.glite.lb.client/examples/log_usertag_proxy.c delete mode 100644 org.glite.lb.client/examples/multiple_user_jobs.c delete mode 100755 org.glite.lb.client/examples/notify.pl delete mode 100644 org.glite.lb.client/examples/parse_eventsfile.c delete mode 100644 org.glite.lb.client/examples/purge_test delete mode 100644 org.glite.lb.client/examples/query_ext.c delete mode 100644 org.glite.lb.client/examples/query_seq_code.c delete mode 100644 org.glite.lb.client/examples/ready.l delete mode 100644 org.glite.lb.client/examples/ready_dag.l delete mode 100644 org.glite.lb.client/examples/ready_subjob.l delete mode 100644 org.glite.lb.client/examples/resubmission.l delete mode 100644 org.glite.lb.client/examples/resubmitted.l delete mode 100644 org.glite.lb.client/examples/running.l delete mode 100644 org.glite.lb.client/examples/running_dag.l delete mode 100644 org.glite.lb.client/examples/running_ft.l delete mode 100644 org.glite.lb.client/examples/running_subjob.l delete mode 100644 org.glite.lb.client/examples/sandbox_transfers.sh delete mode 100644 org.glite.lb.client/examples/scheduled.l delete mode 100644 org.glite.lb.client/examples/scheduled_dag.l delete mode 100644 org.glite.lb.client/examples/scheduled_subjob.l delete mode 100644 org.glite.lb.client/examples/shallow_and_full_resub.l delete mode 100644 org.glite.lb.client/examples/shallow_resub_complex.l delete mode 100644 org.glite.lb.client/examples/shallow_resub_simple.l delete mode 100644 org.glite.lb.client/examples/shallow_resub_simple2.l delete mode 100644 org.glite.lb.client/examples/stats.c delete mode 100644 org.glite.lb.client/examples/stress_context.c delete mode 100644 org.glite.lb.client/examples/stresslog.c delete mode 100644 org.glite.lb.client/examples/submitted.l delete mode 100644 org.glite.lb.client/examples/submitted_dag.l delete mode 100644 org.glite.lb.client/examples/submitted_ft_reg.l delete mode 100644 org.glite.lb.client/examples/submitted_subjob.l delete mode 100644 org.glite.lb.client/examples/test_changed_jdl.c delete mode 100755 org.glite.lb.client/examples/test_notif_rotate.pl delete mode 100644 org.glite.lb.client/examples/ulmfields.pl delete mode 100755 org.glite.lb.client/examples/user-jobs.pl delete mode 100644 org.glite.lb.client/examples/user_jobs.c delete mode 100644 org.glite.lb.client/examples/user_jobs_threaded.c delete mode 100644 org.glite.lb.client/examples/waiting.l delete mode 100644 org.glite.lb.client/examples/waiting_dag.l delete mode 100644 org.glite.lb.client/examples/waiting_subjob.l delete mode 100644 org.glite.lb.client/examples/webservices/java-trustmanager/Makefile delete mode 100644 org.glite.lb.client/examples/webservices/java-trustmanager/README delete mode 100644 org.glite.lb.client/examples/webservices/java-trustmanager/src/LBClientTM.java delete mode 100644 org.glite.lb.client/examples/webservices/java/Makefile delete mode 100644 org.glite.lb.client/examples/webservices/java/README delete mode 100644 org.glite.lb.client/examples/webservices/java/src/ExampleSSLSocketFactory.java delete mode 100644 org.glite.lb.client/examples/webservices/java/src/LBClientExample.java delete mode 100644 org.glite.lb.client/examples/webservices/java/src/MyX509KeyManager.java delete mode 100644 org.glite.lb.client/examples/webservices/java/src/MyX509TrustManager.java delete mode 100644 org.glite.lb.client/examples/webservices/java/src/log4j.properties delete mode 100644 org.glite.lb.client/interface/Event.h.T delete mode 100644 org.glite.lb.client/interface/Job.h delete mode 100644 org.glite.lb.client/interface/JobStatus.h.T delete mode 100644 org.glite.lb.client/interface/Notification.h delete mode 100644 org.glite.lb.client/interface/ServerConnection.h delete mode 100644 org.glite.lb.client/interface/connection.h delete mode 100644 org.glite.lb.client/interface/consumer.h delete mode 100644 org.glite.lb.client/interface/notification.h delete mode 100644 org.glite.lb.client/interface/prod_proto.h delete mode 100644 org.glite.lb.client/interface/producer.h.T delete mode 100644 org.glite.lb.client/interface/stat_fields.h delete mode 100644 org.glite.lb.client/interface/statistics.h delete mode 100644 org.glite.lb.client/m4/glite_lb.m4 delete mode 100644 org.glite.lb.client/project/.cvsignore delete mode 100644 org.glite.lb.client/project/ChangeLog delete mode 100644 org.glite.lb.client/project/build.number delete mode 100644 org.glite.lb.client/project/build.properties delete mode 100644 org.glite.lb.client/project/configure.properties.xml delete mode 100644 org.glite.lb.client/project/package.description delete mode 100644 org.glite.lb.client/project/package.summary delete mode 100755 org.glite.lb.client/project/properties.xml delete mode 100644 org.glite.lb.client/project/tar_exclude delete mode 100644 org.glite.lb.client/project/version.properties delete mode 100644 org.glite.lb.client/src/Event.cpp.T delete mode 100644 org.glite.lb.client/src/EventAttrNames.pl delete mode 100644 org.glite.lb.client/src/Job.cpp delete mode 100644 org.glite.lb.client/src/JobStatus.cpp.T delete mode 100644 org.glite.lb.client/src/Notification.cpp delete mode 100644 org.glite.lb.client/src/ServerConnection.cpp delete mode 100644 org.glite.lb.client/src/StatusAttrNames.pl delete mode 100644 org.glite.lb.client/src/args.c.T delete mode 100644 org.glite.lb.client/src/args.h delete mode 100644 org.glite.lb.client/src/connection.c delete mode 100644 org.glite.lb.client/src/consumer.c delete mode 100644 org.glite.lb.client/src/export.sh delete mode 100644 org.glite.lb.client/src/logevent.c.T delete mode 100644 org.glite.lb.client/src/notification.c delete mode 100644 org.glite.lb.client/src/notify.c delete mode 100644 org.glite.lb.client/src/perftest_jobreg.c delete mode 100755 org.glite.lb.client/src/perftest_jobreg.sh delete mode 100644 org.glite.lb.client/src/perftest_logjobs.c delete mode 100644 org.glite.lb.client/src/perftest_query.sh delete mode 100644 org.glite.lb.client/src/prod_proto.c delete mode 100644 org.glite.lb.client/src/producer.c delete mode 100644 org.glite.lb.client/src/register_sandbox.c delete mode 100644 org.glite.lb.client/src/stat_fields.cpp delete mode 100644 org.glite.lb.client/src/statistics.c delete mode 100644 org.glite.lb.client/src/uiwrap.T delete mode 100644 org.glite.lb.client/src/uiwrap.c.T delete mode 100644 org.glite.lb.client/test/PLOT delete mode 100755 org.glite.lb.client/test/TEST delete mode 100644 org.glite.lb.client/test/prod_proto_test.c delete mode 100644 org.glite.lb.client/test/producer_test.cpp delete mode 100644 org.glite.lb.doc/GGUS19469-reply.txt delete mode 100644 org.glite.lb.doc/LICENSE delete mode 100644 org.glite.lb.doc/Makefile delete mode 100755 org.glite.lb.doc/configure delete mode 100644 org.glite.lb.doc/examples/Makefile delete mode 100644 org.glite.lb.doc/examples/README delete mode 100644 org.glite.lb.doc/examples/README.queries delete mode 100644 org.glite.lb.doc/examples/cons_example1.c delete mode 100644 org.glite.lb.doc/examples/cons_example1.cpp delete mode 100644 org.glite.lb.doc/examples/cons_example2.c delete mode 100644 org.glite.lb.doc/examples/cons_example2.cpp delete mode 100644 org.glite.lb.doc/examples/cons_example3.c delete mode 100644 org.glite.lb.doc/examples/cons_example3.cpp delete mode 100644 org.glite.lb.doc/examples/example1.c delete mode 100644 org.glite.lb.doc/examples/notif_example.c delete mode 100644 org.glite.lb.doc/examples/prod_example1.c delete mode 100644 org.glite.lb.doc/examples/util.C delete mode 100644 org.glite.lb.doc/examples/util.c delete mode 100644 org.glite.lb.doc/project/ChangeLog delete mode 100644 org.glite.lb.doc/project/package.description delete mode 100644 org.glite.lb.doc/project/package.summary delete mode 100644 org.glite.lb.doc/project/version.properties delete mode 100644 org.glite.lb.doc/src/LBAG-Abstract.tex delete mode 100644 org.glite.lb.doc/src/LBAG-Installation.tex delete mode 100644 org.glite.lb.doc/src/LBAG-Introduction.tex delete mode 100644 org.glite.lb.doc/src/LBAG-Running.tex delete mode 100644 org.glite.lb.doc/src/LBAG-Troubleshooting.tex delete mode 100644 org.glite.lb.doc/src/LBAG.tex delete mode 100644 org.glite.lb.doc/src/LBDG-Abstract.tex delete mode 100644 org.glite.lb.doc/src/LBDG-Introduction.tex delete mode 100644 org.glite.lb.doc/src/LBDG.tex delete mode 100644 org.glite.lb.doc/src/LBTP-Abstract.tex delete mode 100644 org.glite.lb.doc/src/LBTP-IntegrationTests.tex delete mode 100644 org.glite.lb.doc/src/LBTP-InterTests.tex delete mode 100644 org.glite.lb.doc/src/LBTP-Introduction.tex delete mode 100644 org.glite.lb.doc/src/LBTP-PerfTests.tex delete mode 100644 org.glite.lb.doc/src/LBTP-Tests.tex delete mode 100644 org.glite.lb.doc/src/LBTP.tex delete mode 100644 org.glite.lb.doc/src/LBUG-Abstract.tex delete mode 100644 org.glite.lb.doc/src/LBUG-Appendix.tex delete mode 100644 org.glite.lb.doc/src/LBUG-Introduction.tex delete mode 100644 org.glite.lb.doc/src/LBUG-Tools.tex delete mode 100644 org.glite.lb.doc/src/LBUG-Troubleshooting.tex delete mode 100644 org.glite.lb.doc/src/LBUG.tex delete mode 100644 org.glite.lb.doc/src/README delete mode 100644 org.glite.lb.doc/src/README-standards.txt delete mode 100644 org.glite.lb.doc/src/change_acl.tex delete mode 100644 org.glite.lb.doc/src/components.tex delete mode 100644 org.glite.lb.doc/src/consumer_api.tex delete mode 100644 org.glite.lb.doc/src/copyright.tex delete mode 100644 org.glite.lb.doc/src/definitions.tex delete mode 100644 org.glite.lb.doc/src/doxygen.sty delete mode 100644 org.glite.lb.doc/src/doxyhack.tex delete mode 100644 org.glite.lb.doc/src/egee.cls delete mode 100644 org.glite.lb.doc/src/events.tex.T delete mode 100644 org.glite.lb.doc/src/frontmatter.tex delete mode 100755 org.glite.lb.doc/src/images/LB-components-LB-WMS.pdf delete mode 100644 org.glite.lb.doc/src/images/LB-components-gather.pdf delete mode 100644 org.glite.lb.doc/src/images/LB-components-query.pdf delete mode 100755 org.glite.lb.doc/src/images/LB-components.pdf delete mode 100644 org.glite.lb.doc/src/images/cesnet.pdf delete mode 100644 org.glite.lb.doc/src/images/egee.pdf delete mode 100644 org.glite.lb.doc/src/images/glite.pdf delete mode 100644 org.glite.lb.doc/src/images/isi.pdf delete mode 100644 org.glite.lb.doc/src/images/seqtree.pdf delete mode 100644 org.glite.lb.doc/src/images/wms2-jobstat.pdf delete mode 100644 org.glite.lb.doc/src/lbjp.bib delete mode 100644 org.glite.lb.doc/src/listings.sty delete mode 100644 org.glite.lb.doc/src/log_usertag.tex delete mode 100644 org.glite.lb.doc/src/logevent.tex delete mode 100644 org.glite.lb.doc/src/lstdoc.sty delete mode 100644 org.glite.lb.doc/src/lstlang1.sty delete mode 100644 org.glite.lb.doc/src/lstlang2.sty delete mode 100644 org.glite.lb.doc/src/lstlang3.sty delete mode 100644 org.glite.lb.doc/src/lstmisc.sty delete mode 100644 org.glite.lb.doc/src/lstpatch.sty delete mode 100644 org.glite.lb.doc/src/notification_api.tex delete mode 100644 org.glite.lb.doc/src/notify.tex delete mode 100644 org.glite.lb.doc/src/producer_api.tex delete mode 100644 org.glite.lb.doc/src/status.tex.T delete mode 100644 org.glite.lb.doc/src/versions.tex delete mode 100644 org.glite.lb.doc/src/web_services.tex delete mode 100644 org.glite.lb.glite-LB/Makefile delete mode 100755 org.glite.lb.glite-LB/configure delete mode 100644 org.glite.lb.glite-LB/project/ChangeLog delete mode 100644 org.glite.lb.glite-LB/project/package.description delete mode 100644 org.glite.lb.glite-LB/project/package.summary delete mode 100644 org.glite.lb.glite-LB/project/version.properties delete mode 100644 org.glite.lb.harvester/Makefile delete mode 100755 org.glite.lb.harvester/configure delete mode 100644 org.glite.lb.harvester/doc/INSTALL delete mode 100644 org.glite.lb.harvester/doc/README delete mode 100644 org.glite.lb.harvester/doc/glite-lb-harvester.sgml delete mode 100755 org.glite.lb.harvester/examples/test.sh delete mode 100644 org.glite.lb.harvester/examples/test.sql delete mode 100644 org.glite.lb.harvester/project/ChangeLog delete mode 100644 org.glite.lb.harvester/project/package.description delete mode 100644 org.glite.lb.harvester/project/package.summary delete mode 100644 org.glite.lb.harvester/project/version.properties delete mode 100644 org.glite.lb.harvester/src/harvester.c delete mode 100644 org.glite.lb.logger/.cvsignore delete mode 100644 org.glite.lb.logger/LICENSE delete mode 100644 org.glite.lb.logger/Makefile delete mode 100755 org.glite.lb.logger/build.xml delete mode 100644 org.glite.lb.logger/config/glite-lb-logger.config.xml delete mode 100644 org.glite.lb.logger/config/glite-lb-logger.default-properties delete mode 100755 org.glite.lb.logger/config/startup delete mode 100755 org.glite.lb.logger/configure delete mode 100644 org.glite.lb.logger/doc/glite-lb-interlogd.8 delete mode 100644 org.glite.lb.logger/doc/glite-lb-logd.8 delete mode 100644 org.glite.lb.logger/project/ChangeLog delete mode 100644 org.glite.lb.logger/project/build.number delete mode 100644 org.glite.lb.logger/project/build.properties delete mode 100644 org.glite.lb.logger/project/configure.properties.xml delete mode 100644 org.glite.lb.logger/project/package.description delete mode 100644 org.glite.lb.logger/project/package.summary delete mode 100755 org.glite.lb.logger/project/properties.xml delete mode 100644 org.glite.lb.logger/project/tar_exclude delete mode 100644 org.glite.lb.logger/project/version.properties delete mode 100644 org.glite.lb.logger/src-nt/Connection.H delete mode 100644 org.glite.lb.logger/src-nt/Connection.cpp delete mode 100644 org.glite.lb.logger/src-nt/EventManager.H delete mode 100644 org.glite.lb.logger/src-nt/EventManager.cpp delete mode 100644 org.glite.lb.logger/src-nt/Exception.H delete mode 100644 org.glite.lb.logger/src-nt/HTTPTransport.H delete mode 100644 org.glite.lb.logger/src-nt/HTTPTransport.cpp delete mode 100644 org.glite.lb.logger/src-nt/InputChannel.H delete mode 100644 org.glite.lb.logger/src-nt/InputChannel.cpp delete mode 100644 org.glite.lb.logger/src-nt/Makefile delete mode 100644 org.glite.lb.logger/src-nt/Message.H delete mode 100644 org.glite.lb.logger/src-nt/MessageStore.H delete mode 100644 org.glite.lb.logger/src-nt/MessageStore.cpp delete mode 100644 org.glite.lb.logger/src-nt/PlainConnection.H delete mode 100644 org.glite.lb.logger/src-nt/PlainConnection.cpp delete mode 100644 org.glite.lb.logger/src-nt/PluginManager.H delete mode 100644 org.glite.lb.logger/src-nt/PluginManager.cpp delete mode 100644 org.glite.lb.logger/src-nt/Properties.H delete mode 100644 org.glite.lb.logger/src-nt/Singleton.H delete mode 100644 org.glite.lb.logger/src-nt/SocketInput.H delete mode 100644 org.glite.lb.logger/src-nt/SocketInput.cpp delete mode 100644 org.glite.lb.logger/src-nt/ThreadPool.H delete mode 100644 org.glite.lb.logger/src-nt/ThreadPool.cpp delete mode 100644 org.glite.lb.logger/src-nt/Transport.H delete mode 100644 org.glite.lb.logger/src-nt/Transport.cpp delete mode 100644 org.glite.lb.logger/src-nt/main.cpp delete mode 100644 org.glite.lb.logger/src-nt/test/EventManagerTest.cpp delete mode 100644 org.glite.lb.logger/src-nt/test/PluginManagerTest.cpp delete mode 100644 org.glite.lb.logger/src-nt/test/SingletonTest.cpp delete mode 100644 org.glite.lb.logger/src-nt/test/ThreadPoolTest.cpp delete mode 100644 org.glite.lb.logger/src-nt/test/test_main.cpp delete mode 100644 org.glite.lb.logger/src/activemq_cpp_plugin.cpp delete mode 100644 org.glite.lb.logger/src/event_queue.c delete mode 100644 org.glite.lb.logger/src/event_store.c delete mode 100644 org.glite.lb.logger/src/event_store_http.c delete mode 100644 org.glite.lb.logger/src/http.c delete mode 100644 org.glite.lb.logger/src/il_error.c delete mode 100644 org.glite.lb.logger/src/il_error.h delete mode 100644 org.glite.lb.logger/src/il_master.c delete mode 100644 org.glite.lb.logger/src/input_queue_socket.c delete mode 100644 org.glite.lb.logger/src/input_queue_socket_http.c delete mode 100644 org.glite.lb.logger/src/interlogd.c delete mode 100644 org.glite.lb.logger/src/interlogd.h delete mode 100644 org.glite.lb.logger/src/logd.c delete mode 100644 org.glite.lb.logger/src/logd_proto.c delete mode 100644 org.glite.lb.logger/src/logd_proto.h delete mode 100644 org.glite.lb.logger/src/perftest_il.sh delete mode 100644 org.glite.lb.logger/src/perftest_ll.sh delete mode 100644 org.glite.lb.logger/src/plugin_mgr.c delete mode 100644 org.glite.lb.logger/src/queue_mgr.c delete mode 100644 org.glite.lb.logger/src/queue_mgr_http.c delete mode 100644 org.glite.lb.logger/src/queue_thread.c delete mode 100644 org.glite.lb.logger/src/recover.c delete mode 100644 org.glite.lb.logger/src/send_event.c delete mode 100644 org.glite.lb.logger/src/send_event_http.c delete mode 100644 org.glite.lb.logger/src/server_msg.c delete mode 100644 org.glite.lb.logger/src/server_msg_http.c delete mode 100644 org.glite.lb.logger/test/IlTestBase.cpp delete mode 100644 org.glite.lb.logger/test/IlTestBase.h delete mode 100644 org.glite.lb.logger/test/event_queueTest.cpp delete mode 100644 org.glite.lb.logger/test/event_storeTest.cpp delete mode 100644 org.glite.lb.logger/test/il_test.cpp delete mode 100644 org.glite.lb.logger/test/input_queue_socketTest.cpp delete mode 100644 org.glite.lb.logger/test/ll_test.cpp delete mode 100644 org.glite.lb.logger/test/logd_proto_test.c delete mode 100644 org.glite.lb.logger/test/server_msgTest.cpp delete mode 100644 org.glite.lb.server/.cvsignore delete mode 100644 org.glite.lb.server/LICENSE delete mode 100644 org.glite.lb.server/Makefile delete mode 100644 org.glite.lb.server/config/glite-lb-dbsetup.sql delete mode 100644 org.glite.lb.server/config/glite-lb-index.conf.template delete mode 100644 org.glite.lb.server/config/glite-lb-migrate_db2version20 delete mode 100755 org.glite.lb.server/config/startup delete mode 100755 org.glite.lb.server/configure delete mode 100644 org.glite.lb.server/doc/glite-lb-bkindex.8 delete mode 100644 org.glite.lb.server/doc/glite-lb-bkserverd.8 delete mode 100644 org.glite.lb.server/doc/glite-lb-mon-db.1 delete mode 100644 org.glite.lb.server/interface/index.h delete mode 100644 org.glite.lb.server/interface/lb_authz.h delete mode 100644 org.glite.lb.server/interface/pretty_print_wrapper.h delete mode 100644 org.glite.lb.server/interface/query.h delete mode 100644 org.glite.lb.server/interface/srv_perf.h delete mode 100644 org.glite.lb.server/interface/store.h delete mode 100644 org.glite.lb.server/project/.cvsignore delete mode 100644 org.glite.lb.server/project/ChangeLog delete mode 100644 org.glite.lb.server/project/build.number delete mode 100644 org.glite.lb.server/project/build.properties delete mode 100644 org.glite.lb.server/project/package.description delete mode 100644 org.glite.lb.server/project/package.summary delete mode 100644 org.glite.lb.server/project/tar_exclude delete mode 100644 org.glite.lb.server/project/version.properties delete mode 100644 org.glite.lb.server/src/authz_policy.c delete mode 100644 org.glite.lb.server/src/authz_policy.h delete mode 100644 org.glite.lb.server/src/bkindex.c delete mode 100644 org.glite.lb.server/src/bkserverd.c delete mode 100644 org.glite.lb.server/src/cond_dump.c delete mode 100644 org.glite.lb.server/src/cond_dump.h delete mode 100644 org.glite.lb.server/src/db_calls.c delete mode 100644 org.glite.lb.server/src/db_calls.h delete mode 100644 org.glite.lb.server/src/db_store.c delete mode 100644 org.glite.lb.server/src/db_supp.c delete mode 100644 org.glite.lb.server/src/db_supp.h delete mode 100644 org.glite.lb.server/src/dump.c delete mode 100644 org.glite.lb.server/src/get_events.c.T delete mode 100644 org.glite.lb.server/src/get_events.h delete mode 100644 org.glite.lb.server/src/il_lbproxy.c delete mode 100644 org.glite.lb.server/src/il_lbproxy.h delete mode 100644 org.glite.lb.server/src/il_notification.c delete mode 100644 org.glite.lb.server/src/il_notification.h delete mode 100644 org.glite.lb.server/src/index.c.T delete mode 100644 org.glite.lb.server/src/index_lex.l delete mode 100644 org.glite.lb.server/src/index_parse.y delete mode 100644 org.glite.lb.server/src/jobstat.c delete mode 100644 org.glite.lb.server/src/jobstat.h delete mode 100644 org.glite.lb.server/src/jobstat_supp.c delete mode 100644 org.glite.lb.server/src/lb_authz.c delete mode 100644 org.glite.lb.server/src/lb_html.c delete mode 100644 org.glite.lb.server/src/lb_html.h delete mode 100644 org.glite.lb.server/src/lb_http.c delete mode 100644 org.glite.lb.server/src/lb_http.h delete mode 100644 org.glite.lb.server/src/lb_proto.c delete mode 100644 org.glite.lb.server/src/lb_proto.h delete mode 100644 org.glite.lb.server/src/lb_rss.c delete mode 100644 org.glite.lb.server/src/lb_rss.h delete mode 100644 org.glite.lb.server/src/lb_text.c delete mode 100644 org.glite.lb.server/src/lb_text.h delete mode 100644 org.glite.lb.server/src/lb_xml_parse.c.T delete mode 100644 org.glite.lb.server/src/lb_xml_parse.h delete mode 100644 org.glite.lb.server/src/lb_xml_parse_V21.c.T delete mode 100644 org.glite.lb.server/src/lb_xml_parse_V21.h delete mode 100644 org.glite.lb.server/src/lcas_lb.c delete mode 100644 org.glite.lb.server/src/load.c delete mode 100644 org.glite.lb.server/src/mon-db.c delete mode 100644 org.glite.lb.server/src/notif_match.c delete mode 100644 org.glite.lb.server/src/notification.c delete mode 100644 org.glite.lb.server/src/openserver.c delete mode 100644 org.glite.lb.server/src/openserver.h delete mode 100755 org.glite.lb.server/src/perftest_proxy.sh delete mode 100644 org.glite.lb.server/src/policy_gram.y delete mode 100644 org.glite.lb.server/src/policy_lex.l delete mode 100644 org.glite.lb.server/src/pretty_print_wrapper.cpp delete mode 100644 org.glite.lb.server/src/purge.h delete mode 100644 org.glite.lb.server/src/query.c delete mode 100644 org.glite.lb.server/src/request.c delete mode 100644 org.glite.lb.server/src/seqcode.c delete mode 100644 org.glite.lb.server/src/server_notification.h delete mode 100644 org.glite.lb.server/src/server_state.c delete mode 100644 org.glite.lb.server/src/server_state.h delete mode 100644 org.glite.lb.server/src/srv_purge.c delete mode 100644 org.glite.lb.server/src/stats.c delete mode 100644 org.glite.lb.server/src/stats.h delete mode 100644 org.glite.lb.server/src/store.c.T delete mode 100644 org.glite.lb.server/src/stored_master.c delete mode 100644 org.glite.lb.server/src/userjobs.c delete mode 100755 org.glite.lb.server/src/write2rgma.c delete mode 100644 org.glite.lb.server/src/ws_fault.c delete mode 100644 org.glite.lb.server/src/ws_fault.h delete mode 100644 org.glite.lb.server/src/ws_lb4agu.c delete mode 100644 org.glite.lb.server/src/ws_query.c delete mode 100644 org.glite.lb.server/src/ws_typemap.dat delete mode 100644 org.glite.lb.server/src/ws_typemap.h delete mode 100644 org.glite.lb.server/src/ws_typeref.c.T delete mode 100644 org.glite.lb.server/src/ws_typeref.h delete mode 100644 org.glite.lb.server/test/oneJob.qry delete mode 100644 org.glite.lb.server/test/test_query_events.cpp delete mode 100644 org.glite.lb.server/test/test_soap_conv.cpp delete mode 100644 org.glite.lb.server/test/test_trans.sh delete mode 100644 org.glite.lb.server/test/test_xml.cpp.T delete mode 100644 org.glite.lb.state-machine/LICENSE delete mode 100644 org.glite.lb.state-machine/Makefile delete mode 100755 org.glite.lb.state-machine/configure delete mode 100644 org.glite.lb.state-machine/interface/intjobstat.h delete mode 100644 org.glite.lb.state-machine/interface/lb-job-attrs.xsd delete mode 100644 org.glite.lb.state-machine/interface/lb-job-attrs2.xsd.T delete mode 100644 org.glite.lb.state-machine/interface/lb-job-record.xsd delete mode 100644 org.glite.lb.state-machine/interface/process_event.h delete mode 100644 org.glite.lb.state-machine/interface/seqcode_aux.h delete mode 100644 org.glite.lb.state-machine/project/ChangeLog delete mode 100644 org.glite.lb.state-machine/project/package.description delete mode 100644 org.glite.lb.state-machine/project/package.summary delete mode 100644 org.glite.lb.state-machine/project/version.properties delete mode 100644 org.glite.lb.state-machine/src/job_attrs.xsl delete mode 100644 org.glite.lb.state-machine/src/job_attrs2.xsl delete mode 100644 org.glite.lb.state-machine/src/jpis_config.xsl delete mode 100644 org.glite.lb.state-machine/src/lb_plugin.c delete mode 100644 org.glite.lb.state-machine/src/process_event.c delete mode 100644 org.glite.lb.state-machine/src/process_event_condor.c delete mode 100644 org.glite.lb.state-machine/src/process_event_cream.c delete mode 100644 org.glite.lb.state-machine/src/process_event_file_transfer.c delete mode 100644 org.glite.lb.state-machine/src/process_event_file_transfer_collection.c delete mode 100644 org.glite.lb.state-machine/src/process_event_pbs.c delete mode 100644 org.glite.lb.state-machine/src/seqcode_aux.c delete mode 100644 org.glite.lb.types/Makefile delete mode 100644 org.glite.lb.types/MultiStruct.pm delete mode 100644 org.glite.lb.types/StructField.pm delete mode 100755 org.glite.lb.types/at3.in delete mode 100755 org.glite.lb.types/check_version.pl delete mode 100755 org.glite.lb.types/configure delete mode 100644 org.glite.lb.types/events.T delete mode 100644 org.glite.lb.types/project/ChangeLog delete mode 100644 org.glite.lb.types/project/package.description delete mode 100644 org.glite.lb.types/project/package.summary delete mode 100644 org.glite.lb.types/project/version.properties delete mode 100644 org.glite.lb.types/status.T delete mode 100644 org.glite.lb.types/types.T delete mode 100755 org.glite.lb.utils/.cvsignore delete mode 100755 org.glite.lb.utils/LICENSE delete mode 100644 org.glite.lb.utils/Makefile delete mode 100644 org.glite.lb.utils/build.xml delete mode 100755 org.glite.lb.utils/configure delete mode 100644 org.glite.lb.utils/doc/README.LB-monitoring delete mode 100644 org.glite.lb.utils/doc/README.LB-statistics delete mode 100644 org.glite.lb.utils/doc/glite-lb-mon.1 delete mode 100644 org.glite.lb.utils/doc/glite-lb-purge.8 delete mode 100644 org.glite.lb.utils/examples/glite-lb-index.conf delete mode 100755 org.glite.lb.utils/examples/glite-lb-statistics-gsi.sh delete mode 100755 org.glite.lb.utils/examples/glite-lb-statistics-rsync.sh delete mode 100755 org.glite.lb.utils/examples/glite-lb-statistics-sftp.sh delete mode 100755 org.glite.lb.utils/examples/glite-lb-statistics.sh delete mode 100644 org.glite.lb.utils/project/ChangeLog delete mode 100644 org.glite.lb.utils/project/build.number delete mode 100755 org.glite.lb.utils/project/build.properties delete mode 100644 org.glite.lb.utils/project/configure.properties.xml delete mode 100644 org.glite.lb.utils/project/package.description delete mode 100644 org.glite.lb.utils/project/package.summary delete mode 100644 org.glite.lb.utils/project/properties.xml delete mode 100644 org.glite.lb.utils/project/tar_exclude delete mode 100755 org.glite.lb.utils/project/version.properties delete mode 100644 org.glite.lb.utils/src/dump.c delete mode 100644 org.glite.lb.utils/src/dump_exporter.c delete mode 100644 org.glite.lb.utils/src/glite-lb-bkpurge-offline.sh delete mode 100644 org.glite.lb.utils/src/load.c delete mode 100644 org.glite.lb.utils/src/mon.c delete mode 100755 org.glite.lb.utils/src/notif-keeper.sh delete mode 100644 org.glite.lb.utils/src/process_attrs.c delete mode 100644 org.glite.lb.utils/src/process_attrs2.c.T delete mode 100644 org.glite.lb.utils/src/purge.c delete mode 100644 org.glite.lb.utils/src/state_history.c delete mode 100644 org.glite.lb.utils/src/statistics.c delete mode 100644 org.glite.lb.ws-interface/.Makefile.swp delete mode 100755 org.glite.lb.ws-interface/.cvsignore delete mode 100755 org.glite.lb.ws-interface/LICENSE delete mode 100644 org.glite.lb.ws-interface/Makefile delete mode 100644 org.glite.lb.ws-interface/build.xml delete mode 100755 org.glite.lb.ws-interface/configure delete mode 100755 org.glite.lb.ws-interface/examples/userjobs.pl delete mode 100644 org.glite.lb.ws-interface/project/ChangeLog delete mode 100644 org.glite.lb.ws-interface/project/build.number delete mode 100755 org.glite.lb.ws-interface/project/build.properties delete mode 100644 org.glite.lb.ws-interface/project/configure.properties.xml delete mode 100644 org.glite.lb.ws-interface/project/package.description delete mode 100644 org.glite.lb.ws-interface/project/package.summary delete mode 100644 org.glite.lb.ws-interface/project/properties.xml delete mode 100644 org.glite.lb.ws-interface/project/tar_exclude delete mode 100755 org.glite.lb.ws-interface/project/version.properties delete mode 100644 org.glite.lb.ws-interface/src/LB.xml delete mode 100644 org.glite.lb.ws-interface/src/LBTypes.xml.T delete mode 100644 org.glite.lb.ws-interface/src/README-lb4agu.txt delete mode 100644 org.glite.lb.ws-interface/src/doc.xml delete mode 100644 org.glite.lb.ws-interface/src/glue2.xsd delete mode 100644 org.glite.lb.ws-interface/src/lb4agu.wsdl delete mode 100644 org.glite.lb.ws-interface/src/puke-ug.xsl delete mode 100644 org.glite.lb.ws-interface/src/puke-wsdl.xsl delete mode 100644 org.glite.lb.ws-test/Makefile delete mode 100755 org.glite.lb.ws-test/configure delete mode 100755 org.glite.lb.ws-test/examples/ws_comlex.pl delete mode 100644 org.glite.lb.ws-test/examples/ws_fault.c delete mode 100644 org.glite.lb.ws-test/examples/ws_fault.h delete mode 100644 org.glite.lb.ws-test/examples/ws_getversion.c delete mode 100755 org.glite.lb.ws-test/examples/ws_getversion.pl delete mode 100644 org.glite.lb.ws-test/examples/ws_joblog.c delete mode 100755 org.glite.lb.ws-test/examples/ws_joblog.pl delete mode 100644 org.glite.lb.ws-test/examples/ws_jobstat.c delete mode 100755 org.glite.lb.ws-test/examples/ws_jobstat.pl delete mode 100644 org.glite.lb.ws-test/examples/ws_lb4agu_GetActivityInfo.c delete mode 100644 org.glite.lb.ws-test/examples/ws_lb4agu_GetActivityStatus.c delete mode 100755 org.glite.lb.ws-test/examples/ws_lb4agu_GetActivityStatus.pl delete mode 100644 org.glite.lb.ws-test/examples/ws_query_ex.c delete mode 100755 org.glite.lb.ws-test/examples/ws_status_history_test.sh delete mode 100644 org.glite.lb.ws-test/examples/ws_typemap.dat delete mode 100644 org.glite.lb.ws-test/project/ChangeLog delete mode 100644 org.glite.lb.ws-test/project/package.description delete mode 100644 org.glite.lb.ws-test/project/package.summary delete mode 100644 org.glite.lb.ws-test/project/version.properties delete mode 100644 org.glite.lb.yaim/Makefile delete mode 100644 org.glite.lb.yaim/config/defaults/glite-lb.pre delete mode 100644 org.glite.lb.yaim/config/functions/config_gip_lb delete mode 100644 org.glite.lb.yaim/config/functions/config_glite_lb delete mode 100644 org.glite.lb.yaim/config/functions/config_info_service_lb delete mode 100644 org.glite.lb.yaim/config/node-info.d/glite-lb delete mode 100644 org.glite.lb.yaim/configure delete mode 100644 org.glite.lb.yaim/project/ChangeLog delete mode 100644 org.glite.lb.yaim/project/package.description delete mode 100644 org.glite.lb.yaim/project/package.summary delete mode 100644 org.glite.lb.yaim/project/version.properties delete mode 100644 org.glite.lb/.cvsignore delete mode 100644 org.glite.lb/LICENSE delete mode 100755 org.glite.lb/build.xml delete mode 100755 org.glite.lb/configure delete mode 100644 org.glite.lb/deployment/README delete mode 100644 org.glite.lb/deployment/deploy_all.diff delete mode 100644 org.glite.lb/deployment/deploy_jp.diff delete mode 100644 org.glite.lb/deployment/deploy_lb.diff delete mode 100644 org.glite.lb/doc/README.lb4vdt delete mode 100644 org.glite.lb/doc/perf_clear_proxy delete mode 100644 org.glite.lb/doc/perf_purge delete mode 100644 org.glite.lb/doc/perf_reg_jobs delete mode 100644 org.glite.lb/doc/perf_results/il_sci_09062006.txt delete mode 100644 org.glite.lb/doc/perf_results/il_sci_09062006_01.txt delete mode 100644 org.glite.lb/doc/perf_results/il_sci_12062006.txt delete mode 100644 org.glite.lb/doc/perf_results/ll_michal_21062006.txt delete mode 100644 org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_22062006.txt delete mode 100644 org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_23062006.txt delete mode 100644 org.glite.lb/doc/perf_results/proxy_sci_09062006.txt delete mode 100644 org.glite.lb/doc/perf_run_interlogd delete mode 100644 org.glite.lb/doc/perf_run_proxy delete mode 100644 org.glite.lb/doc/perf_run_server delete mode 100644 org.glite.lb/doc/perf_run_test delete mode 100644 org.glite.lb/egee_license_check.sh delete mode 100644 org.glite.lb/etics-tag-branch.pl delete mode 100755 org.glite.lb/etics-tag-consistency.pl delete mode 100644 org.glite.lb/etics-tag-with-subsystems-branch.pl delete mode 100755 org.glite.lb/etics-tag-with-subsystems.pl delete mode 100755 org.glite.lb/etics-tag.pl delete mode 100755 org.glite.lb/lb4vdt/LB_install.sh delete mode 100644 org.glite.lb/lb4vdt/Makefile.inc delete mode 100644 org.glite.lb/lb4vdt/scripts/org.gridsite.core.build delete mode 100644 org.glite.lb/project/build.number delete mode 100644 org.glite.lb/project/build.properties delete mode 100644 org.glite.lb/project/glite.lb.csf.xml delete mode 100644 org.glite.lb/project/package.description delete mode 100644 org.glite.lb/project/package.summary delete mode 100755 org.glite.lb/project/properties.xml delete mode 100644 org.glite.lb/project/run-workspace delete mode 100755 org.glite.lb/project/taskdefs.xml delete mode 100644 org.glite.lb/project/version.properties delete mode 100644 org.glite.lbjp-common.db/.cvsignore delete mode 100644 org.glite.lbjp-common.db/LICENSE delete mode 100644 org.glite.lbjp-common.db/Makefile delete mode 100755 org.glite.lbjp-common.db/configure delete mode 100644 org.glite.lbjp-common.db/doc/C.dox delete mode 100644 org.glite.lbjp-common.db/examples/db_expire.c delete mode 100644 org.glite.lbjp-common.db/examples/db_test.c delete mode 100644 org.glite.lbjp-common.db/interface/db-int.h delete mode 100644 org.glite.lbjp-common.db/interface/db.h delete mode 100644 org.glite.lbjp-common.db/project/ChangeLog delete mode 100755 org.glite.lbjp-common.db/project/get_soname.sh delete mode 100644 org.glite.lbjp-common.db/project/package.description delete mode 100644 org.glite.lbjp-common.db/project/package.summary delete mode 100644 org.glite.lbjp-common.db/project/version.properties delete mode 100644 org.glite.lbjp-common.db/src/db-mysql.c delete mode 100644 org.glite.lbjp-common.db/src/db-pg.c delete mode 100644 org.glite.lbjp-common.db/src/db.c delete mode 100644 org.glite.lbjp-common.db/test/timezone.cpp delete mode 100644 org.glite.lbjp-common.jp-interface/Makefile delete mode 100755 org.glite.lbjp-common.jp-interface/build.xml delete mode 100755 org.glite.lbjp-common.jp-interface/configure delete mode 100644 org.glite.lbjp-common.jp-interface/interface/attr.h delete mode 100644 org.glite.lbjp-common.jp-interface/interface/backend.h delete mode 100644 org.glite.lbjp-common.jp-interface/interface/builtin_plugins.h delete mode 100644 org.glite.lbjp-common.jp-interface/interface/context.h delete mode 100644 org.glite.lbjp-common.jp-interface/interface/file_plugin.h delete mode 100644 org.glite.lbjp-common.jp-interface/interface/indexdb.h delete mode 100644 org.glite.lbjp-common.jp-interface/interface/known_attr.h delete mode 100644 org.glite.lbjp-common.jp-interface/interface/type_plugin.h delete mode 100644 org.glite.lbjp-common.jp-interface/interface/types.h delete mode 100644 org.glite.lbjp-common.jp-interface/project/ChangeLog delete mode 100644 org.glite.lbjp-common.jp-interface/project/package.description delete mode 100644 org.glite.lbjp-common.jp-interface/project/package.summary delete mode 100644 org.glite.lbjp-common.jp-interface/project/version.properties delete mode 100644 org.glite.lbjp-common.jp-interface/src/attr.c delete mode 100644 org.glite.lbjp-common.jp-interface/src/context.c delete mode 100644 org.glite.lbjp-common.jp-interface/src/indexdb.c delete mode 100644 org.glite.lbjp-common.jp-interface/src/utils.c delete mode 100644 org.glite.lbjp-common.jp-interface/test/type_test.cpp delete mode 100644 org.glite.lbjp-common.log/LICENSE delete mode 100644 org.glite.lbjp-common.log/Makefile delete mode 100644 org.glite.lbjp-common.log/README delete mode 100644 org.glite.lbjp-common.log/config/log4crc delete mode 100644 org.glite.lbjp-common.log/config/log4crc.debugging delete mode 100755 org.glite.lbjp-common.log/configure delete mode 100644 org.glite.lbjp-common.log/project/ChangeLog delete mode 100644 org.glite.lbjp-common.log/project/package.description delete mode 100644 org.glite.lbjp-common.log/project/package.summary delete mode 100644 org.glite.lbjp-common.log/project/version.properties delete mode 100644 org.glite.lbjp-common.log/src/log.c delete mode 100644 org.glite.lbjp-common.log/src/log.h delete mode 100644 org.glite.lbjp-common.maildir/.cvsignore delete mode 100644 org.glite.lbjp-common.maildir/Makefile delete mode 100755 org.glite.lbjp-common.maildir/configure delete mode 100644 org.glite.lbjp-common.maildir/interface/maildir.h delete mode 100644 org.glite.lbjp-common.maildir/project/ChangeLog delete mode 100644 org.glite.lbjp-common.maildir/project/package.description delete mode 100644 org.glite.lbjp-common.maildir/project/package.summary delete mode 100644 org.glite.lbjp-common.maildir/project/version.properties delete mode 100644 org.glite.lbjp-common.maildir/src/maildir.c delete mode 100644 org.glite.lbjp-common.server-bones/.cvsignore delete mode 100644 org.glite.lbjp-common.server-bones/Makefile delete mode 100755 org.glite.lbjp-common.server-bones/configure delete mode 100644 org.glite.lbjp-common.server-bones/examples/cnt_example.c delete mode 100644 org.glite.lbjp-common.server-bones/examples/srv_example.c delete mode 100644 org.glite.lbjp-common.server-bones/interface/srvbones.h delete mode 100644 org.glite.lbjp-common.server-bones/project/ChangeLog delete mode 100644 org.glite.lbjp-common.server-bones/project/package.description delete mode 100644 org.glite.lbjp-common.server-bones/project/package.summary delete mode 100644 org.glite.lbjp-common.server-bones/project/version.properties delete mode 100644 org.glite.lbjp-common.server-bones/src/srvbones.c delete mode 100644 org.glite.lbjp-common.trio/.cvsignore delete mode 100644 org.glite.lbjp-common.trio/LICENSE delete mode 100644 org.glite.lbjp-common.trio/Makefile delete mode 100755 org.glite.lbjp-common.trio/configure delete mode 100644 org.glite.lbjp-common.trio/interface/escape.h delete mode 100644 org.glite.lbjp-common.trio/interface/trio.h delete mode 100644 org.glite.lbjp-common.trio/project/ChangeLog delete mode 100644 org.glite.lbjp-common.trio/project/package.description delete mode 100644 org.glite.lbjp-common.trio/project/package.summary delete mode 100644 org.glite.lbjp-common.trio/project/version.properties delete mode 100644 org.glite.lbjp-common.trio/src/escape.c delete mode 100644 org.glite.lbjp-common.trio/src/strio.c delete mode 100644 org.glite.lbjp-common.trio/src/strio.h delete mode 100644 org.glite.lbjp-common.trio/src/trio.c delete mode 100644 org.glite.lbjp-common.trio/src/triop.h delete mode 100644 org.glite.lbjp-common.trio/test/trio_test.cpp delete mode 100644 org.glite.lbjp-common/project/version.properties diff --git a/org.glite.jobid.api-c/Makefile b/org.glite.jobid.api-c/Makefile deleted file mode 100644 index 986e2bc..0000000 --- a/org.glite.jobid.api-c/Makefile +++ /dev/null @@ -1,85 +0,0 @@ -# Default values -top_srcdir=.. -stagedir=. -globalprefix=glite -jobidprefix=jobid -package=glite-jobid-api-c -version=0.0.0 - -CC:=gcc -CXX:=g++ - --include Makefile.inc --include ../project/version.properties - -version=${module.version} - -VPATH=${top_srcdir}/src:${top_srcdir}/interface:${top_srcdir}/test -CHECK_VERSION:=VERSION=${version} VERSION_AHEAD=0 perl ${top_srcdir}/project/check_version.pl - -DEBUG:=-g -O0 -Wall - -CFLAGS:=${DEBUG} \ - -I${top_srcdir}/interface -I${top_srcdir}/src \ - ${COVERAGE_FLAGS} \ - -D_GNU_SOURCE - -COMPILE:=libtool --mode=compile ${CC} ${CFLAGS} -CXXCOMPILE:=libtool --mode=compile ${CXX} ${CXXFLAGS} -LINK:=libtool --mode=link ${CC} ${LDFLAGS} -LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS} -INSTALL:=libtool --mode=install install - -LIBOBJS:=cjobid.o strmd5.o -HDRS:=cjobid.h strmd5.h - -LIBLOBJS:=${LIBOBJS:.o=.lo} - -LIB:=libglite_jobid.la - -TEST_LIBS:=-L${cppunit_prefix}/${libdir} -lcppunit -ldl -TEST_INC:=-I${cppunit_prefix}/include - -compile all: ${LIB} - -# In order to use libtool versioning correcty, we must have: -# -# current = major + minor + offset -# revision = patch -# age = minor -# -# where offset is a sum of maximal released minor's of all previous major's -# - -# counted minors: N/A -offset=-1 -version_info:=-version-info ${shell \ - perl -e '$$,=":"; @F=split /\./,"${version}"; print $$F[0]+$$F[1]+${offset},$$F[2],$$F[1]' } - -${LIB}: ${LIBOBJS} - ${LINK} ${version_info} -o $@ ${LIBLOBJS} -rpath ${PREFIX}/${libdir} - -check: compile base64_test - ./base64_test base64_test.xml - -base64_test: %: %.cpp compile - ${CXX} -c ${CFLAGS} ${TEST_INC} $< - ${LINKXX} -o $@ $@.o ${LIB} ${TEST_LIBS} - -clean: - rm -rvf *.o *.lo .libs/ lib* *.c *.cpp *.h - rm -vf base64_test base64_test.xml - rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/ - -install: ${LIB} - mkdir -p ${PREFIX}/${libdir} - mkdir -p ${PREFIX}/include/${globalprefix}/${jobidprefix} - ${INSTALL} -m 644 ${LIB} ${PREFIX}/${libdir} - (cd ${top_srcdir}/interface; ${INSTALL} -m 644 ${HDRS} ${PREFIX}/include/${globalprefix}/${jobidprefix}) - - -%.o: %.c - ${COMPILE} -o $@ -c $< - - -.PHONY: default all compile check install clean diff --git a/org.glite.jobid.api-c/configure b/org.glite.jobid.api-c/configure deleted file mode 100755 index 8188919..0000000 --- a/org.glite.jobid.api-c/configure +++ /dev/null @@ -1,843 +0,0 @@ -#!/usr/bin/perl - -# WARNING: Don't edit this file unless it is the master copy in org.glite.lb -# -# For the purpose of standalone builds of lb/jobid/lbjp-common components -# it is copied on tagging - -# $Header$ -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners/ for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use Getopt::Long; - -my $pwd = `pwd`; chomp $pwd; -my $prefix = $pwd.'/stage'; -my $stagedir; -my $staged; -my $module; -my $thrflavour = 'gcc64dbgpthr'; -my $nothrflavour = 'gcc64dbg'; -my $mode = 'build'; -my $help = 0; -my $listmodules; -my $version; -my $branch; -my $output; -my $lb_tag = ''; -my $lbjp_tag = ''; -my $jp_tag = ''; -my $sec_tag = ''; -my $jobid_tag = ''; -my $libdir = getlibdir(); - -my @nodes = qw/client server logger utils client-java doc ws-test db jpprimary jpindex jpclient harvester/; -my %enable_nodes; -my %disable_nodes; - -my %extern_prefix = ( - cares => '/opt/c-ares', - classads => '/opt/classads', - cppunit => '/usr', - expat => '/usr', - globus => '/opt/globus', - gsoap => '/usr', - mysql => '/usr', - 'mysql-devel' => '', - 'mysql-server' => '', - voms => '/opt/glite', - gridsite => '/opt/glite', - lcas => '/opt/glite', - trustmanager => '/opt/glite', - utiljava => '/opt/glite', - ant => '/usr', - jdk => '/usr', - libtar => '/usr', - axis => '/usr', - log4c => '/usr', - postgresql => '/usr' -); - -my %jar = ( - 'commons-codec' => '/usr/share/java/commons-codec.jar', - 'commons-lang' => '/usr/share/java/commons-lang.jar', -); - - -my %glite_prefix; -my %need_externs; -my %need_externs_type; -my %need_jars; -my %extrafull; -my %extranodmod; -my %deps; -my %deps_type; -my %topbuild; - -my %lbmodules = ( - 'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim glite-LB/], - 'security' => [qw/gss gsoap-plugin/], - 'lbjp-common' => [qw/db log maildir server-bones trio jp-interface/], - 'jobid' => [qw/api-c api-cpp api-java/], - 'jp' => [ qw/client doc index primary server-common ws-interface/ ], - ); - - -my @opts = ( - 'prefix=s' => \$prefix, - 'staged=s' => \$staged, - 'module=s' => \$module, - 'thrflavour=s' => \$thrflavour, - 'nothrflavour=s' => \$nothrflavour, - 'mode=s' => \$mode, - 'listmodules=s' => \$listmodules, - 'version=s' => \$version, - 'branch=s' => \$branch, - 'output=s' => \$output, - 'stage=s' => \$stagedir, - 'lb-tag=s' => \$lb_tag, - 'lbjp-common-tag=s' => \$lbjp_tag, - 'jp-tag=s' => \$jp_tag, - 'security-tag=s' => \$sec_tag, - 'jobid-tag=s' => \$jobid_tag, - 'help' => \$help, - 'libdir=s' => \$libdir, -); - -for (@nodes) { - $enable_nodes{$_} = 0; - $disable_nodes{$_} = 0; - - push @opts,"disable-$_",\$disable_nodes{$_}; - push @opts,"enable-$_",\$enable_nodes{$_}; -} - -push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix; -push @opts,"with-$_=s",\$jar{$_} for keys %jar; - -my @keeparg = @ARGV; - -GetOptions @opts or die "Errors parsing command line\n"; - -$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq ''; -$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq ''; - -if ($help) { usage(); exit 0; } - -if ($listmodules) { - my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}}; - print "@m\n"; - exit 0; -} - -warn "$0: --version, --branch and --output make sense only in --mode=etics\n" - if ($version || $output || $branch) && $mode ne 'etics'; - -my $en; -for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; } - -my $dis; -for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; } - -die "--enable-* and --disable-* are mutually exclusive\n" - if $en && $dis; - -die "--module cannot be used with --enable-* or --disable-*\n" - if $module && ($en || $dis); - -die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}}; - -if ($dis) { - for (@nodes) { - $enable_nodes{$_} = 1 unless $disable_nodes{$_}; - } -} - -if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ; - -for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; } - -$stagedir = $prefix unless $stagedir; - -if ($mode eq 'build') { - print "Writing config.status\n"; - open CONF,">config.status" or die "config.status: $!\n"; - print CONF "$0 @keeparg\n"; - close CONF; -} - - -my @modules; -my %aux; - -if ($module) { -# push @modules,split(/[,.]+/,$module); - push @modules,$module; -} -else { - @modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes)); - - my $n; - - do { - local $"="\n"; - $n = $#modules; - push @modules,(map @{$deps{$_}},@modules); - - undef %aux; @aux{@modules} = (1) x ($#modules+1); - @modules = keys %aux; - } while ($#modules > $n); -} - -@aux{@modules} = (1) x ($#modules+1); -delete $aux{$_} for (split /,/,$staged); -@modules = keys %aux; - -mode_build() if $mode eq 'build'; -mode_checkout() if $mode eq 'checkout'; -mode_etics($module) if $mode eq 'etics'; - -sub mode_build { - print "\nBuilding modules: @modules\n"; - - my @ext = map @{$need_externs{$_}},@modules; - my @myjars = map @{$need_jars{$_}},@modules; - undef %aux; @aux{@ext} = 1; - @ext = keys %aux; - undef %aux; @aux{@myjars} = (1) x ($#myjars+1); - @myjars = keys %aux; - - print "\nRequired externals:\n"; - print "\t$_: $extern_prefix{$_}\n" for @ext; - print "\t$_: $jar{$_}\n" for @myjars; - print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n"; - - mkinc($_) for @modules; - - print "Creating Makefile\n"; - - open MAK,">Makefile" or die "Makefile: $!\n"; - - print MAK "all: @modules\n\nclean:\n"; - - for (@modules) { - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - print MAK "\tcd $full$build && \${MAKE} clean\n" - } - - print MAK "\ndistclean:\n"; - - for (@modules) { - my $full = full($_); - print MAK $topbuild{$_} ? - "\tcd $full$build && \${MAKE} distclean\n" : - "\trm -rf $full$build\n" - } - - print MAK "\n"; - - for (@modules) { - my %ldeps; undef %ldeps; - @ldeps{@{$deps{$_}}} = 1; - for my $x (split /,/,$staged) { delete $ldeps{$x}; } - my @dnames = $module ? () : keys %ldeps; - - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - - print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n"; - } - - close MAK; -} - -sub mode_checkout() { - for (@modules) { - my $module = $_; - my $tag = ""; - if ($lb_tag){ - for (@{$lbmodules{lb}}){ - if ("lb.".$_ eq $module){ - $tag = '-r '.$lb_tag; - } - } - } - if ($lbjp_tag){ - for (@{$lbmodules{'lbjp-common'}}){ - if ("lbjp-common.".$_ eq $module){ - $tag = '-r '.$lbjp_tag; - } - } - } - if ($jp_tag){ - for (@{$lbmodules{'jp'}}){ - if ("jp.".$_ eq $module){ - $tag = '-r '.$jp_tag; - } - } - } - if ($sec_tag){ - for (@{$lbmodules{security}}){ - if ("security.".$_ eq $module){ - $tag = '-r '.$sec_tag; - } - } - } - if ($jobid_tag){ - for (@{$lbmodules{jobid}}){ - if ("jobid.".$_ eq $module){ - $tag = '-r '.$jobid_tag; - } - } - } - #if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){ - # print "found"; - #} - $_ = full($_); - print "\n*** Checking out $_\n"; - system("cvs checkout $tag $_") == 0 or die "cvs checkout $tag $_: $?\n"; - } -} - -BEGIN{ -%need_externs_aux = ( - 'lb.client' => [ qw/cppunit:B classads/ ], - 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava/ ], - 'lb.common' => [ qw/expat cares:B cppunit:B classads/ ], - 'lb.doc' => [], - 'lb.logger' => [ qw/cppunit:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ], - 'lb.state-machine' => [ qw/classads/ ], - 'lb.utils' => [ qw/cppunit:B/ ], - 'lb.ws-interface' => [], - 'lb.ws-test' => [ qw/gsoap:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw// ], - 'lb.yaim' => [ qw/yaim_core:R/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], - 'lbjp-common.db' => [ qw/mysql:B mysql-devel:B postgresql:B cppunit:B log4c:B/ ], - 'lbjp-common.log' => [ qw/log4c/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw// ], - 'lbjp-common.trio' => [ qw/cppunit:B/ ], - 'lbjp-common.jp-interface' => [ qw/cppunit:B log4c:B/ ], - 'security.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B/ ], - 'security.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap:B/ ], - 'jobid.api-c' => [ qw/cppunit:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], - 'jobid.api-java' => [ qw/ant:B jdk:B/ ], - 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], - 'jp.doc' => [], - 'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ], - 'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ], - 'jp.server-common' => [], - 'jp.ws-interface' => [], -); - -for my $ext (keys %need_externs_aux) { - for (@{$need_externs_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$need_externs{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $need_externs_type{$ext}->{$1} = $type; - } -} - -%need_jars = ( - 'jobid.api-java' => [ qw/commons-codec/ ], - 'lb.client-java' => [ qw/commons-lang/ ], -); - -for my $jar (keys %need_jars) { - for (@{$need_jars{$jar}}) { - $need_externs_type{$jar}->{$_} = 'BR'; # XXX - } -} - -%deps_aux = ( - 'lb.client' => [ qw/ - lb.types:B lb.common - lbjp-common.trio - jobid.api-cpp:B jobid.api-c - security.gss - / ], - 'lb.client-java' => [ qw/ - lb.types:B - lb.ws-interface:B - jobid.api-java - / ], - 'lb.common' => [ qw/ - jobid.api-cpp:B jobid.api-c - lb.types:B lbjp-common.trio security.gss - / ], - 'lb.doc' => [ qw/lb.types:B/ ], - 'lb.logger' => [ qw/ - lbjp-common.trio - lbjp-common.log - jobid.api-c - lb.common - security.gss - / ], - 'lb.server' => [ qw/ - lb.ws-interface lb.types:B lb.common lb.state-machine - lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log - jobid.api-c - security.gsoap-plugin security.gss - / ], - 'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ], - 'lb.utils' => [ qw/ - lbjp-common.jp-interface - jobid.api-c - lbjp-common.trio lbjp-common.maildir - lb.client lb.state-machine - / ], - 'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ], - 'lb.ws-interface' => [ qw/lb.types:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw/ - jobid.api-c lbjp-common.trio lbjp-common.db lb.common lb.client - security.gss lbjp-common.log - / ], - 'lb.yaim' => [ qw// ], - 'lb.glite-LB' => [ qw/ - lb.logger:R lb.server:R lb.utils:R lb.doc:R - lb.ws-test:R lb.harvester:R lb.yaim:R - / ], - 'lbjp-common.db' => [ qw/lbjp-common.trio lbjp-common.log/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw/lbjp-common.log/ ], - 'lbjp-common.trio' => [ qw// ], - 'security.gss' => [ qw// ], - 'security.gsoap-plugin' => [ qw/security.gss/ ], - 'jobid.api-c' => [ qw// ], - 'jobid.api-cpp' => [ qw/jobid.api-c/ ], - 'jobid.api-java' => [ qw// ], - - 'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ], - - 'jp.client' => [ qw/ - jp.ws-interface - lbjp-common.jp-interface lbjp-common.maildir - jobid.api-c - security.gsoap-plugin - / ], - 'jp.doc' => [ qw// ], - 'jp.index' => [ qw/ - jp.server-common jp.ws-interface - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.primary' => [ qw/ - jobid.api-c - jp.server-common jp.ws-interface - lb.state-machine - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.server-common' => [ qw/ - lbjp-common.jp-interface lbjp-common.db - / ], - 'jp.ws-interface' => [ qw// ], -); - -for my $ext (keys %deps_aux) { - for (@{$deps_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$deps{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $deps_type{$ext}->{$1} = $type; - } -} - - -%extrafull = ( gridsite=>'org.gridsite.core'); - -#( java => 'client-java' ); -%extranodmod = ( - db => 'lbjp-common.db', - jpprimary => 'jp.primary', - jpindex => 'jp.index', - jpclient => 'jp.client', -); - -%obsoletes = ( - 'lb.yaim' => [ qq/glite-yaim-lb/ ], -); - -my @t = qw/lb.client-java jobid.api-java lb.types/; -@topbuild{@t} = (1) x ($#t+1); -} - -sub full -{ - my $short = shift; - return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short; -} - -sub mkinc -{ - my %aux; - undef %aux; - my @m=qw/ -lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB -security.gss security.gsoap-plugin -jobid.api-c jobid.api-cpp jobid.api-java -lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface -jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface -/; - @aux{@m} = (1) x ($#m+1); - - my $short = shift; - my $full = full $short; - - unless ($aux{$short}) { - print "Makefile.inc not needed in $full\n"; - return; - } - - my $build = ''; - - unless ($topbuild{$_}) { - $build = '/build'; - unless (-d "$full/build") { - mkdir "$full/build" or die "mkdir $full/build: $!\n"; - } - unlink "$full/build/Makefile"; - symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n"; - } - - open MKINC,">$full$build/Makefile.inc" - or die "$full$build/Makefile.inc: $!\n"; - - print "Creating $full$build/Makefile.inc\n"; - - print MKINC qq{ -PREFIX = $prefix -stagedir = $stagedir -thrflavour = $thrflavour -nothrflavour = $nothrflavour -libdir = $libdir -}; - - for (@{$need_externs{$short}}) { - print MKINC "${_}_prefix = $extern_prefix{$_}\n" - } - - for (@{$need_jars{$short}}) { - print MKINC "${_}_jar = $jar{$_}\n" - } - - my $need_gsoap = 0; - for (@{$need_externs{$short}}) { $need_gsoap = 1 if $_ eq 'gsoap'; } - - print MKINC "gsoap_default_version=".gsoap_version()."\n" if $need_gsoap; - - close MKINC; -} - -my %etics_externs; -my %etics_projects; -BEGIN{ - %etics_externs = ( - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - gridsite=>'org.gridsite.shared', - lcas=>'org.glite.security.lcas', - trustmanager=>'org.glite.security.trustmanager', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - yaim_core=>'org.glite.yaim.core', - ); - %etics_projects = ( - vdt=>[qw/globus globus_essentials/], - 'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/], - ); -}; - -sub mode_etics { - $fmod = shift; - - die "$0: --module required with --etics\n" unless $fmod; - - my ($subsys,$module) = split /\./,$fmod; - - my ($major,$minor,$rev,$age); - - if ($version) { - $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/; - ($major,$minor,$rev,$age) = ($1,$2,$3,$4); - } - else { - open V,"org.glite.$subsys.$module/project/version.properties" - or die "org.glite.$subsys.$module/project/version.properties: $!\n"; - - while ($_ = ) { - chomp; - ($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/; - $age = $1 if /module\.age\s*=\s*([[:digit:]]+)/; - } - close V; - } - - my @copts = (); - my %ge; - @ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1); - - for (@{$need_externs{"$subsys.$module"}}) { - if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; - } - } - - for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - push @copts,"--with-$_ \${$eext.location}/$_*.jar"; - } - - my $conf; - my $conftag; - - if ($branch) { - $conf = "glite-${subsys}-${module}_$branch"; - $conftag = $branch; - $dwpath = ""; } - else { - $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - $conftag = $conf; - $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n"; } -# my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - my $file = $output ? $output : "$conf.ini"; - open C,">$file" or die "$file: $!\n"; - - my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build"; - - my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..'; - - my $package_description = ""; - my $package_summary = ""; - - if (-e "org.glite.$subsys.$module/project/package.description") { - open V, "org.glite.$subsys.$module/project/package.description"; - $package_description = join ("", ); - close V; - chomp $package_description; - $package_description =~ s/\n/\\n/g; - $package_description = "package.description = $package_description"; - } - else { - print STDERR "package.description not found for $subsys.$module!\n"; } - - if (-e "org.glite.$subsys.$module/project/package.summary") { - open V, "org.glite.$subsys.$module/project/package.summary"; - $package_summary = join ("", ); - close V; - chomp $package_summary; - $package_summary =~ s/\n/\\n/g; - $package_summary = "package.summary = $package_summary"; - } - else { - print STDERR "package.summary not found for $subsys.$module!\n"; } - - - print STDERR "Writing $file\n"; - print C qq{ -[Configuration-$conf] -profile = None -moduleName = org.glite.$subsys.$module -displayName = $conf -description = org.glite.$subsys.$module -projectName = org.glite -age = $age -deploymentType = None -tag = $conftag -version = $major.$minor.$rev -$dwpath -[Platform-default:VcsCommand] -displayName = None -description = None -tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName} -branch = None -commit = None -checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName} - -[Platform-default:BuildCommand] -postpublish = None -packaging = None -displayName = None -description = None -doc = None -prepublish = None -publish = None -compile = make -init = None -install = make install -clean = make clean -test = make check -configure = cd $confdir && /usr/bin/perl \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts -checkstyle = None - -[Platform-default:Property] -$buildroot -$package_description -$package_summary -}; - for (@{$obsoletes{"$subsys.$module"}}) { - print C "package.obsoletes = $_\n"; - print C "package.replaces = $_\n"; - } - - print C qq{ -[Platform-default:DynamicDependency] -}; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; - } - } - - my $type = $need_externs_type{"$subsys.$module"}->{$_}; - print C "$proj|$eext = $type\n"; - } - - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "org.glite|org.glite.$_ = $type\n"; - } - - close C; -} - -sub gsoap_version { - local $_; - my $gsoap_version; - open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n"; - - while ($_ = ) { - chomp; - - $gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/; - } - close S; - return $gsoap_version; -} - -sub getlibdir { - if ( -e "/etc/debian_version") { # We are on Debian - $lib64="lib"; - $lib32="lib32"; } - else { # Another distribution - $lib64="lib64"; - $lib32="lib"; } - $libdir=$lib32; - - open INP, "uname -s | "; # Check kernel name - $kname= ; - chomp($kname); - close INP; - - if ( $kname == "Linux") { - $arch = ("x86_64\npowerpc\nppc64\n"); - - open INP, "uname -p | "; # Check processor type - $procname= ; - chomp($procname); - close INP; - - if ($arch =~/^$procname\n/) { - return ($lib64); } - - open INP, "uname -m | "; # Check machine hardware - $machname= ; - chomp($machname); - close INP; - - if ($arch =~/^$machname\n/) { - return ($lib64); } - - # special cases (hyperlink lib64, Debian) - if (-l "/usr/lib64") { - $libdir=$lib32; } - - # if /usr/lib64 doesn't exist at all (AIX) - unless ( -e "/usr/lib64" ) { - $libdir=$lib32; } - } - - if ( $kname == "SunOS") { - if (-e "/usr/lib/64") { - $libdir="lib/64"; } - } - - return $libdir; -} - -sub usage { - my @ext = keys %extern_prefix; - my @myjars, keys %jar; - - print STDERR qq{ -usage: $0 options - -General options (defaults in []): - --prefix=PREFIX destination directory [./stage] - --staged=module,module,... what is already in PREFIX (specify without org.glite.) - --thrflavour=flavour - --nothrflavour=flavour threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg] - --listmodules=subsys list modules of a subsystem - --libdir=libdir typically [lib,lib64] postfix - -Mode of operation: - --mode={checkout|build|etics} what to do [build] - -What to build: - --module=module build this module only (mostly in-Etics operation) - --enable-NODE build this "node" (set of modules) only. Available nodes are - @{$lbmodules{lb}},@{$lbmodules{security}} - --disable-NODE don't build this node - --lb-tag=tag checkout LB modules with specific tag - --jp-tag=tag checkout JP modules with specific tag - --lbjp-common-tag=tag checkout lbjp-common modules with specific tag - --security-tag=tag checkout security modules with specific tag - --jobid-tag=tag checkout jobid modules with specific tag - -Dependencies: - --with-EXTERNAL=PATH where to look for an external. Required externals - (not all for all modules) are: - @ext - --with-JAR=JAR where to look for jars. Required jars are: - @myjars - Summary of what will be used is always printed - -}; - -} diff --git a/org.glite.jobid.api-c/interface/cjobid.h b/org.glite.jobid.api-c/interface/cjobid.h deleted file mode 100755 index 0945d24..0000000 --- a/org.glite.jobid.api-c/interface/cjobid.h +++ /dev/null @@ -1,154 +0,0 @@ -#ifndef _GLITE_JOBID_H -#define _GLITE_JOBID_H - -/*! - * \file cjobid.h - * \brief L&B consumer API - */ - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct _edg_wlc_JobId *glite_jobid_t; -typedef const struct _edg_wlc_JobId *glite_jobid_const_t; -typedef glite_jobid_t edg_wlc_JobId; - -#define edg_wlc_JobIdCreate glite_jobid_create -#define edg_wlc_JobIdRecreate glite_jobid_recreate -#define edg_wlc_JobIdDup glite_jobid_dup -#define edg_wlc_JobIdFree glite_jobid_free -#define edg_wlc_JobIdParse glite_jobid_parse -#define edg_wlc_JobIdUnparse glite_jobid_unparse -#define edg_wlc_JobIdGetServer glite_jobid_getServer -#define edg_wlc_JobIdGetServerParts glite_jobid_getServerParts -#define edg_wlc_JobIdGetUnique glite_jobid_getUnique - -#define GLITE_JOBID_DEFAULT_PORT 9000 /**< Default port where bookkeeping server listens */ -#define GLITE_JOBID_PROTO_PREFIX "https://" /**< JobId protocol prefix */ - - -/* All the pointer functions return malloc'ed objects (or NULL on error) */ - -/** - * Create a Job ID. - * See the lb_draft document for details on its construction and components - * \param bkserver book keeping server hostname - * \param port port for the bk service - * \param jobid new created job id - * \ret al 0 success - * \retval EINVAL invalid bkserver - * \retval ENOMEM if memory allocation fails - */ -int glite_jobid_create(const char * bkserver, int port, glite_jobid_t * jobid); - -/** - * Recreate a Job ID - * \param bkserver bookkeeping server hostname - * \param port port for the bk service - * \param unique string which represent created jobid (if NULL then new - * one is created) - * \param jobid new created job id - * \retval 0 success - * \retval EINVAL invalid bkserver - * \retval ENOMEM if memory allocation fails - */ -int glite_jobid_recreate(const char *bkserver, int port, const char * unique, edg_wlc_JobId * jobid); - -/** - * Create copy of Job ID - * \param in jobid for duplication - * \param jobid duplicated jobid - * \retval 0 for success - * \retval EINVAL invalid jobid - * \retval ENOMEM if memory allocation fails - */ -int glite_jobid_dup(glite_jobid_const_t in, glite_jobid_t * jobid); - -/* - * Free jobid structure - * \param jobid for dealocation - */ -void glite_jobid_free(glite_jobid_t jobid); - -/** - * Parse Job ID string and creates jobid structure - * \param jobidstr string representation of jobid - * \param jobid parsed job id - * \retval 0 for success - * \retval EINVAL jobidstr can't be parsed - * \retval ENOMEM if memory allocation fails - */ -int glite_jobid_parse(const char* jobidstr, glite_jobid_t * jobid); - -/** - * Unparse Job ID (produce the string form of JobId). - * \param jobid to be converted to string - * \return allocated string which represents jobid - */ -char* glite_jobid_unparse(glite_jobid_const_t jobid); - -/** - * Extract bookkeeping server address (address:port) - * \param jobid from which the bkserver address should be extracted - * \retval pointer to allocated string with bkserver address - * \retval NULL if jobid is 0 or memory allocation fails - */ -char* glite_jobid_getServer(glite_jobid_const_t jobid); - -/** - * Extract bookkeeping server address and port - * \param jobid from which the bkserver address should be extracted - * \param srvName pointer where to return server name - * \param srvPort pointer where to return server port - * */ -void glite_jobid_getServerParts(glite_jobid_const_t jobid, char **srvName, unsigned int *srvPort); - -/** - * Extract bookkeeping server address and port - * \param jobid from which the bkserver address should be extracted - * \param srvName pointer where to return server name - * \param srvPort pointer where to return server port - * */ -void glite_jobid_getServerParts_internal(glite_jobid_const_t jobid, char **srvName, unsigned int *srvPort); - -/** - * Extract unique string - * \param jobid - * \retval pointer to allocated unique string representing jobid - * \retval NULL if jobid is 0 or memory allocation fails - */ -char* glite_jobid_getUnique(glite_jobid_const_t jobid); - -/** - * Extract unique string - * \param jobid - * \retval pointer to allocated unique string representing jobid - * \retval NULL if jobid is 0 or memory allocation fails - */ -char* glite_jobid_getUnique_internal(glite_jobid_const_t jobid); - -#ifdef __cplusplus -} -#endif - -#endif /* _GLITE_JOBID_H */ diff --git a/org.glite.jobid.api-c/interface/strmd5.h b/org.glite.jobid.api-c/interface/strmd5.h deleted file mode 100755 index 3da25f5..0000000 --- a/org.glite.jobid.api-c/interface/strmd5.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef _GLITE_STRMD5_H -#define _GLITE_STRMD5_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -/* 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); - -int base64_encode(const void *enc, int enc_size, char *out, int out_max_size); -int base64_decode(const char *enc,char *out,int out_size); - -#ifdef __cplusplus -}; -#endif - -#endif /* _GLITE_STRMD5_H */ diff --git a/org.glite.jobid.api-c/project/ChangeLog b/org.glite.jobid.api-c/project/ChangeLog deleted file mode 100644 index 2d51689..0000000 --- a/org.glite.jobid.api-c/project/ChangeLog +++ /dev/null @@ -1,25 +0,0 @@ -1.0.0-1 -- ChangeLog created - -1.0.0-2 -- fixes in etics' invocation of configure - -1.0.0-4 -- configure script update - -1.0.0-5 -- install libraries into $libdir - -1.0.1-1 -- additional includes in base64_test to fix build on Deb5 - -1.0.2-1 -- Generic lbdir settings in the Makefile -- Fixed package description and summary - -1.0.3-1 -- Fix library versioning - -1.0.4-1 -- Fixed libtool version numbering - diff --git a/org.glite.jobid.api-c/project/package.description b/org.glite.jobid.api-c/project/package.description deleted file mode 100644 index 9c326af..0000000 --- a/org.glite.jobid.api-c/project/package.description +++ /dev/null @@ -1 +0,0 @@ -C library handling gLite jobid. diff --git a/org.glite.jobid.api-c/project/package.summary b/org.glite.jobid.api-c/project/package.summary deleted file mode 100644 index 9c326af..0000000 --- a/org.glite.jobid.api-c/project/package.summary +++ /dev/null @@ -1 +0,0 @@ -C library handling gLite jobid. diff --git a/org.glite.jobid.api-c/project/version.properties b/org.glite.jobid.api-c/project/version.properties deleted file mode 100644 index 69d0f50..0000000 --- a/org.glite.jobid.api-c/project/version.properties +++ /dev/null @@ -1,3 +0,0 @@ -# : /cvs/jra1mw/org.glite.jobid.api-c/project/version.properties,v 1.1 2009/01/16 08:48:52 zsustr Exp $ -module.version=1.0.4 -module.age=1 diff --git a/org.glite.jobid.api-c/src/cjobid.c b/org.glite.jobid.api-c/src/cjobid.c deleted file mode 100644 index 3c8631d..0000000 --- a/org.glite.jobid.api-c/src/cjobid.c +++ /dev/null @@ -1,291 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "cjobid.h" -#include "strmd5.h" - -struct _edg_wlc_JobId { - char *id; /* unique job identification */ - /* additional information */ - char *BShost;/* bookkeeping server hostname */ - unsigned int BSport; /* bookkeeping server port */ - char *info; /* additional information (after ? in URI) */ -}; - -int glite_jobid_create(const char *bkserver, int port, glite_jobid_t *jobId) -{ - return glite_jobid_recreate(bkserver, port, NULL, jobId); -} - - -int glite_jobid_recreate(const char* bkserver, int port, const char *unique, glite_jobid_t *jobId) -{ - glite_jobid_t out; - char hostname[200]; /* used to hold string for encrypt */ - struct timeval tv; - int skip; - char* portbeg; - - struct hostent* he; - - if (!bkserver) - return EINVAL; - - if (unique == NULL) { - gethostname(hostname, 100); - he = gethostbyname(hostname); - assert(he->h_length > 0); - gettimeofday(&tv, NULL); - srandom(tv.tv_usec); - - skip = strlen(hostname); - skip += sprintf(hostname + skip, "-IP:0x%x-pid:%d-rnd:%d-time:%d:%d", - *((int*)he->h_addr_list[0]), getpid(), (int)random(), - (int)tv.tv_sec, (int)tv.tv_usec); - } - - *jobId = NULL; - out = (glite_jobid_t) malloc (sizeof(*out)); - if (!out) - return ENOMEM; - - memset(out, 0, sizeof(*out)); - - /* check if it begins with prefix */ - /* unsupported */ - /* FIXME: fill in PROTO_PREFIX if missing */ - if (strncmp(bkserver, GLITE_JOBID_PROTO_PREFIX, sizeof(GLITE_JOBID_PROTO_PREFIX)-1) == 0) - return EINVAL; - - out->BShost = strdup(bkserver); - portbeg = strchr(out->BShost, ':'); - if (portbeg) { - *portbeg = 0; - /* try to get port number */ - if (port == 0) - port = atoi(portbeg + 1); - } - - if (port == 0) - port = GLITE_JOBID_DEFAULT_PORT; - - out->BSport = port; - - out->id = (unique) ? strdup(unique) : str2md5base64(hostname); - //printf("Encrypt: %s\nBASE64 %s\n", hostname, out->id); - - if (!out->id || !out->BShost) { - glite_jobid_free(out); - return ENOMEM; - } - - *jobId = out; - return 0; -} - - -int glite_jobid_dup(glite_jobid_const_t in, glite_jobid_t *out) -{ - glite_jobid_t jid; - *out = NULL; - if (in == NULL) - return 0; - - jid = malloc(sizeof(*jid)); - if (!jid) - return ENOMEM; - - memset(jid, 0,sizeof(*jid)); - jid->BShost = strdup(in->BShost); - jid->id = strdup(in->id); - if (in->info) - jid->info = strdup(in->info); - - if (jid->BShost == NULL || jid->id == NULL) { - glite_jobid_free(jid); - return ENOMEM; - } - - jid->BSport = in->BSport; - *out = jid; - return 0; -} - - -// XXX -// use recreate -// parse name, port, unique -int glite_jobid_parse(const char *idString, glite_jobid_t *jobId) -{ - char *pom, *pom1, *pom2; - glite_jobid_t out; - - *jobId = NULL; - - out = (glite_jobid_t) malloc (sizeof(*out)); - if (out == NULL ) - return ENOMEM; - - memset(out,0,sizeof(*out)); - - if (strncmp(idString, GLITE_JOBID_PROTO_PREFIX, sizeof(GLITE_JOBID_PROTO_PREFIX) - 1)) { - out->BShost = (char *) NULL; - out->BSport = 0; - - free(out); - return EINVAL; - } - - pom = strdup(idString + sizeof(GLITE_JOBID_PROTO_PREFIX) - 1); - pom1 = strchr(pom, '/'); - pom2 = strchr(pom, ':'); - - if (!pom1) { free(pom); free(out); return EINVAL; } - - if ( pom2 && (pom1 > pom2)) { - pom[pom2-pom] = '\0'; - out->BShost = strdup(pom); - pom[pom1-pom] = '\0'; - out->BSport = (unsigned int) strtoul(pom2 + 1,NULL,10); - } else { - pom[pom1-pom] = '\0'; - out->BShost = strdup(pom); - out->BSport = GLITE_JOBID_DEFAULT_PORT; - } - - /* XXX: localhost not supported in jobid - if (!strncmp(out->BShost,"localhost",9) { - free(pom); - free(out->BShost); - free(out); - return EINVAL; - } - */ - - /* additional info from URI */ - pom2 = strchr(pom1+1,'?'); - if (pom2) { - *pom2 = 0; - out->info = strdup(pom2+1); - } - - /* extract the unique part */ - out->id = strdup(pom1+1); - - for (pom1 = out->BShost; *pom1; pom1++) - if (isspace(*pom1)) break; - - for (pom2 = out->id; *pom2; pom2++) - if (isspace(*pom2)) break; - - if (*pom1 || *pom2) { - free(pom); - glite_jobid_free(out); - return EINVAL; - } - - free(pom); - *jobId = out; - return 0; -} - - -void glite_jobid_free(glite_jobid_t job) -{ - if (job) { - free(job->id); - free(job->BShost); - free(job->info); - free(job); - } -} - - -char* glite_jobid_unparse(glite_jobid_const_t jobid) -{ - char *out, port[40]; - - if (!jobid) - return NULL; - - if (jobid->BSport) - sprintf(port,":%d",jobid->BSport); - else - *port = 0; - - asprintf(&out, GLITE_JOBID_PROTO_PREFIX"%s%s/%s%s%s", - jobid->BShost,port, - jobid->id, - (jobid->info ? "?" : ""), - (jobid->info ? jobid->info : "")); - - return out; -} - - -char* glite_jobid_getServer(glite_jobid_const_t jobid) -{ - char *bs = NULL; - - if (jobid) - asprintf(&bs, "%s:%u", jobid->BShost, - jobid->BSport ? jobid->BSport : GLITE_JOBID_DEFAULT_PORT); - - return bs; -} - - -void glite_jobid_getServerParts(glite_jobid_const_t jobid, char **srvName, unsigned int *srvPort) -{ - if (jobid) { - *srvName = strdup(jobid->BShost); - *srvPort = jobid->BSport ? jobid->BSport : GLITE_JOBID_DEFAULT_PORT; - } -} - - -char* glite_jobid_getUnique(glite_jobid_const_t jobid) -{ - return jobid ? strdup(jobid->id) : NULL; -} - - -void glite_jobid_getServerParts_internal(glite_jobid_const_t jobid, char **srvName, unsigned int *srvPort) -{ - if (jobid) { - *srvName = jobid->BShost; - *srvPort = jobid->BSport ? jobid->BSport : GLITE_JOBID_DEFAULT_PORT; - } -} - - -char* glite_jobid_getUnique_internal(glite_jobid_const_t jobid) -{ - return jobid ? jobid->id : NULL; -} diff --git a/org.glite.jobid.api-c/src/md32_common.h b/org.glite.jobid.api-c/src/md32_common.h deleted file mode 100644 index a8a539b..0000000 --- a/org.glite.jobid.api-c/src/md32_common.h +++ /dev/null @@ -1,640 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* crypto/md32_common.h */ -/* ==================================================================== - * Copyright (c) 1999-2002 The OpenSSL Project. All rights reserved. - * - * 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. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * licensing@OpenSSL.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``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 THE OpenSSL 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 product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ - -/* - * This is a generic 32 bit "collector" for message digest algorithms. - * Whenever needed it collects input character stream into chunks of - * 32 bit values and invokes a block function that performs actual hash - * calculations. - * - * Porting guide. - * - * Obligatory macros: - * - * DATA_ORDER_IS_BIG_ENDIAN or DATA_ORDER_IS_LITTLE_ENDIAN - * this macro defines byte order of input stream. - * HASH_CBLOCK - * size of a unit chunk HASH_BLOCK operates on. - * HASH_LONG - * has to be at lest 32 bit wide, if it's wider, then - * HASH_LONG_LOG2 *has to* be defined along - * HASH_CTX - * context structure that at least contains following - * members: - * typedef struct { - * ... - * HASH_LONG Nl,Nh; - * HASH_LONG data[HASH_LBLOCK]; - * unsigned int num; - * ... - * } HASH_CTX; - * HASH_UPDATE - * name of "Update" function, implemented here. - * HASH_TRANSFORM - * name of "Transform" function, implemented here. - * HASH_FINAL - * name of "Final" function, implemented here. - * HASH_BLOCK_HOST_ORDER - * name of "block" function treating *aligned* input message - * in host byte order, implemented externally. - * HASH_BLOCK_DATA_ORDER - * name of "block" function treating *unaligned* input message - * in original (data) byte order, implemented externally (it - * actually is optional if data and host are of the same - * "endianess"). - * HASH_MAKE_STRING - * macro convering context variables to an ASCII hash string. - * - * Optional macros: - * - * B_ENDIAN or L_ENDIAN - * defines host byte-order. - * HASH_LONG_LOG2 - * defaults to 2 if not states otherwise. - * HASH_LBLOCK - * assumed to be HASH_CBLOCK/4 if not stated otherwise. - * HASH_BLOCK_DATA_ORDER_ALIGNED - * alternative "block" function capable of treating - * aligned input message in original (data) order, - * implemented externally. - * - * MD5 example: - * - * #define DATA_ORDER_IS_LITTLE_ENDIAN - * - * #define HASH_LONG MD5_LONG - * #define HASH_LONG_LOG2 MD5_LONG_LOG2 - * #define HASH_CTX MD5_CTX - * #define HASH_CBLOCK MD5_CBLOCK - * #define HASH_LBLOCK MD5_LBLOCK - * #define HASH_UPDATE MD5_Update - * #define HASH_TRANSFORM MD5_Transform - * #define HASH_FINAL MD5_Final - * #define HASH_BLOCK_HOST_ORDER md5_block_host_order - * #define HASH_BLOCK_DATA_ORDER md5_block_data_order - * - * - */ - -#if !defined(DATA_ORDER_IS_BIG_ENDIAN) && !defined(DATA_ORDER_IS_LITTLE_ENDIAN) -#error "DATA_ORDER must be defined!" -#endif - -#ifndef HASH_CBLOCK -#error "HASH_CBLOCK must be defined!" -#endif -#ifndef HASH_LONG -#error "HASH_LONG must be defined!" -#endif -#ifndef HASH_CTX -#error "HASH_CTX must be defined!" -#endif - -#ifndef HASH_UPDATE -#error "HASH_UPDATE must be defined!" -#endif -#ifndef HASH_TRANSFORM -#error "HASH_TRANSFORM must be defined!" -#endif -#ifndef HASH_FINAL -#error "HASH_FINAL must be defined!" -#endif - -#ifndef HASH_BLOCK_HOST_ORDER -#error "HASH_BLOCK_HOST_ORDER must be defined!" -#endif - -#if 0 -/* - * Moved below as it's required only if HASH_BLOCK_DATA_ORDER_ALIGNED - * isn't defined. - */ -#ifndef HASH_BLOCK_DATA_ORDER -#error "HASH_BLOCK_DATA_ORDER must be defined!" -#endif -#endif - -#ifndef HASH_LBLOCK -#define HASH_LBLOCK (HASH_CBLOCK/4) -#endif - -#ifndef HASH_LONG_LOG2 -#define HASH_LONG_LOG2 2 -#endif - -/* - * Engage compiler specific rotate intrinsic function if available. - */ -#undef ROTATE -#ifndef PEDANTIC -# if defined(_MSC_VER) || defined(__ICC) -# define ROTATE(a,n) _lrotl(a,n) -# elif defined(__MWERKS__) -# if defined(__POWERPC__) -# define ROTATE(a,n) __rlwinm(a,n,0,31) -# elif defined(__MC68K__) - /* Motorola specific tweak. */ -# define ROTATE(a,n) ( n<24 ? __rol(a,n) : __ror(a,32-n) ) -# else -# define ROTATE(a,n) __rol(a,n) -# endif -# elif defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM) - /* - * Some GNU C inline assembler templates. Note that these are - * rotates by *constant* number of bits! But that's exactly - * what we need here... - * - */ -# if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__) -# define ROTATE(a,n) ({ register unsigned int ret; \ - asm ( \ - "roll %1,%0" \ - : "=r"(ret) \ - : "I"(n), "0"(a) \ - : "cc"); \ - ret; \ - }) -# elif defined(__powerpc) || defined(__ppc__) || defined(__powerpc64__) -# define ROTATE(a,n) ({ register unsigned int ret; \ - asm ( \ - "rlwinm %0,%1,%2,0,31" \ - : "=r"(ret) \ - : "r"(a), "I"(n)); \ - ret; \ - }) -# endif -# endif -#endif /* PEDANTIC */ - -#if HASH_LONG_LOG2==2 /* Engage only if sizeof(HASH_LONG)== 4 */ -/* A nice byte order reversal from Wei Dai */ -#ifdef ROTATE -/* 5 instructions with rotate instruction, else 9 */ -#define REVERSE_FETCH32(a,l) ( \ - l=*(const HASH_LONG *)(a), \ - ((ROTATE(l,8)&0x00FF00FF)|(ROTATE((l&0x00FF00FF),24))) \ - ) -#else -/* 6 instructions with rotate instruction, else 8 */ -#define REVERSE_FETCH32(a,l) ( \ - l=*(const HASH_LONG *)(a), \ - l=(((l>>8)&0x00FF00FF)|((l&0x00FF00FF)<<8)), \ - ROTATE(l,16) \ - ) -/* - * Originally the middle line started with l=(((l&0xFF00FF00)>>8)|... - * It's rewritten as above for two reasons: - * - RISCs aren't good at long constants and have to explicitely - * compose 'em with several (well, usually 2) instructions in a - * register before performing the actual operation and (as you - * already realized:-) having same constant should inspire the - * compiler to permanently allocate the only register for it; - * - most modern CPUs have two ALUs, but usually only one has - * circuitry for shifts:-( this minor tweak inspires compiler - * to schedule shift instructions in a better way... - * - * - */ -#endif -#endif - -#ifndef ROTATE -#define ROTATE(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n)))) -#endif - -/* - * Make some obvious choices. E.g., HASH_BLOCK_DATA_ORDER_ALIGNED - * and HASH_BLOCK_HOST_ORDER ought to be the same if input data - * and host are of the same "endianess". It's possible to mask - * this with blank #define HASH_BLOCK_DATA_ORDER though... - * - * - */ -#if defined(B_ENDIAN) -# if defined(DATA_ORDER_IS_BIG_ENDIAN) -# if !defined(HASH_BLOCK_DATA_ORDER_ALIGNED) && HASH_LONG_LOG2==2 -# define HASH_BLOCK_DATA_ORDER_ALIGNED HASH_BLOCK_HOST_ORDER -# endif -# endif -#elif defined(L_ENDIAN) -# if defined(DATA_ORDER_IS_LITTLE_ENDIAN) -# if !defined(HASH_BLOCK_DATA_ORDER_ALIGNED) && HASH_LONG_LOG2==2 -# define HASH_BLOCK_DATA_ORDER_ALIGNED HASH_BLOCK_HOST_ORDER -# endif -# endif -#endif - -#if !defined(HASH_BLOCK_DATA_ORDER_ALIGNED) -#ifndef HASH_BLOCK_DATA_ORDER -#error "HASH_BLOCK_DATA_ORDER must be defined!" -#endif -#endif - -#if defined(DATA_ORDER_IS_BIG_ENDIAN) - -#ifndef PEDANTIC -# if defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM) -# if ((defined(__i386) || defined(__i386__)) && !defined(I386_ONLY)) || \ - (defined(__x86_64) || defined(__x86_64__)) - /* - * This gives ~30-40% performance improvement in SHA-256 compiled - * with gcc [on P4]. Well, first macro to be frank. We can pull - * this trick on x86* platforms only, because these CPUs can fetch - * unaligned data without raising an exception. - */ -# define HOST_c2l(c,l) ({ unsigned int r=*((const unsigned int *)(c)); \ - asm ("bswapl %0":"=r"(r):"0"(r)); \ - (c)+=4; (l)=r; }) -# define HOST_l2c(l,c) ({ unsigned int r=(l); \ - asm ("bswapl %0":"=r"(r):"0"(r)); \ - *((unsigned int *)(c))=r; (c)+=4; r; }) -# endif -# endif -#endif - -#ifndef HOST_c2l -#define HOST_c2l(c,l) (l =(((unsigned long)(*((c)++)))<<24), \ - l|=(((unsigned long)(*((c)++)))<<16), \ - l|=(((unsigned long)(*((c)++)))<< 8), \ - l|=(((unsigned long)(*((c)++))) ), \ - l) -#endif -#define HOST_p_c2l(c,l,n) { \ - switch (n) { \ - case 0: l =((unsigned long)(*((c)++)))<<24; \ - case 1: l|=((unsigned long)(*((c)++)))<<16; \ - case 2: l|=((unsigned long)(*((c)++)))<< 8; \ - case 3: l|=((unsigned long)(*((c)++))); \ - } } -#define HOST_p_c2l_p(c,l,sc,len) { \ - switch (sc) { \ - case 0: l =((unsigned long)(*((c)++)))<<24; \ - if (--len == 0) break; \ - case 1: l|=((unsigned long)(*((c)++)))<<16; \ - if (--len == 0) break; \ - case 2: l|=((unsigned long)(*((c)++)))<< 8; \ - } } -/* NOTE the pointer is not incremented at the end of this */ -#define HOST_c2l_p(c,l,n) { \ - l=0; (c)+=n; \ - switch (n) { \ - case 3: l =((unsigned long)(*(--(c))))<< 8; \ - case 2: l|=((unsigned long)(*(--(c))))<<16; \ - case 1: l|=((unsigned long)(*(--(c))))<<24; \ - } } -#ifndef HOST_l2c -#define HOST_l2c(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \ - *((c)++)=(unsigned char)(((l)>>16)&0xff), \ - *((c)++)=(unsigned char)(((l)>> 8)&0xff), \ - *((c)++)=(unsigned char)(((l) )&0xff), \ - l) -#endif - -#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN) - -#if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__) -# ifndef B_ENDIAN - /* See comment in DATA_ORDER_IS_BIG_ENDIAN section. */ -# define HOST_c2l(c,l) ((l)=*((const unsigned int *)(c)), (c)+=4, l) -# define HOST_l2c(l,c) (*((unsigned int *)(c))=(l), (c)+=4, l) -# endif -#endif - -#ifndef HOST_c2l -#define HOST_c2l(c,l) (l =(((unsigned long)(*((c)++))) ), \ - l|=(((unsigned long)(*((c)++)))<< 8), \ - l|=(((unsigned long)(*((c)++)))<<16), \ - l|=(((unsigned long)(*((c)++)))<<24), \ - l) -#endif -#define HOST_p_c2l(c,l,n) { \ - switch (n) { \ - case 0: l =((unsigned long)(*((c)++))); \ - case 1: l|=((unsigned long)(*((c)++)))<< 8; \ - case 2: l|=((unsigned long)(*((c)++)))<<16; \ - case 3: l|=((unsigned long)(*((c)++)))<<24; \ - } } -#define HOST_p_c2l_p(c,l,sc,len) { \ - switch (sc) { \ - case 0: l =((unsigned long)(*((c)++))); \ - if (--len == 0) break; \ - case 1: l|=((unsigned long)(*((c)++)))<< 8; \ - if (--len == 0) break; \ - case 2: l|=((unsigned long)(*((c)++)))<<16; \ - } } -/* NOTE the pointer is not incremented at the end of this */ -#define HOST_c2l_p(c,l,n) { \ - l=0; (c)+=n; \ - switch (n) { \ - case 3: l =((unsigned long)(*(--(c))))<<16; \ - case 2: l|=((unsigned long)(*(--(c))))<< 8; \ - case 1: l|=((unsigned long)(*(--(c)))); \ - } } -#ifndef HOST_l2c -#define HOST_l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \ - *((c)++)=(unsigned char)(((l)>> 8)&0xff), \ - *((c)++)=(unsigned char)(((l)>>16)&0xff), \ - *((c)++)=(unsigned char)(((l)>>24)&0xff), \ - l) -#endif - -#endif - -/* - * Time for some action:-) - */ - -MD5_JOBID_PROTO int HASH_UPDATE (HASH_CTX *c, const void *data_, size_t len) - { - const unsigned char *data=data_; - register HASH_LONG * p; - register HASH_LONG l; - size_t sw,sc,ew,ec; - - if (len==0) return 1; - - l=(c->Nl+(((HASH_LONG)len)<<3))&0xffffffffUL; - /* 95-05-24 eay Fixed a bug with the overflow handling, thanks to - * Wei Dai for pointing it out. */ - if (l < c->Nl) /* overflow */ - c->Nh++; - c->Nh+=(len>>29); /* might cause compiler warning on 16-bit */ - c->Nl=l; - - if (c->num != 0) - { - p=c->data; - sw=c->num>>2; - sc=c->num&0x03; - - if ((c->num+len) >= HASH_CBLOCK) - { - l=p[sw]; HOST_p_c2l(data,l,sc); p[sw++]=l; - for (; swnum); - c->num=0; - /* drop through and do the rest */ - } - else - { - c->num+=(unsigned int)len; - if ((sc+len) < 4) /* ugly, add char's to a word */ - { - l=p[sw]; HOST_p_c2l_p(data,l,sc,len); p[sw]=l; - } - else - { - ew=(c->num>>2); - ec=(c->num&0x03); - if (sc) - l=p[sw]; - HOST_p_c2l(data,l,sc); - p[sw++]=l; - for (; sw < ew; sw++) - { - HOST_c2l(data,l); p[sw]=l; - } - if (ec) - { - HOST_c2l_p(data,l,ec); p[sw]=l; - } - } - return 1; - } - } - - sw=len/HASH_CBLOCK; - if (sw > 0) - { -#if defined(HASH_BLOCK_DATA_ORDER_ALIGNED) - /* - * Note that HASH_BLOCK_DATA_ORDER_ALIGNED gets defined - * only if sizeof(HASH_LONG)==4. - */ - if ((((size_t)data)%4) == 0) - { - /* data is properly aligned so that we can cast it: */ - HASH_BLOCK_DATA_ORDER_ALIGNED (c,(const HASH_LONG *)data,sw); - sw*=HASH_CBLOCK; - data+=sw; - len-=sw; - } - else -#if !defined(HASH_BLOCK_DATA_ORDER) - while (sw--) - { - memcpy (p=c->data,data,HASH_CBLOCK); - HASH_BLOCK_DATA_ORDER_ALIGNED(c,p,1); - data+=HASH_CBLOCK; - len-=HASH_CBLOCK; - } -#endif -#endif -#if defined(HASH_BLOCK_DATA_ORDER) - { - HASH_BLOCK_DATA_ORDER(c,data,sw); - sw*=HASH_CBLOCK; - data+=sw; - len-=sw; - } -#endif - } - - if (len!=0) - { - p = c->data; - c->num = len; - ew=len>>2; /* words to copy */ - ec=len&0x03; - for (; ew; ew--,p++) - { - HOST_c2l(data,l); *p=l; - } - HOST_c2l_p(data,l,ec); - *p=l; - } - return 1; - } - - -MD5_JOBID_PROTO void HASH_TRANSFORM (HASH_CTX *c, const unsigned char *data) - { -#if defined(HASH_BLOCK_DATA_ORDER_ALIGNED) - if ((((size_t)data)%4) == 0) - /* data is properly aligned so that we can cast it: */ - HASH_BLOCK_DATA_ORDER_ALIGNED (c,(const HASH_LONG *)data,1); - else -#if !defined(HASH_BLOCK_DATA_ORDER) - { - - HASH_BLOCK_DATA_ORDER_ALIGNED (c,c->data,1); - } -#endif -#endif -#if defined(HASH_BLOCK_DATA_ORDER) - HASH_BLOCK_DATA_ORDER (c,data,1); -#endif - } - - -MD5_JOBID_PROTO int HASH_FINAL (unsigned char *md, HASH_CTX *c) - { - register HASH_LONG *p; - register unsigned long l; - register int i,j; - static const unsigned char end[4]={0x80,0x00,0x00,0x00}; - const unsigned char *cp=end; - - /* c->num should definitly have room for at least one more byte. */ - p=c->data; - i=c->num>>2; - j=c->num&0x03; - -#if 0 - /* purify often complains about the following line as an - * Uninitialized Memory Read. While this can be true, the - * following p_c2l macro will reset l when that case is true. - * This is because j&0x03 contains the number of 'valid' bytes - * already in p[i]. If and only if j&0x03 == 0, the UMR will - * occur but this is also the only time p_c2l will do - * l= *(cp++) instead of l|= *(cp++) - * Many thanks to Alex Tang for pickup this - * 'potential bug' */ -#ifdef PURIFY - if (j==0) p[i]=0; /* Yeah, but that's not the way to fix it:-) */ -#endif - l=p[i]; -#else - l = (j==0) ? 0 : p[i]; -#endif - HOST_p_c2l(cp,l,j); p[i++]=l; /* i is the next 'undefined word' */ - - if (i>(HASH_LBLOCK-2)) /* save room for Nl and Nh */ - { - if (iNh; - p[HASH_LBLOCK-1]=c->Nl; -#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN) - p[HASH_LBLOCK-2]=c->Nl; - p[HASH_LBLOCK-1]=c->Nh; -#endif - HASH_BLOCK_HOST_ORDER (c,p,1); - -#ifndef HASH_MAKE_STRING -#error "HASH_MAKE_STRING must be defined!" -#else - HASH_MAKE_STRING(c,md); -#endif - - c->num=0; - /* clear stuff, HASH_BLOCK may be leaving some stuff on the stack - * but I'm not worried :-) - OPENSSL_cleanse((void *)c,sizeof(HASH_CTX)); - */ - return 1; - } - -#ifndef MD32_REG_T -#define MD32_REG_T long -/* - * This comment was originaly written for MD5, which is why it - * discusses A-D. But it basically applies to all 32-bit digests, - * which is why it was moved to common header file. - * - * In case you wonder why A-D are declared as long and not - * as MD5_LONG. Doing so results in slight performance - * boost on LP64 architectures. The catch is we don't - * really care if 32 MSBs of a 64-bit register get polluted - * with eventual overflows as we *save* only 32 LSBs in - * *either* case. Now declaring 'em long excuses the compiler - * from keeping 32 MSBs zeroed resulting in 13% performance - * improvement under SPARC Solaris7/64 and 5% under AlphaLinux. - * Well, to be honest it should say that this *prevents* - * performance degradation. - * - * Apparently there're LP64 compilers that generate better - * code if A-D are declared int. Most notably GCC-x86_64 - * generates better code. - * - */ -#endif diff --git a/org.glite.jobid.api-c/src/md5.h b/org.glite.jobid.api-c/src/md5.h deleted file mode 100644 index faec0fc..0000000 --- a/org.glite.jobid.api-c/src/md5.h +++ /dev/null @@ -1,135 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* crypto/md5/md5.h */ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * 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 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS 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 THE AUTHOR OR 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. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ - -#ifndef HEADER_MD5_H -#define HEADER_MD5_H - -/* ljocha -#include -*/ -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef OPENSSL_NO_MD5 -#error MD5 is disabled. -#endif - -/* - * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - * ! MD5_LONG has to be at least 32 bits wide. If it's wider, then ! - * ! MD5_LONG_LOG2 has to be defined along. ! - * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - */ - -#if defined(OPENSSL_SYS_WIN16) || defined(__LP32__) -#define MD5_LONG unsigned long -#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__) -#define MD5_LONG unsigned long -#define MD5_LONG_LOG2 3 - -/* _CRAY note. I could declare short, but I have no idea what impact - * does it have on performance on none-T3E machines. I could declare - * int, but at least on C90 sizeof(int) can be chosen at compile time. - * So I've chosen long... * - */ -#else -#define MD5_LONG unsigned int -#endif - -#define MD5_CBLOCK 64 -#define MD5_LBLOCK (MD5_CBLOCK/4) -#define MD5_DIGEST_LENGTH 16 - -typedef struct MD5state_st - { - MD5_LONG A,B,C,D; - MD5_LONG Nl,Nh; - MD5_LONG data[MD5_LBLOCK]; - unsigned int num; - } MD5_CTX; - -MD5_JOBID_PROTO int MD5_Init(MD5_CTX *c); -MD5_JOBID_PROTO int MD5_Update(MD5_CTX *c, const void *data, size_t len); -MD5_JOBID_PROTO int MD5_Final(unsigned char *md, MD5_CTX *c); -MD5_JOBID_PROTO unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md); -MD5_JOBID_PROTO void MD5_Transform(MD5_CTX *c, const unsigned char *b); -#ifdef __cplusplus -} -#endif - -#endif diff --git a/org.glite.jobid.api-c/src/md5_dgst.c b/org.glite.jobid.api-c/src/md5_dgst.c deleted file mode 100644 index c00fee8..0000000 --- a/org.glite.jobid.api-c/src/md5_dgst.c +++ /dev/null @@ -1,315 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* crypto/md5/md5_dgst.c */ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * 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 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS 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 THE AUTHOR OR 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. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ - -#ifndef MD5_JOBID_PROTO -#define MD5_JOBID_PROTO -#endif - -#include -#include "md5_locl.h" -/* ljocha -#include - -const char MD5_version[]="MD5" OPENSSL_VERSION_PTEXT; -*/ - -/* Implemented from RFC1321 The MD5 Message-Digest Algorithm - */ - -#define INIT_DATA_A (unsigned long)0x67452301L -#define INIT_DATA_B (unsigned long)0xefcdab89L -#define INIT_DATA_C (unsigned long)0x98badcfeL -#define INIT_DATA_D (unsigned long)0x10325476L - -MD5_JOBID_PROTO int MD5_Init(MD5_CTX *c) - { - c->A=INIT_DATA_A; - c->B=INIT_DATA_B; - c->C=INIT_DATA_C; - c->D=INIT_DATA_D; - c->Nl=0; - c->Nh=0; - c->num=0; - return 1; - } - -#ifndef md5_block_host_order -MD5_JOBID_PROTO void md5_block_host_order (MD5_CTX *c, const void *data, size_t num) - { - const MD5_LONG *X=data; - register unsigned MD32_REG_T A,B,C,D; - - A=c->A; - B=c->B; - C=c->C; - D=c->D; - - for (;num--;X+=HASH_LBLOCK) - { - /* Round 0 */ - R0(A,B,C,D,X[ 0], 7,0xd76aa478L); - R0(D,A,B,C,X[ 1],12,0xe8c7b756L); - R0(C,D,A,B,X[ 2],17,0x242070dbL); - R0(B,C,D,A,X[ 3],22,0xc1bdceeeL); - R0(A,B,C,D,X[ 4], 7,0xf57c0fafL); - R0(D,A,B,C,X[ 5],12,0x4787c62aL); - R0(C,D,A,B,X[ 6],17,0xa8304613L); - R0(B,C,D,A,X[ 7],22,0xfd469501L); - R0(A,B,C,D,X[ 8], 7,0x698098d8L); - R0(D,A,B,C,X[ 9],12,0x8b44f7afL); - R0(C,D,A,B,X[10],17,0xffff5bb1L); - R0(B,C,D,A,X[11],22,0x895cd7beL); - R0(A,B,C,D,X[12], 7,0x6b901122L); - R0(D,A,B,C,X[13],12,0xfd987193L); - R0(C,D,A,B,X[14],17,0xa679438eL); - R0(B,C,D,A,X[15],22,0x49b40821L); - /* Round 1 */ - R1(A,B,C,D,X[ 1], 5,0xf61e2562L); - R1(D,A,B,C,X[ 6], 9,0xc040b340L); - R1(C,D,A,B,X[11],14,0x265e5a51L); - R1(B,C,D,A,X[ 0],20,0xe9b6c7aaL); - R1(A,B,C,D,X[ 5], 5,0xd62f105dL); - R1(D,A,B,C,X[10], 9,0x02441453L); - R1(C,D,A,B,X[15],14,0xd8a1e681L); - R1(B,C,D,A,X[ 4],20,0xe7d3fbc8L); - R1(A,B,C,D,X[ 9], 5,0x21e1cde6L); - R1(D,A,B,C,X[14], 9,0xc33707d6L); - R1(C,D,A,B,X[ 3],14,0xf4d50d87L); - R1(B,C,D,A,X[ 8],20,0x455a14edL); - R1(A,B,C,D,X[13], 5,0xa9e3e905L); - R1(D,A,B,C,X[ 2], 9,0xfcefa3f8L); - R1(C,D,A,B,X[ 7],14,0x676f02d9L); - R1(B,C,D,A,X[12],20,0x8d2a4c8aL); - /* Round 2 */ - R2(A,B,C,D,X[ 5], 4,0xfffa3942L); - R2(D,A,B,C,X[ 8],11,0x8771f681L); - R2(C,D,A,B,X[11],16,0x6d9d6122L); - R2(B,C,D,A,X[14],23,0xfde5380cL); - R2(A,B,C,D,X[ 1], 4,0xa4beea44L); - R2(D,A,B,C,X[ 4],11,0x4bdecfa9L); - R2(C,D,A,B,X[ 7],16,0xf6bb4b60L); - R2(B,C,D,A,X[10],23,0xbebfbc70L); - R2(A,B,C,D,X[13], 4,0x289b7ec6L); - R2(D,A,B,C,X[ 0],11,0xeaa127faL); - R2(C,D,A,B,X[ 3],16,0xd4ef3085L); - R2(B,C,D,A,X[ 6],23,0x04881d05L); - R2(A,B,C,D,X[ 9], 4,0xd9d4d039L); - R2(D,A,B,C,X[12],11,0xe6db99e5L); - R2(C,D,A,B,X[15],16,0x1fa27cf8L); - R2(B,C,D,A,X[ 2],23,0xc4ac5665L); - /* Round 3 */ - R3(A,B,C,D,X[ 0], 6,0xf4292244L); - R3(D,A,B,C,X[ 7],10,0x432aff97L); - R3(C,D,A,B,X[14],15,0xab9423a7L); - R3(B,C,D,A,X[ 5],21,0xfc93a039L); - R3(A,B,C,D,X[12], 6,0x655b59c3L); - R3(D,A,B,C,X[ 3],10,0x8f0ccc92L); - R3(C,D,A,B,X[10],15,0xffeff47dL); - R3(B,C,D,A,X[ 1],21,0x85845dd1L); - R3(A,B,C,D,X[ 8], 6,0x6fa87e4fL); - R3(D,A,B,C,X[15],10,0xfe2ce6e0L); - R3(C,D,A,B,X[ 6],15,0xa3014314L); - R3(B,C,D,A,X[13],21,0x4e0811a1L); - R3(A,B,C,D,X[ 4], 6,0xf7537e82L); - R3(D,A,B,C,X[11],10,0xbd3af235L); - R3(C,D,A,B,X[ 2],15,0x2ad7d2bbL); - R3(B,C,D,A,X[ 9],21,0xeb86d391L); - - A = c->A += A; - B = c->B += B; - C = c->C += C; - D = c->D += D; - } - } -#endif - -#ifndef md5_block_data_order -#ifdef X -#undef X -#endif -MD5_JOBID_PROTO void md5_block_data_order (MD5_CTX *c, const void *data_, size_t num) - { - const unsigned char *data=data_; - register unsigned MD32_REG_T A,B,C,D,l; -#ifndef MD32_XARRAY - /* See comment in crypto/sha/sha_locl.h for details. */ - unsigned MD32_REG_T XX0, XX1, XX2, XX3, XX4, XX5, XX6, XX7, - XX8, XX9,XX10,XX11,XX12,XX13,XX14,XX15; -# define X(i) XX##i -#else - MD5_LONG XX[MD5_LBLOCK]; -# define X(i) XX[i] -#endif - - A=c->A; - B=c->B; - C=c->C; - D=c->D; - - for (;num--;) - { - HOST_c2l(data,l); X( 0)=l; HOST_c2l(data,l); X( 1)=l; - /* Round 0 */ - R0(A,B,C,D,X( 0), 7,0xd76aa478L); HOST_c2l(data,l); X( 2)=l; - R0(D,A,B,C,X( 1),12,0xe8c7b756L); HOST_c2l(data,l); X( 3)=l; - R0(C,D,A,B,X( 2),17,0x242070dbL); HOST_c2l(data,l); X( 4)=l; - R0(B,C,D,A,X( 3),22,0xc1bdceeeL); HOST_c2l(data,l); X( 5)=l; - R0(A,B,C,D,X( 4), 7,0xf57c0fafL); HOST_c2l(data,l); X( 6)=l; - R0(D,A,B,C,X( 5),12,0x4787c62aL); HOST_c2l(data,l); X( 7)=l; - R0(C,D,A,B,X( 6),17,0xa8304613L); HOST_c2l(data,l); X( 8)=l; - R0(B,C,D,A,X( 7),22,0xfd469501L); HOST_c2l(data,l); X( 9)=l; - R0(A,B,C,D,X( 8), 7,0x698098d8L); HOST_c2l(data,l); X(10)=l; - R0(D,A,B,C,X( 9),12,0x8b44f7afL); HOST_c2l(data,l); X(11)=l; - R0(C,D,A,B,X(10),17,0xffff5bb1L); HOST_c2l(data,l); X(12)=l; - R0(B,C,D,A,X(11),22,0x895cd7beL); HOST_c2l(data,l); X(13)=l; - R0(A,B,C,D,X(12), 7,0x6b901122L); HOST_c2l(data,l); X(14)=l; - R0(D,A,B,C,X(13),12,0xfd987193L); HOST_c2l(data,l); X(15)=l; - R0(C,D,A,B,X(14),17,0xa679438eL); - R0(B,C,D,A,X(15),22,0x49b40821L); - /* Round 1 */ - R1(A,B,C,D,X( 1), 5,0xf61e2562L); - R1(D,A,B,C,X( 6), 9,0xc040b340L); - R1(C,D,A,B,X(11),14,0x265e5a51L); - R1(B,C,D,A,X( 0),20,0xe9b6c7aaL); - R1(A,B,C,D,X( 5), 5,0xd62f105dL); - R1(D,A,B,C,X(10), 9,0x02441453L); - R1(C,D,A,B,X(15),14,0xd8a1e681L); - R1(B,C,D,A,X( 4),20,0xe7d3fbc8L); - R1(A,B,C,D,X( 9), 5,0x21e1cde6L); - R1(D,A,B,C,X(14), 9,0xc33707d6L); - R1(C,D,A,B,X( 3),14,0xf4d50d87L); - R1(B,C,D,A,X( 8),20,0x455a14edL); - R1(A,B,C,D,X(13), 5,0xa9e3e905L); - R1(D,A,B,C,X( 2), 9,0xfcefa3f8L); - R1(C,D,A,B,X( 7),14,0x676f02d9L); - R1(B,C,D,A,X(12),20,0x8d2a4c8aL); - /* Round 2 */ - R2(A,B,C,D,X( 5), 4,0xfffa3942L); - R2(D,A,B,C,X( 8),11,0x8771f681L); - R2(C,D,A,B,X(11),16,0x6d9d6122L); - R2(B,C,D,A,X(14),23,0xfde5380cL); - R2(A,B,C,D,X( 1), 4,0xa4beea44L); - R2(D,A,B,C,X( 4),11,0x4bdecfa9L); - R2(C,D,A,B,X( 7),16,0xf6bb4b60L); - R2(B,C,D,A,X(10),23,0xbebfbc70L); - R2(A,B,C,D,X(13), 4,0x289b7ec6L); - R2(D,A,B,C,X( 0),11,0xeaa127faL); - R2(C,D,A,B,X( 3),16,0xd4ef3085L); - R2(B,C,D,A,X( 6),23,0x04881d05L); - R2(A,B,C,D,X( 9), 4,0xd9d4d039L); - R2(D,A,B,C,X(12),11,0xe6db99e5L); - R2(C,D,A,B,X(15),16,0x1fa27cf8L); - R2(B,C,D,A,X( 2),23,0xc4ac5665L); - /* Round 3 */ - R3(A,B,C,D,X( 0), 6,0xf4292244L); - R3(D,A,B,C,X( 7),10,0x432aff97L); - R3(C,D,A,B,X(14),15,0xab9423a7L); - R3(B,C,D,A,X( 5),21,0xfc93a039L); - R3(A,B,C,D,X(12), 6,0x655b59c3L); - R3(D,A,B,C,X( 3),10,0x8f0ccc92L); - R3(C,D,A,B,X(10),15,0xffeff47dL); - R3(B,C,D,A,X( 1),21,0x85845dd1L); - R3(A,B,C,D,X( 8), 6,0x6fa87e4fL); - R3(D,A,B,C,X(15),10,0xfe2ce6e0L); - R3(C,D,A,B,X( 6),15,0xa3014314L); - R3(B,C,D,A,X(13),21,0x4e0811a1L); - R3(A,B,C,D,X( 4), 6,0xf7537e82L); - R3(D,A,B,C,X(11),10,0xbd3af235L); - R3(C,D,A,B,X( 2),15,0x2ad7d2bbL); - R3(B,C,D,A,X( 9),21,0xeb86d391L); - - A = c->A += A; - B = c->B += B; - C = c->C += C; - D = c->D += D; - } - } -#endif - -#ifdef undef -int printit(unsigned long *l) - { - int i,ii; - - for (i=0; i<2; i++) - { - for (ii=0; ii<8; ii++) - { - fprintf(stderr,"%08lx ",l[i*8+ii]); - } - fprintf(stderr,"\n"); - } - } -#endif diff --git a/org.glite.jobid.api-c/src/md5_locl.h b/org.glite.jobid.api-c/src/md5_locl.h deleted file mode 100644 index e9e5b08..0000000 --- a/org.glite.jobid.api-c/src/md5_locl.h +++ /dev/null @@ -1,193 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* crypto/md5/md5_locl.h */ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * 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 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS 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 THE AUTHOR OR 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. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ - -#include -#include -#include -#include - -#ifndef MD5_LONG_LOG2 -#define MD5_LONG_LOG2 2 /* default to 32 bits */ -#endif - -#ifdef MD5_ASM -# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || defined(__INTEL__) || defined(__x86_64) || defined(__x86_64__) -# if !defined(B_ENDIAN) -# define md5_block_host_order md5_block_asm_host_order -# endif -# elif defined(__sparc) && defined(OPENSSL_SYS_ULTRASPARC) - void md5_block_asm_data_order_aligned (MD5_CTX *c, const MD5_LONG *p,size_t num); -# define HASH_BLOCK_DATA_ORDER_ALIGNED md5_block_asm_data_order_aligned -# endif -#endif - -MD5_JOBID_PROTO void md5_block_host_order (MD5_CTX *c, const void *p,size_t num); -MD5_JOBID_PROTO void md5_block_data_order (MD5_CTX *c, const void *p,size_t num); - -#if defined(__i386) || defined(__i386__) || defined(_M_IX86) || defined(__INTEL__) || defined(__x86_64) || defined(__x86_64__) -# if !defined(B_ENDIAN) -/* - * *_block_host_order is expected to handle aligned data while - * *_block_data_order - unaligned. As algorithm and host (x86) - * are in this case of the same "endianness" these two are - * otherwise indistinguishable. But normally you don't want to - * call the same function because unaligned access in places - * where alignment is expected is usually a "Bad Thing". Indeed, - * on RISCs you get punished with BUS ERROR signal or *severe* - * performance degradation. Intel CPUs are in turn perfectly - * capable of loading unaligned data without such drastic side - * effect. Yes, they say it's slower than aligned load, but no - * exception is generated and therefore performance degradation - * is *incomparable* with RISCs. What we should weight here is - * costs of unaligned access against costs of aligning data. - * According to my measurements allowing unaligned access results - * in ~9% performance improvement on Pentium II operating at - * 266MHz. I won't be surprised if the difference will be higher - * on faster systems:-) - * - * - */ -# define md5_block_data_order md5_block_host_order -# endif -#endif - -#define DATA_ORDER_IS_LITTLE_ENDIAN - -#define HASH_LONG MD5_LONG -#define HASH_LONG_LOG2 MD5_LONG_LOG2 -#define HASH_CTX MD5_CTX -#define HASH_CBLOCK MD5_CBLOCK -#define HASH_LBLOCK MD5_LBLOCK -#define HASH_UPDATE MD5_Update -#define HASH_TRANSFORM MD5_Transform -#define HASH_FINAL MD5_Final -#define HASH_MAKE_STRING(c,s) do { \ - unsigned long ll; \ - ll=(c)->A; HOST_l2c(ll,(s)); \ - ll=(c)->B; HOST_l2c(ll,(s)); \ - ll=(c)->C; HOST_l2c(ll,(s)); \ - ll=(c)->D; HOST_l2c(ll,(s)); \ - } while (0) -#define HASH_BLOCK_HOST_ORDER md5_block_host_order -#if !defined(L_ENDIAN) || defined(md5_block_data_order) -#define HASH_BLOCK_DATA_ORDER md5_block_data_order -/* - * Little-endians (Intel and Alpha) feel better without this. - * It looks like memcpy does better job than generic - * md5_block_data_order on copying-n-aligning input data. - * But frankly speaking I didn't expect such result on Alpha. - * On the other hand I've got this with egcs-1.0.2 and if - * program is compiled with another (better?) compiler it - * might turn out other way around. - * - * - */ -#endif - -#include "md32_common.h" - -/* -#define F(x,y,z) (((x) & (y)) | ((~(x)) & (z))) -#define G(x,y,z) (((x) & (z)) | ((y) & (~(z)))) -*/ - -/* As pointed out by Wei Dai , the above can be - * simplified to the code below. Wei attributes these optimizations - * to Peter Gutmann's SHS code, and he attributes it to Rich Schroeppel. - */ -#define F(b,c,d) ((((c) ^ (d)) & (b)) ^ (d)) -#define G(b,c,d) ((((b) ^ (c)) & (d)) ^ (c)) -#define H(b,c,d) ((b) ^ (c) ^ (d)) -#define I(b,c,d) (((~(d)) | (b)) ^ (c)) - -#define R0(a,b,c,d,k,s,t) { \ - a+=((k)+(t)+F((b),(c),(d))); \ - a=ROTATE(a,s); \ - a+=b; };\ - -#define R1(a,b,c,d,k,s,t) { \ - a+=((k)+(t)+G((b),(c),(d))); \ - a=ROTATE(a,s); \ - a+=b; }; - -#define R2(a,b,c,d,k,s,t) { \ - a+=((k)+(t)+H((b),(c),(d))); \ - a=ROTATE(a,s); \ - a+=b; }; - -#define R3(a,b,c,d,k,s,t) { \ - a+=((k)+(t)+I((b),(c),(d))); \ - a=ROTATE(a,s); \ - a+=b; }; diff --git a/org.glite.jobid.api-c/src/strmd5.c b/org.glite.jobid.api-c/src/strmd5.c deleted file mode 100755 index 8543cea..0000000 --- a/org.glite.jobid.api-c/src/strmd5.c +++ /dev/null @@ -1,169 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - - -#include -#include -#include - -#define MD5_JOBID_PROTO static -#include "md5.h" -#include "strmd5.h" - -#include "md5_dgst.c" - - -static char mbuf[33]; -static const char* b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; -static char *b64r; - -int base64_encode(const void *enc, int enc_size, char *out, int out_max_size) -{ - - 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; -} - -int base64_decode(const char *enc,char *out,int max_out_size) -{ - unsigned int bits = 0; - int shift = 0; - int out_size = 0; - - if (!b64r) { - int i; - b64r = calloc(128,1); - - for (i=0; b64[i]; i++) b64r[(int)b64[i]] = i; - } - - while (*enc && *enc != '=') { - bits <<= 6; - bits |= b64r[(int)*enc++]; - shift += 6; - - while (shift >= 8) { - if (out_size >= max_out_size) return -1; - shift -= 8; - *out++ = (bits >> shift) & 0xff; - out_size++; - } - } - - return out_size; -} - -char *strmd5(const char *s, unsigned char *digest) -{ - MD5_CTX md5; - unsigned char d[16]; - int i; - - MD5_Init(&md5); - MD5_Update(&md5,s,strlen(s)); - MD5_Final(d,&md5); - - if (digest) memcpy(digest,d,sizeof(d)); - - for (i=0; i<16; i++) { - int dd = d[i] & 0x0f; - mbuf[2*i+1] = dd<10 ? dd+'0' : dd-10+'a'; - dd = d[i] >> 4; - mbuf[2*i] = dd<10 ? dd+'0' : dd-10+'a'; - } - mbuf[32] = 0; - return (char *) mbuf; -} - -char *str2md5(const char *s) -{ - MD5_CTX md5; - unsigned char d[16]; - char* ret = malloc(33); - int i; - - if (!ret) - return NULL; - - MD5_Init(&md5); - MD5_Update(&md5, s, strlen(s)); - MD5_Final(d, &md5); - - for (i=0; i<16; i++) { - int dd = d[i] & 0x0f; - ret[2*i+1] = dd<10 ? dd+'0' : dd-10+'a'; - dd = d[i] >> 4; - ret[2*i] = dd<10 ? dd+'0' : dd-10+'a'; - } - ret[32] = 0; - return ret; -} - -char *str2md5base64(const char *s) -{ - MD5_CTX md5; - unsigned char d[16]; - char buf[50]; - int l; - - MD5_Init(&md5); - MD5_Update(&md5, s, strlen(s)); - MD5_Final(d, &md5); - - l = base64_encode(d, 16, buf, sizeof(buf) - 1); - if (l < 1) - return NULL; - buf[l - 1] = 0; - return strdup(buf); -} diff --git a/org.glite.jobid.api-c/test/base64_test.cpp b/org.glite.jobid.api-c/test/base64_test.cpp deleted file mode 100644 index b7003a7..0000000 --- a/org.glite.jobid.api-c/test/base64_test.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "strmd5.h" - -class Base64Test: public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(Base64Test); - CPPUNIT_TEST(test); - CPPUNIT_TEST_SUITE_END(); -public: - void test(); -}; - -void Base64Test::test() -{ - int i; - unsigned char in[2000], b[4000], out[2000]; - - srandom(0xDEAD); - in[0] = 'x'; - for (i=1; i<2000; i++) { - char s[20]; - int len; - sprintf(s,"%d",i); - in[i] = random() % 256; - - std::cerr << '.'; - - base64_encode(in,i,(char *) b,sizeof b); - len = base64_decode((const char *) b,(char *) out,sizeof out); - - CPPUNIT_ASSERT_MESSAGE(std::string("len"),i == len); - CPPUNIT_ASSERT_MESSAGE(std::string(s),!memcmp(in,out,i)); - } - std::cerr << std::endl; -} - -CPPUNIT_TEST_SUITE_REGISTRATION(Base64Test); - - -int main (int argc,const char *argv[]) -{ - CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); - - assert(argc == 2); - std::ofstream xml(argv[1]); - - CppUnit::TestResult controller; - CppUnit::TestResultCollector result; - controller.addListener( &result ); - - CppUnit::TestRunner runner; - runner.addTest(suite); - runner.run(controller); - - CppUnit::XmlOutputter xout( &result, xml ); - CppUnit::CompilerOutputter tout( &result, std::cout); - xout.write(); - tout.write(); - - return result.wasSuccessful() ? 0 : 1 ; -} diff --git a/org.glite.jobid.api-cpp/Makefile b/org.glite.jobid.api-cpp/Makefile deleted file mode 100644 index b35b7b8..0000000 --- a/org.glite.jobid.api-cpp/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# Default values -top_srcdir=.. -stagedir=. -globalprefix=glite -jobidprefix=jobid -package=glite-jobid-api-cpp -version=0.0.0 - -CC:=gcc -CXX:=g++ - --include Makefile.inc - -version=${module.version} - -VPATH=${top_srcdir}/src:${top_srcdir}/interface:${top_srcdir}/test - -DEBUG:=-g -O0 -Wall - -CFLAGS:=${DEBUG} \ - -I${top_srcdir}/interface -I${top_srcdir}/src \ - ${COVERAGE_FLAGS} \ - -D_GNU_SOURCE - -COMPILE:=libtool --mode=compile ${CC} ${CFLAGS} -CXXCOMPILE:=libtool --mode=compile ${CXX} ${CXXFLAGS} -LINK:=libtool --mode=link ${CC} ${LDFLAGS} -LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS} -INSTALL:=libtool --mode=install install - -LIBOBJS:= -HDRS:=JobId.h - -LIBLOBJS:=${LIBOBJS:.o=.lo} - -LIB:= - -compile all: - - -check: compile -# - -clean: - rm -rvf *.o *.lo .libs lib* *.c *.cpp *.h - rm -rvf log.xml project rpmbuild RPMS tgz - -install: - mkdir -p ${PREFIX}/include/${globalprefix}/${jobidprefix} - (cd ${top_srcdir}/interface; ${INSTALL} -m 644 ${HDRS} ${PREFIX}/include/${globalprefix}/${jobidprefix}) - - -%.o: %.c - ${COMPILE} -o $@ -c $< - - -.PHONY: default all compile check install clean diff --git a/org.glite.jobid.api-cpp/configure b/org.glite.jobid.api-cpp/configure deleted file mode 100755 index 8188919..0000000 --- a/org.glite.jobid.api-cpp/configure +++ /dev/null @@ -1,843 +0,0 @@ -#!/usr/bin/perl - -# WARNING: Don't edit this file unless it is the master copy in org.glite.lb -# -# For the purpose of standalone builds of lb/jobid/lbjp-common components -# it is copied on tagging - -# $Header$ -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners/ for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use Getopt::Long; - -my $pwd = `pwd`; chomp $pwd; -my $prefix = $pwd.'/stage'; -my $stagedir; -my $staged; -my $module; -my $thrflavour = 'gcc64dbgpthr'; -my $nothrflavour = 'gcc64dbg'; -my $mode = 'build'; -my $help = 0; -my $listmodules; -my $version; -my $branch; -my $output; -my $lb_tag = ''; -my $lbjp_tag = ''; -my $jp_tag = ''; -my $sec_tag = ''; -my $jobid_tag = ''; -my $libdir = getlibdir(); - -my @nodes = qw/client server logger utils client-java doc ws-test db jpprimary jpindex jpclient harvester/; -my %enable_nodes; -my %disable_nodes; - -my %extern_prefix = ( - cares => '/opt/c-ares', - classads => '/opt/classads', - cppunit => '/usr', - expat => '/usr', - globus => '/opt/globus', - gsoap => '/usr', - mysql => '/usr', - 'mysql-devel' => '', - 'mysql-server' => '', - voms => '/opt/glite', - gridsite => '/opt/glite', - lcas => '/opt/glite', - trustmanager => '/opt/glite', - utiljava => '/opt/glite', - ant => '/usr', - jdk => '/usr', - libtar => '/usr', - axis => '/usr', - log4c => '/usr', - postgresql => '/usr' -); - -my %jar = ( - 'commons-codec' => '/usr/share/java/commons-codec.jar', - 'commons-lang' => '/usr/share/java/commons-lang.jar', -); - - -my %glite_prefix; -my %need_externs; -my %need_externs_type; -my %need_jars; -my %extrafull; -my %extranodmod; -my %deps; -my %deps_type; -my %topbuild; - -my %lbmodules = ( - 'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim glite-LB/], - 'security' => [qw/gss gsoap-plugin/], - 'lbjp-common' => [qw/db log maildir server-bones trio jp-interface/], - 'jobid' => [qw/api-c api-cpp api-java/], - 'jp' => [ qw/client doc index primary server-common ws-interface/ ], - ); - - -my @opts = ( - 'prefix=s' => \$prefix, - 'staged=s' => \$staged, - 'module=s' => \$module, - 'thrflavour=s' => \$thrflavour, - 'nothrflavour=s' => \$nothrflavour, - 'mode=s' => \$mode, - 'listmodules=s' => \$listmodules, - 'version=s' => \$version, - 'branch=s' => \$branch, - 'output=s' => \$output, - 'stage=s' => \$stagedir, - 'lb-tag=s' => \$lb_tag, - 'lbjp-common-tag=s' => \$lbjp_tag, - 'jp-tag=s' => \$jp_tag, - 'security-tag=s' => \$sec_tag, - 'jobid-tag=s' => \$jobid_tag, - 'help' => \$help, - 'libdir=s' => \$libdir, -); - -for (@nodes) { - $enable_nodes{$_} = 0; - $disable_nodes{$_} = 0; - - push @opts,"disable-$_",\$disable_nodes{$_}; - push @opts,"enable-$_",\$enable_nodes{$_}; -} - -push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix; -push @opts,"with-$_=s",\$jar{$_} for keys %jar; - -my @keeparg = @ARGV; - -GetOptions @opts or die "Errors parsing command line\n"; - -$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq ''; -$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq ''; - -if ($help) { usage(); exit 0; } - -if ($listmodules) { - my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}}; - print "@m\n"; - exit 0; -} - -warn "$0: --version, --branch and --output make sense only in --mode=etics\n" - if ($version || $output || $branch) && $mode ne 'etics'; - -my $en; -for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; } - -my $dis; -for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; } - -die "--enable-* and --disable-* are mutually exclusive\n" - if $en && $dis; - -die "--module cannot be used with --enable-* or --disable-*\n" - if $module && ($en || $dis); - -die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}}; - -if ($dis) { - for (@nodes) { - $enable_nodes{$_} = 1 unless $disable_nodes{$_}; - } -} - -if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ; - -for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; } - -$stagedir = $prefix unless $stagedir; - -if ($mode eq 'build') { - print "Writing config.status\n"; - open CONF,">config.status" or die "config.status: $!\n"; - print CONF "$0 @keeparg\n"; - close CONF; -} - - -my @modules; -my %aux; - -if ($module) { -# push @modules,split(/[,.]+/,$module); - push @modules,$module; -} -else { - @modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes)); - - my $n; - - do { - local $"="\n"; - $n = $#modules; - push @modules,(map @{$deps{$_}},@modules); - - undef %aux; @aux{@modules} = (1) x ($#modules+1); - @modules = keys %aux; - } while ($#modules > $n); -} - -@aux{@modules} = (1) x ($#modules+1); -delete $aux{$_} for (split /,/,$staged); -@modules = keys %aux; - -mode_build() if $mode eq 'build'; -mode_checkout() if $mode eq 'checkout'; -mode_etics($module) if $mode eq 'etics'; - -sub mode_build { - print "\nBuilding modules: @modules\n"; - - my @ext = map @{$need_externs{$_}},@modules; - my @myjars = map @{$need_jars{$_}},@modules; - undef %aux; @aux{@ext} = 1; - @ext = keys %aux; - undef %aux; @aux{@myjars} = (1) x ($#myjars+1); - @myjars = keys %aux; - - print "\nRequired externals:\n"; - print "\t$_: $extern_prefix{$_}\n" for @ext; - print "\t$_: $jar{$_}\n" for @myjars; - print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n"; - - mkinc($_) for @modules; - - print "Creating Makefile\n"; - - open MAK,">Makefile" or die "Makefile: $!\n"; - - print MAK "all: @modules\n\nclean:\n"; - - for (@modules) { - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - print MAK "\tcd $full$build && \${MAKE} clean\n" - } - - print MAK "\ndistclean:\n"; - - for (@modules) { - my $full = full($_); - print MAK $topbuild{$_} ? - "\tcd $full$build && \${MAKE} distclean\n" : - "\trm -rf $full$build\n" - } - - print MAK "\n"; - - for (@modules) { - my %ldeps; undef %ldeps; - @ldeps{@{$deps{$_}}} = 1; - for my $x (split /,/,$staged) { delete $ldeps{$x}; } - my @dnames = $module ? () : keys %ldeps; - - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - - print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n"; - } - - close MAK; -} - -sub mode_checkout() { - for (@modules) { - my $module = $_; - my $tag = ""; - if ($lb_tag){ - for (@{$lbmodules{lb}}){ - if ("lb.".$_ eq $module){ - $tag = '-r '.$lb_tag; - } - } - } - if ($lbjp_tag){ - for (@{$lbmodules{'lbjp-common'}}){ - if ("lbjp-common.".$_ eq $module){ - $tag = '-r '.$lbjp_tag; - } - } - } - if ($jp_tag){ - for (@{$lbmodules{'jp'}}){ - if ("jp.".$_ eq $module){ - $tag = '-r '.$jp_tag; - } - } - } - if ($sec_tag){ - for (@{$lbmodules{security}}){ - if ("security.".$_ eq $module){ - $tag = '-r '.$sec_tag; - } - } - } - if ($jobid_tag){ - for (@{$lbmodules{jobid}}){ - if ("jobid.".$_ eq $module){ - $tag = '-r '.$jobid_tag; - } - } - } - #if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){ - # print "found"; - #} - $_ = full($_); - print "\n*** Checking out $_\n"; - system("cvs checkout $tag $_") == 0 or die "cvs checkout $tag $_: $?\n"; - } -} - -BEGIN{ -%need_externs_aux = ( - 'lb.client' => [ qw/cppunit:B classads/ ], - 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava/ ], - 'lb.common' => [ qw/expat cares:B cppunit:B classads/ ], - 'lb.doc' => [], - 'lb.logger' => [ qw/cppunit:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ], - 'lb.state-machine' => [ qw/classads/ ], - 'lb.utils' => [ qw/cppunit:B/ ], - 'lb.ws-interface' => [], - 'lb.ws-test' => [ qw/gsoap:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw// ], - 'lb.yaim' => [ qw/yaim_core:R/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], - 'lbjp-common.db' => [ qw/mysql:B mysql-devel:B postgresql:B cppunit:B log4c:B/ ], - 'lbjp-common.log' => [ qw/log4c/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw// ], - 'lbjp-common.trio' => [ qw/cppunit:B/ ], - 'lbjp-common.jp-interface' => [ qw/cppunit:B log4c:B/ ], - 'security.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B/ ], - 'security.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap:B/ ], - 'jobid.api-c' => [ qw/cppunit:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], - 'jobid.api-java' => [ qw/ant:B jdk:B/ ], - 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], - 'jp.doc' => [], - 'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ], - 'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ], - 'jp.server-common' => [], - 'jp.ws-interface' => [], -); - -for my $ext (keys %need_externs_aux) { - for (@{$need_externs_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$need_externs{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $need_externs_type{$ext}->{$1} = $type; - } -} - -%need_jars = ( - 'jobid.api-java' => [ qw/commons-codec/ ], - 'lb.client-java' => [ qw/commons-lang/ ], -); - -for my $jar (keys %need_jars) { - for (@{$need_jars{$jar}}) { - $need_externs_type{$jar}->{$_} = 'BR'; # XXX - } -} - -%deps_aux = ( - 'lb.client' => [ qw/ - lb.types:B lb.common - lbjp-common.trio - jobid.api-cpp:B jobid.api-c - security.gss - / ], - 'lb.client-java' => [ qw/ - lb.types:B - lb.ws-interface:B - jobid.api-java - / ], - 'lb.common' => [ qw/ - jobid.api-cpp:B jobid.api-c - lb.types:B lbjp-common.trio security.gss - / ], - 'lb.doc' => [ qw/lb.types:B/ ], - 'lb.logger' => [ qw/ - lbjp-common.trio - lbjp-common.log - jobid.api-c - lb.common - security.gss - / ], - 'lb.server' => [ qw/ - lb.ws-interface lb.types:B lb.common lb.state-machine - lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log - jobid.api-c - security.gsoap-plugin security.gss - / ], - 'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ], - 'lb.utils' => [ qw/ - lbjp-common.jp-interface - jobid.api-c - lbjp-common.trio lbjp-common.maildir - lb.client lb.state-machine - / ], - 'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ], - 'lb.ws-interface' => [ qw/lb.types:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw/ - jobid.api-c lbjp-common.trio lbjp-common.db lb.common lb.client - security.gss lbjp-common.log - / ], - 'lb.yaim' => [ qw// ], - 'lb.glite-LB' => [ qw/ - lb.logger:R lb.server:R lb.utils:R lb.doc:R - lb.ws-test:R lb.harvester:R lb.yaim:R - / ], - 'lbjp-common.db' => [ qw/lbjp-common.trio lbjp-common.log/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw/lbjp-common.log/ ], - 'lbjp-common.trio' => [ qw// ], - 'security.gss' => [ qw// ], - 'security.gsoap-plugin' => [ qw/security.gss/ ], - 'jobid.api-c' => [ qw// ], - 'jobid.api-cpp' => [ qw/jobid.api-c/ ], - 'jobid.api-java' => [ qw// ], - - 'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ], - - 'jp.client' => [ qw/ - jp.ws-interface - lbjp-common.jp-interface lbjp-common.maildir - jobid.api-c - security.gsoap-plugin - / ], - 'jp.doc' => [ qw// ], - 'jp.index' => [ qw/ - jp.server-common jp.ws-interface - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.primary' => [ qw/ - jobid.api-c - jp.server-common jp.ws-interface - lb.state-machine - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.server-common' => [ qw/ - lbjp-common.jp-interface lbjp-common.db - / ], - 'jp.ws-interface' => [ qw// ], -); - -for my $ext (keys %deps_aux) { - for (@{$deps_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$deps{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $deps_type{$ext}->{$1} = $type; - } -} - - -%extrafull = ( gridsite=>'org.gridsite.core'); - -#( java => 'client-java' ); -%extranodmod = ( - db => 'lbjp-common.db', - jpprimary => 'jp.primary', - jpindex => 'jp.index', - jpclient => 'jp.client', -); - -%obsoletes = ( - 'lb.yaim' => [ qq/glite-yaim-lb/ ], -); - -my @t = qw/lb.client-java jobid.api-java lb.types/; -@topbuild{@t} = (1) x ($#t+1); -} - -sub full -{ - my $short = shift; - return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short; -} - -sub mkinc -{ - my %aux; - undef %aux; - my @m=qw/ -lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB -security.gss security.gsoap-plugin -jobid.api-c jobid.api-cpp jobid.api-java -lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface -jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface -/; - @aux{@m} = (1) x ($#m+1); - - my $short = shift; - my $full = full $short; - - unless ($aux{$short}) { - print "Makefile.inc not needed in $full\n"; - return; - } - - my $build = ''; - - unless ($topbuild{$_}) { - $build = '/build'; - unless (-d "$full/build") { - mkdir "$full/build" or die "mkdir $full/build: $!\n"; - } - unlink "$full/build/Makefile"; - symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n"; - } - - open MKINC,">$full$build/Makefile.inc" - or die "$full$build/Makefile.inc: $!\n"; - - print "Creating $full$build/Makefile.inc\n"; - - print MKINC qq{ -PREFIX = $prefix -stagedir = $stagedir -thrflavour = $thrflavour -nothrflavour = $nothrflavour -libdir = $libdir -}; - - for (@{$need_externs{$short}}) { - print MKINC "${_}_prefix = $extern_prefix{$_}\n" - } - - for (@{$need_jars{$short}}) { - print MKINC "${_}_jar = $jar{$_}\n" - } - - my $need_gsoap = 0; - for (@{$need_externs{$short}}) { $need_gsoap = 1 if $_ eq 'gsoap'; } - - print MKINC "gsoap_default_version=".gsoap_version()."\n" if $need_gsoap; - - close MKINC; -} - -my %etics_externs; -my %etics_projects; -BEGIN{ - %etics_externs = ( - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - gridsite=>'org.gridsite.shared', - lcas=>'org.glite.security.lcas', - trustmanager=>'org.glite.security.trustmanager', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - yaim_core=>'org.glite.yaim.core', - ); - %etics_projects = ( - vdt=>[qw/globus globus_essentials/], - 'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/], - ); -}; - -sub mode_etics { - $fmod = shift; - - die "$0: --module required with --etics\n" unless $fmod; - - my ($subsys,$module) = split /\./,$fmod; - - my ($major,$minor,$rev,$age); - - if ($version) { - $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/; - ($major,$minor,$rev,$age) = ($1,$2,$3,$4); - } - else { - open V,"org.glite.$subsys.$module/project/version.properties" - or die "org.glite.$subsys.$module/project/version.properties: $!\n"; - - while ($_ = ) { - chomp; - ($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/; - $age = $1 if /module\.age\s*=\s*([[:digit:]]+)/; - } - close V; - } - - my @copts = (); - my %ge; - @ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1); - - for (@{$need_externs{"$subsys.$module"}}) { - if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; - } - } - - for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - push @copts,"--with-$_ \${$eext.location}/$_*.jar"; - } - - my $conf; - my $conftag; - - if ($branch) { - $conf = "glite-${subsys}-${module}_$branch"; - $conftag = $branch; - $dwpath = ""; } - else { - $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - $conftag = $conf; - $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n"; } -# my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - my $file = $output ? $output : "$conf.ini"; - open C,">$file" or die "$file: $!\n"; - - my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build"; - - my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..'; - - my $package_description = ""; - my $package_summary = ""; - - if (-e "org.glite.$subsys.$module/project/package.description") { - open V, "org.glite.$subsys.$module/project/package.description"; - $package_description = join ("", ); - close V; - chomp $package_description; - $package_description =~ s/\n/\\n/g; - $package_description = "package.description = $package_description"; - } - else { - print STDERR "package.description not found for $subsys.$module!\n"; } - - if (-e "org.glite.$subsys.$module/project/package.summary") { - open V, "org.glite.$subsys.$module/project/package.summary"; - $package_summary = join ("", ); - close V; - chomp $package_summary; - $package_summary =~ s/\n/\\n/g; - $package_summary = "package.summary = $package_summary"; - } - else { - print STDERR "package.summary not found for $subsys.$module!\n"; } - - - print STDERR "Writing $file\n"; - print C qq{ -[Configuration-$conf] -profile = None -moduleName = org.glite.$subsys.$module -displayName = $conf -description = org.glite.$subsys.$module -projectName = org.glite -age = $age -deploymentType = None -tag = $conftag -version = $major.$minor.$rev -$dwpath -[Platform-default:VcsCommand] -displayName = None -description = None -tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName} -branch = None -commit = None -checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName} - -[Platform-default:BuildCommand] -postpublish = None -packaging = None -displayName = None -description = None -doc = None -prepublish = None -publish = None -compile = make -init = None -install = make install -clean = make clean -test = make check -configure = cd $confdir && /usr/bin/perl \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts -checkstyle = None - -[Platform-default:Property] -$buildroot -$package_description -$package_summary -}; - for (@{$obsoletes{"$subsys.$module"}}) { - print C "package.obsoletes = $_\n"; - print C "package.replaces = $_\n"; - } - - print C qq{ -[Platform-default:DynamicDependency] -}; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; - } - } - - my $type = $need_externs_type{"$subsys.$module"}->{$_}; - print C "$proj|$eext = $type\n"; - } - - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "org.glite|org.glite.$_ = $type\n"; - } - - close C; -} - -sub gsoap_version { - local $_; - my $gsoap_version; - open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n"; - - while ($_ = ) { - chomp; - - $gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/; - } - close S; - return $gsoap_version; -} - -sub getlibdir { - if ( -e "/etc/debian_version") { # We are on Debian - $lib64="lib"; - $lib32="lib32"; } - else { # Another distribution - $lib64="lib64"; - $lib32="lib"; } - $libdir=$lib32; - - open INP, "uname -s | "; # Check kernel name - $kname= ; - chomp($kname); - close INP; - - if ( $kname == "Linux") { - $arch = ("x86_64\npowerpc\nppc64\n"); - - open INP, "uname -p | "; # Check processor type - $procname= ; - chomp($procname); - close INP; - - if ($arch =~/^$procname\n/) { - return ($lib64); } - - open INP, "uname -m | "; # Check machine hardware - $machname= ; - chomp($machname); - close INP; - - if ($arch =~/^$machname\n/) { - return ($lib64); } - - # special cases (hyperlink lib64, Debian) - if (-l "/usr/lib64") { - $libdir=$lib32; } - - # if /usr/lib64 doesn't exist at all (AIX) - unless ( -e "/usr/lib64" ) { - $libdir=$lib32; } - } - - if ( $kname == "SunOS") { - if (-e "/usr/lib/64") { - $libdir="lib/64"; } - } - - return $libdir; -} - -sub usage { - my @ext = keys %extern_prefix; - my @myjars, keys %jar; - - print STDERR qq{ -usage: $0 options - -General options (defaults in []): - --prefix=PREFIX destination directory [./stage] - --staged=module,module,... what is already in PREFIX (specify without org.glite.) - --thrflavour=flavour - --nothrflavour=flavour threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg] - --listmodules=subsys list modules of a subsystem - --libdir=libdir typically [lib,lib64] postfix - -Mode of operation: - --mode={checkout|build|etics} what to do [build] - -What to build: - --module=module build this module only (mostly in-Etics operation) - --enable-NODE build this "node" (set of modules) only. Available nodes are - @{$lbmodules{lb}},@{$lbmodules{security}} - --disable-NODE don't build this node - --lb-tag=tag checkout LB modules with specific tag - --jp-tag=tag checkout JP modules with specific tag - --lbjp-common-tag=tag checkout lbjp-common modules with specific tag - --security-tag=tag checkout security modules with specific tag - --jobid-tag=tag checkout jobid modules with specific tag - -Dependencies: - --with-EXTERNAL=PATH where to look for an external. Required externals - (not all for all modules) are: - @ext - --with-JAR=JAR where to look for jars. Required jars are: - @myjars - Summary of what will be used is always printed - -}; - -} diff --git a/org.glite.jobid.api-cpp/interface/JobId.h b/org.glite.jobid.api-cpp/interface/JobId.h deleted file mode 100755 index 7c96993..0000000 --- a/org.glite.jobid.api-cpp/interface/JobId.h +++ /dev/null @@ -1,351 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#ifndef GLITE_JOBID_JOBID_H -#define GLITE_JOBID_JOBID_H - -#include -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" - - -namespace glite { -namespace jobid { - - -/** - * class glite::jobid::JobIdError - */ - -class JobIdError : public std::runtime_error { -public: - /** Constructor for mandatory fields. - * - * Updates all the mandatory fields and names the exception. - * \param[in] exception Error message describing the exception. - */ - JobIdError(std::string const& exception) - : std::runtime_error(std::string("JobId: bad argument (") + exception + ")") - {} - - virtual ~JobIdError() throw() - {} - -}; - - -/** - * class glite::jobid::JobId - */ - -class JobId -{ -public: - class Hostname { - public: - std::string const& name; - Hostname(std::string const& n) : name(n) - {} - }; - - //@name Constructors/Destructor - //@{ - - /** - * Constructor from string format. - * @param job_id_string - * @throws Exception When a string is passed in a wrong format - */ - JobId(std::string const& job_id_string); - - /** - * Constructor from job id components. - * \param host - * \param port - * \param unique - */ - explicit JobId(Hostname const& host = Hostname("localhost"), - int port = GLITE_JOBID_DEFAULT_PORT, - std::string const& unique = std::string("")); - - /** - * Destructor. - */ - ~JobId(); - - //@} - - //@ Conversions, assignments, comparisons - //@{ - - /** - * Copy constructor. - */ - JobId(JobId const&); - - /** - * Constructor from C jobid. - * \param src C API job id - */ - explicit JobId(glite_jobid_const_t src); - - /** - * Assignment operator. - * Create a deep copy of the JobId instance. - */ - JobId& operator=(JobId const& src); - - /** - * Casting operator. - */ - glite_jobid_const_t c_jobid() const; - - /** - * Returns the string representing the job id - * @return String representation of a JobId - */ - std::string toString() const; - - - /** - * Comparison given by lexicographical ordering of string representations. - * @return Result of comparison. - */ - int operator< (const JobId &j) const; - //@} - - - /**@name Member access - * @{ - */ - - /** - * Get server:port. - * @return hostname and port - */ - std::string server() const; - - /** - * Get host. - * @return hostname - */ - std::string host() const; - - /** - * Get port. - * @return port - */ - int port() const; - - /** - * Get unique. - * @return unique string - */ - std::string unique() const; - - //@} - -private: - glite_jobid_t m_jobid; -}; - - - -// -------------------- implementation ------------------------ - -inline -JobId::JobId(std::string const& job_id_string) -{ - int ret = glite_jobid_parse(job_id_string.c_str(), - &m_jobid); - switch(ret) { - case EINVAL: - throw JobIdError(job_id_string); - - case ENOMEM: - throw std::bad_alloc(); - - default: - break; - } -} - - -inline -JobId::JobId(JobId::Hostname const& host, int port, std::string const& unique) -{ - if(port < 0) { - throw JobIdError("negative port"); - } - - int ret = glite_jobid_recreate(host.name.c_str(), port, - unique.empty() ? NULL : unique.c_str(), - &m_jobid); - switch(ret) { - case EINVAL: - throw JobIdError(host.name); - - case ENOMEM: - throw std::bad_alloc(); - - default: - break; - } -} - - -inline -JobId::~JobId() { - glite_jobid_free(m_jobid); -} - - -inline -JobId::JobId(JobId const& src) -{ - int ret = glite_jobid_dup(src.m_jobid, - &m_jobid); - if(ret) { - // we rely on dup returning only ENOMEM on error - assert(ret == ENOMEM); - throw std::bad_alloc(); - } -} - - -inline -JobId::JobId(glite_jobid_const_t src) -{ - if(src == NULL) { - throw JobIdError("null"); - } - - int ret = glite_jobid_dup(src, - &m_jobid); - if(ret) { - throw std::bad_alloc(); - } -} - - -inline -JobId& -JobId::operator=(JobId const& src) -{ - if(this == &src) { - return *this; - } - - glite_jobid_free(m_jobid); - int ret = glite_jobid_dup(src.m_jobid, - &m_jobid); - if(ret) { - throw std::bad_alloc(); - } - return *this; -} - - -inline -glite_jobid_const_t -JobId::c_jobid() const -{ - return m_jobid; -} - - -inline -std::string -JobId::toString() const -{ - char *out = glite_jobid_unparse(m_jobid); - std::string res(out); - - free(out); - return res; -} - - -inline -int -JobId::operator< (const JobId &j) const -{ - std::string me(toString()); - std::string js(j.toString()); - - return(me < js); -} - - -inline -std::string -JobId::server() const -{ - char *server = glite_jobid_getServer(m_jobid); - std::string res(server); - - free(server); - return res; -} - - -inline -std::string -JobId::host() const -{ - char *name; - unsigned int port; - - glite_jobid_getServerParts_internal(m_jobid, - &name, &port); - return std::string(name); -} - - -inline -int -JobId::port() const -{ - char *name; - unsigned int port; - - glite_jobid_getServerParts_internal(m_jobid, - &name, &port); - return port; -} - - -inline -std::string -JobId::unique() const -{ - char *unique = glite_jobid_getUnique_internal(m_jobid); - std::string res(unique); - - return res; -} - - -} // namespace jobid -} // namespace glite - -#endif // GLITE_JOBID_JOBID_H diff --git a/org.glite.jobid.api-cpp/project/ChangeLog b/org.glite.jobid.api-cpp/project/ChangeLog deleted file mode 100644 index b537194..0000000 --- a/org.glite.jobid.api-cpp/project/ChangeLog +++ /dev/null @@ -1,16 +0,0 @@ -1.0.0-1 -- initial release - -1.0.0-2 -- fixes in etics' invocation of configure - -1.0.0-4 -- configure script update -- compatibility with g++ 4.3.2 - -1.0.0-5 -- module rebuilt - -1.0.0-6 -- module rebuilt - diff --git a/org.glite.jobid.api-cpp/project/package.description b/org.glite.jobid.api-cpp/project/package.description deleted file mode 100644 index e140a25..0000000 --- a/org.glite.jobid.api-cpp/project/package.description +++ /dev/null @@ -1 +0,0 @@ -C++ API handling gLite jobid. It is a thin wrapper of the C implementation (glite-jobid-api-c). diff --git a/org.glite.jobid.api-cpp/project/package.summary b/org.glite.jobid.api-cpp/project/package.summary deleted file mode 100644 index e73220a..0000000 --- a/org.glite.jobid.api-cpp/project/package.summary +++ /dev/null @@ -1 +0,0 @@ -C++ API handling gLite jobid diff --git a/org.glite.jobid.api-cpp/project/version.properties b/org.glite.jobid.api-cpp/project/version.properties deleted file mode 100644 index d8f25c4..0000000 --- a/org.glite.jobid.api-cpp/project/version.properties +++ /dev/null @@ -1,3 +0,0 @@ -# : /cvs/glite/org.glite.jobid.api-cpp/project/version.properties,v 1.1 2009/01/16 08:48:52 zsustr Exp $ -module.version=1.0.0 -module.age=6 diff --git a/org.glite.jobid.api-java/Makefile b/org.glite.jobid.api-java/Makefile deleted file mode 100644 index de0b4ee..0000000 --- a/org.glite.jobid.api-java/Makefile +++ /dev/null @@ -1,14 +0,0 @@ --include Makefile.inc - -all compile: - ${ant_prefix}/bin/ant -Dfile.reference.commons-codec.jar=${commons-codec_jar} - -install: - mkdir -p ${PREFIX}/share/java - cp dist/jobid-api-java.jar ${PREFIX}/share/java - -check: - -clean: - ${ant_prefix}/bin/ant clean - rm -rvf log.xml project/glite-jobid-api-java.spec rpmbuild/ RPMS/ tgz/ diff --git a/org.glite.jobid.api-java/build.xml b/org.glite.jobid.api-java/build.xml deleted file mode 100755 index 90e26a7..0000000 --- a/org.glite.jobid.api-java/build.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - Builds, tests, and runs the project jobid-api-java. - - - diff --git a/org.glite.jobid.api-java/configure b/org.glite.jobid.api-java/configure deleted file mode 100755 index 8188919..0000000 --- a/org.glite.jobid.api-java/configure +++ /dev/null @@ -1,843 +0,0 @@ -#!/usr/bin/perl - -# WARNING: Don't edit this file unless it is the master copy in org.glite.lb -# -# For the purpose of standalone builds of lb/jobid/lbjp-common components -# it is copied on tagging - -# $Header$ -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners/ for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use Getopt::Long; - -my $pwd = `pwd`; chomp $pwd; -my $prefix = $pwd.'/stage'; -my $stagedir; -my $staged; -my $module; -my $thrflavour = 'gcc64dbgpthr'; -my $nothrflavour = 'gcc64dbg'; -my $mode = 'build'; -my $help = 0; -my $listmodules; -my $version; -my $branch; -my $output; -my $lb_tag = ''; -my $lbjp_tag = ''; -my $jp_tag = ''; -my $sec_tag = ''; -my $jobid_tag = ''; -my $libdir = getlibdir(); - -my @nodes = qw/client server logger utils client-java doc ws-test db jpprimary jpindex jpclient harvester/; -my %enable_nodes; -my %disable_nodes; - -my %extern_prefix = ( - cares => '/opt/c-ares', - classads => '/opt/classads', - cppunit => '/usr', - expat => '/usr', - globus => '/opt/globus', - gsoap => '/usr', - mysql => '/usr', - 'mysql-devel' => '', - 'mysql-server' => '', - voms => '/opt/glite', - gridsite => '/opt/glite', - lcas => '/opt/glite', - trustmanager => '/opt/glite', - utiljava => '/opt/glite', - ant => '/usr', - jdk => '/usr', - libtar => '/usr', - axis => '/usr', - log4c => '/usr', - postgresql => '/usr' -); - -my %jar = ( - 'commons-codec' => '/usr/share/java/commons-codec.jar', - 'commons-lang' => '/usr/share/java/commons-lang.jar', -); - - -my %glite_prefix; -my %need_externs; -my %need_externs_type; -my %need_jars; -my %extrafull; -my %extranodmod; -my %deps; -my %deps_type; -my %topbuild; - -my %lbmodules = ( - 'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim glite-LB/], - 'security' => [qw/gss gsoap-plugin/], - 'lbjp-common' => [qw/db log maildir server-bones trio jp-interface/], - 'jobid' => [qw/api-c api-cpp api-java/], - 'jp' => [ qw/client doc index primary server-common ws-interface/ ], - ); - - -my @opts = ( - 'prefix=s' => \$prefix, - 'staged=s' => \$staged, - 'module=s' => \$module, - 'thrflavour=s' => \$thrflavour, - 'nothrflavour=s' => \$nothrflavour, - 'mode=s' => \$mode, - 'listmodules=s' => \$listmodules, - 'version=s' => \$version, - 'branch=s' => \$branch, - 'output=s' => \$output, - 'stage=s' => \$stagedir, - 'lb-tag=s' => \$lb_tag, - 'lbjp-common-tag=s' => \$lbjp_tag, - 'jp-tag=s' => \$jp_tag, - 'security-tag=s' => \$sec_tag, - 'jobid-tag=s' => \$jobid_tag, - 'help' => \$help, - 'libdir=s' => \$libdir, -); - -for (@nodes) { - $enable_nodes{$_} = 0; - $disable_nodes{$_} = 0; - - push @opts,"disable-$_",\$disable_nodes{$_}; - push @opts,"enable-$_",\$enable_nodes{$_}; -} - -push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix; -push @opts,"with-$_=s",\$jar{$_} for keys %jar; - -my @keeparg = @ARGV; - -GetOptions @opts or die "Errors parsing command line\n"; - -$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq ''; -$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq ''; - -if ($help) { usage(); exit 0; } - -if ($listmodules) { - my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}}; - print "@m\n"; - exit 0; -} - -warn "$0: --version, --branch and --output make sense only in --mode=etics\n" - if ($version || $output || $branch) && $mode ne 'etics'; - -my $en; -for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; } - -my $dis; -for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; } - -die "--enable-* and --disable-* are mutually exclusive\n" - if $en && $dis; - -die "--module cannot be used with --enable-* or --disable-*\n" - if $module && ($en || $dis); - -die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}}; - -if ($dis) { - for (@nodes) { - $enable_nodes{$_} = 1 unless $disable_nodes{$_}; - } -} - -if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ; - -for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; } - -$stagedir = $prefix unless $stagedir; - -if ($mode eq 'build') { - print "Writing config.status\n"; - open CONF,">config.status" or die "config.status: $!\n"; - print CONF "$0 @keeparg\n"; - close CONF; -} - - -my @modules; -my %aux; - -if ($module) { -# push @modules,split(/[,.]+/,$module); - push @modules,$module; -} -else { - @modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes)); - - my $n; - - do { - local $"="\n"; - $n = $#modules; - push @modules,(map @{$deps{$_}},@modules); - - undef %aux; @aux{@modules} = (1) x ($#modules+1); - @modules = keys %aux; - } while ($#modules > $n); -} - -@aux{@modules} = (1) x ($#modules+1); -delete $aux{$_} for (split /,/,$staged); -@modules = keys %aux; - -mode_build() if $mode eq 'build'; -mode_checkout() if $mode eq 'checkout'; -mode_etics($module) if $mode eq 'etics'; - -sub mode_build { - print "\nBuilding modules: @modules\n"; - - my @ext = map @{$need_externs{$_}},@modules; - my @myjars = map @{$need_jars{$_}},@modules; - undef %aux; @aux{@ext} = 1; - @ext = keys %aux; - undef %aux; @aux{@myjars} = (1) x ($#myjars+1); - @myjars = keys %aux; - - print "\nRequired externals:\n"; - print "\t$_: $extern_prefix{$_}\n" for @ext; - print "\t$_: $jar{$_}\n" for @myjars; - print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n"; - - mkinc($_) for @modules; - - print "Creating Makefile\n"; - - open MAK,">Makefile" or die "Makefile: $!\n"; - - print MAK "all: @modules\n\nclean:\n"; - - for (@modules) { - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - print MAK "\tcd $full$build && \${MAKE} clean\n" - } - - print MAK "\ndistclean:\n"; - - for (@modules) { - my $full = full($_); - print MAK $topbuild{$_} ? - "\tcd $full$build && \${MAKE} distclean\n" : - "\trm -rf $full$build\n" - } - - print MAK "\n"; - - for (@modules) { - my %ldeps; undef %ldeps; - @ldeps{@{$deps{$_}}} = 1; - for my $x (split /,/,$staged) { delete $ldeps{$x}; } - my @dnames = $module ? () : keys %ldeps; - - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - - print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n"; - } - - close MAK; -} - -sub mode_checkout() { - for (@modules) { - my $module = $_; - my $tag = ""; - if ($lb_tag){ - for (@{$lbmodules{lb}}){ - if ("lb.".$_ eq $module){ - $tag = '-r '.$lb_tag; - } - } - } - if ($lbjp_tag){ - for (@{$lbmodules{'lbjp-common'}}){ - if ("lbjp-common.".$_ eq $module){ - $tag = '-r '.$lbjp_tag; - } - } - } - if ($jp_tag){ - for (@{$lbmodules{'jp'}}){ - if ("jp.".$_ eq $module){ - $tag = '-r '.$jp_tag; - } - } - } - if ($sec_tag){ - for (@{$lbmodules{security}}){ - if ("security.".$_ eq $module){ - $tag = '-r '.$sec_tag; - } - } - } - if ($jobid_tag){ - for (@{$lbmodules{jobid}}){ - if ("jobid.".$_ eq $module){ - $tag = '-r '.$jobid_tag; - } - } - } - #if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){ - # print "found"; - #} - $_ = full($_); - print "\n*** Checking out $_\n"; - system("cvs checkout $tag $_") == 0 or die "cvs checkout $tag $_: $?\n"; - } -} - -BEGIN{ -%need_externs_aux = ( - 'lb.client' => [ qw/cppunit:B classads/ ], - 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava/ ], - 'lb.common' => [ qw/expat cares:B cppunit:B classads/ ], - 'lb.doc' => [], - 'lb.logger' => [ qw/cppunit:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ], - 'lb.state-machine' => [ qw/classads/ ], - 'lb.utils' => [ qw/cppunit:B/ ], - 'lb.ws-interface' => [], - 'lb.ws-test' => [ qw/gsoap:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw// ], - 'lb.yaim' => [ qw/yaim_core:R/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], - 'lbjp-common.db' => [ qw/mysql:B mysql-devel:B postgresql:B cppunit:B log4c:B/ ], - 'lbjp-common.log' => [ qw/log4c/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw// ], - 'lbjp-common.trio' => [ qw/cppunit:B/ ], - 'lbjp-common.jp-interface' => [ qw/cppunit:B log4c:B/ ], - 'security.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B/ ], - 'security.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap:B/ ], - 'jobid.api-c' => [ qw/cppunit:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], - 'jobid.api-java' => [ qw/ant:B jdk:B/ ], - 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], - 'jp.doc' => [], - 'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ], - 'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ], - 'jp.server-common' => [], - 'jp.ws-interface' => [], -); - -for my $ext (keys %need_externs_aux) { - for (@{$need_externs_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$need_externs{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $need_externs_type{$ext}->{$1} = $type; - } -} - -%need_jars = ( - 'jobid.api-java' => [ qw/commons-codec/ ], - 'lb.client-java' => [ qw/commons-lang/ ], -); - -for my $jar (keys %need_jars) { - for (@{$need_jars{$jar}}) { - $need_externs_type{$jar}->{$_} = 'BR'; # XXX - } -} - -%deps_aux = ( - 'lb.client' => [ qw/ - lb.types:B lb.common - lbjp-common.trio - jobid.api-cpp:B jobid.api-c - security.gss - / ], - 'lb.client-java' => [ qw/ - lb.types:B - lb.ws-interface:B - jobid.api-java - / ], - 'lb.common' => [ qw/ - jobid.api-cpp:B jobid.api-c - lb.types:B lbjp-common.trio security.gss - / ], - 'lb.doc' => [ qw/lb.types:B/ ], - 'lb.logger' => [ qw/ - lbjp-common.trio - lbjp-common.log - jobid.api-c - lb.common - security.gss - / ], - 'lb.server' => [ qw/ - lb.ws-interface lb.types:B lb.common lb.state-machine - lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log - jobid.api-c - security.gsoap-plugin security.gss - / ], - 'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ], - 'lb.utils' => [ qw/ - lbjp-common.jp-interface - jobid.api-c - lbjp-common.trio lbjp-common.maildir - lb.client lb.state-machine - / ], - 'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ], - 'lb.ws-interface' => [ qw/lb.types:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw/ - jobid.api-c lbjp-common.trio lbjp-common.db lb.common lb.client - security.gss lbjp-common.log - / ], - 'lb.yaim' => [ qw// ], - 'lb.glite-LB' => [ qw/ - lb.logger:R lb.server:R lb.utils:R lb.doc:R - lb.ws-test:R lb.harvester:R lb.yaim:R - / ], - 'lbjp-common.db' => [ qw/lbjp-common.trio lbjp-common.log/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw/lbjp-common.log/ ], - 'lbjp-common.trio' => [ qw// ], - 'security.gss' => [ qw// ], - 'security.gsoap-plugin' => [ qw/security.gss/ ], - 'jobid.api-c' => [ qw// ], - 'jobid.api-cpp' => [ qw/jobid.api-c/ ], - 'jobid.api-java' => [ qw// ], - - 'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ], - - 'jp.client' => [ qw/ - jp.ws-interface - lbjp-common.jp-interface lbjp-common.maildir - jobid.api-c - security.gsoap-plugin - / ], - 'jp.doc' => [ qw// ], - 'jp.index' => [ qw/ - jp.server-common jp.ws-interface - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.primary' => [ qw/ - jobid.api-c - jp.server-common jp.ws-interface - lb.state-machine - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.server-common' => [ qw/ - lbjp-common.jp-interface lbjp-common.db - / ], - 'jp.ws-interface' => [ qw// ], -); - -for my $ext (keys %deps_aux) { - for (@{$deps_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$deps{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $deps_type{$ext}->{$1} = $type; - } -} - - -%extrafull = ( gridsite=>'org.gridsite.core'); - -#( java => 'client-java' ); -%extranodmod = ( - db => 'lbjp-common.db', - jpprimary => 'jp.primary', - jpindex => 'jp.index', - jpclient => 'jp.client', -); - -%obsoletes = ( - 'lb.yaim' => [ qq/glite-yaim-lb/ ], -); - -my @t = qw/lb.client-java jobid.api-java lb.types/; -@topbuild{@t} = (1) x ($#t+1); -} - -sub full -{ - my $short = shift; - return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short; -} - -sub mkinc -{ - my %aux; - undef %aux; - my @m=qw/ -lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB -security.gss security.gsoap-plugin -jobid.api-c jobid.api-cpp jobid.api-java -lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface -jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface -/; - @aux{@m} = (1) x ($#m+1); - - my $short = shift; - my $full = full $short; - - unless ($aux{$short}) { - print "Makefile.inc not needed in $full\n"; - return; - } - - my $build = ''; - - unless ($topbuild{$_}) { - $build = '/build'; - unless (-d "$full/build") { - mkdir "$full/build" or die "mkdir $full/build: $!\n"; - } - unlink "$full/build/Makefile"; - symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n"; - } - - open MKINC,">$full$build/Makefile.inc" - or die "$full$build/Makefile.inc: $!\n"; - - print "Creating $full$build/Makefile.inc\n"; - - print MKINC qq{ -PREFIX = $prefix -stagedir = $stagedir -thrflavour = $thrflavour -nothrflavour = $nothrflavour -libdir = $libdir -}; - - for (@{$need_externs{$short}}) { - print MKINC "${_}_prefix = $extern_prefix{$_}\n" - } - - for (@{$need_jars{$short}}) { - print MKINC "${_}_jar = $jar{$_}\n" - } - - my $need_gsoap = 0; - for (@{$need_externs{$short}}) { $need_gsoap = 1 if $_ eq 'gsoap'; } - - print MKINC "gsoap_default_version=".gsoap_version()."\n" if $need_gsoap; - - close MKINC; -} - -my %etics_externs; -my %etics_projects; -BEGIN{ - %etics_externs = ( - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - gridsite=>'org.gridsite.shared', - lcas=>'org.glite.security.lcas', - trustmanager=>'org.glite.security.trustmanager', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - yaim_core=>'org.glite.yaim.core', - ); - %etics_projects = ( - vdt=>[qw/globus globus_essentials/], - 'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/], - ); -}; - -sub mode_etics { - $fmod = shift; - - die "$0: --module required with --etics\n" unless $fmod; - - my ($subsys,$module) = split /\./,$fmod; - - my ($major,$minor,$rev,$age); - - if ($version) { - $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/; - ($major,$minor,$rev,$age) = ($1,$2,$3,$4); - } - else { - open V,"org.glite.$subsys.$module/project/version.properties" - or die "org.glite.$subsys.$module/project/version.properties: $!\n"; - - while ($_ = ) { - chomp; - ($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/; - $age = $1 if /module\.age\s*=\s*([[:digit:]]+)/; - } - close V; - } - - my @copts = (); - my %ge; - @ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1); - - for (@{$need_externs{"$subsys.$module"}}) { - if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; - } - } - - for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - push @copts,"--with-$_ \${$eext.location}/$_*.jar"; - } - - my $conf; - my $conftag; - - if ($branch) { - $conf = "glite-${subsys}-${module}_$branch"; - $conftag = $branch; - $dwpath = ""; } - else { - $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - $conftag = $conf; - $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n"; } -# my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - my $file = $output ? $output : "$conf.ini"; - open C,">$file" or die "$file: $!\n"; - - my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build"; - - my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..'; - - my $package_description = ""; - my $package_summary = ""; - - if (-e "org.glite.$subsys.$module/project/package.description") { - open V, "org.glite.$subsys.$module/project/package.description"; - $package_description = join ("", ); - close V; - chomp $package_description; - $package_description =~ s/\n/\\n/g; - $package_description = "package.description = $package_description"; - } - else { - print STDERR "package.description not found for $subsys.$module!\n"; } - - if (-e "org.glite.$subsys.$module/project/package.summary") { - open V, "org.glite.$subsys.$module/project/package.summary"; - $package_summary = join ("", ); - close V; - chomp $package_summary; - $package_summary =~ s/\n/\\n/g; - $package_summary = "package.summary = $package_summary"; - } - else { - print STDERR "package.summary not found for $subsys.$module!\n"; } - - - print STDERR "Writing $file\n"; - print C qq{ -[Configuration-$conf] -profile = None -moduleName = org.glite.$subsys.$module -displayName = $conf -description = org.glite.$subsys.$module -projectName = org.glite -age = $age -deploymentType = None -tag = $conftag -version = $major.$minor.$rev -$dwpath -[Platform-default:VcsCommand] -displayName = None -description = None -tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName} -branch = None -commit = None -checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName} - -[Platform-default:BuildCommand] -postpublish = None -packaging = None -displayName = None -description = None -doc = None -prepublish = None -publish = None -compile = make -init = None -install = make install -clean = make clean -test = make check -configure = cd $confdir && /usr/bin/perl \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts -checkstyle = None - -[Platform-default:Property] -$buildroot -$package_description -$package_summary -}; - for (@{$obsoletes{"$subsys.$module"}}) { - print C "package.obsoletes = $_\n"; - print C "package.replaces = $_\n"; - } - - print C qq{ -[Platform-default:DynamicDependency] -}; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; - } - } - - my $type = $need_externs_type{"$subsys.$module"}->{$_}; - print C "$proj|$eext = $type\n"; - } - - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "org.glite|org.glite.$_ = $type\n"; - } - - close C; -} - -sub gsoap_version { - local $_; - my $gsoap_version; - open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n"; - - while ($_ = ) { - chomp; - - $gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/; - } - close S; - return $gsoap_version; -} - -sub getlibdir { - if ( -e "/etc/debian_version") { # We are on Debian - $lib64="lib"; - $lib32="lib32"; } - else { # Another distribution - $lib64="lib64"; - $lib32="lib"; } - $libdir=$lib32; - - open INP, "uname -s | "; # Check kernel name - $kname= ; - chomp($kname); - close INP; - - if ( $kname == "Linux") { - $arch = ("x86_64\npowerpc\nppc64\n"); - - open INP, "uname -p | "; # Check processor type - $procname= ; - chomp($procname); - close INP; - - if ($arch =~/^$procname\n/) { - return ($lib64); } - - open INP, "uname -m | "; # Check machine hardware - $machname= ; - chomp($machname); - close INP; - - if ($arch =~/^$machname\n/) { - return ($lib64); } - - # special cases (hyperlink lib64, Debian) - if (-l "/usr/lib64") { - $libdir=$lib32; } - - # if /usr/lib64 doesn't exist at all (AIX) - unless ( -e "/usr/lib64" ) { - $libdir=$lib32; } - } - - if ( $kname == "SunOS") { - if (-e "/usr/lib/64") { - $libdir="lib/64"; } - } - - return $libdir; -} - -sub usage { - my @ext = keys %extern_prefix; - my @myjars, keys %jar; - - print STDERR qq{ -usage: $0 options - -General options (defaults in []): - --prefix=PREFIX destination directory [./stage] - --staged=module,module,... what is already in PREFIX (specify without org.glite.) - --thrflavour=flavour - --nothrflavour=flavour threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg] - --listmodules=subsys list modules of a subsystem - --libdir=libdir typically [lib,lib64] postfix - -Mode of operation: - --mode={checkout|build|etics} what to do [build] - -What to build: - --module=module build this module only (mostly in-Etics operation) - --enable-NODE build this "node" (set of modules) only. Available nodes are - @{$lbmodules{lb}},@{$lbmodules{security}} - --disable-NODE don't build this node - --lb-tag=tag checkout LB modules with specific tag - --jp-tag=tag checkout JP modules with specific tag - --lbjp-common-tag=tag checkout lbjp-common modules with specific tag - --security-tag=tag checkout security modules with specific tag - --jobid-tag=tag checkout jobid modules with specific tag - -Dependencies: - --with-EXTERNAL=PATH where to look for an external. Required externals - (not all for all modules) are: - @ext - --with-JAR=JAR where to look for jars. Required jars are: - @myjars - Summary of what will be used is always printed - -}; - -} diff --git a/org.glite.jobid.api-java/nbproject/build-impl.xml b/org.glite.jobid.api-java/nbproject/build-impl.xml deleted file mode 100755 index 47755b4..0000000 --- a/org.glite.jobid.api-java/nbproject/build-impl.xml +++ /dev/null @@ -1,627 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set src.dir - Must set test.src.dir - Must set build.dir - Must set dist.dir - Must set build.classes.dir - Must set dist.javadoc.dir - Must set build.test.classes.dir - Must set build.test.results.dir - Must set build.classes.excludes - Must set dist.jar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - - - - - - java -cp "${run.classpath.with.dist.jar}" ${main.class} - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - java -jar "${dist.jar.resolved}" - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set debug.class - - - - - Must set fix.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - Some tests failed; see details above. - - - - - - - - - Must select some files in the IDE or set test.includes - - - - Some tests failed; see details above. - - - - - Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.jobid.api-java/nbproject/genfiles.properties b/org.glite.jobid.api-java/nbproject/genfiles.properties deleted file mode 100755 index bb605a8..0000000 --- a/org.glite.jobid.api-java/nbproject/genfiles.properties +++ /dev/null @@ -1,8 +0,0 @@ -build.xml.data.CRC32=dbd878b7 -build.xml.script.CRC32=3fb96f09 -build.xml.stylesheet.CRC32=be360661 -# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. -# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -nbproject/build-impl.xml.data.CRC32=dbd878b7 -nbproject/build-impl.xml.script.CRC32=02cb42d1 -nbproject/build-impl.xml.stylesheet.CRC32=f1d9da08 diff --git a/org.glite.jobid.api-java/nbproject/private/config.properties b/org.glite.jobid.api-java/nbproject/private/config.properties deleted file mode 100644 index e69de29..0000000 diff --git a/org.glite.jobid.api-java/nbproject/private/private.properties b/org.glite.jobid.api-java/nbproject/private/private.properties deleted file mode 100755 index b6aa80e..0000000 --- a/org.glite.jobid.api-java/nbproject/private/private.properties +++ /dev/null @@ -1,6 +0,0 @@ -do.depend=false -do.jar=true -javac.debug=true -javadoc.preview=true -jaxws.endorsed.dir=/home/pavel/netbeans-6.0.1/java1/modules/ext/jaxws21/api -user.properties.file=/home/pavel/.netbeans/6.0/build.properties diff --git a/org.glite.jobid.api-java/nbproject/private/private.xml b/org.glite.jobid.api-java/nbproject/private/private.xml deleted file mode 100644 index c1f155a..0000000 --- a/org.glite.jobid.api-java/nbproject/private/private.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/org.glite.jobid.api-java/nbproject/project.properties b/org.glite.jobid.api-java/nbproject/project.properties deleted file mode 100755 index 2958811..0000000 --- a/org.glite.jobid.api-java/nbproject/project.properties +++ /dev/null @@ -1,62 +0,0 @@ -application.title=jobid-api-java -application.vendor=xpiskac -build.classes.dir=${build.dir}/classes -build.classes.excludes=**/*.java,**/*.form -# This directory is removed when the project is cleaned: -build.dir=build -build.generated.dir=${build.dir}/generated -# Only compile against the classpath explicitly listed here: -build.sysclasspath=ignore -build.test.classes.dir=${build.dir}/test/classes -build.test.results.dir=${build.dir}/test/results -debug.classpath=\ - ${run.classpath} -debug.test.classpath=\ - ${run.test.classpath} -# This directory is removed when the project is cleaned: -dist.dir=dist -dist.jar=${dist.dir}/jobid-api-java.jar -dist.javadoc.dir=${dist.dir}/javadoc -excludes= -# file.reference.commons-codec-1.3.jar=/home/etics/repository/externals/commons-codec/1.3.0/noarch/ -includes=** -jar.compress=false -javac.classpath=\ - ${file.reference.commons-codec.jar} -# Space-separated list of extra javac options -javac.compilerargs= -javac.deprecation=false -javac.source= -javac.target= -javac.test.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -javadoc.additionalparam= -javadoc.author=false -javadoc.encoding=${source.encoding} -javadoc.noindex=false -javadoc.nonavbar=false -javadoc.notree=false -javadoc.private=false -javadoc.splitindex=true -javadoc.use=true -javadoc.version=false -javadoc.windowtitle= -main.class=org.glite.test.Test -manifest.file=manifest.mf -meta.inf.dir=${src.dir}/META-INF -platform.active=default_platform -run.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -# Space-separated list of JVM arguments used when running the project -# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value -# or test-sys-prop.name=value to set system properties for unit tests): -run.jvmargs= -run.test.classpath=\ - ${javac.test.classpath}:\ - ${build.test.classes.dir} -source.encoding=UTF-8 -src.dir=src -test.src.dir=test -javac.compilerargs.jaxws= diff --git a/org.glite.jobid.api-java/nbproject/project.xml b/org.glite.jobid.api-java/nbproject/project.xml deleted file mode 100755 index 0db31a3..0000000 --- a/org.glite.jobid.api-java/nbproject/project.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - org.netbeans.modules.java.j2seproject - - - jobid-api-java - 1.6.5 - - - - - - - - - - diff --git a/org.glite.jobid.api-java/project/ChangeLog b/org.glite.jobid.api-java/project/ChangeLog deleted file mode 100644 index 54a9b35..0000000 --- a/org.glite.jobid.api-java/project/ChangeLog +++ /dev/null @@ -1,6 +0,0 @@ -1.0.1-1 -- Initial release of the api-java module - -1.0.2-1 -- Fixed target 'clean' in the Makefile - diff --git a/org.glite.jobid.api-java/project/package.description b/org.glite.jobid.api-java/project/package.description deleted file mode 100644 index 860d7dd..0000000 --- a/org.glite.jobid.api-java/project/package.description +++ /dev/null @@ -1 +0,0 @@ -JAVA implementation of handling gLite jobid diff --git a/org.glite.jobid.api-java/project/package.summary b/org.glite.jobid.api-java/project/package.summary deleted file mode 100644 index 860d7dd..0000000 --- a/org.glite.jobid.api-java/project/package.summary +++ /dev/null @@ -1 +0,0 @@ -JAVA implementation of handling gLite jobid diff --git a/org.glite.jobid.api-java/project/version.properties b/org.glite.jobid.api-java/project/version.properties deleted file mode 100644 index a15f35a..0000000 --- a/org.glite.jobid.api-java/project/version.properties +++ /dev/null @@ -1,3 +0,0 @@ -# : /cvs/glite/org.glite.jobid.api-java/project/version.properties,v 1.5 2009/01/20 17:25:13 akrenek Exp $ -module.version=1.0.2 -module.age=1 diff --git a/org.glite.jobid.api-java/src/org/glite/jobid/ExampleJobid.java b/org.glite.jobid.api-java/src/org/glite/jobid/ExampleJobid.java deleted file mode 100644 index 2f061b9..0000000 --- a/org.glite.jobid.api-java/src/org/glite/jobid/ExampleJobid.java +++ /dev/null @@ -1,60 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.jobid; - -/** - * This class shows how Jobid works and how to work with it. - * @author Pavel Piskac - */ -public class ExampleJobid { - - public static void main(String[] args) { - //how Jobid class works - //unique part is automatically generated - Jobid jobid1 = new Jobid("https://somewhere.cz", 5000); - System.out.println("bkserver "+ jobid1.getBkserver()); - System.out.println("port "+ jobid1.getPort()); - System.out.println("unique "+ jobid1.getUnique()); - System.out.println("-------------------"); - - //unique part is set by user - Jobid jobid2 = new Jobid("https://somewhere.cz", 5000, "my_unique_part"); - System.out.println("bkserver "+ jobid2.getBkserver()); - System.out.println("port "+ jobid2.getPort()); - System.out.println("unique "+ jobid2.getUnique()); - System.out.println("-------------------"); - - //whole jobid is set by user and then parsed - Jobid jobid3 = new Jobid("https://somewhere.cz:5000/my_unique_part"); - System.out.println("bkserver "+ jobid3.getBkserver()); - System.out.println("port "+ jobid3.getPort()); - System.out.println("unique "+ jobid3.getUnique()); - System.out.println("-------------------"); - - //each part is set separately - Jobid jobid4 = new Jobid(); - jobid4.setBkserver("https://somewhere.cz"); - jobid4.setPort(5000); - jobid4.setUnique("my_unique_part"); - System.out.println("bkserver "+ jobid4.getBkserver()); - System.out.println("port "+ jobid4.getPort()); - System.out.println("unique "+ jobid4.getUnique()); - System.out.println("-------------------"); - } - -} diff --git a/org.glite.jobid.api-java/src/org/glite/jobid/Jobid.java b/org.glite.jobid.api-java/src/org/glite/jobid/Jobid.java deleted file mode 100644 index 840f661..0000000 --- a/org.glite.jobid.api-java/src/org/glite/jobid/Jobid.java +++ /dev/null @@ -1,245 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.jobid; - -import java.net.UnknownHostException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.Calendar; -import java.util.Random; -//import org.apache.commons.codec.binary.Base64; -import org.apache.commons.codec.binary.Base64; - -/** - * Class representing jobId - * - * @author Pavel Piskac (173297@mail.muni.cz) - * @version 15. 3. 2008 - */ -public class Jobid { - - String unique; - String bkserver; - int port; - - /** - * Creates new instance of Jobid class. - */ - public Jobid() { - } - - /** - * Creates new instace of JobId with BK server address and port number, unique part - * is generated. If some exception is catched during generating the unique part, then - * System.exit(-1); is called. - * - * @param bkserver BK server address - * @param port BK server port - * @throws java.land.IllegalArgumentException if bkserver is null - * @throws java.lang.IllegalArgumentException if port is lower than 1 or - * bigger than 65535 - */ - - public Jobid(String bkserver, int port) { - if (bkserver == null) { - throw new IllegalArgumentException("Jobid bkserver"); - } - - if (port < 1 || port > 65535) { - throw new IllegalArgumentException("Jobid port"); - } - - if (bkserver.indexOf("https://") == -1) - this.bkserver = "https://" + bkserver; - else this.bkserver = bkserver; - - this.port = port; - - MessageDigest digest = null; - - try { - String hostname = ""; - try { - hostname = java.net.InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException ex) { - System.err.println(ex); - } - - digest = java.security.MessageDigest.getInstance("MD5"); - unique = hostname + bkserver + port + Calendar.getInstance().getTimeInMillis() + - new Random().nextInt(999999); - - digest.update(unique.getBytes(),0,unique.length()); - Base64 base64 = new Base64(); - byte[] tmp = base64.encode(digest.digest()); - unique = new String(tmp, 0, tmp.length-2); - unique = unique.replaceAll("/", "_"); - unique = unique.replaceAll("\\+", "-"); - } catch (NoSuchAlgorithmException ex) { - System.err.println(ex); - System.exit(-1); - } - } - - /** - * Creates new instace of Jobid with BK server address, port number and - * unique part as parameters. - * - * @param bkserver BK server address - * @param port BK server port - * @param unique unique part of jobid - * @throws java.lang.IllegalArgumentException if bkserver is null - * @throws java.lang.IllegalArgumentException if port is lower than 1 or - * bigger than 65535 - * @throws java.lang.IllegalArgumentException if unique is null - */ - public Jobid(String bkserver, int port, String unique) { - if (bkserver == null) { - throw new IllegalArgumentException("Jobid bkserver"); - } - - if (port < 1 || port > 65535) { - throw new IllegalArgumentException("Jobid port"); - } - - if (unique == null) { - throw new IllegalArgumentException("Jobid unique"); - } - - if (bkserver.indexOf("https://") == -1) - this.bkserver = "https://" + bkserver; - else this.bkserver = bkserver; - - this.port = port; - this.unique = unique; - } - - /** - * Creates new instace of Jobid from string which represents jobid - * - * @param jobidString jobid string representation - * @throws java.lang.IllegalArgumentException if jobidString is null - */ - public Jobid(String jobidString) { - if (jobidString == null) { - throw new IllegalArgumentException("Jobid jobidString"); - } - - int doubleSlashPosition = jobidString.indexOf("https://"); - if (doubleSlashPosition == -1) { - throw new IllegalArgumentException("wrong jobid https"); - } - - int colonPosition = jobidString.indexOf(":", doubleSlashPosition + 8); - if (colonPosition == -1) { - throw new IllegalArgumentException("wrong jobid colon"); - } - - int dashAfterPort = jobidString.indexOf("/", colonPosition); - String bkserverS = jobidString.substring(0, colonPosition); - Integer portS = new Integer(jobidString.substring(colonPosition+1, - dashAfterPort)); - String uniqueS = jobidString.substring(dashAfterPort+1, jobidString.length()); - - this.bkserver = bkserverS; - this.port = portS.intValue(); - this.unique = uniqueS; - } - - /** - * Returns BK server address - * - * @return bkserver BK server address - */ - public String getBkserver() { - return bkserver; - } - - /** - * Sets BK server address - * - * @param bkserver BK server address - * @throws java.lang.IllegalArgumentException if bkserver is null - */ - public void setBkserver(String bkserver) { - - if (bkserver == null) { - throw new IllegalArgumentException("Jobid bkserver"); - } - - this.bkserver = bkserver; - } - - /** - * Returns unique part of jobId - * - * @return unique part of jobId - */ - public String getUnique() { - return unique; - } - - /** - * Sets unique part of jobId - * - * @param unique - * @throws java.lang.IllegalArgumentException if unique is null - */ - public void setUnique(String unique) { - - if (unique == null) { - throw new IllegalArgumentException("Jobid unique"); - } - - this.unique = unique; - } - - /** - * Returns port number - * - * @return port number - */ - public int getPort() { - return port; - } - - /** - * Sets port number - * - * @param port number - * @throws java.lang.IllegalArgumentException if port is lower than 0 or - * bigger than 65535 - */ - public void setPort(int port) { - - if (port <= 0 || port >= 65536) { - throw new IllegalArgumentException("Jobid port"); - } - - this.port = port; - } - - /** - * Returns Jobid string representation in format bkserver:port/unique - * - * @return Jobid string representation in format bkserver:port/unique - */ - public String toString() { - return bkserver + ":" + port + "/" + unique; - } -} diff --git a/org.glite.jobid/project/version.properties b/org.glite.jobid/project/version.properties deleted file mode 100644 index 69d0f50..0000000 --- a/org.glite.jobid/project/version.properties +++ /dev/null @@ -1,3 +0,0 @@ -# : /cvs/jra1mw/org.glite.jobid.api-c/project/version.properties,v 1.1 2009/01/16 08:48:52 zsustr Exp $ -module.version=1.0.4 -module.age=1 diff --git a/org.glite.lb.client-java/Makefile b/org.glite.lb.client-java/Makefile deleted file mode 100644 index 783b5ee..0000000 --- a/org.glite.lb.client-java/Makefile +++ /dev/null @@ -1,70 +0,0 @@ --include Makefile.inc - -# broken -# SimpleLLTest.class ProducerTestLL.class ProducerTestIL.class - -EXAMPLES := SSLClient.class SSLServer.class QueryDemo.class NotificationExample.class CreamTest.class - -VPATH := examples - -JAVAC:=${jdk_prefix}/bin/javac -JAVAH:=${jdk_prefix}/bin/javah -JAVA:=${jdk_prefix}/bin/java - -all compile: genevents genws compile-java build-jar build-c - -compile-java: - ${JAVAC} \ - -classpath ${commons-lang_jar}:${stagedir}/share/java/jobid-api-java.jar:${trustmanager_prefix}/share/java/glite-security-trustmanager.jar:${utiljava_prefix}/share/java/glite-security-util-java.jar:`ls ${axis_prefix}/lib/*.jar | tr '\012' :` \ - -d build \ - src/org/glite/lb/*.java \ - build/gen/*.java \ - build/axis/org/glite/wsdl/services/lb/*.java \ - build/axis/org/glite/wsdl/services/lb4agu/*.java \ - `find build/axis/org/ogf/schemas/glue -name *.java -print` \ - build/axis/org/glite/wsdl/types/lb/*.java \ - build/axis/org/glite/wsdl/types/lb/holders/*.java \ - build/axis/org/glite/wsdl/elements/lb/*.java \ - build/axis/holders/StringArrayHolder.java - -build-jar: - cd build && ${jdk_prefix}/bin/jar cf lb-client-java.jar holders org - - -build-c: - ${JAVAH} -classpath build -jni -d build org.glite.lb.ContextIL - -mkdir -p build/c - -ln -s ../../src_c/Makefile build/c - cd build/c && $(MAKE) PREFIX=${PREFIX} JAVA_HOME=${jdk_prefix} topdir=../.. - -examples: ${EXAMPLES} - -GEN:=${stagedir}/sbin/glite-lb-at3 project/genEventTypes.pl -AT3DIR:=${stagedir}/share/lb/at3 -axis_classpath:=`ls ${axis_prefix}/lib/*.jar | tr '\012' :` - -genevents: - -mkdir -p build/gen - ${GEN} build/gen - -genws: - ${JAVA} -classpath ${axis_classpath} org.apache.axis.wsdl.WSDL2Java -o build/axis ${stagedir}/interface/LB.wsdl - -${EXAMPLES}: %.class: %.java - ${jdk_prefix}/bin/javac -d build -cp build:build/classes/:${stagedir}/share/java/jobid-api-java.jar:`ls ${axis_prefix}/lib/*.jar | tr '\012' :` $< - - -check: - @echo "No check" - -install: - mkdir -p ${PREFIX}/share/java - cp build/lb-client-java.jar ${PREFIX}/share/java - cd build/c && $(MAKE) install PREFIX=${PREFIX} - -clean: - rm -rf build - cd src_c && $(MAKE) clean - rm -rvf log.xml project/org.glite.lb.client-java.spec rpmbuild RPMS tgz - - diff --git a/org.glite.lb.client-java/configure b/org.glite.lb.client-java/configure deleted file mode 100755 index c82ed75..0000000 --- a/org.glite.lb.client-java/configure +++ /dev/null @@ -1,843 +0,0 @@ -#!/usr/bin/perl - -# WARNING: Don't edit this file unless it is the master copy in org.glite.lb -# -# For the purpose of standalone builds of lb/jobid/lbjp-common components -# it is copied on tagging - -# $Header$ -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners/ for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use Getopt::Long; - -my $pwd = `pwd`; chomp $pwd; -my $prefix = $pwd.'/stage'; -my $stagedir; -my $staged; -my $module; -my $thrflavour = 'gcc64dbgpthr'; -my $nothrflavour = 'gcc64dbg'; -my $mode = 'build'; -my $help = 0; -my $listmodules; -my $version; -my $branch; -my $output; -my $lb_tag = ''; -my $lbjp_tag = ''; -my $jp_tag = ''; -my $sec_tag = ''; -my $jobid_tag = ''; -my $libdir = getlibdir(); - -my @nodes = qw/client server logger utils client-java doc ws-test db jpprimary jpindex jpclient harvester/; -my %enable_nodes; -my %disable_nodes; - -my %extern_prefix = ( - cares => '/opt/c-ares', - classads => '/opt/classads', - cppunit => '/usr', - expat => '/usr', - globus => '/opt/globus', - gsoap => '/usr', - mysql => '/usr', - 'mysql-devel' => '', - 'mysql-server' => '', - voms => '/opt/glite', - gridsite => '/opt/glite', - lcas => '/opt/glite', - trustmanager => '/opt/glite', - utiljava => '/opt/glite', - ant => '/usr', - jdk => '/usr', - libtar => '/usr', - axis => '/usr', - log4c => '/usr', - postgresql => '/usr' -); - -my %jar = ( - 'commons-codec' => '/usr/share/java/commons-codec.jar', - 'commons-lang' => '/usr/share/java/commons-lang.jar', -); - - -my %glite_prefix; -my %need_externs; -my %need_externs_type; -my %need_jars; -my %extrafull; -my %extranodmod; -my %deps; -my %deps_type; -my %topbuild; - -my %lbmodules = ( - 'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim glite-LB/], - 'security' => [qw/gss gsoap-plugin/], - 'lbjp-common' => [qw/db log maildir server-bones trio jp-interface/], - 'jobid' => [qw/api-c api-cpp api-java/], - 'jp' => [ qw/client doc index primary server-common ws-interface/ ], - ); - - -my @opts = ( - 'prefix=s' => \$prefix, - 'staged=s' => \$staged, - 'module=s' => \$module, - 'thrflavour=s' => \$thrflavour, - 'nothrflavour=s' => \$nothrflavour, - 'mode=s' => \$mode, - 'listmodules=s' => \$listmodules, - 'version=s' => \$version, - 'branch=s' => \$branch, - 'output=s' => \$output, - 'stage=s' => \$stagedir, - 'lb-tag=s' => \$lb_tag, - 'lbjp-common-tag=s' => \$lbjp_tag, - 'jp-tag=s' => \$jp_tag, - 'security-tag=s' => \$sec_tag, - 'jobid-tag=s' => \$jobid_tag, - 'help' => \$help, - 'libdir=s' => \$libdir, -); - -for (@nodes) { - $enable_nodes{$_} = 0; - $disable_nodes{$_} = 0; - - push @opts,"disable-$_",\$disable_nodes{$_}; - push @opts,"enable-$_",\$enable_nodes{$_}; -} - -push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix; -push @opts,"with-$_=s",\$jar{$_} for keys %jar; - -my @keeparg = @ARGV; - -GetOptions @opts or die "Errors parsing command line\n"; - -$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq ''; -$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq ''; - -if ($help) { usage(); exit 0; } - -if ($listmodules) { - my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}}; - print "@m\n"; - exit 0; -} - -warn "$0: --version, --branch and --output make sense only in --mode=etics\n" - if ($version || $output || $branch) && $mode ne 'etics'; - -my $en; -for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; } - -my $dis; -for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; } - -die "--enable-* and --disable-* are mutually exclusive\n" - if $en && $dis; - -die "--module cannot be used with --enable-* or --disable-*\n" - if $module && ($en || $dis); - -die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}}; - -if ($dis) { - for (@nodes) { - $enable_nodes{$_} = 1 unless $disable_nodes{$_}; - } -} - -if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ; - -for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; } - -$stagedir = $prefix unless $stagedir; - -if ($mode eq 'build') { - print "Writing config.status\n"; - open CONF,">config.status" or die "config.status: $!\n"; - print CONF "$0 @keeparg\n"; - close CONF; -} - - -my @modules; -my %aux; - -if ($module) { -# push @modules,split(/[,.]+/,$module); - push @modules,$module; -} -else { - @modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes)); - - my $n; - - do { - local $"="\n"; - $n = $#modules; - push @modules,(map @{$deps{$_}},@modules); - - undef %aux; @aux{@modules} = (1) x ($#modules+1); - @modules = keys %aux; - } while ($#modules > $n); -} - -@aux{@modules} = (1) x ($#modules+1); -delete $aux{$_} for (split /,/,$staged); -@modules = keys %aux; - -mode_build() if $mode eq 'build'; -mode_checkout() if $mode eq 'checkout'; -mode_etics($module) if $mode eq 'etics'; - -sub mode_build { - print "\nBuilding modules: @modules\n"; - - my @ext = map @{$need_externs{$_}},@modules; - my @myjars = map @{$need_jars{$_}},@modules; - undef %aux; @aux{@ext} = 1; - @ext = keys %aux; - undef %aux; @aux{@myjars} = (1) x ($#myjars+1); - @myjars = keys %aux; - - print "\nRequired externals:\n"; - print "\t$_: $extern_prefix{$_}\n" for @ext; - print "\t$_: $jar{$_}\n" for @myjars; - print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n"; - - mkinc($_) for @modules; - - print "Creating Makefile\n"; - - open MAK,">Makefile" or die "Makefile: $!\n"; - - print MAK "all: @modules\n\nclean:\n"; - - for (@modules) { - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - print MAK "\tcd $full$build && \${MAKE} clean\n" - } - - print MAK "\ndistclean:\n"; - - for (@modules) { - my $full = full($_); - print MAK $topbuild{$_} ? - "\tcd $full$build && \${MAKE} distclean\n" : - "\trm -rf $full$build\n" - } - - print MAK "\n"; - - for (@modules) { - my %ldeps; undef %ldeps; - @ldeps{@{$deps{$_}}} = 1; - for my $x (split /,/,$staged) { delete $ldeps{$x}; } - my @dnames = $module ? () : keys %ldeps; - - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - - print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n"; - } - - close MAK; -} - -sub mode_checkout() { - for (@modules) { - my $module = $_; - my $tag = ""; - if ($lb_tag){ - for (@{$lbmodules{lb}}){ - if ("lb.".$_ eq $module){ - $tag = '-r '.$lb_tag; - } - } - } - if ($lbjp_tag){ - for (@{$lbmodules{'lbjp-common'}}){ - if ("lbjp-common.".$_ eq $module){ - $tag = '-r '.$lbjp_tag; - } - } - } - if ($jp_tag){ - for (@{$lbmodules{'jp'}}){ - if ("jp.".$_ eq $module){ - $tag = '-r '.$jp_tag; - } - } - } - if ($sec_tag){ - for (@{$lbmodules{security}}){ - if ("security.".$_ eq $module){ - $tag = '-r '.$sec_tag; - } - } - } - if ($jobid_tag){ - for (@{$lbmodules{jobid}}){ - if ("jobid.".$_ eq $module){ - $tag = '-r '.$jobid_tag; - } - } - } - #if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){ - # print "found"; - #} - $_ = full($_); - print "\n*** Checking out $_\n"; - system("cvs checkout $tag $_") == 0 or die "cvs checkout $tag $_: $?\n"; - } -} - -BEGIN{ -%need_externs_aux = ( - 'lb.client' => [ qw/cppunit:B classads/ ], - 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava/ ], - 'lb.common' => [ qw/expat cares:B cppunit:B classads/ ], - 'lb.doc' => [], - 'lb.logger' => [ qw/cppunit:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ], - 'lb.state-machine' => [ qw/classads/ ], - 'lb.utils' => [ qw/cppunit:B/ ], - 'lb.ws-interface' => [], - 'lb.ws-test' => [ qw/gsoap:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw// ], - 'lb.yaim' => [ qw/yaim_core:R/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], - 'lbjp-common.db' => [ qw/mysql:B mysql-devel:B postgresql:B cppunit:B log4c:B/ ], - 'lbjp-common.log' => [ qw/log4c/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw// ], - 'lbjp-common.trio' => [ qw/cppunit:B/ ], - 'lbjp-common.jp-interface' => [ qw/cppunit:B log4c:B/ ], - 'security.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B/ ], - 'security.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap:B/ ], - 'jobid.api-c' => [ qw/cppunit:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], - 'jobid.api-java' => [ qw/ant:B jdk:B/ ], - 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], - 'jp.doc' => [], - 'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ], - 'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ], - 'jp.server-common' => [], - 'jp.ws-interface' => [], -); - -for my $ext (keys %need_externs_aux) { - for (@{$need_externs_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$need_externs{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $need_externs_type{$ext}->{$1} = $type; - } -} - -%need_jars = ( - 'jobid.api-java' => [ qw/commons-codec/ ], - 'lb.client-java' => [ qw/commons-lang/ ], -); - -for my $jar (keys %need_jars) { - for (@{$need_jars{$jar}}) { - $need_externs_type{$jar}->{$_} = 'BR'; # XXX - } -} - -%deps_aux = ( - 'lb.client' => [ qw/ - lb.types:B lb.common - lbjp-common.trio - jobid.api-cpp:B jobid.api-c - security.gss - / ], - 'lb.client-java' => [ qw/ - lb.types:B - lb.ws-interface:B - jobid.api-java - / ], - 'lb.common' => [ qw/ - jobid.api-cpp:B jobid.api-c - lb.types:B lbjp-common.trio security.gss - / ], - 'lb.doc' => [ qw/lb.types:B/ ], - 'lb.logger' => [ qw/ - lbjp-common.trio - lbjp-common.log - jobid.api-c - lb.common - security.gss - / ], - 'lb.server' => [ qw/ - lb.ws-interface lb.types:B lb.common lb.state-machine - lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log - jobid.api-c - security.gsoap-plugin security.gss - / ], - 'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ], - 'lb.utils' => [ qw/ - lbjp-common.jp-interface - jobid.api-c - lbjp-common.trio lbjp-common.maildir - lb.client lb.state-machine - / ], - 'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ], - 'lb.ws-interface' => [ qw/lb.types:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw/ - jobid.api-c lbjp-common.trio lbjp-common.db lb.common lb.client - security.gss lbjp-common.log - / ], - 'lb.yaim' => [ qw// ], - 'lb.glite-LB' => [ qw/ - lb.logger:R lb.server:R lb.utils:R lb.doc:R - lb.ws-test:R lb.harvester:R lb.yaim:R lb.client-java:R - / ], - 'lbjp-common.db' => [ qw/lbjp-common.trio lbjp-common.log/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw/lbjp-common.log/ ], - 'lbjp-common.trio' => [ qw// ], - 'security.gss' => [ qw// ], - 'security.gsoap-plugin' => [ qw/security.gss/ ], - 'jobid.api-c' => [ qw// ], - 'jobid.api-cpp' => [ qw/jobid.api-c/ ], - 'jobid.api-java' => [ qw// ], - - 'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ], - - 'jp.client' => [ qw/ - jp.ws-interface - lbjp-common.jp-interface lbjp-common.maildir - jobid.api-c - security.gsoap-plugin - / ], - 'jp.doc' => [ qw// ], - 'jp.index' => [ qw/ - jp.server-common jp.ws-interface - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.primary' => [ qw/ - jobid.api-c - jp.server-common jp.ws-interface - lb.state-machine - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.server-common' => [ qw/ - lbjp-common.jp-interface lbjp-common.db - / ], - 'jp.ws-interface' => [ qw// ], -); - -for my $ext (keys %deps_aux) { - for (@{$deps_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$deps{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $deps_type{$ext}->{$1} = $type; - } -} - - -%extrafull = ( gridsite=>'org.gridsite.core'); - -#( java => 'client-java' ); -%extranodmod = ( - db => 'lbjp-common.db', - jpprimary => 'jp.primary', - jpindex => 'jp.index', - jpclient => 'jp.client', -); - -%obsoletes = ( - 'lb.yaim' => [ qq/glite-yaim-lb/ ], -); - -my @t = qw/lb.client-java jobid.api-java lb.types/; -@topbuild{@t} = (1) x ($#t+1); -} - -sub full -{ - my $short = shift; - return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short; -} - -sub mkinc -{ - my %aux; - undef %aux; - my @m=qw/ -lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB -security.gss security.gsoap-plugin -jobid.api-c jobid.api-cpp jobid.api-java -lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface -jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface -/; - @aux{@m} = (1) x ($#m+1); - - my $short = shift; - my $full = full $short; - - unless ($aux{$short}) { - print "Makefile.inc not needed in $full\n"; - return; - } - - my $build = ''; - - unless ($topbuild{$_}) { - $build = '/build'; - unless (-d "$full/build") { - mkdir "$full/build" or die "mkdir $full/build: $!\n"; - } - unlink "$full/build/Makefile"; - symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n"; - } - - open MKINC,">$full$build/Makefile.inc" - or die "$full$build/Makefile.inc: $!\n"; - - print "Creating $full$build/Makefile.inc\n"; - - print MKINC qq{ -PREFIX = $prefix -stagedir = $stagedir -thrflavour = $thrflavour -nothrflavour = $nothrflavour -libdir = $libdir -}; - - for (@{$need_externs{$short}}) { - print MKINC "${_}_prefix = $extern_prefix{$_}\n" - } - - for (@{$need_jars{$short}}) { - print MKINC "${_}_jar = $jar{$_}\n" - } - - my $need_gsoap = 0; - for (@{$need_externs{$short}}) { $need_gsoap = 1 if $_ eq 'gsoap'; } - - print MKINC "gsoap_default_version=".gsoap_version()."\n" if $need_gsoap; - - close MKINC; -} - -my %etics_externs; -my %etics_projects; -BEGIN{ - %etics_externs = ( - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - gridsite=>'org.gridsite.shared', - lcas=>'org.glite.security.lcas', - trustmanager=>'org.glite.security.trustmanager', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - yaim_core=>'org.glite.yaim.core', - ); - %etics_projects = ( - vdt=>[qw/globus globus_essentials/], - 'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/], - ); -}; - -sub mode_etics { - $fmod = shift; - - die "$0: --module required with --etics\n" unless $fmod; - - my ($subsys,$module) = split /\./,$fmod; - - my ($major,$minor,$rev,$age); - - if ($version) { - $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/; - ($major,$minor,$rev,$age) = ($1,$2,$3,$4); - } - else { - open V,"org.glite.$subsys.$module/project/version.properties" - or die "org.glite.$subsys.$module/project/version.properties: $!\n"; - - while ($_ = ) { - chomp; - ($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/; - $age = $1 if /module\.age\s*=\s*([[:digit:]]+)/; - } - close V; - } - - my @copts = (); - my %ge; - @ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1); - - for (@{$need_externs{"$subsys.$module"}}) { - if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; - } - } - - for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - push @copts,"--with-$_ \${$eext.location}/$_*.jar"; - } - - my $conf; - my $conftag; - - if ($branch) { - $conf = "glite-${subsys}-${module}_$branch"; - $conftag = $branch; - $dwpath = ""; } - else { - $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - $conftag = $conf; - $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n"; } -# my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - my $file = $output ? $output : "$conf.ini"; - open C,">$file" or die "$file: $!\n"; - - my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build"; - - my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..'; - - my $package_description = ""; - my $package_summary = ""; - - if (-e "org.glite.$subsys.$module/project/package.description") { - open V, "org.glite.$subsys.$module/project/package.description"; - $package_description = join ("", ); - close V; - chomp $package_description; - $package_description =~ s/\n/\\n/g; - $package_description = "package.description = $package_description"; - } - else { - print STDERR "package.description not found for $subsys.$module!\n"; } - - if (-e "org.glite.$subsys.$module/project/package.summary") { - open V, "org.glite.$subsys.$module/project/package.summary"; - $package_summary = join ("", ); - close V; - chomp $package_summary; - $package_summary =~ s/\n/\\n/g; - $package_summary = "package.summary = $package_summary"; - } - else { - print STDERR "package.summary not found for $subsys.$module!\n"; } - - - print STDERR "Writing $file\n"; - print C qq{ -[Configuration-$conf] -profile = None -moduleName = org.glite.$subsys.$module -displayName = $conf -description = org.glite.$subsys.$module -projectName = org.glite -age = $age -deploymentType = None -tag = $conftag -version = $major.$minor.$rev -$dwpath -[Platform-default:VcsCommand] -displayName = None -description = None -tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName} -branch = None -commit = None -checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName} - -[Platform-default:BuildCommand] -postpublish = None -packaging = None -displayName = None -description = None -doc = None -prepublish = None -publish = None -compile = make -init = None -install = make install -clean = make clean -test = make check -configure = cd $confdir && /usr/bin/perl \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts -checkstyle = None - -[Platform-default:Property] -$buildroot -$package_description -$package_summary -}; - for (@{$obsoletes{"$subsys.$module"}}) { - print C "package.obsoletes = $_\n"; - print C "package.replaces = $_\n"; - } - - print C qq{ -[Platform-default:DynamicDependency] -}; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; - } - } - - my $type = $need_externs_type{"$subsys.$module"}->{$_}; - print C "$proj|$eext = $type\n"; - } - - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "org.glite|org.glite.$_ = $type\n"; - } - - close C; -} - -sub gsoap_version { - local $_; - my $gsoap_version; - open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n"; - - while ($_ = ) { - chomp; - - $gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/; - } - close S; - return $gsoap_version; -} - -sub getlibdir { - if ( -e "/etc/debian_version") { # We are on Debian - $lib64="lib"; - $lib32="lib32"; } - else { # Another distribution - $lib64="lib64"; - $lib32="lib"; } - $libdir=$lib32; - - open INP, "uname -s | "; # Check kernel name - $kname= ; - chomp($kname); - close INP; - - if ( $kname == "Linux") { - $arch = ("x86_64\npowerpc\nppc64\n"); - - open INP, "uname -p | "; # Check processor type - $procname= ; - chomp($procname); - close INP; - - if ($arch =~/^$procname\n/) { - return ($lib64); } - - open INP, "uname -m | "; # Check machine hardware - $machname= ; - chomp($machname); - close INP; - - if ($arch =~/^$machname\n/) { - return ($lib64); } - - # special cases (hyperlink lib64, Debian) - if (-l "/usr/lib64") { - $libdir=$lib32; } - - # if /usr/lib64 doesn't exist at all (AIX) - unless ( -e "/usr/lib64" ) { - $libdir=$lib32; } - } - - if ( $kname == "SunOS") { - if (-e "/usr/lib/64") { - $libdir="lib/64"; } - } - - return $libdir; -} - -sub usage { - my @ext = keys %extern_prefix; - my @myjars, keys %jar; - - print STDERR qq{ -usage: $0 options - -General options (defaults in []): - --prefix=PREFIX destination directory [./stage] - --staged=module,module,... what is already in PREFIX (specify without org.glite.) - --thrflavour=flavour - --nothrflavour=flavour threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg] - --listmodules=subsys list modules of a subsystem - --libdir=libdir typically [lib,lib64] postfix - -Mode of operation: - --mode={checkout|build|etics} what to do [build] - -What to build: - --module=module build this module only (mostly in-Etics operation) - --enable-NODE build this "node" (set of modules) only. Available nodes are - @{$lbmodules{lb}},@{$lbmodules{security}} - --disable-NODE don't build this node - --lb-tag=tag checkout LB modules with specific tag - --jp-tag=tag checkout JP modules with specific tag - --lbjp-common-tag=tag checkout lbjp-common modules with specific tag - --security-tag=tag checkout security modules with specific tag - --jobid-tag=tag checkout jobid modules with specific tag - -Dependencies: - --with-EXTERNAL=PATH where to look for an external. Required externals - (not all for all modules) are: - @ext - --with-JAR=JAR where to look for jars. Required jars are: - @myjars - Summary of what will be used is always printed - -}; - -} diff --git a/org.glite.lb.client-java/examples/CreamTest.java b/org.glite.lb.client-java/examples/CreamTest.java deleted file mode 100644 index ba5e1fb..0000000 --- a/org.glite.lb.client-java/examples/CreamTest.java +++ /dev/null @@ -1,95 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import org.glite.lb.*; -import org.glite.jobid.Jobid; - -public class CreamTest { - -public static void main(String[] args) -{ - - int i; - String srv = null,socket = null,prefix = null,lib = "glite_lb_sendviasocket"; - - for (i = 0; i < args.length; i++) { - if (args[i].equals("-m")) srv = args[++i]; - else if (args[i].equals("-s")) socket = args[++i]; - else if (args[i].equals("-f")) prefix = args[++i]; - else if (args[i].equals("-l")) lib = args[++i]; /* needs java.library.path */ - } - - try { - String[] srvpart = srv.split(":"); - int srvport = Integer.parseInt(srvpart[1]); - Jobid job = new Jobid(srvpart[0],srvport); - - LBCredentials cred = new LBCredentials(System.getenv("X509_USER_PROXY"),"/etc/grid-security/certificates"); - - - ContextDirect ctxd = new ContextDirect(srvpart[0],srvport); - ctxd.setCredentials(cred); - ctxd.setSource(new Sources(Sources.CREAM_CORE)); - ctxd.setJobid(job); - ctxd.setSeqCode(new SeqCode(SeqCode.CREAM,"no_seqcodes_with_cream")); - - -/* initial registration goes directly */ - EventRegJob reg = new EventRegJob(); - reg.setNs("https://where.is.cream:1234"); - reg.setJobtype(EventRegJob.Jobtype.CREAM); - ctxd.log(reg); - - System.out.println("JOBID="+job); - - ContextIL ctx = new ContextIL(prefix,socket,lib); - ctx.setSource(new Sources(Sources.CREAM_CORE)); - ctx.setJobid(job); - ctx.setSeqCode(new SeqCode(SeqCode.CREAM,"no_seqcodes_with_cream_cheat_duplicate")); - ctx.setUser(ctxd.getUser()); - -/* 2nd registration with JDL, via IL */ - reg.setJdl("[\n\ttest = \"hellow, world\";\n]"); - ctx.log(reg); - - Event e = new EventCREAMStart(); - ctx.log(e); - - EventCREAMStore store = new EventCREAMStore(); - store.setResult(EventCREAMStore.Result.START); - store.setCommand(EventCREAMStore.Command.CMDSTART); - ctx.log(store); - - EventCREAMCall call = new EventCREAMCall(); - call.setCallee(new Sources(Sources.LRMS)); - call.setDestid("fake_Torque_ID"); - call.setResult(EventCREAMCall.Result.OK); - call.setCommand(EventCREAMCall.Command.CMDSTART); - - ctx.log(call); - - } catch (Exception e) - { - System.err.println("Oops"); - e.printStackTrace(); - } - -} - - - -} diff --git a/org.glite.lb.client-java/examples/NotificationExample.java b/org.glite.lb.client-java/examples/NotificationExample.java deleted file mode 100644 index 8e9a88e..0000000 --- a/org.glite.lb.client-java/examples/NotificationExample.java +++ /dev/null @@ -1,114 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -import org.glite.lb.Notification; -import org.glite.lb.LBCredentials; -import org.glite.lb.LBException; - -import java.util.Date; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.glite.wsdl.types.lb.JobStatus; -import org.glite.wsdl.types.lb.QueryAttr; -import org.glite.wsdl.types.lb.QueryConditions; -import org.glite.wsdl.types.lb.QueryOp; -import org.glite.wsdl.types.lb.QueryRecValue; -import org.glite.wsdl.types.lb.QueryRecord; -import org.glite.wsdl.types.lb.StatName; - -/** - * This is an example on how to use the package org.glite.lb.notif_java - * - * - * @author Kopac - */ -public class NotificationExample { - - /** - * example method on how to use this package - * - * @param args parameters for the methods, order as follows: - *

- * 1. path to user's certificate - *

- * 2. path to a list of trusted certificates - *

- * 3. owner ID - *

- * 4. port number - *

- * 5. LB server address - */ - public static void main(String[] args){ - try { - - //creation of an instance of class that prepares SSL connection for - //webservice, first of the two possibilities is used - LBCredentials credentials = new LBCredentials(args[0], args[1]); - - //creation of QueryConditions instance. this one tells the notification to - //be associated with jobs of an owner and that don't have a tag. meh - QueryRecValue value1 = new QueryRecValue(null, args[2], null); - QueryRecord[] record = new QueryRecord[]{new QueryRecord(QueryOp.EQUAL, value1, null)}; - QueryConditions[] conditions = new QueryConditions[]{new - QueryConditions(QueryAttr.OWNER, null, StatName.SUBMITTED, record)}; - - //creating an instance of NotificationImpl, the argument is port number - Notification notif = new Notification(Integer.parseInt(args[3]), credentials); - - Date date = new Date(System.currentTimeMillis()+86400000); - - //registering a new notification, first parameter is LB server address in String, - //second previously created QueryConditions, there are no JobFlags provided - //and the last one tells the server to keep it active for two days - notif.newNotif(args[4], conditions, null, date); - - //id of the newly created notification - String notifId = notif.getNotifid(); - - //refreshing the previously created notification by two days - notif.refresh(notifId, date); - - //tells the client to read incomming notifications with a timeout of 1 minute - JobStatus state = notif.receive(60000); - //from here on, state can be used to pick the desired info using its - //get methods - - //like this - System.out.println(state.getAcl()); - System.out.println(state.getCancelReason()); - System.out.println(state.getJobId()); - - //creates a new instance of NotificationImpl with the port 14342 and - //binds the notification to this new instance, meaning to a new local - //address - Notification notif2 = new Notification(14342, credentials); - notif2.bind(notifId, date); - - //lastly, the notification is dropped - notif2.drop(notifId); - - } catch (LBException ex) { - Logger.getLogger(NotificationExample.class.getName()).log(Level.SEVERE, null, ex); - } - } -} diff --git a/org.glite.lb.client-java/examples/ProducerTestIL.java b/org.glite.lb.client-java/examples/ProducerTestIL.java deleted file mode 100644 index a2cda6b..0000000 --- a/org.glite.lb.client-java/examples/ProducerTestIL.java +++ /dev/null @@ -1,166 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -import java.util.Random; -import org.glite.jobid.Jobid; -import org.glite.lb.*; - -/** - * This class shows how to work with ContextIL. - * - * @author Pavel Piskac - */ -public class ProducerTestIL { - - public static void main(String[] args) { - - if (args.length != 10) { - System.out.println("How to use test class:\n" + - "you have to set 10 arguments in this order, if the choice is optional \"\" or text has to be set:\n" + - "1. jobid in format \"https://somewhere:port/unique_part\" (required)\n" + - "2. path to shared library written in c to be able to send messages via unix socket (optional)\n" + - "3. source, enum constant from class Sources, determines which part of sequence code will be increased (required)\n" + - "4. flag (required)\n" + - "5. host name, if it is \"\" then is set name of the computer where is test class running (optional)\n" + - "6. user name (required)\n" + - "7. srcInstance (optional)\n" + - "8. path to directory where will be saved files with events for each job (required)\n" + - "9. path to unix socket (required if path to shared library is set)\n" + - "10. description for event in this case event running (required)\n"); - } else { - /* Create new instance of jobid, you can use other constructors too (see org.glite.jobid.api_java.Jobid.java) - * Examples: - * Jobid jobid = new Jobid("https://skurut68-2.cesnet.cz:9000/paja6_test2"); - */ - Jobid jobid = new Jobid(args[0]); - System.out.println("jobid: " + args[0]); - - /* Create sequence code - * Example: - * SeqCode seqCode = new SeqCode(); - * Insert sequence number in format - * UI=XXXXXX:NS=XXXXXXXXXX:WM=XXXXXX:BH=XXXXXXXXXX:JSS=XXXXXX:LM=XXXXXX:LRMS=XXXXXX:APP=XXXXXX:LBS=XXXXXX - * where X is 0-9, or you can just create new instance of SeqCode where all parts are set to 0 - * Example: - * SeqCode seqCode = new SeqCode(); - * seqCode.getSeqCodeFromString("UI=000001:NS=0000000002:WM=000003:BH=0000000004:" + - * "JSS=000005:LM=000006:LRMS=000007:APP=000008:LBS=000009"); - * seqCode.incrementSeqCode(Sources.USER_INTERFACE); - * resulting sequence code will be - * UI=000002:NS=0000000002:WM=000003:BH=0000000004:JSS=000005:LM=000006:LRMS=000007:APP=000008:LBS=000009 - */ - SeqCode seqCode = new SeqCode(); - - /* Choose type of sending a log messages (at this time is implemented only ContextIL class) - * You can choose from some constructors (see org.glite.lb.client_java.ContextIL class) - */ - ContextIL ctx = new ContextIL(); - - /* If you chose emtpy ContextIL constructor you have to set some attributes. - * One of them is pathToNativeLib which sais where java can find shared library written in c. - * Example: ctx.setPathToNativeLib("/home/paja6/locallogger/build/classes/org/glite/lb/"); - */ - ctx.setPathToNativeLib(args[1]); - System.out.println("pathToNativeLib: " + args[1]); - - /* Id of the message is some random unique number. - */ - ctx.setId(new Random().nextInt(99999999)); - - /* Source indicates source of the message, it is constant from org.glite.lb.client_java.Sources class - * and determines which part of sequence number will be increased. - * Example: ctx.setSource(Sources.LRMS); - * In this case we have to use method which converts args[2] to Sources. In real environment it will - * not be used. - */ - ctx.setSource(new Integer(args[2])); - System.out.println("source: " + args[2]); - - /* Flag - * Example: ctx.setFlag(0); - */ - ctx.setFlag(new Integer(args[3])); - System.out.println("flag: " + args[3]); - - /* Name of the computer where is locallogger running - * Example: ctx.setHost("pelargir.ics.muni.cz"); - */ - ctx.setHost(args[4]); - System.out.println("host: " + args[4]); - - /* Name of the user who owns the job. - * Example: ctx.setUser("Pavel Piskac"); - */ - ctx.setUser(args[5]); - System.out.println("user: " + args[5]); - - /* TODO co to vlastne znamena? - * Mostly "" is set - * Example: ctx.setSrcInstance(""); - */ - ctx.setSrcInstance(args[6]); - System.out.println("srcInstance: " + args[6]); - - /* Set the jobid for the context. - */ - ctx.setJobid(jobid); - - /* Set the jobid for the context. - */ - ctx.setSeqCode(seqCode); - - /* Number of connection attempts while sending the message via unix socket. - * Default value is 3 but you can change it. - */ - ctx.setConnAttempts(5); - - /* Timeout in seconds for the connection while sending the message via unix socket. - * Default value is 3 but you can change it. - */ - ctx.setTimeout(2); - - /* Path to directory where will be saved files with logs until inter-logger sends - * the content. - * Example: ctx.setPrefix("/home/paja6/tmp/dglog." + jobid.getUnique()); - */ - ctx.setPrefix(args[7]); - System.out.println("prefix: " + args[7]); - - /* Path to unix socket. - * Example: ctx.setPathToSocket("/home/paja6/tmp/il.sock"); - */ - ctx.setPathToSocket(args[8]); - System.out.println("pathToSocket: " + args[8]); - - /* Create new instance of the event which will be logged. - */ - EventRunning running = new EventRunning(); - - /* Set some description for the event. - * Example: running.setNode("worker node"); - */ - running.setNode(args[9]); - System.out.println("node: " + args[9]); - - /* And now is the context and event prepared to work. - * - */ - ctx.log(running); - } - } -} diff --git a/org.glite.lb.client-java/examples/ProducerTestLL.java b/org.glite.lb.client-java/examples/ProducerTestLL.java deleted file mode 100644 index ebb01f7..0000000 --- a/org.glite.lb.client-java/examples/ProducerTestLL.java +++ /dev/null @@ -1,184 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -import java.util.Random; -import org.glite.jobid.Jobid; -import org.glite.lb.*; - -/** - * This class shows how to work with ContextIL. - * - * @author Pavel Piskac - */ -public class ProducerTestLL { - - public static void main(String[] args) { - - if (args.length != 12) { - System.out.println("How to use test class:\n" + - "you have to set 12 arguments in this order, if the choice is optional \"\" or text has to be set:\n" + - "1. jobid in format \"https://somewhere:port/unique_part\" (required)\n" + - "2. source, enum constant from class Sources, determines which part of sequence code will be increased (required)\n" + - "3. flag (required)\n" + - "4. host name, if it is \"\" then is set name of the computer where is test class running (optional)\n" + - "5. user name (required)\n" + - "6. srcInstace (optional)\n" + - "7. connection timeout (optional)\n" + - "8. proxy server address (required)\n" + - "9. proxy server port, default value is 9002 (optional)\n" + - "10. path to user's certificate (required)\n" + - "11. path to directory where will be saved files with logs until inter-logger sends the content.\n" + - "12. worker node name for example event."); - } else { - /* Create new instance of jobid, you can use other constructors too (see org.glite.jobid.api_java.Jobid.java) - * Examples: - * Jobid jobid = new Jobid("https://skurut68-2.cesnet.cz:9000/paja6_test2"); - * Jobid jobid = new Jobid("https://skurut68-2.cesnet.cz", 9000, "paja6_test2"); - * Jobid jobid = new Jobid("https://skurut68-2.cesnet.cz", 9000); //unique part is automatically generated - * Jobid jobid = new Jobid(); - * jobid.setBkserver("https://skurut68-2.cesnet.cz"); - * jobid.setPort(9000); - * jobid.setUnique("paja6_testProxy3"); - */ - Jobid jobid = new Jobid(args[0]); - System.out.println("jobid: " + args[0]); - - /* Create sequence code - * Example: - * SeqCode seqCode = new SeqCode(); - * Insert sequence number in format - * UI=XXXXXX:NS=XXXXXXXXXX:WM=XXXXXX:BH=XXXXXXXXXX:JSS=XXXXXX:LM=XXXXXX:LRMS=XXXXXX:APP=XXXXXX:LBS=XXXXXX - * where X is 0-9, or you can just create new instance of SeqCode where all parts are set to 0 - * Example: - * SeqCode seqCode = new SeqCode(); - * seqCode.getSeqCodeFromString("UI=000001:NS=0000000002:WM=000003:BH=0000000004:" + - * "JSS=000005:LM=000006:LRMS=000007:APP=000008:LBS=000009"); - * seqCode.incrementSeqCode(Sources.USER_INTERFACE); - * resulting sequence code will be - * UI=000002:NS=0000000002:WM=000003:BH=0000000004:JSS=000005:LM=000006:LRMS=000007:APP=000008:LBS=000009 - */ - SeqCode seqCode = new SeqCode(); - - /* Choose type of sending a log messages (at this time is implemented only ContextIL class) - * You can choose from some constructors (see org.glite.lb.client_java.ContextIL class) - */ - ContextLL ctx = new ContextLL(); - - /* Id of the message is some random unique number. - * This value will be ceplaced by value from proxy. - */ - ctx.setId(new Random().nextInt(99999999)); - - /* Source indicates source of the message, it is constant from org.glite.lb.client_java.Sources class - * and determines which part of sequence number will be increased. - * Example: ctx.setSource(Sources.LRMS); - * In this case we have to use method which converts args[2] to Sources. In real environment it will - * not be used. - */ - ctx.setSource(new Integer(args[1])); - System.out.println("source: " + args[1]); - - /* Flag. - * Example: ctx.setFlag(0); - */ - ctx.setFlag(new Integer(args[2])); - System.out.println("flag: " + args[2]); - - /* Name of the computer where is locallogger running - * Example: ctx.setHost("pelargir.ics.muni.cz"); - */ - ctx.setHost(args[3]); - System.out.println("host: " + args[3]); - - /* Name of the user who owns the job, this attribute will be replaced - * by value get from certificate. - * Example: ctx.setUser("Pavel Piskac"); - */ - ctx.setUser(args[4]); - System.out.println("user: " + args[4]); - - /* TODO co to vlastne znamena? - * Mostly "" is set - * Example: ctx.setSrcInstance(""); - */ - ctx.setSrcInstance(args[5]); - System.out.println("srcInstance: " + args[5]); - - /* Set the jobid for the context. - */ - ctx.setJobid(jobid); - - /* Set the jobid for the context. - */ - ctx.setSeqCode(seqCode); - - /* Timeout in seconds for the connection while sending the message via unix socket. - * Default value is 3 but you can change it. - */ - ctx.setTimeout(new Integer(args[6])); - System.out.println("timeout: " + args[6]); - - /* Address to proxy. - * Example: - * ctx.setAddress("147.251.3.62"); - */ - ctx.setAddress(args[7]); - System.out.println("address: " + args[7]); - - /* Proxy server port. - * Example: - * ctx.setPort(9002); - */ - ctx.setPort(new Integer(args[8])); - System.out.println("port: " + args[8]); - - /* Path to user's certificate. Only *.ks and *.p12 certificates are allowed. - * Example: - * ctx.setPathToCertificate("/home/paja6/myCertificate.p12"); - */ - ctx.setCredentials(new LBCredentials(args[9],null)); - System.out.println("pathToCertificate: " + args[9]); - - /* Path to directory where will be saved files with logs until inter-logger sends - * the content. - * Example: ctx.setPrefix("/home/paja6/tmp/dglog." + jobid.getUnique()); - */ - ctx.setPrefix(args[10]); - System.out.println("prefix: " + args[10]); - - /* Create new instance of the event which will be logged. - */ - EventRunning running = new EventRunning(); - - /* Set some description for the event. - * Example: running.setNode("worker node"); - */ - running.setNode(args[11]); - System.out.println("node: " + args[11]); - - /* And now is the context and event prepared to work. - * - */ - try { - ctx.log(running); - } catch (LBException e) { - e.printStackTrace(); - } - } - } -} diff --git a/org.glite.lb.client-java/examples/QueryDemo.java b/org.glite.lb.client-java/examples/QueryDemo.java deleted file mode 100644 index 3f8204a..0000000 --- a/org.glite.lb.client-java/examples/QueryDemo.java +++ /dev/null @@ -1,274 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import java.rmi.RemoteException; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.GregorianCalendar; -import java.util.Iterator; -import java.util.List; -import org.glite.jobid.Jobid; -import org.glite.lb.*; -import org.glite.wsdl.types.lb.GenericFault; -import org.glite.wsdl.types.lb.JobStatus; -import org.glite.wsdl.types.lb.QueryAttr; -import org.glite.wsdl.types.lb.QueryConditions; -import org.glite.wsdl.types.lb.QueryOp; -import org.glite.wsdl.types.lb.QueryRecValue; -import org.glite.wsdl.types.lb.QueryRecord; -import org.glite.wsdl.types.lb.StatName; -import org.glite.wsdl.types.lb.Timeval; -import org.apache.axis.AxisFault; - - -/** - * This is a demonstration class for query API. - * It contains all possible methodes that can be called on ServerConnection - * and Job objects. - * @author Tomas Kramec, 207545@mail.muni.cz - */ -public class QueryDemo { - - - /** - * This method serves for formating output information about given job status. - * It is only an example of how the data can be presented. It can be changed - * by user's needs. - * - * @param status Job status - * @return text representation of the given status - */ - private static String jobStatusToString(JobStatus status) { - StringBuilder sb = new StringBuilder(); - sb.append("State: "+status.getState()+"\n"); - sb.append("Job ID: "+status.getJobId()+"\n"); - sb.append("Owner: "+status.getOwner()+"\n"); - sb.append("Job type: "+status.getJobtype()+"\n"); - sb.append("Destination: "+status.getLocation()+"\n"); - sb.append("Done code: "+status.getDoneCode()+"\n"); - sb.append("User tags: "); - //if there are some user tags write it out. - if (status.getUserTags() != null) { - for (int i=0;i idx = sc.getIndexedAttrs(); - for (int i=0;i jobs = sc.userJobs(); - //get their states - List js = sc.userJobStates(); - Iterator it = jobs.iterator(); - Iterator itJs = js.iterator(); - while (it.hasNext()) { - System.out.println(it.next()); - System.out.println(jobStatusToString(itJs.next())); - } - - //Demonstration of Job class - System.out.println(); - System.out.println("----------------JOB----------------"); - - //create new Job - Job myJob = new Job(args[6], sc); - //print job state info - System.out.println(); - System.out.println("Status: " + jobStatusToString(myJob.getStatus(null))); - - //print info about job's events - System.out.println(); - List events = myJob.getEvents(); - System.out.println("Found "+events.size()+" events:"); - for (int i=0;i recList = new ArrayList(); - for (int i=0;i interval) - QueryConditions condOnTime = new QueryConditions(QueryAttr.TIME, null, StatName.SUBMITTED, timeRec); - - //create QueryConditions list representing this formula: - //(JOBID='jobId1' or JOBID='jobId2 or ...) AND (TIME is in interval) - //where jobId1,... are ids of user's jobs - List condList = new ArrayList(); - condList.add(condOnJobid); - condList.add(condOnTime); - - //get all jobs matching the given conditions - List jobResult = sc.queryJobs(condList); - //get all their states - List jobStatesResult = sc.queryJobStates(condList, null); - - //Print information about results - Calendar calendar = new GregorianCalendar(); - DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); - System.out.println(); - System.out.print("Jobs registered "); - calendar.setTimeInMillis(timeFrom.getT().getTvSec()*1000); - System.out.print("from "+ df.format(calendar.getTime())+" "); - calendar.setTimeInMillis(timeTo.getT().getTvSec()*1000); - System.out.print("to "+ df.format(calendar.getTime())+"\n"); - Iterator jobsit = jobResult.iterator(); - Iterator statusit = jobStatesResult.iterator(); - while (jobsit.hasNext()) { - System.out.println(jobsit.next()); - System.out.println(jobStatusToString(statusit.next())); - } - } - } catch (Exception e) - { - Throwable cause = e.getCause(); - - if (cause != null && cause instanceof AxisFault) { - cause.printStackTrace(); - } - else { - System.err.println("Oops"); - e.printStackTrace(); - } - } - } - } -} diff --git a/org.glite.lb.client-java/examples/SSLClient.java b/org.glite.lb.client-java/examples/SSLClient.java deleted file mode 100644 index 9baf00b..0000000 --- a/org.glite.lb.client-java/examples/SSLClient.java +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import org.glite.lb.SSLSend; -import org.glite.lb.LBCredentials; - -public class SSLClient { - public static void main(String[] args) { - - SSLSend ssl = new SSLSend(); - - try { - ssl.send(new LBCredentials(args[0],null),"localhost",9002,100,"baff"); - } - catch (Exception e) { - System.err.println(e); - } - - } -} diff --git a/org.glite.lb.client-java/examples/SSLServer.java b/org.glite.lb.client-java/examples/SSLServer.java deleted file mode 100644 index 99a8789..0000000 --- a/org.glite.lb.client-java/examples/SSLServer.java +++ /dev/null @@ -1,47 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import org.glite.lb.SSL; -import org.glite.lb.LBCredentials; -import java.io.*; -import java.net.Socket; - -public class SSLServer { - public static void main(String[] args) { - - SSL ssl = new SSL(); - - try { - ssl.setCredentials(new LBCredentials(args[0],null)); - Socket sock = ssl.accept(Integer.parseInt(args[1]),100000); - System.out.println("accept ok"); - InputStream in = sock.getInputStream(); - PrintStream out = new PrintStream(sock.getOutputStream(),false); - - while (true) { - byte[] buf = new byte[1000]; - int len = in.read(buf); - System.out.write(buf,0,len); - out.print("buzz off"); - } - } - catch (Exception e) { - e.printStackTrace(); - } - - } -} diff --git a/org.glite.lb.client-java/examples/SimpleLLTest.java b/org.glite.lb.client-java/examples/SimpleLLTest.java deleted file mode 100644 index fe6decb..0000000 --- a/org.glite.lb.client-java/examples/SimpleLLTest.java +++ /dev/null @@ -1,54 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import java.util.Random; -import org.glite.jobid.Jobid; -import org.glite.lb.*; - -/** - * This class shows how to work with ContextLL. - * - * @author Pavel Piskac - */ -public class SimpleLLTest { - - public static void main(String[] args) { - - try { - Jobid jobid = new Jobid("https://skurut68-2.cesnet.cz:9000/paja6_test2"); - SeqCode seqCode = new SeqCode(); - ContextLL ctx = new ContextLL(); - ctx.setId(new Random().nextInt(99999999)); - ctx.setSource(1); - ctx.setFlag(0); - ctx.setHost("pelargir.ics.muni.cz"); - ctx.setUser("Pavel Piskac"); - ctx.setSrcInstance(""); - ctx.setJobid(jobid); - ctx.setSeqCode(seqCode); - ctx.setTimeout(5); - ctx.setAddress("localhost"); - ctx.setPort(9002); - ctx.setCredentials(new LBCredentials(args[0],null)); - ctx.setPrefix("/tmp/dglog.paja6_testProxy6"); - EventRunning running = new EventRunning(); - running.setNode("node"); - ctx.log(running); - } - catch (Exception e) { e.printStackTrace(); } - } -} diff --git a/org.glite.lb.client-java/project/ChangeLog b/org.glite.lb.client-java/project/ChangeLog deleted file mode 100644 index 7c9ac29..0000000 --- a/org.glite.lb.client-java/project/ChangeLog +++ /dev/null @@ -1,9 +0,0 @@ -1.0.1-1 -- Initial release of the client-java module. - -1.0.2-1 -- Fixed time zone in UTC times in events - -1.0.3-1 -- Improved portability - diff --git a/org.glite.lb.client-java/project/genEventTypes.pl b/org.glite.lb.client-java/project/genEventTypes.pl deleted file mode 100644 index 4611a10..0000000 --- a/org.glite.lb.client-java/project/genEventTypes.pl +++ /dev/null @@ -1,148 +0,0 @@ -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -@@@LANG: java -@@@{ - $dest = shift; - - for my $e ($event->getTypesOrdered) { - my $uc = ucfirst $e; - my $uuc = uc $e; - print "generating $dest/Event$uc.java\n"; - - open E,">$dest/Event$uc.java" or die "$dest/Event$uc.java: $!\n"; - - print E -qq{ -package org.glite.lb; -import org.glite.jobid.Jobid; - -public class Event$uc extends Event \{ - public Event$uc() \{ - \} - - public String getEventType() \{ - return "$uc"; - \} -}; - - selectType $event $e; - - for ($event->getFieldsOrdered) { - my $f = selectField $event $_; - my $fn = $f->{name}; - my $fnu = ucfirst $fn; - my $fnuu = uc $fn; - my $t; - my $init; - - while ($fnu =~ /_([a-z])/) { - my $u = uc $1; - $fnu =~ s/_$1/$u/; - } - - if ($f->{codes}) { - local $_; - $t = $fnu; - print E -qq{ public enum $fnu \{ - UNDEFINED, -}; - $init = " = ${fnu}.UNDEFINED"; - for (@{$f->{codes}}) { - my $cu = uc $_->{name}; - print E -qq{ ${cu}, -}; - } - - print E -qq{ \}; -}; -# public static String ${fnu}ToString($fnu e) \{ -# String out = "UNDEF"; -# switch (e) \{ -#}; -# for (@{$f->{codes}}) { -# my $cu = uc $_->{name}; -# print E -#qq{ -# case ${fnu}.${cu}: out = "$cu"; break; -#}; -# } -# print E -#qq{ -# \} -# return out; -# \} -#}; - } - else { - $t = $f->getType; - $init = $f->{null} && $main::DefaultNullValue{$f->{type}} ne $f->{null} ? " = $f->{null}" : ""; - } - - -# XXX: handle nulls in setXX() ? - print E -qq{ private $t $fn $init; - - public $t get$fnu() \{ - return $fn; - \} - - public void set$fnu($t val) \{ - this.$fn = val; - \} -}; - } - - print E -qq{ public String ulm() \{ - return (" " + -}; - - - for ($event->getFieldsOrdered) { - my $f = selectField $event $_; - my $fn = $f->{name}; - my $t = getType $f; - my $fnu = ucfirst $fn; - while ($fnu =~ /_([a-z])/) { - my $u = uc $1; - $fnu =~ s/_$1/$u/; - } - my $fnuu = uc $fn; - my $val = $t eq 'String' ? - "($fn == null ? \"\" : Escape.ulm($fn))" : - $f->{codes} ? "Escape.ulm(${fn}.toString())" : - $fn; - - print E -qq{ " DG.$uuc.$fnuu=\\"" + $val + "\\"" + -}; - } - - print E -qq{ ""); - \} -\} -}; - - close E; - } - -@@@} diff --git a/org.glite.lb.client-java/project/package.description b/org.glite.lb.client-java/project/package.description deleted file mode 100644 index 7b62601..0000000 --- a/org.glite.lb.client-java/project/package.description +++ /dev/null @@ -1,4 +0,0 @@ -JAVA implemantation of the L&B service client. Supports producing (logging) -events into L&B, event and job status queries, and receiving notifications. - - diff --git a/org.glite.lb.client-java/project/package.summary b/org.glite.lb.client-java/project/package.summary deleted file mode 100644 index 258ca9c..0000000 --- a/org.glite.lb.client-java/project/package.summary +++ /dev/null @@ -1 +0,0 @@ -JAVA implemantation of the L&B service client diff --git a/org.glite.lb.client-java/project/version.properties b/org.glite.lb.client-java/project/version.properties deleted file mode 100644 index 8d5cbdb..0000000 --- a/org.glite.lb.client-java/project/version.properties +++ /dev/null @@ -1,3 +0,0 @@ -# $Header$ -module.version=1.0.3 -module.age=1 diff --git a/org.glite.lb.client-java/src/org/glite/lb/Context.java b/org.glite.lb.client-java/src/org/glite/lb/Context.java deleted file mode 100644 index 76f4491..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/Context.java +++ /dev/null @@ -1,370 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.lb; - -import java.text.SimpleDateFormat; - -import java.net.UnknownHostException; -import java.util.Date; -import java.util.Random; -import java.util.SimpleTimeZone; -import org.glite.jobid.Jobid; - -/** - * Class representing a context for some job - * - * @author Pavel Piskac (173297@mail.muni.cz) - * @version 15. 3. 2008 - */ -public abstract class Context { - - private Sources source; - private int flag; - private String host; - private String user; - private String prog; - private String srcInstance; - private Jobid jobid; - private SeqCode seqCode; - - /** - * Creates new instance of Context class. - */ - public Context() { - } - - /** - * Creates new instance of Context class. - * - * @param id message id, if null, random number is generated - * @param source one if paramaters of Sources enumeration - * @param flag - * @param host host name, if null or "", the name is get from host name of this computer - * @param user user name - * @param prog if null then is used "egd-wms" - * @param srcInstance if null then it is set as "" - * @param jobid - * @throws java.lang.IllegalArgumentException if user or jobid is null - * or flag < 0 or source <=0 || >= 9 - * - */ - public Context(Sources src, - int flag, - String host, - String user, - String prog, - String srcInstance, - Jobid jobid) { - - if (src == null) { - throw new IllegalArgumentException("Context source"); - } - - if (flag < 0) { - throw new IllegalArgumentException("Context flag"); - } - - if (host == null || host.equals("")) { - try { - host = java.net.InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException ex) { - System.err.println(ex); - } - } - - if (user == null) { - throw new IllegalArgumentException("Context user"); - } - - if (prog == null) { - prog = new String("edg-wms"); - } - - if (srcInstance == null) { - srcInstance = new String(""); - } - - if (jobid == null) { - throw new IllegalArgumentException("Context jobid"); - } - - this.source = src; - this.flag = flag; - this.host = host; - this.user = user; - this.prog = prog; - this.srcInstance = srcInstance; - this.jobid = jobid; - } - - /** - * Abstract method which will serve as method for sending messages with events. - * @param event event for which will be created and send message - */ - public abstract void log(Event event) throws LBException; - - /** - * Creates message prepared to send - * @param event event for which is message generated - * @throws IllegalArgumentException if event, source, user or job is null - * or flag < 0 - * @return output String with message - */ - protected String createMessage(Event event) { - if (event == null) { - throw new IllegalArgumentException("Context event"); - } - - if (jobid == null) { - throw new IllegalArgumentException("Context jobid"); - } - - if (jobid.getBkserver() == null) { - throw new IllegalArgumentException("Context Jobid bkserver"); - } - - if (jobid.getPort() <= 0 || jobid.getPort() >= 65536) { - throw new IllegalArgumentException("Context Jobid port"); - } - - if (jobid.getUnique() == null) { - throw new IllegalArgumentException("Context Jobid unique"); - } - - if (event == null) { - throw new IllegalArgumentException("Context event"); - } - - if (seqCode == null) { - throw new IllegalArgumentException("Context seqCode"); - } - - if (flag < 0) { - throw new IllegalArgumentException("Context flag"); - } - - if (host == null || host.equals("")) { - try { - host = java.net.InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException ex) { - System.err.println(ex); - } - } - - if (prog == null) { - prog = new String("edg-wms"); - } - - if (user == null) { - throw new IllegalArgumentException("Context user"); - } - - if (srcInstance == null) { - srcInstance = new String(""); - } - - SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS"); - df.setTimeZone(new SimpleTimeZone(0, "UTC")); - String date = df.format(new Date()) + "000"; - - if (seqCode != null) seqCode.incrementSeqCode(source); - - String output = (" DG.USER=\"" + Escape.ulm(user) + "\"" + - " DATE=" + date + - " HOST=\"" + Escape.ulm(host) + "\"" + - " PROG=" + Escape.ulm(prog) + - " LVL=SYSTEM" + - " DG.PRIORITY=0" + - " DG.SOURCE=\"" + source + "\"" + - " DG.SRC_INSTANCE=\"" + Escape.ulm(srcInstance) + "\"" + - " DG.EVNT=\"" + event.getEventType() + "\"" + - " DG.JOBID=\"" + jobid + "\"" + - " DG.SEQCODE=\"" + Escape.ulm(seqCode.toString()) + "\"" + - event.ulm()); - - return output; - } - - /** - * Return flag - * - * @return flag - */ - public int getFlag() { - return flag; - } - - /** - * Set flag - * - * @param flag - * @throws java.lang.IllegalArgumentException if flag is lower than 0 - */ - public void setFlag(int flag) { - if (flag < 0) { - throw new IllegalArgumentException("Context flag"); - } - - this.flag = flag; - } - - /** - * Returns host name - * - * @return host name - */ - public String getHost() { - return host; - } - - /** - * Sets host name - * @param host host name - * @throws java.lang.IllegalArgumentException if host is null - */ - public void setHost(String host) { - if (host == null) { - throw new IllegalArgumentException("Context host"); - } - - this.host = host; - } - - /** - * Gets jobid. - * - * @return jobid - */ - public Jobid getJobid() { - return jobid; - } - - /** - * Sets jobid. - * - * @param jobid - * @throws java.lang.IllegalArgumentException if jobid is null - */ - public void setJobid(Jobid jobid) { - if (jobid == null) { - throw new IllegalArgumentException("Context jobid"); - } - - this.jobid = jobid; - } - - /** - * Gets prog. - * @return prog - */ - public String getProg() { - return prog; - } - - /** - * Sets prog, if prog is null then is set default value "edg-wms" - * @param prog - */ - public void setProg(String prog) { - if (prog == null) { - prog = new String("edg-wms"); - } - - this.prog = prog; - } - - /** - * Gets sequence code. - * - * @return sequence code - */ - public SeqCode getSeqCode() { - return seqCode; - } - - /** - * Sets sequence code. - * @param seqCode sequence code - * @throws java.lang.IllegalArgumentException if seqCode is null - */ - public void setSeqCode(SeqCode seqCode) { - if (seqCode == null) { - throw new IllegalArgumentException("Context seqCode"); - } - - this.seqCode = seqCode; - } - - /** - * Gets source which represents which part of sequence code will be changed - * @return source - */ - public Sources getSource() { - return source; - } - - /** - * Sets source which represents which part of sequence code will be changed - * @param source source - * @throws java.lang.IllegalArgumentException if source is null - */ - public void setSource(Sources src) { - this.source = src; - } - - /** - * Gets srcInstance. - * @return srcInstance - */ - public String getSrcInstance() { - return srcInstance; - } - - /** - * Sets srcInstace, if srcInstace null then is set "". - * @param srcInstance srcInstance - */ - public void setSrcInstance(String srcInstance) { - if (srcInstance == null) { - srcInstance = new String(""); - } - - this.srcInstance = srcInstance; - } - - /** - * Gets user name. - * @return user name - */ - public String getUser() { - return user; - } - - /** - * Sets user name. - * @param user user name - * @throws java.lang.IllegalArgumentException if user is null - */ - public void setUser(String user) { - if (user == null) { - throw new IllegalArgumentException("Context user"); - } - - this.user = user; - } -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/ContextDirect.java b/org.glite.lb.client-java/src/org/glite/lb/ContextDirect.java deleted file mode 100644 index e395a27..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/ContextDirect.java +++ /dev/null @@ -1,79 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -package org.glite.lb; -import java.net.Socket; - -public class ContextDirect extends Context -{ - String server; - int port; - LBCredentials cred; - ILProto il = null; - int timeout = 20000; - - public ContextDirect() - { - } - - public ContextDirect(String server,int port) - { - if (server == null) { - throw new IllegalArgumentException("server is null"); - } - if (port < 1 || port > 65535) { - throw new IllegalArgumentException("port is not valid range"); - } - this.server = server; - this.port = port; - } - - public void setCredentials(LBCredentials cred) - { - this.cred = cred; - il = null; - } - - @Override - public void log(Event event) throws LBException { - if (il == null) { - SSL ssl = new SSL(); - ssl.setCredentials(cred); - Socket sock = ssl.connect(server,port+1,timeout); - setUser(ssl.myDN()); - try { il = new ILProto(sock); } - catch (Throwable e) { throw new LBException(e); } - } - - String msg = super.createMessage(event); - int maj; - - try { - il.sendMessage(msg); - maj = il.receiveReply(); - } - catch (Throwable e) { throw new LBException(e); } - - if (maj > 0) { - int min = il.errMin(); - String err = il.errMsg(); - - throw new LBException("IL proto: " + maj + " " + min + " " + err); - } - } -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/ContextIL.java b/org.glite.lb.client-java/src/org/glite/lb/ContextIL.java deleted file mode 100644 index 4dde7d2..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/ContextIL.java +++ /dev/null @@ -1,163 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.lb; - -import org.glite.jobid.Jobid; - -/** - * Class which is used to send messages to inter-logger using unix socket. - * - * @author Pavel Piskac (173297@mail.muni.cz) - */ -public class ContextIL extends Context { - - private String socket; - private String prefix; - private int repeatWriteToFile = 5; - private int connAttempts = 3; - private int timeout = 3; - - //tutorial http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jni.html - //native method which is written in C and imported to Java - native int sendToSocket(String socket_path, - long filepos, - String msg, - int msg_size, - int conn_attempts, - int timeout); - - /** - * Creates new instance of ContextIL. - */ - public ContextIL() { - this.prefix = "/var/glite/log/dglogd.log"; - } - - public ContextIL(String prefix) { - this.prefix = prefix; - } - - public ContextIL(String prefix,String socket,String lib) - { - if (prefix == null) throw new IllegalArgumentException("ContextIL prefix"); - if ((socket != null && lib == null) || (socket == null && lib != null)) - throw new IllegalArgumentException("ContextIL both socket and lib must be set"); - - this.prefix = prefix; - this.socket = socket; - - if (lib != null) System.loadLibrary(lib); - } - - - - /** - * Writes event message to the file and socket. - * - * @param event event - * @throws java.lang.IllegalArgumentException if event, prefix or path - */ - public void log(Event event) throws LBException { - if (event == null) { - throw new IllegalArgumentException("ContextIL event"); - } - - if (prefix == null) { - throw new IllegalArgumentException("ContextIL prefix"); - } - - String message = "DG.LLLID=\"0\"" + super.createMessage(event) +"\n"; - - String file = prefix + "." + getJobid().getUnique(); - - Long fileLength = ILFileWriter.write(file, message, repeatWriteToFile); - - if (socket != null) sendToSocket(socket,fileLength.longValue(),message,message.length(),connAttempts,timeout); - } - - public String getPrefix() { - return prefix; - } - - /** - * Gets count of repeated write to file if some exception is thrown. - * - * @return count of repeated write to file - */ - public int getRepeatWriteToFile() { - return repeatWriteToFile; - } - - /** - * Sets count of repeated write to file if some exception is thrown. - * - * @param repeatWriteToFile count of repeated write to file - */ - public void setRepeatWriteToFile(int repeatWriteToFile) { - if (repeatWriteToFile < 1) { - throw new IllegalArgumentException("ContextIL repeatWriteToFile"); - } - - this.repeatWriteToFile = repeatWriteToFile; - } - - /** - * Gets count of connection attempts which is used while sending the message via unix socket. - * - * @return count of connection attempts - */ - public int getConnAttempts() { - return connAttempts; - } - - /** - * Sets count of connection attempts while sending the message via unix socket. - * - * @param connAttempts count of connection attempts - */ - public void setConnAttempts(int connAttempts) { - if (connAttempts < 1) { - throw new IllegalArgumentException("ContextIL conn_attempts"); - } - - this.connAttempts = connAttempts; - } - - /** - * Gets timeout which is used while sending the message via unix socket. - * - * @return timeout - */ - public int getTimeout() { - return timeout; - } - - /** - * Sets timeout which is used while sending the message via unix socket. - * - * @param timeout timeout - */ - public void setTimeout(int timeout) { - if (timeout < 1) { - throw new IllegalArgumentException("ContextIL time_out"); - } - - this.timeout = timeout; - } - -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/ContextLL.java b/org.glite.lb.client-java/src/org/glite/lb/ContextLL.java deleted file mode 100644 index 4ae98fc..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/ContextLL.java +++ /dev/null @@ -1,178 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.lb; - -import org.glite.jobid.Jobid; - -/** - * This class provides sending messages using network sockets. - * - * @author Pavel Piskac (173297@mail.muni.cz) - */ -public class ContextLL extends Context { - - private String address; - private int port = 9002; - private String prefix; - private int repeatWriteToFile = 5; - private int timeout = 30000; //in milliseconds - private LBCredentials cred; - private SSLSend sslSend = null; - - public ContextLL() { - } - - public ContextLL(String address, int port, String prefix) { - this.prefix = prefix; - this.address = address; - this.port = port; - } - -/* XXX - public ContextLL(int id, - int source, - int flag, - String host, - String user, - String prog, - String srcInstance, - Jobid jobid, - String address, - int port, - String prefix) { - - super(id, source, flag, host, user, prog, srcInstance, jobid); - - if (prefix == null) { - throw new IllegalArgumentException("ContextLL prefix"); - } - if (address == null) { - throw new IllegalArgumentException("ContextLL socket"); - } - if (port < 0) { - throw new IllegalArgumentException("ContextLL port"); - } - - this.prefix = prefix; - this.address = address; - } - -*/ - @Override - public void log(Event event) throws LBException { - if (event == null) { - throw new IllegalArgumentException("ContextLL event"); - } - - if (prefix == null) { - throw new IllegalArgumentException("ContextLL prefix"); - } - - if (address == null) { - throw new IllegalArgumentException("ContextLL socket"); - } - - if (port < 0) { - throw new IllegalArgumentException("ContextLL port"); - } - - if (sslSend == null) { - sslSend = new SSLSend(); - } - - String message = super.createMessage(event); - - ILFileWriter.write(prefix, message, repeatWriteToFile); - - - sslSend.send(cred, address, port, timeout, message); - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - if (address == null) { - throw new IllegalArgumentException("ContextLL address"); - } - - this.address = address; - } - - public int getPort() { - return port; - } - - public void setPort(int port) { - if (port < 0) { - throw new IllegalArgumentException("ContextLL port"); - } - this.port = port; - } - - - public String getPrefix() { - return prefix; - } - - public void setPrefix(String prefix) { - if (prefix == null) { - throw new IllegalArgumentException("ContextLL prefix"); - } - - this.prefix = prefix; - } - - public int getRepeatWriteToFile() { - return repeatWriteToFile; - } - - public void setRepeatWriteToFile(int repeatWriteToFile) { - if (repeatWriteToFile < 1) { - throw new IllegalArgumentException("ContextLL repeatWriteToFile"); - } - - this.repeatWriteToFile = repeatWriteToFile; - } - - public int getTimeout() { - return timeout; - } - - public void setTimeout(int timeout) { - if (timeout < 0) { - throw new IllegalArgumentException("ContextLL timout"); - } - this.timeout = timeout; - } - - public LBCredentials getCredentials() { - return cred; - } - - public void setCredentials(LBCredentials cred) { - if (cred == null) { - throw new IllegalArgumentException("ContextLL credentials"); - } - - this.cred = cred; - } - - -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/Escape.java b/org.glite.lb.client-java/src/org/glite/lb/Escape.java deleted file mode 100644 index e552fef..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/Escape.java +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.lb; - -class Escape { - public static String ulm(String in) { - String out = in.replaceAll("\"", "\\\\\""); - out = out.replaceAll("\n", "\\\\\\n"); - return out; - } -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/Event.java b/org.glite.lb.client-java/src/org/glite/lb/Event.java deleted file mode 100644 index 21bbf95..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/Event.java +++ /dev/null @@ -1,179 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.lb; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.GregorianCalendar; -import org.glite.jobid.Jobid; - -/** - * Abstract class which serves as base for all events. - * - * @author Pavel Piskac (173297@mail.muni.cz) - */ -public abstract class Event { - - private Timeval timestamp; - private Timeval arrived; - private String host; - private Level level; - private Integer priority; - private Jobid jobId; - private SeqCode seqcode; - private String user; - private Sources source; - private String srcInstance; - - public Event() { - } - - public Event(Jobid jobId) { - if (jobId == null) throw new IllegalArgumentException("jobId"); - - this.jobId = jobId; - } - - public Jobid getJobId() { - return jobId; - } - - /** - * When implemented, this method returns string which is specific for each event. - * - * @return specific string - */ - public abstract String ulm(); - - /** - * When implemented, this method returns name of event type. - * - * @return name of event - */ - public abstract String getEventType(); - -/* - public String info() { - String date = ""; - if (arrived != null) { - Calendar calendar = new GregorianCalendar(); - DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); - calendar.setTimeInMillis(arrived.getTvSec()*1000); - date = df.format(calendar.getTime()); - } - return "DATE=" + date + " HOST=\"" + host + "\" " + - "LVL="+level+" DG.PRIORITY=" + priority + " DG.SOURCE=\""+ - source + "\" "+"DG.SRC_INSTANCE=\""+srcInstance+"\" "+ - "DG.EVNT=\""+getEventType()+"\" "+"DG.JOBID=\""+jobId+"\" "+ - "DG.SEQCODE=\""+seqcode+"\" "+"DG.USER=\""+user+"\""+ulm(); - } -*/ - - /** - * Get and set methods for Event attributes. - */ - - public Timeval getArrived() { - return arrived; - } - - public void setArrived(Timeval arrived) { - if (arrived == null) throw new IllegalArgumentException("arrived"); - this.arrived = arrived; - } - - public String getHost() { - return host; - } - - public void setHost(String host) { - if (host == null) throw new IllegalArgumentException("host"); - this.host = host; - } - - - public void setJobId(Jobid jobId) { - if (jobId == null) throw new IllegalArgumentException("jobId"); - this.jobId = jobId; - } - - public Level getLevel() { - return level; - } - - public void setLevel(Level level) { - if (level == null) throw new IllegalArgumentException("level"); - this.level = level; - } - - public Integer getPriority() { - return priority; - } - - public void setPriority(Integer priority) { - this.priority = priority; - } - - public SeqCode getSeqcode() { - return seqcode; - } - - public void setSeqcode(SeqCode seqcode) { - if (seqcode == null) throw new IllegalArgumentException("seqcode"); - this.seqcode = seqcode; - } - - public Sources getSource() { - return source; - } - - public void setSource(Sources source) { - if (source == null) throw new IllegalArgumentException("source"); - this.source = source; - } - - public String getSrcInstance() { - return srcInstance; - } - - public void setSrcInstance(String srcInstance) { - if (srcInstance == null) throw new IllegalArgumentException("srcInstance"); - this.srcInstance = srcInstance; - } - - public Timeval getTimestamp() { - return timestamp; - } - - public void setTimestamp(Timeval timestamp) { - if (timestamp == null) throw new IllegalArgumentException("timestamp"); - this.timestamp = timestamp; - } - - public String getUser() { - return user; - } - - public void setUser(String user) { - if (user == null) throw new IllegalArgumentException("user"); - this.user = user; - } - - -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/EventConvertor.java b/org.glite.lb.client-java/src/org/glite/lb/EventConvertor.java deleted file mode 100644 index 84da13d..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/EventConvertor.java +++ /dev/null @@ -1,1101 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.lb; - -import org.glite.jobid.Jobid; -import org.glite.lb.Event; - -import org.glite.lb.EventAbort; -import org.glite.lb.EventAccepted; -import org.glite.lb.EventCancel; -import org.glite.lb.EventChangeACL; -import org.glite.lb.EventChkpt; -import org.glite.lb.EventClear; -import org.glite.lb.EventCollectionState; -import org.glite.lb.EventCondorError; -import org.glite.lb.EventCondorMatch; -import org.glite.lb.EventCondorReject; -import org.glite.lb.EventCondorResourceUsage; -import org.glite.lb.EventCondorShadowExited; -import org.glite.lb.EventCondorShadowStarted; -import org.glite.lb.EventCondorStarterExited; -import org.glite.lb.EventCondorStarterStarted; -import org.glite.lb.EventCurDescr; -import org.glite.lb.EventDeQueued; -import org.glite.lb.EventDone; -import org.glite.lb.EventEnQueued; -import org.glite.lb.EventHelperCall; -import org.glite.lb.EventHelperReturn; -import org.glite.lb.EventListener; -import org.glite.lb.EventMatch; -import org.glite.lb.EventNotification; -import org.glite.lb.EventPBSDequeued; -import org.glite.lb.EventPBSDone; -import org.glite.lb.EventPBSError; -import org.glite.lb.EventPBSMatch; -import org.glite.lb.EventPBSPending; -import org.glite.lb.EventPBSQueued; -import org.glite.lb.EventPBSRerun; -import org.glite.lb.EventPBSResourceUsage; -import org.glite.lb.EventPBSRun; -import org.glite.lb.EventPending; -import org.glite.lb.EventPurge; -import org.glite.lb.EventReallyRunning; -import org.glite.lb.EventRefused; -import org.glite.lb.EventRegJob; -import org.glite.lb.EventResourceUsage; -import org.glite.lb.EventResubmission; -import org.glite.lb.EventResume; -import org.glite.lb.EventRunning; -import org.glite.lb.EventSuspend; -import org.glite.lb.EventTransfer; -import org.glite.lb.EventUserTag; -import org.glite.lb.Level; -import org.glite.lb.SeqCode; -import org.glite.lb.Sources; -import org.glite.lb.Timeval; -import org.glite.wsdl.types.lb.EventSource; - - -/** - * This class is only for internal purposes of this package. Users of this query API - * do not need it. - * The class serves for converting events from org.glite.wsdl.types.lb.Event type - * to org.glite.lb.Event type. In other words, it maps given wsdl event to the event - * from logging API. - * - * @author Tomas Kramec, 207545@mail.muni.cz - * - */ -public class EventConvertor { - - /** - * This method sets common attributes for the given event. These attributes - * are included in every event. - * - * @param timestamp - * @param arrived - * @param host - * @param level - * @param priority - * @param jobId - * @param seqcode - * @param user - * @param source - * @param srcInstance - */ - private void setCommonAttributes(org.glite.wsdl.types.lb.Timeval timestamp, - org.glite.wsdl.types.lb.Timeval arrived, String host, - org.glite.wsdl.types.lb.Level level, Integer priority, String jobId, - String seqcode, String user, org.glite.wsdl.types.lb.EventSource source, - String srcInstance, Event event) { - - if (event == null) throw new IllegalArgumentException("event cannot be null"); - - if (arrived != null) event.setArrived(new Timeval(arrived.getTvSec(), arrived.getTvUsec())); - if (host != null) event.setHost(host); - if (jobId != null) event.setJobId(new Jobid(jobId)); - if (level != null) event.setLevel(getLevelFromString(level.getValue())); - if (priority != null) event.setPriority(priority); - if (seqcode != null) event.setSeqcode(new SeqCode(SeqCode.NORMAL,seqcode)); /* XXX */ - if (source != null) event.setSource(getSourceFromString(source.getValue())); - if (srcInstance != null) event.setSrcInstance(srcInstance); - if (timestamp != null) event.setTimestamp(new Timeval(timestamp.getTvSec(), timestamp.getTvUsec())); - if (user != null) event.setUser(user); - - - } - - /** - * This private method returns event source depending on input string - * - * @param from represents symbolic name for the source - * @return source value - */ - private Sources getSourceFromString(String from) { - if (from == null) throw new IllegalArgumentException("from cannot be null"); - - Sources source = new Sources(Sources.NONE); - - if (from.equals(EventSource._UserInterface)) source = new Sources(Sources.USER_INTERFACE); - else if (from.equals(EventSource._NetworkServer)) source = new Sources(Sources.NETWORK_SERVER); - else if (from.equals(EventSource._WorkloadManager)) source = new Sources(Sources.WORKLOAD_MANAGER); - else if (from.equals(EventSource._BigHelper)) source = new Sources(Sources.BIG_HELPER); - else if (from.equals(EventSource._JobSubmission)) source = new Sources(Sources.JOB_SUBMISSION); - else if (from.equals(EventSource._LogMonitor)) source = new Sources(Sources.LOG_MONITOR); - else if (from.equals(EventSource._LRMS)) source = new Sources(Sources.LRMS); - else if (from.equals(EventSource._Application)) source = new Sources(Sources.APPLICATION); - else if (from.equals(EventSource._LBServer)) source = new Sources(Sources.LB_SERVER); - - return source; - } - - /** - * This private method returns level depending on the given symbolic name. - * - * @param name symbolic name of the level - * @return level object - */ - - private Level getLevelFromString(String name) { - if(name.equals("UNDEFINED")) return Level.LEVEL_UNDEFINED; - else if(name.equals("EMERGENCY")) return Level.LEVEL_EMERGENCY; - else if(name.equals("ALERT")) return Level.LEVEL_ALERT; - else if(name.equals("ERROR")) return Level.LEVEL_ERROR; - else if(name.equals("WARNING")) return Level.LEVEL_WARNING; - else if(name.equals("AUTH")) return Level.LEVEL_AUTH; - else if(name.equals("SECURITY")) return Level.LEVEL_SECURITY; - else if(name.equals("USAGE")) return Level.LEVEL_USAGE; - else if(name.equals("SYSTEM")) return Level.LEVEL_SYSTEM; - else if(name.equals("IMPORTANT")) return Level.LEVEL_IMPORTANT; - else if(name.equals("DEBUG")) return Level.LEVEL_DEBUG; - else throw new IllegalArgumentException("wrong level type"); - } - - /** - * These private methods serve for creating particular events from logging API. - * They fill in all relevant attributes of output event - * as consistent with the attributes of the given wsdl event. - * - * @param event Wsdl event - * @return appropriate event from logging API - */ - - private EventAbort createEventAbort(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventAbort wsdlEvent = event.getAbort(); - EventAbort ev = new EventAbort(); - - if (wsdlEvent.getReason()!=null) ev.setReason(wsdlEvent.getReason()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventAccepted createEventAccepted(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventAccepted wsdlEvent = event.getAccepted(); - EventAccepted ev = new EventAccepted(); - - Sources source = new Sources(Sources.NONE); - if (wsdlEvent.getFrom() != null) { - source = getSourceFromString(wsdlEvent.getFrom().getValue()); - } - ev.setFrom(source); - - if (wsdlEvent.getFromHost()!=null) ev.setFromHost(wsdlEvent.getFromHost()); - if (wsdlEvent.getFromInstance()!=null) ev.setFromInstance(wsdlEvent.getFromInstance()); - if (wsdlEvent.getLocalJobid()!=null) ev.setLocalJobid(wsdlEvent.getLocalJobid()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventCancel createEventCancel(org.glite.wsdl.types.lb.Event event) { - EventCancel ev = new EventCancel(); - org.glite.wsdl.types.lb.EventCancel wsdlEvent = event.getCancel(); - - if (wsdlEvent.getReason()!=null) ev.setReason(wsdlEvent.getReason()); - - if(wsdlEvent.getStatusCode() != null) { - ev.setStatusCode(EventCancel.StatusCode.valueOf(wsdlEvent.getStatusCode().getValue())); - } else ev.setStatusCode(EventCancel.StatusCode.UNDEFINED); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventChangeACL createEventChangeACL(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventChangeACL wsdlEvent = event.getChangeACL(); - EventChangeACL ev = new EventChangeACL(); - - if (wsdlEvent.getOperation() != null) { - ev.setOperation(EventChangeACL.Operation.valueOf(wsdlEvent.getOperation().getValue())); - } else ev.setOperation(EventChangeACL.Operation.UNDEFINED); - - if (wsdlEvent.getPermission()!= null) { - ev.setPermission(EventChangeACL.Permission.valueOf(wsdlEvent.getPermission().getValue())); - } else ev.setPermission(EventChangeACL.Permission.UNDEFINED); - - if (wsdlEvent.getPermissionType() != null) { - ev.setPermissionType(EventChangeACL.PermissionType.valueOf(wsdlEvent.getPermissionType().getValue())); - } else ev.setPermissionType(EventChangeACL.PermissionType.UNDEFINED); - - if (wsdlEvent.getUserId() != null) ev.setUserId(wsdlEvent.getUserId()); - - if (wsdlEvent.getUserIdType() != null) { - ev.setUserIdType(EventChangeACL.UserIdType.valueOf(wsdlEvent.getUserIdType().getValue())); - } else ev.setUserIdType(EventChangeACL.UserIdType.UNDEFINED); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventChkpt createEventChkpt(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventChkpt wsdlEvent = event.getChkpt(); - EventChkpt ev = new EventChkpt(); - - if (wsdlEvent.getClassad() != null) ev.setClassad(wsdlEvent.getClassad()); - if (wsdlEvent.getTag() != null) ev.setTag(wsdlEvent.getTag()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventClear createEventClear(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventClear wsdlEvent = event.getClear(); - EventClear ev = new EventClear(); - - if (wsdlEvent.getReason() != null) { - ev.setReason(EventClear.Reason.valueOf(wsdlEvent.getReason().getValue())); - } else ev.setReason(EventClear.Reason.UNDEFINED); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventCollectionState createEventCollectionState(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventCollectionState wsdlEvent = event.getCollectionState(); - EventCollectionState ev = new EventCollectionState(); - - if (wsdlEvent.getChild() != null) { - ev.setChild(new Jobid(wsdlEvent.getChild())); - } - if (wsdlEvent.getChildEvent() != null) { - ev.setChildEvent(wsdlEvent.getChildEvent()); - } - if (wsdlEvent.getDoneCode() != null) { - ev.setDoneCode(wsdlEvent.getDoneCode()); - } - if (wsdlEvent.getHistogram() != null) { - ev.setHistogram(wsdlEvent.getHistogram()); - } - if (wsdlEvent.getState() != null) { - ev.setState(wsdlEvent.getState()); - } - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventCondorError createEventCondorError(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventCondorError wsdlEvent = event.getCondorError(); - EventCondorError ev = new EventCondorError(); - - if (ev.getErrorDesc() != null) ev.setErrorDesc(wsdlEvent.getErrorDesc()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventCondorMatch createEventCondorMatch(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventCondorMatch wsdlEvent = event.getCondorMatch(); - EventCondorMatch ev = new EventCondorMatch(); - - if (ev.getDestHost() != null) ev.setDestHost(wsdlEvent.getDestHost()); - if (ev.getOwner() != null) ev.setOwner(wsdlEvent.getOwner()); - if (ev.getPreempting() != null) ev.setPreempting(wsdlEvent.getPreempting()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventCondorReject createEventCondorReject(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventCondorReject wsdlEvent = event.getCondorReject(); - EventCondorReject ev = new EventCondorReject(); - - if (ev.getOwner() != null) ev.setOwner(wsdlEvent.getOwner()); - if (wsdlEvent.getStatusCode() != null) { - ev.setStatusCode(EventCondorReject.StatusCode.valueOf(wsdlEvent.getStatusCode().getValue())); - } else ev.setStatusCode(EventCondorReject.StatusCode.UNDEFINED); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventCondorResourceUsage createEventCondorResourceUsage(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventCondorResourceUsage wsdlEvent = event.getCondorResourceUsage(); - EventCondorResourceUsage ev = new EventCondorResourceUsage(); - - if (ev.getName() != null) ev.setName(wsdlEvent.getName()); - ev.setQuantity(wsdlEvent.getQuantity()); - if (ev.getUnit() != null) ev.setUnit(wsdlEvent.getUnit()); - if (wsdlEvent.getUsage() != null) { - ev.setUsage(EventCondorResourceUsage.Usage.valueOf(wsdlEvent.getUsage().getValue())); - } else ev.setUsage(EventCondorResourceUsage.Usage.UNDEFINED); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - return ev; - } - - private EventCondorShadowExited createEventCondorShadowExited(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventCondorShadowExited wsdlEvent = event.getCondorShadowExited(); - EventCondorShadowExited ev = new EventCondorShadowExited(); - - ev.setShadowExitStatus(wsdlEvent.getShadowExitStatus()); - ev.setShadowPid(wsdlEvent.getShadowPid()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventCondorShadowStarted createEventCondorShadowStarted(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventCondorShadowStarted wsdlEvent = event.getCondorShadowStarted(); - EventCondorShadowStarted ev = new EventCondorShadowStarted(); - - if (ev.getShadowHost() != null) ev.setShadowHost(wsdlEvent.getShadowHost()); - ev.setShadowPid(wsdlEvent.getShadowPid()); - ev.setShadowPort(wsdlEvent.getShadowPort()); - if (ev.getShadowStatus() != null) ev.setShadowStatus(wsdlEvent.getShadowStatus()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventCondorStarterExited createEventCondorStarterExited(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventCondorStarterExited wsdlEvent = event.getCondorStarterExited(); - EventCondorStarterExited ev = new EventCondorStarterExited(); - - if (wsdlEvent.getJobExitStatus() != null) { - ev.setJobExitStatus(wsdlEvent.getJobExitStatus()); - } - if (wsdlEvent.getJobPid() != null) { - ev.setJobPid(wsdlEvent.getJobPid()); - } - if (wsdlEvent.getStarterExitStatus() != null) { - ev.setStarterExitStatus(wsdlEvent.getStarterExitStatus()); - } - if (wsdlEvent.getStarterPid() != null) { - ev.setStarterPid(wsdlEvent.getStarterPid()); - } - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventCondorStarterStarted createEventCondorStarterStarted(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventCondorStarterStarted wsdlEvent = event.getCondorStarterStarted(); - EventCondorStarterStarted ev = new EventCondorStarterStarted(); - - if (wsdlEvent.getStarterPid() != null) { - ev.setStarterPid(wsdlEvent.getStarterPid()); - } - if (wsdlEvent.getUniverse() != null) ev.setUniverse(wsdlEvent.getUniverse()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventCurDescr createEventCurDescr(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventCurDescr wsdlEvent = event.getCurDescr(); - EventCurDescr ev = new EventCurDescr(); - - if (wsdlEvent.getDescr() != null) ev.setDescr(wsdlEvent.getDescr()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventDeQueued createEventDeQueued(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventDeQueued wsdlEvent = event.getDeQueued(); - EventDeQueued ev = new EventDeQueued(); - - if (wsdlEvent.getLocalJobid() != null) ev.setLocalJobid(wsdlEvent.getLocalJobid()); - if (wsdlEvent.getQueue() != null) ev.setQueue(wsdlEvent.getQueue()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventDone createEventDone(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventDone wsdlEvent = event.getDone(); - EventDone ev = new EventDone(); - - ev.setExitCode(wsdlEvent.getExitCode()); - if (wsdlEvent.getReason() != null) ev.setReason(wsdlEvent.getReason()); - if (wsdlEvent.getStatusCode() != null) { - ev.setStatusCode(EventDone.StatusCode.valueOf(wsdlEvent.getStatusCode().getValue())); - } else ev.setStatusCode(EventDone.StatusCode.UNDEFINED); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventEnQueued createEventEnQueued(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventEnQueued wsdlEvent = event.getEnQueued(); - EventEnQueued ev = new EventEnQueued(); - - if (wsdlEvent.getJob() != null) ev.setJob(wsdlEvent.getJob()); - if (wsdlEvent.getQueue() != null) ev.setQueue(wsdlEvent.getQueue()); - if (wsdlEvent.getReason() != null) ev.setReason(wsdlEvent.getReason()); - if (wsdlEvent.getResult() != null) { - ev.setResult(EventEnQueued.Result.valueOf(wsdlEvent.getResult().getValue())); - } else ev.setResult(EventEnQueued.Result.UNDEFINED); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventHelperCall createEventHelperCall(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventHelperCall wsdlEvent = event.getHelperCall(); - EventHelperCall ev = new EventHelperCall(); - - if (wsdlEvent.getHelperName() != null) ev.setHelperName(wsdlEvent.getHelperName()); - if (wsdlEvent.getHelperParams() != null) ev.setHelperParams(wsdlEvent.getHelperParams()); - if (wsdlEvent.getSrcRole() != null) { - ev.setSrcRole(EventHelperCall.SrcRole.valueOf(wsdlEvent.getSrcRole().getValue())); - } else ev.setSrcRole(EventHelperCall.SrcRole.UNDEFINED); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventHelperReturn createEventHelperReturn(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventHelperReturn wsdlEvent = event.getHelperReturn(); - EventHelperReturn ev = new EventHelperReturn(); - - if (wsdlEvent.getHelperName() != null) ev.setHelperName(wsdlEvent.getHelperName()); - if (wsdlEvent.getRetval() != null) ev.setRetval(wsdlEvent.getRetval()); - if (wsdlEvent.getSrcRole() != null) { - ev.setSrcRole(EventHelperReturn.SrcRole.valueOf(wsdlEvent.getSrcRole().getValue())); - } else ev.setSrcRole(EventHelperReturn.SrcRole.UNDEFINED); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventListener createEventListener(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventListener wsdlEvent = event.getListener(); - EventListener ev = new EventListener(); - - if (wsdlEvent.getSvcHost() != null) ev.setSvcHost(wsdlEvent.getSvcHost()); - if (wsdlEvent.getSvcName() != null) ev.setSvcName(wsdlEvent.getSvcName()); - ev.setSvcPort(wsdlEvent.getSvcPort()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventMatch createEventMatch(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventMatch wsdlEvent = event.getMatch(); - EventMatch ev = new EventMatch(); - - if (wsdlEvent.getDestId() != null) ev.setDestId(wsdlEvent.getDestId()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventNotification createEventNotification(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventNotification wsdlEvent = event.getNotification(); - EventNotification ev = new EventNotification(); - - if (wsdlEvent.getDestHost() != null) ev.setDestHost(wsdlEvent.getDestHost()); - ev.setDestPort(wsdlEvent.getDestPort()); - ev.setExpires(wsdlEvent.getExpires()); - if (wsdlEvent.getJobstat() != null) ev.setJobstat(wsdlEvent.getJobstat()); - if (wsdlEvent.getNotifId() != null) { - ev.setNotifId(new Jobid(wsdlEvent.getNotifId())); - } - if (wsdlEvent.getOwner() != null) ev.setOwner(wsdlEvent.getOwner()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventPBSDequeued createEventPBSDequeued(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventPBSDequeued wsdlEvent = event.getPBSDequeued(); - EventPBSDequeued ev = new EventPBSDequeued(); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventPBSDone createEventPBSDone(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventPBSDone wsdlEvent = event.getPBSDone(); - EventPBSDone ev = new EventPBSDone(); - - if (wsdlEvent.getExitStatus() != null) { - ev.setExitStatus(wsdlEvent.getExitStatus()); - } - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventPBSError createEventPBSError(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventPBSError wsdlEvent = event.getPBSError(); - EventPBSError ev = new EventPBSError(); - - if (wsdlEvent.getErrorDesc() != null) ev.setErrorDesc(wsdlEvent.getErrorDesc()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventPBSMatch createEventPBSMatch(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventPBSMatch wsdlEvent = event.getPBSMatch(); - EventPBSMatch ev = new EventPBSMatch(); - - if (wsdlEvent.getDestHost() != null) ev.setDestHost(wsdlEvent.getDestHost()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventPBSPending createEventPBSPending(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventPBSPending wsdlEvent = event.getPBSPending(); - EventPBSPending ev = new EventPBSPending(); - - if (wsdlEvent.getReason() != null) ev.setReason(wsdlEvent.getReason()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventPBSQueued createEventPBSQueued(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventPBSQueued wsdlEvent = event.getPBSQueued(); - EventPBSQueued ev = new EventPBSQueued(); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventPBSRerun createEventPBSRerun(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventPBSRerun wsdlEvent = event.getPBSRerun(); - EventPBSRerun ev = new EventPBSRerun(); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventPBSResourceUsage createEventPBSResourceUsage(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventPBSResourceUsage wsdlEvent = event.getPBSResourceUsage(); - EventPBSResourceUsage ev = new EventPBSResourceUsage(); - - if (wsdlEvent.getName() != null) ev.setName(wsdlEvent.getName()); - if (wsdlEvent.getQuantity() != null) { - ev.setQuantity(wsdlEvent.getQuantity()); - } - if (wsdlEvent.getUnit() != null) ev.setUnit(wsdlEvent.getUnit()); - if (wsdlEvent.getUsage() != null) { - ev.setUsage(EventPBSResourceUsage.Usage.valueOf(wsdlEvent.getUsage().getValue())); - } else ev.setUsage(EventPBSResourceUsage.Usage.UNDEFINED); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventPBSRun createEventPBSRun(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventPBSRun wsdlEvent = event.getPBSRun(); - EventPBSRun ev = new EventPBSRun(); - - if (wsdlEvent.getDestHost() != null) ev.setDestHost(wsdlEvent.getDestHost()); - if (wsdlEvent.getPid() != null) { - ev.setPid(wsdlEvent.getPid()); - } - if (wsdlEvent.getScheduler() != null) ev.setScheduler(wsdlEvent.getScheduler()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventPending createEventPending(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventPending wsdlEvent = event.getPending(); - EventPending ev = new EventPending(); - - if (wsdlEvent.getReason() != null) ev.setReason(wsdlEvent.getReason()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventPurge createEventPurge(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventPurge wsdlEvent = event.getPurge(); - EventPurge ev = new EventPurge(); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventReallyRunning createEventReallyRunning(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventReallyRunning wsdlEvent = event.getReallyRunning(); - EventReallyRunning ev = new EventReallyRunning(); - - if (wsdlEvent.getWnSeq() != null) ev.setWnSeq(wsdlEvent.getWnSeq()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventRefused createEventRefused(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventRefused wsdlEvent = event.getRefused(); - EventRefused ev = new EventRefused(); - - if (wsdlEvent.getFrom() != null) { - ev.setFrom(getSourceFromString(wsdlEvent.getFrom().getValue())); - } else ev.setFrom(new Sources(Sources.NONE)); - if (wsdlEvent.getFromHost() != null) ev.setFromHost(wsdlEvent.getFromHost()); - if (wsdlEvent.getFromInstance() != null) ev.setFromInstance(wsdlEvent.getFromInstance()); - if (wsdlEvent.getReason() != null) ev.setReason(wsdlEvent.getReason()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventRegJob createEventRegJob(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventRegJob wsdlEvent = event.getRegJob(); - EventRegJob ev = new EventRegJob(); - - if (wsdlEvent.getJdl() != null) ev.setJdl(wsdlEvent.getJdl()); - - if (wsdlEvent.getJobtype() != null) { - ev.setJobtype(EventRegJob.Jobtype.valueOf(wsdlEvent.getJobtype().getValue())); - } else ev.setJobtype(EventRegJob.Jobtype.UNDEFINED); - - if (wsdlEvent.getNs() != null) ev.setNs(wsdlEvent.getNs()); - - if (wsdlEvent.getNsubjobs() != null) ev.setNsubjobs(wsdlEvent.getNsubjobs()); - - if (wsdlEvent.getParent() != null) ev.setParent(new Jobid(wsdlEvent.getParent())); - - if (wsdlEvent.getSeed() != null) ev.setSeed(wsdlEvent.getSeed()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventResourceUsage createEventResourceUsage(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventResourceUsage wsdlEvent = event.getResourceUsage(); - EventResourceUsage ev = new EventResourceUsage(); - - ev.setQuantity(wsdlEvent.getQuantity()); - if (wsdlEvent.getResource() != null) ev.setResource(wsdlEvent.getResource()); - if (wsdlEvent.getUnit() != null) ev.setUnit(wsdlEvent.getUnit()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventResubmission createEventResubmission(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventResubmission wsdlEvent = event.getResubmission(); - EventResubmission ev = new EventResubmission(); - - if (wsdlEvent.getReason() != null) ev.setReason(wsdlEvent.getReason()); - if (wsdlEvent.getResult() != null) { - ev.setResult(EventResubmission.Result.valueOf(wsdlEvent.getResult().getValue())); - } else ev.setResult(EventResubmission.Result.UNDEFINED); - if (wsdlEvent.getTag() != null) ev.setTag(wsdlEvent.getTag()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventResume createEventResume(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventResume wsdlEvent = event.getResume(); - EventResume ev = new EventResume(); - - if (wsdlEvent.getReason() != null) ev.setReason(wsdlEvent.getReason()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventRunning createEventRunning(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventRunning wsdlEvent = event.getRunning(); - EventRunning ev = new EventRunning(); - - if (wsdlEvent.getNode() != null) ev.setNode(wsdlEvent.getNode()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventSuspend createEventSuspend(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventSuspend wsdlEvent = event.getSuspend(); - EventSuspend ev = new EventSuspend(); - - if (wsdlEvent.getReason() != null) ev.setReason(wsdlEvent.getReason()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventTransfer createEventTransfer(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventTransfer wsdlEvent = event.getTransfer(); - EventTransfer ev = new EventTransfer(); - - if (wsdlEvent.getDestHost() != null) ev.setDestHost(wsdlEvent.getDestHost()); - if (wsdlEvent.getDestInstance() != null) ev.setDestInstance(wsdlEvent.getDestInstance()); - if (wsdlEvent.getDestJobid() != null) ev.setDestJobid(wsdlEvent.getDestJobid()); - - if (wsdlEvent.getDestination() != null) { - ev.setDestination(getSourceFromString(wsdlEvent.getDestination().getValue())); - } else ev.setDestination(new Sources(Sources.NONE)); - - if (wsdlEvent.getJob() != null) ev.setJob(wsdlEvent.getJob()); - if (wsdlEvent.getReason() != null) ev.setReason(wsdlEvent.getReason()); - - if (wsdlEvent.getResult() != null) { - ev.setResult(EventTransfer.Result.valueOf(wsdlEvent.getResult().getValue())); - } else ev.setResult(EventTransfer.Result.UNDEFINED); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - private EventUserTag createEventUserTag(org.glite.wsdl.types.lb.Event event) { - org.glite.wsdl.types.lb.EventUserTag wsdlEvent = event.getUserTag(); - EventUserTag ev = new EventUserTag(); - - if (wsdlEvent.getName() != null) ev.setName(wsdlEvent.getName()); - if (wsdlEvent.getValue() != null) ev.setValue(wsdlEvent.getValue()); - - setCommonAttributes(wsdlEvent.getTimestamp(), wsdlEvent.getArrived(), - wsdlEvent.getHost(), wsdlEvent.getLevel(), wsdlEvent.getPriority(), - wsdlEvent.getJobId(), wsdlEvent.getSeqcode(), wsdlEvent.getUser(), - wsdlEvent.getSource(), wsdlEvent.getSrcInstance(), ev); - - return ev; - } - - - - /** - * Converts given event of org.glite.wsdl.types.lb.Event type - * into event of org.glite.lb.Event type - * - * @param event Event to be converted - * @return converted event - */ - protected Event convert(org.glite.wsdl.types.lb.Event event) { - - if (event == null) throw new IllegalArgumentException("event cannot be null"); - - //EventAbort - if(event.getAbort()!=null) return createEventAbort(event); - - //EventAccepted - if(event.getAccepted()!=null) return createEventAccepted(event); - - //EventCancel - if (event.getCancel() != null) return createEventCancel(event); - - //EventChangeACL - if (event.getChangeACL() != null) return createEventChangeACL(event); - - //EventChkpt - if (event.getChkpt() != null) return createEventChkpt(event); - - //EventClear - if (event.getClear() != null) return createEventClear(event); - - //EventCollectionState - if (event.getCollectionState() != null) return createEventCollectionState(event); - - //EventCondorError - if (event.getCondorError() != null) return createEventCondorError(event); - - //EventCondorMatch - if (event.getCondorMatch() != null) return createEventCondorMatch(event); - - //EventCondorReject - if (event.getCondorReject() != null) return createEventCondorReject(event); - - //EventCondorResourceUsage - if (event.getCondorResourceUsage() != null) return createEventCondorResourceUsage(event); - - //EventCondorShadowExited - if (event.getCondorShadowExited() != null) return createEventCondorShadowExited(event); - - //EventCondorShadowStarted - if (event.getCondorShadowStarted() != null) return createEventCondorShadowStarted(event); - - //EventCondorStarterExited - if (event.getCondorStarterExited() != null) return createEventCondorStarterExited(event); - - //EventCondorStarterStarted - if (event.getCondorStarterStarted() != null) return createEventCondorStarterStarted(event); - - //EventCurDescr - if (event.getCurDescr() != null) return createEventCurDescr(event); - - //EventDeQueued - if (event.getDeQueued() != null) return createEventDeQueued(event); - - //EventDone - if (event.getDone() != null) return createEventDone(event); - - //EventEnQueued - if (event.getEnQueued() != null) return createEventEnQueued(event); - - //EventHelperCall - if (event.getHelperCall() != null) return createEventHelperCall(event); - - //EventHelperReturn - if (event.getHelperReturn() != null) return createEventHelperReturn(event); - - //EventListener - if (event.getListener() != null) return createEventListener(event); - - //EventMatch - if (event.getMatch() != null) return createEventMatch(event); - - //EventNotification - if (event.getNotification() != null) return createEventNotification(event); - - //EventPBSDequeued - if (event.getPBSDequeued() != null) return createEventPBSDequeued(event); - - //EventPBSDone - if (event.getPBSDone() != null) return createEventPBSDone(event); - - //EventPBSError - if (event.getPBSError() != null) return createEventPBSError(event); - - //EventPBSMatch - if (event.getPBSMatch() != null) return createEventPBSMatch(event); - - //EventPBSPendig - if (event.getPBSPending() != null) return createEventPBSPending(event); - - //EventPBSQueued - if (event.getPBSQueued() != null) return createEventPBSQueued(event); - - //EventPBSRerun - if (event.getPBSRerun() != null) return createEventPBSRerun(event); - - //EventPBSResourceUsage - if (event.getPBSResourceUsage() != null) return createEventPBSResourceUsage(event); - - //EventPBSRun - if (event.getPBSRun() != null) return createEventPBSRun(event); - - //EventPendig - if (event.getPending() != null) return createEventPending(event); - - //EventPurge - if (event.getPurge() != null) return createEventPurge(event); - - //EventReallyRunning - if (event.getReallyRunning() != null) return createEventReallyRunning(event); - - //EventRefused - if (event.getRefused() != null) return createEventRefused(event); - - //EventRegJob - if (event.getRegJob() != null) return createEventRegJob(event); - - //EventResourceUsage - if (event.getResourceUsage() != null) return createEventResourceUsage(event); - - //EventResubmission - if (event.getResubmission() != null) return createEventResubmission(event); - - //EventResume - if (event.getResume() != null) return createEventResume(event); - - //EventRunning - if (event.getRunning() != null) return createEventRunning(event); - - //EventSuspend - if (event.getSuspend() != null) return createEventSuspend(event); - - //EventTransfer - if (event.getTransfer() != null) return createEventTransfer(event); - - //EventUserTag - if (event.getUserTag() != null) return createEventUserTag(event); - - return null; - } - -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/ILFileWriter.java b/org.glite.lb.client-java/src/org/glite/lb/ILFileWriter.java deleted file mode 100644 index 50900f8..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/ILFileWriter.java +++ /dev/null @@ -1,84 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.lb; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileWriter; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.channels.FileChannel; -import java.nio.channels.FileLock; - -/** - * This class provides writing messages to some file. - * - * @author Pavel Piskac (173297@mail.muni.cz) - */ -public class ILFileWriter { - - public ILFileWriter() { - } - - /** - * Writes message to a file and returns size of this file before writing the - * data - * @param prefix file path - * @param message message which will be written - * @param repeatWriteToFile count of attempts to write to file in case of failure - */ - public static Long write(String prefix, String message, int repeatWriteToFile) throws LBException { - FileWriter fileWriter = null; - long fileLength = 0; - FileLock fileLock = null; - File file; - - for (int i = 0; i < repeatWriteToFile; i++) { - try { - file = new File(prefix); - FileOutputStream out = new FileOutputStream(file,true); - FileChannel fileChannel = out.getChannel(); - - fileLock = fileChannel.tryLock(); - if (fileLock != null) { - if (!file.exists()) { - continue; - } - fileLength = file.length(); - out.write(message.getBytes()); - fileLock.release(); - out.close(); - - if (file.exists()) { - break; - } - } - } catch (Throwable ex) { - if (fileLock != null) { - try { - fileLock.release(); - } catch (IOException ex2) { } - } - throw new LBException(ex); - } - } - - return new Long(fileLength); - } -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/ILProto.java b/org.glite.lb.client-java/src/org/glite/lb/ILProto.java deleted file mode 100644 index f71fa93..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/ILProto.java +++ /dev/null @@ -1,255 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package org.glite.lb; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.Socket; - -/** - * this class handles communication with LB server (reads messages it sends) - * - * @author Kopac - */ -public class ILProto { - - private Socket socket = null; - private InputStream inStream = null; - private OutputStream outStream = null; - private static final String magicWordXXX = "6 michal"; - private static final String magicWord = "michal"; - private int min,maj; - private String err; - private byte[] buf; - private int bufptr,bufsiz; - - /** - * construcor initializes the class' socket, inStream and outStream attributes - * - * @param socket an SSLSocket - * @throws java.io.IOException - */ - public ILProto(Socket socket) throws IOException { - this.socket = socket; - inStream = this.socket.getInputStream(); - outStream = this.socket.getOutputStream(); - } - - /** - * this method reads from the inpuStream of the provided socket, checks for - * the magic word and returns relevant info - * - * @return a String containing third line of the inputStream data, without - * the info about its length - * @throws IOException - */ - /* XXX: weird implementation, should follow C */ - public String receiveMessage() throws IOException{ - byte[] b = new byte[17]; - int i = 0; - //read in and convert size of the message - if(inStream.read(b, 0, 17) == -1) { - return null; - } else { - String test = new String(b); - test.trim(); - int length = Integer.parseInt(test); - byte[] notification = new byte[length]; - //read in the rest of the message - int j = 0; - while(i != length || j == -1) { - j = inStream.read(notification, i, length-i); - i=i+j; - } - String retString = checkWord(notification); - if(retString == null) return null; - else - //return - return retString.split(" ", 2)[1]; - } - } - - public void sendMessage(String msg) throws IOException - { - newbuf(magicWord.length() + msg.length() + 100); - put_string(magicWord); - put_string(msg); - String hdr = String.format("%16d\n",bufptr); - outStream.write(hdr.getBytes()); - - writebuf(); - outStream.flush(); - } - - public int receiveReply() throws IOException,LBException - { - newbuf(17); - - if (readbuf(17) != 17) { - throw new LBException("reading IL proto header"); - } - int len = Integer.parseInt((new String(buf)).trim()); - - newbuf(len); - if (readbuf(len) < len) { - throw new LBException("incomplete IL message"); - } - - rewind(); - this.maj = get_int(); - this.min = get_int(); - this.err = get_string(); - - return this.maj; - } - - public int errMin() { return min; } - public String errMsg() { return err; } - - /** - * private method that checks, if the magic word is present in the notification - * - * @param notification a notification without the line specifying its length - * @return null, if the word is not there, the last line of the notification, - * again without its length specification, otherwise - */ - private String checkWord(byte[] notification) { - int i = 0; - while(notification[i] != '\n') { - i++; - } - String word = new String(notification, 0, i+1); - word.trim(); - if(!word.equals(magicWordXXX)) { - return null; - } else { - return new String(notification, i+1, notification.length - i + 1); - } - } - - /** - * this method encodes and sends a reply to the interlogger via the socket's - * outputStream - * - * @param errCode errCode of the calling - * @param minErrCode minimum available errcode - * @param message message for the interlogger - could be any String - * @throws IOException - */ - public void sendReply(int errCode, int minErrCode, String message) throws IOException { - byte[] errByte = (new String()+errCode).getBytes(); - byte[] minErrByte = (new String()+minErrCode).getBytes(); - byte[] msgByte = message.getBytes(); - int length = errByte.length + minErrByte.length + msgByte.length; - byte[] lengthByte = (new String()+length).getBytes(); - int numberOfSpaces = 17 - lengthByte.length; - byte[] returnByte = new byte[length+17]; - int i = 0; - while(i < numberOfSpaces-1) { - returnByte[i] = ' '; - i++; - } - returnByte = putByte(returnByte, lengthByte, numberOfSpaces); - returnByte[16] = '\n'; - returnByte = putByte(returnByte, errByte, 17); - returnByte = putByte(returnByte, minErrByte, 16 + errByte.length); - returnByte = putByte(returnByte, msgByte, 16 + errByte.length + minErrByte.length); - outStream.write(returnByte); - } - - /** - * appends a byte array to the end of an existing byte array - * - * @param arrayToFill array to be filled - * @param filler array to be appended - * @param start starting offset of the first array, from which the second - * array should be appended - * @return the resulting byte array - */ - private byte[] putByte(byte[] arrayToFill, byte[] filler, int start) { - for(int i = start; i < filler.length + start; i++) { - int j = 0; - arrayToFill[i] = filler[j]; - j++; - } - return arrayToFill; - } - - private void newbuf(int size) { - buf = new byte[size]; - bufptr = 0; - bufsiz = size; - } - - private void rewind() { bufptr = 0; } - - private int readbuf(int size) throws IOException { - int r,total = 0; - - while (size > 0 && (r = inStream.read(buf,bufptr,size)) > 0) { - bufptr += r; - size -= r; - total += r; - } - return total; - } - - private void writebuf() throws IOException { - outStream.write(buf,0,bufptr); - } - - private void _put_int(int ii) - { - String s = new String() + ii; - byte[] b = s.getBytes(); - int i; - - for (i=0; i - *

  • CLASSADS - Include the job description in the query result.
  • - *
  • CHILDREN - Include the list of subjob id's in the query result.
  • - *
  • CHILDSTAT - Apply the flags recursively to subjobs.
  • - *
  • CHILDHIST_FAST - Include partially complete histogram of child job states.
  • - *
  • CHILDHIST_THOROUGH - Include full and up-to date histogram of child job states.
  • - * - * - * @return Status of the job. - * @throws LBException If some communication or server problem occurs. - */ - public JobStatus getStatus(JobFlagsValue[] flags) throws LBException { - if (serverConnection == null) - throw new IllegalStateException("serverConnection is null, please set it"); - if (jobId == null) - throw new IllegalStateException("jobId is null, please set it"); - return serverConnection.jobState(jobId.toString(), flags); - } - - /** - * Return all events corresponding to this job. - * Obtains all events corresponding to the job that are stored - * in the bookkeeping server database. - *

    - * Default value for logging level is SYSTEM. If needed, it can be changed - * by calling setEventLoggingLevel(Level loggingLevel) method - * on the serverConnection attribute of this class. - *

    - * - * @return events List of events (of type Event). - * @throws LBException If some communication or server problem occurs. - */ - public List getEvents() throws LBException { - if (serverConnection == null) - throw new IllegalStateException("serverConnection is null, please set it"); - if (jobId == null) - throw new IllegalStateException("jobId is null, please set it"); - - QueryRecValue jobIdValue = new QueryRecValue(null, jobId.toString(), null); - QueryRecord[] jobIdRec = new QueryRecord[] {new QueryRecord(QueryOp.EQUAL, jobIdValue, null)}; - QueryConditions[] query = new QueryConditions[]{new QueryConditions(QueryAttr.JOBID, null, null, jobIdRec)}; - QueryRecValue levelValue = new QueryRecValue(serverConnection.getEventLoggingLevel().getInt()+1, null, null); - QueryRecord[] levelRec = new QueryRecord[] {new QueryRecord(QueryOp.LESS, levelValue, null)}; - QueryConditions[] queryEvent = new QueryConditions[]{new QueryConditions(QueryAttr.LEVEL, null, null, levelRec)}; - List queryList = new ArrayList(); - queryList.add(query[0]); - List queryEventList = new ArrayList(); - queryEventList.add(queryEvent[0]); - - return serverConnection.queryEvents(queryList, queryEventList); - } -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/LBCredentials.java b/org.glite.lb.client-java/src/org/glite/lb/LBCredentials.java deleted file mode 100644 index b18b7b1..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/LBCredentials.java +++ /dev/null @@ -1,135 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package org.glite.lb; - -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Properties; -import javax.xml.rpc.ServiceException; -import javax.net.ssl.SSLContext; - -import org.apache.axis.SimpleTargetedChain; -import org.apache.axis.Handler; -import org.apache.axis.transport.http.HTTPTransport; -import org.apache.axis.transport.http.SocketHolder; -import org.apache.axis.SimpleChain; -import org.apache.axis.configuration.SimpleProvider; - -import org.glite.security.trustmanager.ContextWrapper; -import org.glite.security.trustmanager.axis.SSLConfigSender; - -import org.glite.wsdl.services.lb.LoggingAndBookkeepingLocator; -import org.glite.wsdl.services.lb.LoggingAndBookkeepingPortType; - - -/** - * - */ -public class LBCredentials { - - private String proxy; - private String caFiles; - private String key; - private String pass; - private String cert; - - public LBCredentials(String proxy, String caFiles) { - if (proxy == null) throw new IllegalArgumentException("Proxy cannot be null"); - - this.proxy = new String(proxy); - if (caFiles != null) { - this.caFiles = new String(caFiles); - } - } - - public LBCredentials(String userCert, String userKey, String userPass, String caFiles) { - if (userCert==null || userKey==null) - throw new IllegalArgumentException("key and cert must not be null"); - - key = new String(userKey); - cert = new String(userCert); - if (userPass != null) pass = new String(userPass); - if (caFiles != null) this.caFiles = new String(caFiles); - } - - protected LoggingAndBookkeepingPortType getStub(String server) throws LBException { - if (server == null) - throw new IllegalArgumentException("Server cannot be null"); - try { - URL queryServerAddress = new URL(server); - int port = queryServerAddress.getPort(); - if (port < 1 || port > 65535) { - throw new IllegalArgumentException("port"); - } - if (!queryServerAddress.getProtocol().equals("https")) { - throw new IllegalArgumentException("wrong protocol"); - } - - Handler transport = new SimpleTargetedChain(new SimpleChain(), - new SSLConfigSender(makeConfig()), - new SimpleChain()); - SimpleProvider transportProvider = new SimpleProvider(); - transportProvider.deployTransport(HTTPTransport.DEFAULT_TRANSPORT_NAME, transport); - LoggingAndBookkeepingLocator loc = new LoggingAndBookkeepingLocator(transportProvider); - return loc.getLoggingAndBookkeeping(queryServerAddress); - } catch (ServiceException ex) { - throw new LBException(ex); - } catch (MalformedURLException ex) { - throw new LBException(ex); - } catch (org.apache.axis.AxisFault ex) { - throw new LBException(ex); - } - } - - private Properties makeConfig() { - Properties cf = new java.util.Properties(); - - if (proxy != null) cf.put(ContextWrapper.CREDENTIALS_PROXY_FILE,proxy); - else { - cf.put(ContextWrapper.CREDENTIALS_CERT_FILE,cert); - cf.put(ContextWrapper.CREDENTIALS_KEY_FILE,key); - if (pass != null) cf.put(ContextWrapper.CREDENTIALS_KEY_PASSWD, pass); - } - - if (caFiles != null) cf.put(ContextWrapper.CA_FILES,caFiles); - cf.put(ContextWrapper.SSL_PROTOCOL, "SSLv3"); - - return cf; - } - - protected SSLContext getSSLContext() throws LBException { - ContextWrapper cw; - - try { - cw = new ContextWrapper(makeConfig()); - } - catch (java.io.IOException e) { - throw new LBException(e); - } - catch (java.security.GeneralSecurityException e) { - throw new LBException(e); - } - return cw.getContext(); - - } -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/LBException.java b/org.glite.lb.client-java/src/org/glite/lb/LBException.java deleted file mode 100644 index 9846eab..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/LBException.java +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.lb; - -public class LBException extends Exception { - - public LBException(Throwable e) { - super(e); - } - - public LBException(String s) { - super(s); - } - -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/Level.java b/org.glite.lb.client-java/src/org/glite/lb/Level.java deleted file mode 100644 index 678290b..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/Level.java +++ /dev/null @@ -1,66 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.lb; - -/** - * This class represents logging level for events. - * - * @author Tomas Kramec, 207545@mail.muni.cz - */ -public class Level { - - private final int level; - - public static final Level LEVEL_UNDEFINED = new Level(0); - public static final Level LEVEL_EMERGENCY = new Level(1); - public static final Level LEVEL_ALERT = new Level(2); - public static final Level LEVEL_ERROR = new Level(3); - public static final Level LEVEL_WARNING = new Level(4); - public static final Level LEVEL_AUTH = new Level(5); - public static final Level LEVEL_SECURITY = new Level(6); - public static final Level LEVEL_USAGE = new Level(7); - public static final Level LEVEL_SYSTEM = new Level(8); - public static final Level LEVEL_IMPORTANT = new Level(9); - public static final Level LEVEL_DEBUG = new Level(10); - - private Level(int level) { - this.level = level; - } - - public int getInt() { - return level; - } - @Override - public String toString() { - switch (level) { - case 0: return "UNDEFINED"; - case 1: return "EMERGENCY"; - case 2: return "ALERT"; - case 3: return "ERROR"; - case 4: return "WARNING"; - case 5: return "AUTH"; - case 6: return "SECURITY"; - case 7: return "USAGE"; - case 8: return "SYSTEM"; - case 9: return "IMPORTANT"; - case 10: return "DEBUG"; - default: throw new IllegalArgumentException("wrong level type"); - } - } - -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/NotifParser.java b/org.glite.lb.client-java/src/org/glite/lb/NotifParser.java deleted file mode 100644 index c3d769c..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/NotifParser.java +++ /dev/null @@ -1,145 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package org.glite.lb; - -import java.io.IOException; -import java.io.StringReader; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpression; -import javax.xml.xpath.XPathExpressionException; -import javax.xml.xpath.XPathFactory; -import org.apache.commons.lang.StringEscapeUtils; -import org.glite.wsdl.types.lb.JobStatus; -import org.w3c.dom.Document; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - -/** - * this class parses the received message into a readable format - * - * @author Kopac - */ -public class NotifParser { - - Document doc = null; - String header = null; - - - /** - * constructor takes a notification in String format and parses it into a String - * containing the header and an XML doc - * - * @param notif the string with notification in it - * @throws javax.xml.parsers.ParserConfigurationException - * @throws org.xml.sax.SAXException - * @throws java.io.IOException - */ - public NotifParser(String notif) throws ParserConfigurationException, SAXException, IOException { - String[] splitString = notif.split("DG.NOTIFICATION.JOBSTAT=\"", 2); - header = splitString[0]; - doc = createXML(splitString[1]); - } - - /** - * this method reads through an XML document using XPath expressions and - * fills an instance of JobStatus, which it then returns - * this is done using automatically generated code - * - * @param notification an array of bytes containing the raw notification - * @return a Jobstatus instance - */ - public JobStatus getJobInfo() - throws ParserConfigurationException, SAXException, IOException { - JobStatus status = new JobStatus(); - //TODO: insert automated code creation - status.setJobId(evaluateXPath("//jobId").item(0).getTextContent()); - status.setOwner(evaluateXPath("//owner").item(0).getTextContent()); - return status; - } - - /** - * this method returns id of the notification - * - * @return notif id - */ - public String getNotifId() { - String halfHeader = header.split("DG.NOTIFICATION.NOTIFID=\"")[1]; - return halfHeader.substring(0, halfHeader.indexOf("\"")); - } - - /** - * a method for handling xpath queries - * - * @param xpathString xpath expression - * @return the result nodelist - */ - private NodeList evaluateXPath(String xpathString) { - try { - XPathFactory xfactory = XPathFactory.newInstance(); - XPath xpath = xfactory.newXPath(); - XPathExpression expr = xpath.compile(xpathString); - return (NodeList) expr.evaluate(doc, XPathConstants.NODESET); - } catch (XPathExpressionException ex) { - ex.printStackTrace(); - return null; - } - } - - /** - * this method creates an XML document out of a provided String - * note that the string has to be a valid escaped XML document representation, - * otherwise the process will fail - * - * @param body a String containing an XML document - * @return an XML document in the Document format - * @throws javax.xml.parsers.ParserConfigurationException - * @throws org.xml.sax.SAXException - * @throws java.io.IOException - */ - private Document createXML(String body) throws ParserConfigurationException, SAXException, IOException { - String removed = body.substring(0, body.length()-1); - String parsed = StringEscapeUtils.unescapeXml(removed); - //this code removes hexadecimal references from the string (couldn't find - //a suitable parser for this) - StringBuilder build = new StringBuilder(parsed); - int j = build.indexOf("%"); - while(j > 0) { - if(build.charAt(j-1) == '>') { - build.delete(j, j+3); - if(build.charAt(j) == '<') { - j = build.indexOf("%"); - } - } else { - j = build.indexOf("%", j+1); - } - } - parsed = build.toString(); - //ends here - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - return factory.newDocumentBuilder().parse(new InputSource(new StringReader(parsed))); - } -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/Notification.java b/org.glite.lb.client-java/src/org/glite/lb/Notification.java deleted file mode 100644 index 326ab70..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/Notification.java +++ /dev/null @@ -1,252 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package org.glite.lb; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.Socket; -import java.net.UnknownHostException; -import java.rmi.RemoteException; -import java.security.KeyManagementException; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.util.Calendar; -import java.util.Date; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.rpc.holders.CalendarHolder; -import org.glite.jobid.Jobid; -import org.glite.lb.SSL; -import org.glite.wsdl.services.lb.LoggingAndBookkeepingPortType; -import org.glite.wsdl.types.lb.JobFlagsValue; -import org.glite.wsdl.types.lb.JobStatus; -import org.glite.wsdl.types.lb.QueryConditions; -import org.xml.sax.SAXException; - -/** - * This class handles all communication comming from the client toward the server. - * it uses methods generated from .wsdl description files. - * note that each instance of this class is dedicated to a single port. Different - * port means a new instance has to be created - * - * @author Kopac - */ -public class Notification { - - private int port = 0; - private Socket socket = null; - private static String keyStore; - private String notifId; - private LoggingAndBookkeepingPortType stub; - private LBCredentials lbCredent; - - /** - * constructor sets the local port number - * - * @param port number of the local port the notification is bound to - * @param lbCredent instance of class that handles SSL authentication - */ - public Notification(int port, LBCredentials lbCredent) { - this.port = port; - this.lbCredent = lbCredent; - } - - /** - * a private method used to create a unique ID for a new notification - * - * @param host hostname - * @return String containing the unique ID - */ - private String makeId(String host) { - StringBuilder returnString = new StringBuilder(); - returnString.append(host); - Jobid jobid = new Jobid(returnString.toString(), port); - returnString.append("/NOTIF:"); - returnString.append(jobid.getUnique()); - return returnString.toString(); - } - - /** - * returns ID of the latest received notification - * - * @return notifID - */ - public String getNotifid() { - return notifId; - } - - /** - * private method used to recover LB server address from a notif ID - * - * @param notifId notif ID - * @return server address - */ - private String getServer(String notifId) { - StringBuilder ret = new StringBuilder(notifId.split("/")[2]); - char[] ch = new char[]{ret.charAt(ret.length()-1)}; - int i = Integer.parseInt(new String(ch)) + 3; - ret.replace(ret.length()-1, ret.length()-1, new String()+i); - ret.insert(0, "https://"); - return ret.toString(); - } - - /** - * this method sends a request to the server, to create a new notification. - * it's not necessary to provide all the options for this calling, thus - * some of the parameters can be null. in that case, the option they correspond to - * is not used. - * - * @param server a String containing the server address (e.g. https://harad.ics.muni.cz:9553). - * can't be null - * @param conditions an array of QueryConditions, may contain all the possible - * conditions for the new notification. can't be null - * @param flags an array of JobFlagsValue, may contain all the possible flags - * and their values for the new notification. - * @param date a Date containing the desired time, the notification will be valid for - * note that this option can only be used to shorten the validity span, as the server - * checks it and sets the final expiration date to a constant max, should - * the provided Date exceed it. may be null - * @return a Date holding info on how long the new notification will - * be valid for - * @throws LBException - */ - public Date newNotif(String server, QueryConditions[] conditions, JobFlagsValue[] flags, Date date) throws LBException { - try { - CalendarHolder calendarHolder = new CalendarHolder(Calendar.getInstance()); - if (date != null) { - calendarHolder.value.setTime(date); - } else { - calendarHolder.value.setTime(new Date(System.currentTimeMillis() + 86400000)); - } - stub = lbCredent.getStub(server); - String addr = "0.0.0.0:" + port; - String id = makeId(server); - stub.notifNew(id, addr, conditions, flags, calendarHolder); - notifId = id; - return calendarHolder.value.getTime(); - } catch (RemoteException ex) { - throw new LBException(ex); - } - } - - /** - * this method drops an existing notification, removing it completely - * - * @param notifId id of the notification to be dropped - * @throws LBException - */ - public void drop(String notifId) throws LBException { - try { - stub = lbCredent.getStub(getServer(notifId)); - stub.notifDrop(notifId); - } catch (RemoteException ex) { - throw new LBException(ex); - } - } - - /** - * this method is used to extend the validity of an existing notification - * - * @param notifId id of the notification to be refreshed - * @param date information about the desired validity duration of the notification - * in Date format. may be null (in this case, the maximum possible duration is used). - * @throws LBException - */ - public void refresh(String notifId, Date date) throws LBException { - try { - stub = lbCredent.getStub(getServer(notifId)); - CalendarHolder holder = new CalendarHolder(Calendar.getInstance()); - if (date != null) { - holder.value.setTime(date); - } else { - holder.value.setTime(new Date(System.currentTimeMillis() + 86400000)); - } - stub.notifRefresh(notifId, holder); - } catch (RemoteException ex) { - throw new LBException(ex); - } - } - - /** - * this method is used to bind an existing notification to a different local port - * than previously declared - * - * @param notifId id of th notification - * @param date optional attribute, can be used to refresh the notification - * @return length of the validity duration of the notification in Date format - * @throws LBException - */ - public Date bind(String notifId, Date date) throws LBException { - try { - stub = lbCredent.getStub(getServer(notifId)); - String host = InetAddress.getLocalHost().getHostName() + ":" + port; - CalendarHolder holder = new CalendarHolder(Calendar.getInstance()); - if (date != null) { - holder.value.setTime(date); - } else { - holder.value.setTime(new Date(System.currentTimeMillis() + 86400000)); - } - stub.notifBind(notifId, host, holder); - return holder.value.getTime(); - } catch (RemoteException ex) { - throw new LBException(ex); - } catch (UnknownHostException ex) { - throw new LBException(ex); - } - } - - /** - * this method is used to tell the client to start listening for incomming - * connections on the local port, with the specified timeout - * - * @param timeout read timeout - * @return comprehensible information, pulled from the received message - * @throws LBException - */ - public JobStatus receive(int timeout) throws LBException { - SSL ssl = new SSL(); - ssl.setCredentials(lbCredent); - ILProto receiver = null; - String received = null; - try { - if(socket == null) { - socket = ssl.accept(port, timeout); - } - receiver = new ILProto(socket); - if((received = receiver.receiveMessage()) == null) { - socket = ssl.accept(port, timeout); - receiver = new ILProto(socket); - received = receiver.receiveMessage(); - } - receiver.sendReply(0, 0, "success"); - NotifParser parser = new NotifParser(received); - notifId = parser.getNotifId(); - return parser.getJobInfo(); - } catch (IOException ex) { - throw new LBException(ex); - } catch (ParserConfigurationException ex) { - throw new LBException(ex); - } catch (SAXException ex) { - throw new LBException(ex); - } - } -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/SSL.java b/org.glite.lb.client-java/src/org/glite/lb/SSL.java deleted file mode 100644 index fcf4c0e..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/SSL.java +++ /dev/null @@ -1,122 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.lb; - -import javax.net.ssl.*; -import java.net.SocketException; -import java.io.*; -import java.net.InetSocketAddress; -import java.net.Socket; - -public class SSL { - - - - SSLContext sctx; - SSLSocket client; - SSLServerSocket server; - SSLSession sess; - LBCredentials creds; - - void init_ctx() throws LBException { - if (sctx == null) { - if (creds == null) throw new NullPointerException("credentials must be specfied"); - - sctx = creds.getSSLContext(); - } - } - - public void setCredentials(LBCredentials c) { - creds = c; - } - - public Socket connect(String host,int port,int timeout) throws LBException { - init_ctx(); - - try { - client = (SSLSocket) sctx.getSocketFactory().createSocket(); - - client.setEnabledProtocols(new String[]{"SSLv3"}); - client.setUseClientMode(true); - client.setSoTimeout(timeout); //read timeout - - client.connect(new InetSocketAddress(host, port), timeout); //connect timeout - client.startHandshake(); - - sess = client.getSession(); - if (sess == null) { - throw new NullPointerException("null session"); - } - } - catch (IOException e) { throw new LBException(e); } - - return client; - //return new PrintStream(client.getOutputStream(),false); - } - - public Socket accept(int port,int timeout) throws LBException - { - SSLSocket conn; - init_ctx(); - - try { - server = (SSLServerSocket) sctx.getServerSocketFactory().createServerSocket(); - - server.setEnabledProtocols(new String[]{"SSLv3"}); - server.setSoTimeout(timeout); - - server.bind(new InetSocketAddress(port)); - - conn = (SSLSocket) server.accept(); - } - catch (IOException e) { throw new LBException(e); } - - return conn; - } - - public void close() throws LBException - { - try { - client.close(); - } - catch (IOException e) { throw new LBException(e); } - } - - private static String slashDN(String dn) { - String f[] = dn.split(","); - int i; - String out = new String(); - - /* XXX: proxy */ - for (i=f.length-1; i>=0 && f[i].indexOf("=proxy") == -1; i--) - out += "/" + f[i]; - - return out; - } - - public String myDN() - { - java.security.cert.Certificate[] cert = sess.getLocalCertificates(); - java.security.cert.X509Certificate xcert = - (java.security.cert.X509Certificate) cert[0]; - - return slashDN(xcert.getSubjectX500Principal().getName()); - } - - -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/SSLSend.java b/org.glite.lb.client-java/src/org/glite/lb/SSLSend.java deleted file mode 100644 index e3e3c33..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/SSLSend.java +++ /dev/null @@ -1,80 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.lb; - -import java.io.IOException; -import java.io.PrintStream; -import java.security.*; -import java.net.Socket; - -/** - * This class opens secure connection using SSLv3 and then sends message to set - * address. - * - * @author Pavel Piskac - */ -public class SSLSend { - - private static final String EDG_WLL_LOG_SOCKET_HEADER = "DGLOG"; - - /** - * This method is used to send messages using a secure socket. - * - * @param keyStoreSender path to user's certificate - * @param host host name - * @param port port number - * @param timeout connection timeout - * @param message message which will be send - */ - public void send(LBCredentials cred, String host, - int port, int timeout, String message) - throws LBException - { - - try { - SSL lbsock = new SSL(); - - lbsock.setCredentials(cred); - Socket sock = lbsock.connect(host,port,timeout); - PrintStream s = new PrintStream(sock.getOutputStream(),false); - - s.print(EDG_WLL_LOG_SOCKET_HEADER); - - message = message.replaceFirst("DG.LLLID=[0-9]* ", ""); - message = message.replaceFirst("DG.USER=\\x22[a-zA-Z ]*\\x22 ", ""); - - int messageSize = message.length() + 2; - byte revertedInt[] = new byte[4]; - revertedInt[0] = (byte) (messageSize % 256); - messageSize >>= 8; - revertedInt[1] = (byte) (messageSize % 256); - messageSize >>= 8; - revertedInt[2] = (byte) (messageSize % 256); - messageSize >>= 8; - revertedInt[3] = (byte) (messageSize); - - s.write(revertedInt,0,4); - s.print(message + '\n' + '\0'); - s.flush(); - s.close(); - } - catch (IOException e) { - throw new LBException(e); - } - } -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/SeqCode.java b/org.glite.lb.client-java/src/org/glite/lb/SeqCode.java deleted file mode 100644 index 7a97fda..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/SeqCode.java +++ /dev/null @@ -1,157 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.lb; - -/** - * This class represents sequence code. - * - * @author Pavel Piskac (173297@mail.muni.cz) - * @version 9. 4. 2008 - */ -public class SeqCode { - - public static final int NORMAL = 1; - public static final int DUPLICATE = 11; - public static final int PBS = 2; - public static final int CONDOR = 4; - public static final int CREAM = 4; - - private int[] seqCode = {0, 0, 0, 0, 0, 0, 0, 0, 0}; - private int type = 0; - private String cream_code; - - /** - * Empty constructor which creates new instance of SeqCode with all values - * equal 0 - */ - public SeqCode() { - } - - /** - * Constructor which creates new instance of SeqCode with values set by user - * in input attribute - * - * @param seqCodeString - */ - public SeqCode(int type,String seqCodeString) { - getSeqCodeFromString(type,seqCodeString); - } - - /** - * This method increments one specific part of sequence code given by part attribute - * - * @param part part of sequence number which will be increased - */ - public void incrementSeqCode(Sources src) { - int part = src.source; - switch (type) { - case NORMAL: - case DUPLICATE: - if (src == null) - throw new IllegalArgumentException("SeqCode part"); - seqCode[part-1]++; - break; - default: break; - } - } - - /** - * Converts string representation of sequence code to format which is used - * in this class. - * Insert sequence codes in format: - * UI=000000:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000:LBS=000000 - * @param seqCodeString - */ - public void getSeqCodeFromString(int type,String seqCodeString) { - switch (type) { - case NORMAL: - case DUPLICATE: - if (!seqCodeString.matches("UI=\\d{1,}:NS=\\d{1,}:WM=\\d{1,}:BH=\\d{1,}:" + - "JSS=\\d{1,}:LM=\\d{1,}:LRMS=\\d{1,}:APP=\\d{1,}:LBS=\\d{1,}")) { - throw new IllegalArgumentException("this is not correct sequence code"); - } - - int currentPosition = 0; - int equalsPosition = 0; - int colonPosition = 0; - for (int i = 0; i <= 8; i++) { - equalsPosition = seqCodeString.indexOf('=', currentPosition); - if (i == 8) { - colonPosition = seqCodeString.length(); - } else { - colonPosition = seqCodeString.indexOf(':', currentPosition); - } - seqCode[i] = (new Integer(seqCodeString.substring(equalsPosition+1, colonPosition))).intValue(); - currentPosition = colonPosition + 1; - } - break; - case CREAM: - cream_code = seqCodeString; - break; - default: throw new IllegalArgumentException("unsupported seqcode type " + type); - } - this.type = type; - } - - public String toString() { - switch (type) { - case NORMAL: - case DUPLICATE: - String tmp = Integer.toString(seqCode[0]); - String output = "UI="; - output += "000000".substring(0, 6 - tmp.length ()) + tmp; - output += ":"; - output += "NS="; - tmp = Integer.toString(seqCode[1]); - output += "0000000000".substring(0, 10 - tmp.length ()) + tmp; - output += ":"; - output += "WM="; - tmp = Integer.toString(seqCode[2]); - output += "0000000000".substring(0, 6 - tmp.length ()) + tmp; - output += ":"; - output += "BH="; - tmp = Integer.toString(seqCode[3]); - output += "0000000000".substring(0, 10 - tmp.length ()) + tmp; - output += ":"; - output += "JSS="; - tmp = Integer.toString(seqCode[4]); - output += "0000000000".substring(0, 6 - tmp.length ()) + tmp; - output += ":"; - output += "LM="; - tmp = Integer.toString(seqCode[5]); - output += "0000000000".substring(0, 6 - tmp.length ()) + tmp; - output += ":"; - output += "LMRS="; - tmp = Integer.toString(seqCode[6]); - output += "0000000000".substring(0, 6 - tmp.length ()) + tmp; - output += ":"; - output += "APP="; - tmp = Integer.toString(seqCode[7]); - output += "0000000000".substring(0, 6 - tmp.length ()) + tmp; - output += ":"; - output += "LBS="; - tmp = Integer.toString(seqCode[8]); - output += "0000000000".substring(0, 6 - tmp.length ()) + tmp; - return output; - case CREAM: - return cream_code; - default: - throw new IllegalArgumentException("unitialized seqcode"); - } - } -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/ServerConnection.java b/org.glite.lb.client-java/src/org/glite/lb/ServerConnection.java deleted file mode 100644 index f99f1f2..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/ServerConnection.java +++ /dev/null @@ -1,536 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -package org.glite.lb; - -import holders.StringArrayHolder; -import java.rmi.RemoteException; -import java.util.ArrayList; -import java.util.List; -import org.apache.axis.client.Stub; -import org.glite.jobid.Jobid; -import org.glite.lb.Event; -import org.glite.lb.Level; -import org.glite.wsdl.services.lb.LoggingAndBookkeepingPortType; -import org.glite.wsdl.types.lb.JobFlagsValue; -import org.glite.wsdl.types.lb.JobStatus; -import org.glite.wsdl.types.lb.QueryConditions; -import org.glite.wsdl.types.lb.holders.JobStatusArrayHolder; - -/** - * This class serves for obtaining data from the bookkeeping - * server. - * The L&B service queries come in two flavors: - *
    1. conjunctive query, as in (cond1) or (cond2)
    2. - *
    3. conjunction of disjunctive queries, as in ( (cond1) - * or (cond2) ) and ( (cond3) or (cond4) )
    - * 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. - * - * @author Tomas Kramec, 207545@mail.muni.cz - */ -public class ServerConnection { - - private String queryServerAddress; - private int queryJobsLimit=0; - private int queryEventsLimit=0; - private QueryResultsFlag queryResultsFlag = QueryResultsFlag.NONE; - private Level eventLogLevel = Level.LEVEL_SYSTEM; - private LoggingAndBookkeepingPortType queryServer; - private LBCredentials lbCredent; - - - /** - * This enum represents flag to indicate handling of too large results. - * In case the result limit is reached: - *
      - *
    1. NONE - means no results are returned at all.
    2. - *
    3. LIMITED - means a result contains at most limit items.
    4. - *
    5. ALL - means all results are returned withouth any limitation.
    6. - *
    - */ - public enum QueryResultsFlag { - /** - * No results are returned at all. - */ - NONE, - /** - * Result contains at most limit items. Limits for job and event - * results can be set by calling appropriate method on the ServerConnection - * instance. - */ - LIMITED, - /** - * Results are returned withouth any limitation. - */ - ALL - } - - /** - * Constructor initializes the context and - * directs new instance to query the given bookkeping server. - * - * @param server String containing the server address (e.g. https://harad.ics.muni.cz:9453). - * @param lbCredent instance of class that holds credentials for SSL authentication - */ - public ServerConnection(String server, LBCredentials lbCredent) throws LBException { - if (server == null) throw new IllegalArgumentException("Server cannot be null"); - if (lbCredent == null) throw new IllegalArgumentException("Credentials cannot be null"); - - this.lbCredent = lbCredent; - setQueryServerAddress(server); - setQueryTimeout(120); - } - - /** - * Set bookkeeping server. - * Directs the instance to query the given bookkeping server. - * - * @param server String containing the server address (e.g. https://harad.ics.muni.cz:9553). - */ - public void setQueryServerAddress(String server) throws LBException { - if (server == null) throw new IllegalArgumentException("Server cannot be null"); - - queryServer = lbCredent.getStub(server); - queryServerAddress = server; - - } - - /** - * Get address of the bookkeeping server. - * Returns address of the bookkeeping server this instance is - * bound to. - * - * @return Address (https://hostname:port). - */ - public String getQueryServerAddress() { - return queryServerAddress; - } - - /** - * Set query timeout. - * Sets the time interval to wait for server response. - * Default value is 120 seconds. - * - * @param time Time in seconds before the query expires. 0 means no timeout. - */ - public void setQueryTimeout(int time) { - if (time < 0 || time > 1800) - throw new IllegalArgumentException("timeout must be between 0 and 1800"); - - ((Stub) queryServer).setTimeout(time*1000); - - } - - /** - * Get query timeout. - * Returns the time interval this instance waits for server - * response. - * - * @return Number of seconds to wait. 0 means no timeout. - */ - public int getQueryTimeout() { - return ((Stub) queryServer).getTimeout()/1000; - } - - /** - * Set logging level. - * Sets the level for logging the events. - * Possible values:
      - *
    1. EMERGENCY
    2. - *
    3. ALERT
    4. - *
    5. ERROR
    6. - *
    7. WARNING
    8. - *
    9. AUTH
    10. - *
    11. SECURITY
    12. - *
    13. USAGE
    14. - *
    15. SYSTEM
    16. - *
    17. IMPORTANT
    18. - *
    19. DEBUG
    20. - *
    - * Default value is SYSTEM. - * @param loggingLevel level for logging the events - */ - public void setEventLoggingLevel(Level loggingLevel) { - if (loggingLevel == null) throw new IllegalArgumentException("loggingLevel"); - - this.eventLogLevel = loggingLevel; - } - - /** - * Get logging level. - * Returns the level for logging the events. - * - * @return level value - */ - public Level getEventLoggingLevel() { - return eventLogLevel; - } - - /** - * Retrieve the set of single indexed attributes. - * 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 list returned, each element represents a query condition. - * Query attribute of the condition corresponds to the indexed attribute. - * If the query attribute is USERTAG, tagName is its name; - * if it is TIME, statName is state name. - * - * @return list of QueryConditions - * @throws LBException If some communication or server problem occurs. - */ - public List getIndexedAttrs() throws LBException { - try { - QueryConditions[] cond = queryServer.getIndexedAttrs(""); - List indexedAttrs = new ArrayList(); - for (int i = 0; i < cond.length; i++) { - indexedAttrs.add(cond[i]); - } - return indexedAttrs; - } catch (RemoteException ex) { - throw new LBException(ex); - } - } - - /** - * Retrieve hard result set size limit. This - * property is set at the server side. - * - * Returns the hard limit on the number of - * results returned by the bookkeeping server. - * - * @return Server limit. - * @throws LBException If some communication or server problem occurs. - */ - public int getServerLimit() throws LBException { - try { - return queryServer.getServerLimit(""); - } catch (RemoteException ex) { - throw new LBException(ex); - } - } - - /** - * Set the soft result set size limit. - * Sets the maximum number of results this instance is willing - * to obtain when querying for jobs. - * Default value is 0. It means no limits for results. - * - * @param jobsLimit Maximum number of results. 0 for no limit. - */ - public void setQueryJobsLimit(int jobsLimit) { - if (jobsLimit < 0) throw new IllegalArgumentException("jobsLimit"); - this.queryJobsLimit = jobsLimit; - } - - /** - * Get soft result set size limit. - * Gets the maximum number of results this instance is willing - * to obtain when querying for jobs. - * - * @return queryJobsLimit Maximum number of results. - */ - public int getQueryJobsLimit() { - return queryJobsLimit; - } - - /** - * Set the soft result set size limit. - * Sets the maximum number of results this instance is willing - * to obtain when querying for events. - * Default value is 0. It means no limits for results. - * - * @param eventsLimit Maximum number of results. 0 for no limit. - */ - public void setQueryEventsLimit(int eventsLimit) { - if (eventsLimit < 0) throw new IllegalArgumentException("eventsLimit"); - this.queryEventsLimit = eventsLimit; - } - - /** - * Get soft result set size limit. - * Gets the maximum number of results this instance is willing - * to obtain when querying for events. - * - * @return queryEventsLimit Soft limit. - */ - public int getQueryEventsLimit() { - return queryEventsLimit; - } - - /** - * Sets the flag indicating the way of handling of too large query results. - * Default is NONE. - * - * @param flag One of NONE, LIMITED or ALL. - */ - public void setQueryResultsFlag(QueryResultsFlag flag) { - if (flag == null) throw new IllegalArgumentException("flag"); - - queryResultsFlag = flag; - } - - /** - * Gest the flag indicating the way of handling of too large query results. - * - * @return queryResultsFlag - */ - public QueryResultsFlag getQueryResultsFlag() { - return queryResultsFlag; - } - - /** - * Retrieve all events satisfying the conjunctive-disjunctive - * query records. - * Returns all events belonging to the jobs specified by - * jobCond and satisfying queryCond. The - * conditions are given in conjunctive-disjunctive form - * ((cond1 OR cond2 OR ...) AND ...) - * - * @param jobCond List of conditions on jobs. - * @param eventCond List of coditions on events. - * @return eventList List of Event objects representing L&B events. - * @throws LBException If some communication or server problem occurs. - */ - public List queryEvents(List jobCond, - List eventCond) throws LBException { - - if (jobCond == null) throw new IllegalArgumentException("jobCond cannot be null"); - if (eventCond == null) throw new IllegalArgumentException("eventCond cannot be null"); - - org.glite.wsdl.types.lb.Event[] events = null; - try { - events = queryServer.queryEvents(jobCond.toArray(new QueryConditions[jobCond.size()]), eventCond.toArray(new QueryConditions[eventCond.size()])); - } catch (RemoteException ex) { - throw new LBException(ex); - } - - List eventList= new ArrayList(); - - if (events!= null) { - int queryResults; - //if the events limit is reached - if (queryEventsLimit!=0 && events.length > queryEventsLimit) { - queryResults = getResultSetSize(queryEventsLimit, events.length); - } else queryResults = events.length; - - EventConvertor convertor = new EventConvertor(); - for (int i=0;i queryJobs(List query) throws LBException { - if (query == null) throw new IllegalArgumentException("query cannot be null"); - - StringArrayHolder jobHolder = new StringArrayHolder(); - try { - queryServer.queryJobs(query.toArray(new QueryConditions[query.size()]), new JobFlagsValue[]{}, jobHolder, new JobStatusArrayHolder()); - } catch (RemoteException ex) { - throw new LBException(ex); - } - - List jobList = new ArrayList(); - - if (jobHolder.value!= null) { - int queryResults; - int jobsCount = jobHolder.value.length; - //if the jobs limit is reached - if (queryJobsLimit!=0 && jobsCount > queryJobsLimit) { - queryResults = getResultSetSize(queryJobsLimit, jobsCount); - } else queryResults = jobsCount; - - for (int i=0;i queryJobStates(List query, - JobFlagsValue[] flags) throws LBException { - if (query == null) throw new IllegalArgumentException("query cannot be null"); - - JobStatusArrayHolder jobStatusHolder = new JobStatusArrayHolder(); - try { - queryServer.queryJobs(query.toArray(new QueryConditions[query.size()]), flags, new StringArrayHolder(), jobStatusHolder); - } catch (RemoteException ex) { - throw new LBException(ex); - } - - List jobStates= new ArrayList(); - - if (jobStatusHolder.value!= null) { - int queryResults; - int jobsCount = jobStatusHolder.value.length; - //if the jobs limit is reached - if (queryJobsLimit!=0 && jobsCount > queryJobsLimit) { - queryResults = getResultSetSize(queryJobsLimit, jobsCount); - } else queryResults = jobsCount; - - for (int i=0;i userJobStates() throws LBException { - JobStatusArrayHolder jobStatusHolder = new JobStatusArrayHolder(); - try { - queryServer.userJobs(new StringArrayHolder(), jobStatusHolder); - } catch (RemoteException ex) { - throw new LBException(ex); - } - - List jobStates= new ArrayList(); - - if (jobStatusHolder.value!= null) { - int queryResults; - int jobsCount = jobStatusHolder.value.length; - //if the jobs limit is reached - if (queryJobsLimit!=0 && jobsCount > queryJobsLimit) { - queryResults = getResultSetSize(queryJobsLimit, jobsCount); - } else queryResults = jobsCount; - - for (int i=0;i userJobs() throws LBException { - StringArrayHolder jobHolder = new StringArrayHolder(); - try { - queryServer.userJobs(jobHolder, new JobStatusArrayHolder()); - } catch (RemoteException ex) { - throw new LBException(ex); - } - - List jobs= new ArrayList(); - - if (jobHolder.value!= null) { - int queryResults; - int jobsCount = jobHolder.value.length; - //if the jobs limit is reached - if (queryJobsLimit!=0 && jobsCount > queryJobsLimit) { - queryResults = getResultSetSize(queryJobsLimit, jobsCount); - } else queryResults = jobsCount; - - for (int i=0;i 11) - throw new IllegalArgumentException("lb.Source"); - } - - public Sources(int source) { - check(source); - this.source = source; - } - - public String toString() { - return names[source]; - } -} diff --git a/org.glite.lb.client-java/src/org/glite/lb/Timeval.java b/org.glite.lb.client-java/src/org/glite/lb/Timeval.java deleted file mode 100644 index 4d07d3c..0000000 --- a/org.glite.lb.client-java/src/org/glite/lb/Timeval.java +++ /dev/null @@ -1,89 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.lb; - -/** - * This class represents the timestamp in this form: tvSec.tvUsec. - * It consists of two parts: - *
      - *
    1. tvSec - represents time in seconds
    2. - *
    3. tvUsec - represents time in microseconds
    4. - *
    - * - * For example: 1240415967.234999 - * @author Tomas Kramec, 207545@mail.muni.cz - */ -public class Timeval { - - private long tvSec; - private long tvUsec; - - public Timeval() { - } - - /** - * Creates an instance of Timeval. - * - * @param tvSec in seconds - * @param tvUsec in microseconds - */ - public Timeval(long tvSec, long tvUsec) { - this.tvSec = tvSec; - this.tvUsec = tvUsec; - } - - - /** - * Gets the tvSec value for this Timeval. - * - * @return tvSec in seconds - */ - public long getTvSec() { - return tvSec; - } - - - /** - * Sets the tvSec value for this Timeval. - * - * @param tvSec in seconds - */ - public void setTvSec(long tvSec) { - this.tvSec = tvSec; - } - - - /** - * Gets the tvUsec value for this Timeval. - * - * @return tvUsec in microseconds - */ - public long getTvUsec() { - return tvUsec; - } - - - /** - * Sets the tvUsec value for this Timeval. - * - * @param tvUsec in microseconds - */ - public void setTvUsec(long tvUsec) { - this.tvUsec = tvUsec; - } -} diff --git a/org.glite.lb.client-java/src_c/Makefile b/org.glite.lb.client-java/src_c/Makefile deleted file mode 100755 index 2124d30..0000000 --- a/org.glite.lb.client-java/src_c/Makefile +++ /dev/null @@ -1,27 +0,0 @@ --include ../Makefile.inc --include ../../Makefile.inc - -CC=gcc -PATH_TO_JAVA=${JAVA_HOME} - -OS=$(shell uname | tr '[:upper:]' '[:lower:]') - -LIB=libglite_lb_sendviasocket.la -OBJ=send_via_socket.lo - -VPATH=${topdir}/src_c - -compile: ${LIB} - -${LIB}: ${OBJ} - libtool --mode=link ${CC} -rpath ${PREFIX}/${libdir} -o $@ ${OBJ} - -%.lo: %.c - libtool --mode=compile ${CC} -I.. -I${PATH_TO_JAVA}/include -I${PATH_TO_JAVA}/include/$(OS) -c $< - -install: compile - -mkdir -p ${PREFIX}/${libdir} - libtool --mode=install install -m 755 ${LIB} ${PREFIX}/${libdir} - -clean: - rm -rf ${OBJ} .libs ${LIB} diff --git a/org.glite.lb.client-java/src_c/send_via_proxy.c b/org.glite.lb.client-java/src_c/send_via_proxy.c deleted file mode 100755 index b8e68ee..0000000 --- a/org.glite.lb.client-java/src_c/send_via_proxy.c +++ /dev/null @@ -1,297 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/** - *---------------------------------------------------------------------- - * Open a GSS connection to local-logger, send already formatted ULM string - * and get answer back from local-logger - * \brief connect to local-logger, send message and get answer back - * \param[in,out] ctx context to work with, - * \param[in] logline formated ULM string - *---------------------------------------------------------------------- - */ -int edg_wll_DoLogEvent( - edg_wll_Context ctx, - edg_wll_LogLine logline) -{ - int ret = 0, answer = EAGAIN; - int conn; - - edg_wll_ResetError(ctx); - memset(&conn,0,sizeof(conn)); - - /* connect to local-logger */ - if ((ret = edg_wll_log_connect(ctx,&conn))) { - fprintf(stderr, "edg_wll_log_connect error"); - goto edg_wll_DoLogEvent_end; - } - - /* send message */ - if ((ret = edg_wll_log_write(ctx,conn,logline)) == -1) { - fprintf(stderr, "edg_wll_log_write error"); - goto edg_wll_DoLogEvent_end; - } - - /* get answer */ - if ((ret = edg_wll_log_read(ctx,conn)) == -1) { - fprintf(stderr, "edg_wll_log_read error"); - } else { - answer = edg_wll_Error(ctx, NULL, NULL); - } - -edg_wll_DoLogEvent_end: - if (ret) edg_wll_log_close(ctx,conn); - - return 0; -} - -/** - *---------------------------------------------------------------------- - * connect to locallogger - *---------------------------------------------------------------------- - */ -int edg_wll_log_connect(edg_wll_Context ctx, int *conn) -{ - int ret, answer=0, index; - char *my_subject_name = NULL; - edg_wll_GssStatus gss_stat; - - //edg_wll_ResetError(ctx); - //edg_wll_poolLock(); - - /* check if connection already in pool */ - if ( (index = ConnectionIndex(ctx, ctx->p_destination, ctx->p_dest_port)) == -1 ) { - if (ctx->connections->connOpened == ctx->connections->poolSize) - if (ReleaseConnection(ctx, NULL, 0)) - goto edg_wll_log_connect_end; - index = AddConnection(ctx, ctx->p_destination, ctx->p_dest_port); - if (index < 0) { - edg_wll_SetError(ctx,EAGAIN,"connection pool size exceeded"); - goto edg_wll_log_connect_end; - } -#if 0 - /* acquire gss credentials */ - ret = edg_wll_gss_acquire_cred_gsi( - ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_cert_filename, - ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_key_filename, - &ctx->connections->connPool[index].gsiCred, &my_subject_name, &gss_stat); - /* give up if unable to acquire prescribed credentials, otherwise go on anonymously */ - if (ret && ctx->p_proxy_filename) { - edg_wll_SetErrorGss(ctx, "edg_wll_gss_acquire_cred_gsi(): failed to load GSI credentials", &gss_stat); - goto edg_wll_log_connect_err; - } - /* gss_connect */ - if (ctx->connections->connPool[index].gss.context == GSS_C_NO_CONTEXT) { - - /* acquire gss credentials */ - ret = edg_wll_gss_acquire_cred_gsi( - ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_cert_filename, - ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_key_filename, - &ctx->connections->connPool[index].gsiCred, &my_subject_name, &gss_stat); - /* give up if unable to acquire prescribed credentials, otherwise go on anonymously */ - if (ret && ctx->p_proxy_filename) { - edg_wll_SetErrorGss(ctx, "edg_wll_gss_acquire_cred_gsi(): failed to load GSI credentials", &gss_stat); - goto edg_wll_log_connect_err; - } - if ((answer = edg_wll_gss_connect( - ctx->connections->connPool[index].gsiCred, - ctx->connections->connPool[index].peerName, - ctx->connections->connPool[index].peerPort, - &ctx->p_tmp_timeout, - &ctx->connections->connPool[index].gss, - &gss_stat)) < 0) { - answer = handle_gss_failures(ctx,answer,&gss_stat,"edg_wll_gss_connect()"); - goto edg_wll_log_connect_err; - } - goto edg_wll_log_connect_end; - } else goto edg_wll_log_connect_end; - -edg_wll_log_connect_err: - if (index >= 0) CloseConnection(ctx, &index); - index = -1; - -edg_wll_log_connect_end: - if (index >= 0) edg_wll_connectionTryLock(ctx, index); - if (my_subject_name) free(my_subject_name); - - edg_wll_poolUnlock(); - - *conn = index; - return answer; -} - -/** - *---------------------------------------------------------------------- - * close connection to locallogger - *---------------------------------------------------------------------- - */ -int edg_wll_log_close(edg_wll_Context ctx, int conn) -{ - int ret = 0; - - if (conn == -1) return 0; - ret = CloseConnection(ctx,&conn); - edg_wll_connectionUnlock(ctx,conn); - return ret; -} - -/** - *---------------------------------------------------------------------- - * write/send to locallogger - *---------------------------------------------------------------------- - */ -int edg_wll_log_write(edg_wll_Context ctx, int conn, edg_wll_LogLine logline) -{ - char header[EDG_WLL_LOG_SOCKET_HEADER_LENGTH+1]; - int err; - int answer; - size_t count,sent; - int size; - u_int8_t size_end[4]; - edg_wll_GssStatus gss_code; - - errno = err = answer = count = sent = 0; - size = strlen(logline)+1; - size_end[0] = size & 0xff; size >>= 8; - size_end[1] = size & 0xff; size >>= 8; - size_end[2] = size & 0xff; size >>= 8; - size_end[3] = size; - size = strlen(logline)+1; - - edg_wll_ResetError(ctx); - - sprintf(header,"%s",EDG_WLL_LOG_SOCKET_HEADER); - header[EDG_WLL_LOG_SOCKET_HEADER_LENGTH]='\0'; - if ((err = edg_wll_gss_write_full(&ctx->connections->connPool[conn].gss, header, EDG_WLL_LOG_SOCKET_HEADER_LENGTH, &ctx->p_tmp_timeout, &count, &gss_code)) < 0) { - switch (answer = handle_gss_failures(ctx,err,&gss_code,"edg_wll_gss_write_full()")) { - case ENOTCONN: - edg_wll_log_close(ctx,conn); - if (edg_wll_log_connect(ctx,&conn) || - edg_wll_gss_write_full(&ctx->connections->connPool[conn].gss, header, EDG_WLL_LOG_SOCKET_HEADER_LENGTH, &ctx->p_tmp_timeout, &count, &gss_code) < 0) { - edg_wll_UpdateError(ctx,answer,"edg_wll_log_write(): error sending header"); - return -1; - } - break; - case 0: - break; - default: - edg_wll_UpdateError(ctx,answer,"edg_wll_log_write(): error sending header"); - return -1; - } - } - sent += count; - - count = 0; - if ((err = edg_wll_gss_write_full(&ctx->connections->connPool[conn].gss, size_end, 4, &ctx->p_tmp_timeout, &count, &gss_code)) < 0) { - switch (answer = handle_gss_failures(ctx,err,&gss_code,"edg_wll_gss_write_full()")) { - case ENOTCONN: - edg_wll_log_close(ctx,conn); - if (edg_wll_log_connect(ctx,&conn) || - edg_wll_gss_write_full(&ctx->connections->connPool[conn].gss, size_end, 4, &ctx->p_tmp_timeout, &count, &gss_code) < 0) { - edg_wll_UpdateError(ctx,answer,"edg_wll_log_write(): error sending message size"); - return -1; - } - break; - case 0: - break; - default: - edg_wll_UpdateError(ctx,answer,"edg_wll_log_write(): error sending message size"); - return -1; - - } - } - sent += count; - - count = 0; - if (( err = edg_wll_gss_write_full(&ctx->connections->connPool[conn].gss, logline, size, &ctx->p_tmp_timeout, &count, &gss_code)) < 0) { - switch (answer = handle_gss_failures(ctx,err,&gss_code,"edg_wll_gss_write_full()")) { - case ENOTCONN: - edg_wll_log_close(ctx,conn); - if (edg_wll_log_connect(ctx,&conn) || - edg_wll_gss_write_full(&ctx->connections->connPool[conn].gss, logline, size, &ctx->p_tmp_timeout, &count, &gss_code) < 0) { - edg_wll_UpdateError(ctx,answer,"edg_wll_log_write(): error sending message"); - return -1; - } - break; - case 0: - break; - default: - edg_wll_UpdateError(ctx,answer,"edg_wll_log_write(): error sending message"); - return -1; - } - } - sent += count; - - return sent; -} - -/** - *---------------------------------------------------------------------- - * read/receive from locallogger - *---------------------------------------------------------------------- - */ -int edg_wll_log_read(edg_wll_Context ctx, int conn) -{ - int err; - int answer; - u_int8_t answer_end[4]; - size_t count; - edg_wll_GssStatus gss_code; - - errno = err = answer = count = 0; - - edg_wll_ResetError(ctx); - - count = 0; - if ((err = edg_wll_gss_read_full(&ctx->connections->connPool[conn].gss, answer_end, 4, &ctx->p_tmp_timeout, &count, &gss_code)) < 0 ) { - switch (answer = handle_gss_failures(ctx,err,&gss_code,"edg_wll_gss_read_full()")) { - case ENOTCONN: - edg_wll_log_close(ctx,conn); - if (edg_wll_log_connect(ctx,&conn) || - edg_wll_gss_read_full(&ctx->connections->connPool[conn].gss, answer_end, 4, &ctx->p_tmp_timeout, &count, &gss_code) < 0 ) { - edg_wll_UpdateError(ctx,answer,"edg_wll_log_read(): error reading answer from local-logger"); - return -1; - } - break; - case 0: - break; - default: - edg_wll_UpdateError(ctx,answer,"edg_wll_log_read(): error reading answer from local-logger"); - return -1; - } - } - answer = answer_end[3]; answer <<=8; - answer |= answer_end[2]; answer <<=8; - answer |= answer_end[1]; answer <<=8; - answer |= answer_end[0]; - edg_wll_SetError(ctx,answer,"edg_wll_log_read(): answer read from locallogger"); - - return count; -} diff --git a/org.glite.lb.client-java/src_c/send_via_socket.c b/org.glite.lb.client-java/src_c/send_via_socket.c deleted file mode 100755 index 48db5af..0000000 --- a/org.glite.lb.client-java/src_c/send_via_socket.c +++ /dev/null @@ -1,219 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "org_glite_lb_ContextIL.h" - -#define tv_sub(a, b) {\ - (a).tv_usec -= (b).tv_usec;\ - (a).tv_sec -= (b).tv_sec;\ - if ((a).tv_usec < 0) {\ - (a).tv_sec--;\ - (a).tv_usec += 1000000;\ - }\ -} - - -/*! - * Write to socket - * Needn't write entire buffer. Timeout is applicable only for non-blocking - * connections - * \param sock IN: connection to work with - * \param buf IN: buffer - * \param bufsize IN: max size to write - * \param timeout INOUT: max time allowed for operation, remaining time on return - * \retval bytes written (>0) on success - * \retval -1 on write error - */ -static ssize_t -edg_wll_socket_write( - int sock, - const void *buf, - size_t bufsize, - struct timeval *timeout) -{ - ssize_t len = 0; - fd_set fds; - struct timeval to, before, after; - - - if ( timeout ) { - memcpy(&to, timeout, sizeof to); - gettimeofday(&before, NULL); - } - len = write(sock, buf, bufsize); - if ( len <= 0 && errno == EAGAIN ) { - FD_ZERO(&fds); - FD_SET(sock,&fds); - if ( select(sock+1, NULL, &fds, NULL, timeout? &to: NULL) < 0 ) { - len = -1; - } else { - len = write(sock, buf, bufsize); - } - } - if ( timeout ) { - gettimeofday(&after, NULL); - tv_sub(after, before); - tv_sub(*timeout, after); - if ( timeout->tv_sec < 0 ) { - timeout->tv_sec = 0; - timeout->tv_usec = 0; - } - } - - return len; -} - -/*! - * Write specified amount of data to socket - * Attempts to call edg_wll_socket_write() untill the entire request is satisfied - * (or times out). - * \param sock IN: connection to work with - * \param buf IN: buffer - * \param bufsize IN: max size to write - * \param timeout INOUT: max time allowed for operation, remaining time on return - * \param total OUT: bytes actually written - * \retval bytes written (>0) on success - * \retval -1 on write error - */ -static ssize_t -edg_wll_socket_write_full( - int sock, - void *buf, - size_t bufsize, - struct timeval *timeout, - ssize_t *total) -{ - ssize_t len; - *total = 0; - - while ( *total < bufsize ) { - len = edg_wll_socket_write(sock, buf+*total, bufsize-*total, timeout); - if (len < 0) return len; - *total += len; - } - - return 0; -} - -/* - * edg_wll_log_event_send - send event to the socket - * - * Returns: 0 if done properly or errno - * - */ -/*int edg_wll_log_event_send( - const char *socket_path, - long filepos, - const char *msg, - int msg_size, - int conn_attempts, - int timeout_int)*/ -/*JNIEXPORT jint JNICALL Java_org_glite_lb_ContextIL_edg_wll_log_event_send - (JNIEnv *env, - jobject jobj, - jstring socket_path_j, - jlong filepos_j, - jstring msg_j, - jint msg_size_j, - jint conn_attempts_j, - jint timeout_int_j)*/ -JNIEXPORT jint JNICALL -Java_org_glite_lb_ContextIL_sendToSocket - (JNIEnv *env, - jobject jobj, - jstring socket_path_j, - jlong filepos_j, - jstring msg_j, - jint msg_size_j, - jint conn_attempts_j, - jint timeout_int_j) - -{ - const char *socket_path = (*env)->GetStringUTFChars(env, socket_path_j, 0); - const char *msg = (*env)->GetStringUTFChars(env, msg_j, 0); - int timeout_int = (int) timeout_int_j; - //int timeout_int = 3; - long filepos = (long) filepos_j; - int msg_size = (int) msg_size_j; - int conn_attempts = (int) conn_attempts_j; - //int conn_attempts = 3; - struct timeval timeout; - timeout.tv_sec = timeout_int; - timeout.tv_usec = 0; - struct sockaddr_un saddr; - int msg_sock, - flags, - conn_timeout, i; - ssize_t count = 0; - - - if ( (msg_sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0 ) { - goto event_send_end; - } - - memset(&saddr, 0, sizeof(saddr)); - saddr.sun_family = AF_UNIX; - strcpy(saddr.sun_path, socket_path); - - if ( (flags = fcntl(msg_sock, F_GETFL, 0)) < 0 - || fcntl(msg_sock, F_SETFL, flags | O_NONBLOCK) < 0 ) { - goto cleanup; - } - - conn_timeout = floor(timeout.tv_sec/(conn_attempts + 1)); - for ( i = 0; i < conn_attempts; i++) { - if ( connect(msg_sock, (struct sockaddr *)&saddr, sizeof(saddr)) < 0 ) { - if ( errno == EISCONN ) break; - else if ((errno == EAGAIN) || (errno == ETIMEDOUT)) { - sleep(conn_timeout); - timeout.tv_sec -= conn_timeout; - continue; - } else { - goto cleanup; - } - } else break; - } - - if ( edg_wll_socket_write_full(msg_sock, &filepos, sizeof(filepos), &timeout, &count) < 0 -) { - goto cleanup; - } - - if ( edg_wll_socket_write_full(msg_sock, (void *)msg, msg_size, -&timeout, &count) < 0 ) { - goto cleanup; - } - -cleanup: - close(msg_sock); - -event_send_end: - return 0; -} diff --git a/org.glite.lb.client/.cvsignore b/org.glite.lb.client/.cvsignore deleted file mode 100644 index 1df717b..0000000 --- a/org.glite.lb.client/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -.project -.cdtproject \ No newline at end of file diff --git a/org.glite.lb.client/LICENSE b/org.glite.lb.client/LICENSE deleted file mode 100644 index 259a91f..0000000 --- a/org.glite.lb.client/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -Copyright (c) 2004 on behalf of the EU EGEE Project: -The European Organization for Nuclear Research (CERN), -Istituto Nazionale di Fisica Nucleare (INFN), Italy -Datamat Spa, Italy -Centre National de la Recherche Scientifique (CNRS), France -CS Systeme d'Information (CSSI), France -Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden -Universiteit van Amsterdam (UvA), Netherlands -University of Helsinki (UH.HIP), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.lb.client/Makefile b/org.glite.lb.client/Makefile deleted file mode 100644 index d6d2a52..0000000 --- a/org.glite.lb.client/Makefile +++ /dev/null @@ -1,362 +0,0 @@ -# Default values -top_srcdir=.. -stagedir=. -globalprefix=glite -lbprefix=lb -package=glite-lb-client -version=0.0.0 - -nothrflavour=gcc32 -thrflavour=gcc32pthr - -CC:=gcc -CXX:=g++ - --include Makefile.inc --include ../project/version.properties - -version=${module.version} - -# We must follow major version changes of org.glite.lb.common due to -# binary compatibility. However, we may live a life of our own, changing our -# major version more frequently. This variable specifies how many steps ahead -# we are (the number can be even negative). - -VERSION_AHEAD=-3 - -VPATH=${top_srcdir}/src:${top_srcdir}/interface:${top_srcdir}/test:${top_srcdir}/examples:${top_srcdir}/doc -AT3=${stagedir}/sbin/glite-lb-at3 -GENSAM=${top_srcdir}/examples/gen_sample_job -CHECK_VERSION:=VERSION=${version} VERSION_AHEAD=${VERSION_AHEAD} perl ${stagedir}/sbin/glite-lb-check_version.pl - -SUFFIXES = .T .l - -l_SRC = \ - chkpt.l \ - cleared.l \ - done.l \ - done_dag.l \ - done_subjob.l \ - ready.l \ - ready_dag.l \ - ready_subjob.l \ - running.l \ - running_dag.l \ - running_subjob.l \ - scheduled.l \ - scheduled_dag.l \ - scheduled_subjob.l \ - submitted.l \ - submitted_dag.l \ - submitted_subjob.l \ - waiting.l \ - waiting_dag.l \ - waiting_subjob.l \ - failed_dag.l \ - failed_subjob.l \ - aborted.l \ - cancelled.l \ - cream_registered.l \ - cream_pending.l \ - cream_idle.l \ - cream_running.l \ - cream_reallyrunning.l \ - cream_done.l \ - cream_failed.l \ - submitted_ft_reg.l \ - running_ft.l \ - done_ft.l \ - aborted_ft.l \ - -# TODO: missing resubmission_deep -# shallow_resub_complex.l shallow_resub_simple.l shallow_resub_simple2.l \ -# resubmission.l resubmitted.l - - -sh_PROGS = $(l_SRC:.l=.sh) - -ifdef DEBUG - DEBUG:=-g -O0 -Wall -DEDG_WLL_LOG_STUB -else - DEBUG:=-g -O0 -Wall -endif - -ifdef LB_STANDALONE - LB_STANDALONE_FLAGS:=-DLB_STANDALONE -endif - -ifdef LB_PERF - LB_PERF_FLAGS:=-DLB_PERF - LB_PERF_TOOLS:=perftest_logjobs perftest_jobreg -endif -COMMON_LIB:=-lglite_lb_common_${nothrflavour} -COMMON_LIB_THR:=-lglite_lb_common_${thrflavour} -TRIO_LIB:=-lglite_lbu_trio - -CFLAGS:=${DEBUG} \ - -I. \ - -I${top_srcdir}/src -I${top_srcdir}/interface \ - -I${stagedir}/include \ - ${COVERAGE_FLAGS} \ - -DBUILDING_LB_CLIENT \ - -D_GNU_SOURCE ${LB_STANDALONE_FLAGS} ${LB_PERF_FLAGS} - -CXXFLAGS:=${CFLAGS} - -EXT_LIB:= - -TEST_LIBS:=-L${cppunit_prefix}/${libdir} -lcppunit -TEST_INC:=-I${cppunit_prefix}/include - -LDFLAGS:=-L${stagedir}/${libdir} ${COVERAGE_FLAGS} - -COMPILE:=libtool --mode=compile ${CC} ${CFLAGS} -CXXCOMPILE:=libtool --mode=compile ${CXX} ${CXXFLAGS} -LINK:=libtool --mode=link ${CC} ${LDFLAGS} -LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS} -INSTALL?=libtool --mode=install install - -LIBOBJS:=connection.o consumer.o notification.o prod_proto.o \ - producer.o uiwrap.o statistics.o - -PLUSOBJS:=Event.o Job.o JobStatus.o Notification.o ServerConnection.o stat_fields.o - -HDRS:=consumer.h notification.h statistics.h prod_proto.h connection.h \ - Job.h Notification.h ServerConnection.h stat_fields.h -GEN_HDRS:=Event.h JobStatus.h producer.h - -LIBTHROBJS:=${LIBOBJS:.o=.thr.o} -LIBLOBJS:=${LIBOBJS:.o=.lo} -LIBTHRLOBJS:=${LIBOBJS:.o=.thr.lo} - -PLUSTHROBJS:=${PLUSOBJS:.o=.thr.o} -PLUSLOBJS:=${PLUSOBJS:.o=.lo} -PLUSTHRLOBJS:=${PLUSOBJS:.o=.thr.lo} - -LIB:=libglite_lb_client_${nothrflavour}.la -THRLIB:=libglite_lb_client_${thrflavour}.la - -PLUSLIB:=libglite_lb_clientpp_${nothrflavour}.la -THRPLUSLIB:=libglite_lb_clientpp_${thrflavour}.la - -TOOLS:=${LB_PERF_TOOLS} -EXAMPLES_SRC:=log_usertag_proxy.c job_log.c job_reg.c feed_shark.c query_ext.c query_seq_code.c stats.c abort_job.c change_acl.c stresslog.c flood_proxy.c dagids.c stress_context.c parse_eventsfile.c test_changed_jdl.c done_failed_events.c -EXAMPLES:=${EXAMPLES_SRC:.c=} - -# TODO: migrate them here from branch_RC31_3 -# EXAMPLES_PLUS_SRC:=indexed_attrs_plus.cpp job_status_plus.cpp query_events_plus.cpp listener.cpp user_jobs_plus.cpp job_log_plus.cpp notify_plus.cpp -# EXAMPLES_PLUS:=${EXAMPLES_PLUS_SRC:.cpp=} - -EXAMPLES_CL_SRC:=user_jobs.c job_status.c multiple_user_jobs.c -EXAMPLES_CL:=${EXAMPLES_CL_SRC:.c=} - -EXAMPLES_CL_THR_SRC:=user_jobs_threaded.c -EXAMPLES_CL_THR:=${EXAMPLES_CL_THR_SRC:.c=} - -MAN_GZ:=glite-lb-logevent.1.gz glite-lb-notify.1.gz -MAN8_GZ:=glite-lb-dump.8.gz glite-lb-load.8.gz -MAN = $(MAN_GZ:.gz=) -MAN8 = $(MAN8_GZ:.gz=) - -PLUS_EXTRA_LIB:=-lglite_jobid - - -# version_info=-version-info `echo ${version} | cut -d. -f1,2 | tr . :` - -# counted minor versions: -offset=0 - -version_info:=-version-info ${shell \ - perl -e '$$,=":"; @F=split "\\.","${version}"; print $$F[0]+$$F[1]+${offset},$$F[2],$$F[1]' } - -ifdef LB_STANDALONE -compile all: generate ${LIB} ${THRLIB} ${TOOLS} logevent notify register_sandbox examples ${MAN_GZ} ${MAN8_GZ} -else -compile all: check_version generate ${LIB} ${THRLIB} ${PLUSLIB} ${THRPLUSLIB} ${TOOLS} logevent notify register_sandbox examples ${MAN_GZ} ${MAN8_GZ} -endif - -generate: ${GEN_HDRS} - -default: all - -${LIB}: ${LIBOBJS} - ${LINK} ${version_info} -o $@ ${LIBLOBJS} -rpath ${PREFIX}/${libdir} \ - ${COMMON_LIB} ${TRIO_LIB} \ - -lglite_security_gss_${nothrflavour} - -${THRLIB}: ${LIBTHROBJS} - ${LINK} ${version_info} -o $@ ${LIBTHRLOBJS} -rpath ${PREFIX}/${libdir} \ - ${COMMON_LIB_THR} ${TRIO_LIB} \ - -lglite_security_gss_${thrflavour} - -${PLUSLIB}: ${PLUSOBJS} ${LIB} - ${LINKXX} ${version_info} -o $@ ${PLUSLOBJS} -rpath ${PREFIX}/${libdir} ${LIB} ${PLUS_EXTRA_LIB} - -${THRPLUSLIB}: ${PLUSTHROBJS} ${THRLIB} - ${LINKXX} ${version_info} -o $@ ${PLUSTHRLOBJS} -rpath ${PREFIX}/${libdir} ${THRLIB} ${PLUS_EXTRA_LIB} - -logevent: logevent.o args.o - ${LINK} -o $@ logevent.o args.o ${LIB} ${EXT_LIB} - -notify: notify.o - ${LINKXX} -o $@ notify.o ${PLUSLIB} ${EXT_LIB} ${PLUS_EXTRA_LIB} - -register_sandbox: %: %.o - ${LINK} -o $@ $@.o ${LIB} ${EXT_LIB} - -${TOOLS} ${EXAMPLES}: %: %.o - ${LINK} -o $@ $< ${LIB} ${EXT_LIB} - -${EXAMPLES_CL}: %: %.o - ${LINK} -o $@ $< ${LIB} ${COMMON_LIB} ${EXT_LIB} - -${EXAMPLES_CL_THR}: %: %.o - ${LINK} -o $@ $< ${THRLIB} ${COMMON_LIB_THR} ${EXT_LIB} - -${TOOLS}: ${LIB} - -${PLUSOBJS}: %.o: %.cpp - ${CXXCOMPILE} -c $< - -${PLUSTHROBJS}: %.thr.o: %.cpp - ${CXXCOMPILE} -o $@ -c $< - -${EXAMPLES_PLUS}: ${PLUSLIB} - -${EXAMPLES_PLUS}: %: %.o - ${LINKXX} -o $@ $< ${PLUSLIB} - -${LIBOBJS}: %.o: %.c - ${COMPILE} -c $< - -${LIBTHROBJS}: %.thr.o: %.c - ${COMPILE} -o $@ -c $< - -${MAN_GZ}: ${MAN} - rm -f ${MAN_GZ} ${MAN} - cp $? . - gzip -f $(notdir $?) - -${MAN8_GZ}: ${MAN8} - cp $? . - gzip -f $(notdir $?) - -perftest_logjobs.o: perftest_logjobs.c - ${CC} ${CFLAGS} -DLB_PERF_DROP -c $< - -# catches $TOOLS and logevent compilation -%.o: %.c - ${CC} ${CFLAGS} -c $< - -%.h: %.h.T - rm -f $@ - ${AT3} $< >$@ || ( rm -f $@; false ) - chmod -w $@ >/dev/null - -%.o: %.cpp - ${CXX} ${CFLAGS} ${GLOBUSINC} -c $< - -%.c: %.c.T - rm -f $@ - ${AT3} $< >$@ || ( rm -f $@; false ) - chmod -w $@ >/dev/null - -%.cpp: %.cpp.T - rm -f $@ - ${AT3} $< >$@ || ( rm -f $@; false ) - chmod -w $@ >/dev/null - -%.sh: %.l gen_begin gen_sample_job - rm -f $@ - -chmod +x ${GENSAM} - $(GENSAM) $< >$@ || rm -f $@ - chmod -w,+x $@ > /dev/null - -examples: ${EXAMPLES} ${EXAMPLES_PLUS} ${EXAMPLES_CL} ${EXAMPLES_CL_THR} ${sh_PROGS} - -check: compile -# shut up check.producer - -check.producer: producer_test - ./producer_test - -producer_test: producer_test.o prod_proto_test.o - ${LINKXX} -o $@ ${LIB} ${TEST_LIBS} $+ ${EXT_LIB} - -producer_test.o: %.o: %.cpp - ${CXX} -c ${CXXFLAGS} ${TEST_INC} $< - -man: ${MAN_GZ} ${MAN8_GZ} - -stage: compile - $(MAKE) install PREFIX=${stagedir} - -Event.h Event.cpp: EventAttrNames.pl - -JobStatus.h JobStatus.cpp: StatusAttrNames.pl - -#EventAttrNames.pl: -# rm -f $@ -# ln -s ${stagedir}/share/perl/gLite/LB/$@ $@ - -dist: distsrc distbin - -install: - mkdir -p ${PREFIX}/bin - mkdir -p ${PREFIX}/sbin - mkdir -p ${PREFIX}/include/${globalprefix}/${lbprefix} - mkdir -p ${PREFIX}/${libdir} - mkdir -p ${PREFIX}/share/doc/${package}-${version}/examples/ - mkdir -p ${PREFIX}/share/man/man1 - mkdir -p ${PREFIX}/examples - mkdir -p ${PREFIX}/share/man/man8 - mkdir -p ${PREFIX}/share/build/m4 -ifdef LB_STANDALONE - ${INSTALL} -m 644 ${LIB} ${THRLIB} ${PREFIX}/${libdir} -else - ${INSTALL} -m 644 ${LIB} ${THRLIB} ${PLUSLIB} ${THRPLUSLIB} ${PREFIX}/${libdir} - ${INSTALL} -m 644 ${LIB} ${THRLIB} ${PREFIX}/${libdir} -endif - ${INSTALL} -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version} - ( cd ${top_srcdir}/project && ${INSTALL} -m 644 ChangeLog package.description package.summary ${PREFIX}/share/doc/${package}-${version} ) - ${INSTALL} -m 644 ${top_srcdir}/doc/README-notify ${PREFIX}/share/doc/${package}-${version} - (cd ${top_srcdir}/interface && ${INSTALL} -m 644 ${HDRS} ${PREFIX}/include/${globalprefix}/${lbprefix}) - ${INSTALL} -m 644 ${GEN_HDRS} ${PREFIX}/include/${globalprefix}/${lbprefix} -ifndef LB_STANDALONE -# cp -r C CPP ${PREFIX}/share/doc/${package}-${version} -# cp -r ${top_srcdir}/doc/api/{Makefile,api.tex,fig} ${PREFIX}/share/doc/${package}-${version}/api -endif - for p in logevent notify register_sandbox; do \ - ${INSTALL} -m 755 "$$p" "${PREFIX}/bin/glite-lb-$$p"; \ - done - for p in ${TOOLS} ; do \ - ${INSTALL} -m 755 "$$p" "${PREFIX}/sbin/glite-lb-$$p"; \ - done -# TODO: restructuring - do we really need binaries of the examples to be installed? - for p in ${EXAMPLES} ${EXAMPLES_PLUS} ${EXAMPLES_CL} ${EXAMPLES_CL_THR} ${sh_PROGS} ; do \ - ${INSTALL} -m 755 "$$p" "${PREFIX}/examples/glite-lb-$$p"; \ - done - for p in ${EXAMPLES_SRC} ${EXAMPLES_PLUS_SRC} ${EXAMPLES_CL_SRC} ${EXAMPLES_CL_THR_SRC} ; do \ - ${INSTALL} -m 644 "${top_srcdir}/examples/$$p" "${PREFIX}/share/doc/${package}-${version}/examples/"; \ - done - ${INSTALL} -m 644 ${top_srcdir}/examples/Makefile "${PREFIX}/share/doc/${package}-${version}/examples/" - ${INSTALL} -m 644 ${top_srcdir}/examples/README.examples "${PREFIX}/share/doc/${package}-${version}/examples/" - ${INSTALL} -m 755 ${top_srcdir}/src/export.sh "${PREFIX}/sbin/glite-lb-export.sh" - ${INSTALL} -m 755 ${top_srcdir}/examples/notify.pl ${PREFIX}/examples/glite-lb-notify.pl - ${INSTALL} -m 755 ${top_srcdir}/examples/sandbox_transfers.sh ${PREFIX}/examples/glite-lb-sandbox_transfers.sh - ${INSTALL} -m 644 ${MAN_GZ} ${PREFIX}/share/man/man1 - ${INSTALL} -m 644 ${MAN8_GZ} ${PREFIX}/share/man/man8 - ${INSTALL} -m 644 ${top_srcdir}/m4/glite_lb.m4 ${PREFIX}/share/build/m4/ - -clean: - rm -rvf *.o *.lo .libs lib* *.c *.cpp *.h *.dox producer_test notify C/ CPP/ - rm -rvf ${LIB} ${THRLIB} ${TOOLS} logevent register_sandbox ${PLUSLIB} ${THRPLUSLIB} ${MAN_GZ} ${MAN8_GZ} - rm -rvf ${EXAMPLES} ${EXAMPLES_CL} ${EXAMPLES_CL_THR} ${sh_PROGS} - rm -f EventAttrNames.pl - rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/ - -check_version: - ${CHECK_VERSION} ${stagedir}/include/glite/lb/common_version.h - - -.PHONY: default all compile examples check stage install clean check_version diff --git a/org.glite.lb.client/build.xml b/org.glite.lb.client/build.xml deleted file mode 100755 index 60d35dc..0000000 --- a/org.glite.lb.client/build.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb.client/configure b/org.glite.lb.client/configure deleted file mode 100755 index c82ed75..0000000 --- a/org.glite.lb.client/configure +++ /dev/null @@ -1,843 +0,0 @@ -#!/usr/bin/perl - -# WARNING: Don't edit this file unless it is the master copy in org.glite.lb -# -# For the purpose of standalone builds of lb/jobid/lbjp-common components -# it is copied on tagging - -# $Header$ -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners/ for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use Getopt::Long; - -my $pwd = `pwd`; chomp $pwd; -my $prefix = $pwd.'/stage'; -my $stagedir; -my $staged; -my $module; -my $thrflavour = 'gcc64dbgpthr'; -my $nothrflavour = 'gcc64dbg'; -my $mode = 'build'; -my $help = 0; -my $listmodules; -my $version; -my $branch; -my $output; -my $lb_tag = ''; -my $lbjp_tag = ''; -my $jp_tag = ''; -my $sec_tag = ''; -my $jobid_tag = ''; -my $libdir = getlibdir(); - -my @nodes = qw/client server logger utils client-java doc ws-test db jpprimary jpindex jpclient harvester/; -my %enable_nodes; -my %disable_nodes; - -my %extern_prefix = ( - cares => '/opt/c-ares', - classads => '/opt/classads', - cppunit => '/usr', - expat => '/usr', - globus => '/opt/globus', - gsoap => '/usr', - mysql => '/usr', - 'mysql-devel' => '', - 'mysql-server' => '', - voms => '/opt/glite', - gridsite => '/opt/glite', - lcas => '/opt/glite', - trustmanager => '/opt/glite', - utiljava => '/opt/glite', - ant => '/usr', - jdk => '/usr', - libtar => '/usr', - axis => '/usr', - log4c => '/usr', - postgresql => '/usr' -); - -my %jar = ( - 'commons-codec' => '/usr/share/java/commons-codec.jar', - 'commons-lang' => '/usr/share/java/commons-lang.jar', -); - - -my %glite_prefix; -my %need_externs; -my %need_externs_type; -my %need_jars; -my %extrafull; -my %extranodmod; -my %deps; -my %deps_type; -my %topbuild; - -my %lbmodules = ( - 'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim glite-LB/], - 'security' => [qw/gss gsoap-plugin/], - 'lbjp-common' => [qw/db log maildir server-bones trio jp-interface/], - 'jobid' => [qw/api-c api-cpp api-java/], - 'jp' => [ qw/client doc index primary server-common ws-interface/ ], - ); - - -my @opts = ( - 'prefix=s' => \$prefix, - 'staged=s' => \$staged, - 'module=s' => \$module, - 'thrflavour=s' => \$thrflavour, - 'nothrflavour=s' => \$nothrflavour, - 'mode=s' => \$mode, - 'listmodules=s' => \$listmodules, - 'version=s' => \$version, - 'branch=s' => \$branch, - 'output=s' => \$output, - 'stage=s' => \$stagedir, - 'lb-tag=s' => \$lb_tag, - 'lbjp-common-tag=s' => \$lbjp_tag, - 'jp-tag=s' => \$jp_tag, - 'security-tag=s' => \$sec_tag, - 'jobid-tag=s' => \$jobid_tag, - 'help' => \$help, - 'libdir=s' => \$libdir, -); - -for (@nodes) { - $enable_nodes{$_} = 0; - $disable_nodes{$_} = 0; - - push @opts,"disable-$_",\$disable_nodes{$_}; - push @opts,"enable-$_",\$enable_nodes{$_}; -} - -push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix; -push @opts,"with-$_=s",\$jar{$_} for keys %jar; - -my @keeparg = @ARGV; - -GetOptions @opts or die "Errors parsing command line\n"; - -$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq ''; -$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq ''; - -if ($help) { usage(); exit 0; } - -if ($listmodules) { - my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}}; - print "@m\n"; - exit 0; -} - -warn "$0: --version, --branch and --output make sense only in --mode=etics\n" - if ($version || $output || $branch) && $mode ne 'etics'; - -my $en; -for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; } - -my $dis; -for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; } - -die "--enable-* and --disable-* are mutually exclusive\n" - if $en && $dis; - -die "--module cannot be used with --enable-* or --disable-*\n" - if $module && ($en || $dis); - -die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}}; - -if ($dis) { - for (@nodes) { - $enable_nodes{$_} = 1 unless $disable_nodes{$_}; - } -} - -if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ; - -for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; } - -$stagedir = $prefix unless $stagedir; - -if ($mode eq 'build') { - print "Writing config.status\n"; - open CONF,">config.status" or die "config.status: $!\n"; - print CONF "$0 @keeparg\n"; - close CONF; -} - - -my @modules; -my %aux; - -if ($module) { -# push @modules,split(/[,.]+/,$module); - push @modules,$module; -} -else { - @modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes)); - - my $n; - - do { - local $"="\n"; - $n = $#modules; - push @modules,(map @{$deps{$_}},@modules); - - undef %aux; @aux{@modules} = (1) x ($#modules+1); - @modules = keys %aux; - } while ($#modules > $n); -} - -@aux{@modules} = (1) x ($#modules+1); -delete $aux{$_} for (split /,/,$staged); -@modules = keys %aux; - -mode_build() if $mode eq 'build'; -mode_checkout() if $mode eq 'checkout'; -mode_etics($module) if $mode eq 'etics'; - -sub mode_build { - print "\nBuilding modules: @modules\n"; - - my @ext = map @{$need_externs{$_}},@modules; - my @myjars = map @{$need_jars{$_}},@modules; - undef %aux; @aux{@ext} = 1; - @ext = keys %aux; - undef %aux; @aux{@myjars} = (1) x ($#myjars+1); - @myjars = keys %aux; - - print "\nRequired externals:\n"; - print "\t$_: $extern_prefix{$_}\n" for @ext; - print "\t$_: $jar{$_}\n" for @myjars; - print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n"; - - mkinc($_) for @modules; - - print "Creating Makefile\n"; - - open MAK,">Makefile" or die "Makefile: $!\n"; - - print MAK "all: @modules\n\nclean:\n"; - - for (@modules) { - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - print MAK "\tcd $full$build && \${MAKE} clean\n" - } - - print MAK "\ndistclean:\n"; - - for (@modules) { - my $full = full($_); - print MAK $topbuild{$_} ? - "\tcd $full$build && \${MAKE} distclean\n" : - "\trm -rf $full$build\n" - } - - print MAK "\n"; - - for (@modules) { - my %ldeps; undef %ldeps; - @ldeps{@{$deps{$_}}} = 1; - for my $x (split /,/,$staged) { delete $ldeps{$x}; } - my @dnames = $module ? () : keys %ldeps; - - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - - print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n"; - } - - close MAK; -} - -sub mode_checkout() { - for (@modules) { - my $module = $_; - my $tag = ""; - if ($lb_tag){ - for (@{$lbmodules{lb}}){ - if ("lb.".$_ eq $module){ - $tag = '-r '.$lb_tag; - } - } - } - if ($lbjp_tag){ - for (@{$lbmodules{'lbjp-common'}}){ - if ("lbjp-common.".$_ eq $module){ - $tag = '-r '.$lbjp_tag; - } - } - } - if ($jp_tag){ - for (@{$lbmodules{'jp'}}){ - if ("jp.".$_ eq $module){ - $tag = '-r '.$jp_tag; - } - } - } - if ($sec_tag){ - for (@{$lbmodules{security}}){ - if ("security.".$_ eq $module){ - $tag = '-r '.$sec_tag; - } - } - } - if ($jobid_tag){ - for (@{$lbmodules{jobid}}){ - if ("jobid.".$_ eq $module){ - $tag = '-r '.$jobid_tag; - } - } - } - #if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){ - # print "found"; - #} - $_ = full($_); - print "\n*** Checking out $_\n"; - system("cvs checkout $tag $_") == 0 or die "cvs checkout $tag $_: $?\n"; - } -} - -BEGIN{ -%need_externs_aux = ( - 'lb.client' => [ qw/cppunit:B classads/ ], - 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava/ ], - 'lb.common' => [ qw/expat cares:B cppunit:B classads/ ], - 'lb.doc' => [], - 'lb.logger' => [ qw/cppunit:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ], - 'lb.state-machine' => [ qw/classads/ ], - 'lb.utils' => [ qw/cppunit:B/ ], - 'lb.ws-interface' => [], - 'lb.ws-test' => [ qw/gsoap:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw// ], - 'lb.yaim' => [ qw/yaim_core:R/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], - 'lbjp-common.db' => [ qw/mysql:B mysql-devel:B postgresql:B cppunit:B log4c:B/ ], - 'lbjp-common.log' => [ qw/log4c/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw// ], - 'lbjp-common.trio' => [ qw/cppunit:B/ ], - 'lbjp-common.jp-interface' => [ qw/cppunit:B log4c:B/ ], - 'security.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B/ ], - 'security.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap:B/ ], - 'jobid.api-c' => [ qw/cppunit:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], - 'jobid.api-java' => [ qw/ant:B jdk:B/ ], - 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], - 'jp.doc' => [], - 'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ], - 'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ], - 'jp.server-common' => [], - 'jp.ws-interface' => [], -); - -for my $ext (keys %need_externs_aux) { - for (@{$need_externs_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$need_externs{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $need_externs_type{$ext}->{$1} = $type; - } -} - -%need_jars = ( - 'jobid.api-java' => [ qw/commons-codec/ ], - 'lb.client-java' => [ qw/commons-lang/ ], -); - -for my $jar (keys %need_jars) { - for (@{$need_jars{$jar}}) { - $need_externs_type{$jar}->{$_} = 'BR'; # XXX - } -} - -%deps_aux = ( - 'lb.client' => [ qw/ - lb.types:B lb.common - lbjp-common.trio - jobid.api-cpp:B jobid.api-c - security.gss - / ], - 'lb.client-java' => [ qw/ - lb.types:B - lb.ws-interface:B - jobid.api-java - / ], - 'lb.common' => [ qw/ - jobid.api-cpp:B jobid.api-c - lb.types:B lbjp-common.trio security.gss - / ], - 'lb.doc' => [ qw/lb.types:B/ ], - 'lb.logger' => [ qw/ - lbjp-common.trio - lbjp-common.log - jobid.api-c - lb.common - security.gss - / ], - 'lb.server' => [ qw/ - lb.ws-interface lb.types:B lb.common lb.state-machine - lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log - jobid.api-c - security.gsoap-plugin security.gss - / ], - 'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ], - 'lb.utils' => [ qw/ - lbjp-common.jp-interface - jobid.api-c - lbjp-common.trio lbjp-common.maildir - lb.client lb.state-machine - / ], - 'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ], - 'lb.ws-interface' => [ qw/lb.types:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw/ - jobid.api-c lbjp-common.trio lbjp-common.db lb.common lb.client - security.gss lbjp-common.log - / ], - 'lb.yaim' => [ qw// ], - 'lb.glite-LB' => [ qw/ - lb.logger:R lb.server:R lb.utils:R lb.doc:R - lb.ws-test:R lb.harvester:R lb.yaim:R lb.client-java:R - / ], - 'lbjp-common.db' => [ qw/lbjp-common.trio lbjp-common.log/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw/lbjp-common.log/ ], - 'lbjp-common.trio' => [ qw// ], - 'security.gss' => [ qw// ], - 'security.gsoap-plugin' => [ qw/security.gss/ ], - 'jobid.api-c' => [ qw// ], - 'jobid.api-cpp' => [ qw/jobid.api-c/ ], - 'jobid.api-java' => [ qw// ], - - 'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ], - - 'jp.client' => [ qw/ - jp.ws-interface - lbjp-common.jp-interface lbjp-common.maildir - jobid.api-c - security.gsoap-plugin - / ], - 'jp.doc' => [ qw// ], - 'jp.index' => [ qw/ - jp.server-common jp.ws-interface - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.primary' => [ qw/ - jobid.api-c - jp.server-common jp.ws-interface - lb.state-machine - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.server-common' => [ qw/ - lbjp-common.jp-interface lbjp-common.db - / ], - 'jp.ws-interface' => [ qw// ], -); - -for my $ext (keys %deps_aux) { - for (@{$deps_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$deps{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $deps_type{$ext}->{$1} = $type; - } -} - - -%extrafull = ( gridsite=>'org.gridsite.core'); - -#( java => 'client-java' ); -%extranodmod = ( - db => 'lbjp-common.db', - jpprimary => 'jp.primary', - jpindex => 'jp.index', - jpclient => 'jp.client', -); - -%obsoletes = ( - 'lb.yaim' => [ qq/glite-yaim-lb/ ], -); - -my @t = qw/lb.client-java jobid.api-java lb.types/; -@topbuild{@t} = (1) x ($#t+1); -} - -sub full -{ - my $short = shift; - return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short; -} - -sub mkinc -{ - my %aux; - undef %aux; - my @m=qw/ -lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB -security.gss security.gsoap-plugin -jobid.api-c jobid.api-cpp jobid.api-java -lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface -jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface -/; - @aux{@m} = (1) x ($#m+1); - - my $short = shift; - my $full = full $short; - - unless ($aux{$short}) { - print "Makefile.inc not needed in $full\n"; - return; - } - - my $build = ''; - - unless ($topbuild{$_}) { - $build = '/build'; - unless (-d "$full/build") { - mkdir "$full/build" or die "mkdir $full/build: $!\n"; - } - unlink "$full/build/Makefile"; - symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n"; - } - - open MKINC,">$full$build/Makefile.inc" - or die "$full$build/Makefile.inc: $!\n"; - - print "Creating $full$build/Makefile.inc\n"; - - print MKINC qq{ -PREFIX = $prefix -stagedir = $stagedir -thrflavour = $thrflavour -nothrflavour = $nothrflavour -libdir = $libdir -}; - - for (@{$need_externs{$short}}) { - print MKINC "${_}_prefix = $extern_prefix{$_}\n" - } - - for (@{$need_jars{$short}}) { - print MKINC "${_}_jar = $jar{$_}\n" - } - - my $need_gsoap = 0; - for (@{$need_externs{$short}}) { $need_gsoap = 1 if $_ eq 'gsoap'; } - - print MKINC "gsoap_default_version=".gsoap_version()."\n" if $need_gsoap; - - close MKINC; -} - -my %etics_externs; -my %etics_projects; -BEGIN{ - %etics_externs = ( - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - gridsite=>'org.gridsite.shared', - lcas=>'org.glite.security.lcas', - trustmanager=>'org.glite.security.trustmanager', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - yaim_core=>'org.glite.yaim.core', - ); - %etics_projects = ( - vdt=>[qw/globus globus_essentials/], - 'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/], - ); -}; - -sub mode_etics { - $fmod = shift; - - die "$0: --module required with --etics\n" unless $fmod; - - my ($subsys,$module) = split /\./,$fmod; - - my ($major,$minor,$rev,$age); - - if ($version) { - $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/; - ($major,$minor,$rev,$age) = ($1,$2,$3,$4); - } - else { - open V,"org.glite.$subsys.$module/project/version.properties" - or die "org.glite.$subsys.$module/project/version.properties: $!\n"; - - while ($_ = ) { - chomp; - ($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/; - $age = $1 if /module\.age\s*=\s*([[:digit:]]+)/; - } - close V; - } - - my @copts = (); - my %ge; - @ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1); - - for (@{$need_externs{"$subsys.$module"}}) { - if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; - } - } - - for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - push @copts,"--with-$_ \${$eext.location}/$_*.jar"; - } - - my $conf; - my $conftag; - - if ($branch) { - $conf = "glite-${subsys}-${module}_$branch"; - $conftag = $branch; - $dwpath = ""; } - else { - $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - $conftag = $conf; - $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n"; } -# my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - my $file = $output ? $output : "$conf.ini"; - open C,">$file" or die "$file: $!\n"; - - my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build"; - - my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..'; - - my $package_description = ""; - my $package_summary = ""; - - if (-e "org.glite.$subsys.$module/project/package.description") { - open V, "org.glite.$subsys.$module/project/package.description"; - $package_description = join ("", ); - close V; - chomp $package_description; - $package_description =~ s/\n/\\n/g; - $package_description = "package.description = $package_description"; - } - else { - print STDERR "package.description not found for $subsys.$module!\n"; } - - if (-e "org.glite.$subsys.$module/project/package.summary") { - open V, "org.glite.$subsys.$module/project/package.summary"; - $package_summary = join ("", ); - close V; - chomp $package_summary; - $package_summary =~ s/\n/\\n/g; - $package_summary = "package.summary = $package_summary"; - } - else { - print STDERR "package.summary not found for $subsys.$module!\n"; } - - - print STDERR "Writing $file\n"; - print C qq{ -[Configuration-$conf] -profile = None -moduleName = org.glite.$subsys.$module -displayName = $conf -description = org.glite.$subsys.$module -projectName = org.glite -age = $age -deploymentType = None -tag = $conftag -version = $major.$minor.$rev -$dwpath -[Platform-default:VcsCommand] -displayName = None -description = None -tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName} -branch = None -commit = None -checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName} - -[Platform-default:BuildCommand] -postpublish = None -packaging = None -displayName = None -description = None -doc = None -prepublish = None -publish = None -compile = make -init = None -install = make install -clean = make clean -test = make check -configure = cd $confdir && /usr/bin/perl \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts -checkstyle = None - -[Platform-default:Property] -$buildroot -$package_description -$package_summary -}; - for (@{$obsoletes{"$subsys.$module"}}) { - print C "package.obsoletes = $_\n"; - print C "package.replaces = $_\n"; - } - - print C qq{ -[Platform-default:DynamicDependency] -}; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; - } - } - - my $type = $need_externs_type{"$subsys.$module"}->{$_}; - print C "$proj|$eext = $type\n"; - } - - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "org.glite|org.glite.$_ = $type\n"; - } - - close C; -} - -sub gsoap_version { - local $_; - my $gsoap_version; - open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n"; - - while ($_ = ) { - chomp; - - $gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/; - } - close S; - return $gsoap_version; -} - -sub getlibdir { - if ( -e "/etc/debian_version") { # We are on Debian - $lib64="lib"; - $lib32="lib32"; } - else { # Another distribution - $lib64="lib64"; - $lib32="lib"; } - $libdir=$lib32; - - open INP, "uname -s | "; # Check kernel name - $kname= ; - chomp($kname); - close INP; - - if ( $kname == "Linux") { - $arch = ("x86_64\npowerpc\nppc64\n"); - - open INP, "uname -p | "; # Check processor type - $procname= ; - chomp($procname); - close INP; - - if ($arch =~/^$procname\n/) { - return ($lib64); } - - open INP, "uname -m | "; # Check machine hardware - $machname= ; - chomp($machname); - close INP; - - if ($arch =~/^$machname\n/) { - return ($lib64); } - - # special cases (hyperlink lib64, Debian) - if (-l "/usr/lib64") { - $libdir=$lib32; } - - # if /usr/lib64 doesn't exist at all (AIX) - unless ( -e "/usr/lib64" ) { - $libdir=$lib32; } - } - - if ( $kname == "SunOS") { - if (-e "/usr/lib/64") { - $libdir="lib/64"; } - } - - return $libdir; -} - -sub usage { - my @ext = keys %extern_prefix; - my @myjars, keys %jar; - - print STDERR qq{ -usage: $0 options - -General options (defaults in []): - --prefix=PREFIX destination directory [./stage] - --staged=module,module,... what is already in PREFIX (specify without org.glite.) - --thrflavour=flavour - --nothrflavour=flavour threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg] - --listmodules=subsys list modules of a subsystem - --libdir=libdir typically [lib,lib64] postfix - -Mode of operation: - --mode={checkout|build|etics} what to do [build] - -What to build: - --module=module build this module only (mostly in-Etics operation) - --enable-NODE build this "node" (set of modules) only. Available nodes are - @{$lbmodules{lb}},@{$lbmodules{security}} - --disable-NODE don't build this node - --lb-tag=tag checkout LB modules with specific tag - --jp-tag=tag checkout JP modules with specific tag - --lbjp-common-tag=tag checkout lbjp-common modules with specific tag - --security-tag=tag checkout security modules with specific tag - --jobid-tag=tag checkout jobid modules with specific tag - -Dependencies: - --with-EXTERNAL=PATH where to look for an external. Required externals - (not all for all modules) are: - @ext - --with-JAR=JAR where to look for jars. Required jars are: - @myjars - Summary of what will be used is always printed - -}; - -} diff --git a/org.glite.lb.client/doc/README-notify b/org.glite.lb.client/doc/README-notify deleted file mode 100644 index 3411208..0000000 --- a/org.glite.lb.client/doc/README-notify +++ /dev/null @@ -1,106 +0,0 @@ -LB notifications ----------------- - -LB infrastructure enables its users to be notified when something interesting happens on a LB server (typically job status change). It enables the user not to poll LB server periodically to find out whatever he/she is interesting in but confortable wait and let the server itself inform you. If user wants to receive the notifications, he/she must first register to the LB notification infarastructure. - -User registers via some notification client. (program that uses LB client API to handle notifications). He/she must specify a condition under which the notification is sent. For example - job XY reaches status DONE. Currently, one or more JOBID's are required in the condition and only a single occurence of a specific attribute is allowed among ANDed conditions. The condition is then delivered to LB server where it is stored. At the same time, server generates an unique notification ID for such registration and returns it to the user. - -The registration exists only for limited amount of time. The validity is returned by LB server together with notification ID when registering. During this period user can attach to server and receive notifications, change conditions which triger notification, prolong validity of the registration, or remove the registration from LB server. For all such operation you have to supply the notification ID. - - -While the registration is valid, user is able repeatable connect to LB server from different places in the net and continue receiving notifications associated with given notification ID. Notifications generated during the time you are not receiving them are stored and waiting when you reconnect. When you reconnect from another place (another IP or PORT), you will receive all not delivered notifications and continue receiving new ones. - - -How does it work? ------------------ - -The request for notification is delivered to LB server. The notification condition specified in the request is stored in LB database and whenever a new event arrives to the LB server, all notification conditions are tested. Always when some of them is true, corresponding notification is sent. - -For a notification delivery, a special deamon, a notification interlogger is used. It stores notifications in files and periodically tries to deliver them to the adress of the last connection of notification client. If the user changes the place (IP or PORT) where the client listens, LB server instuct the notification deamon to change delivery destination of all pending notifications. - - - -Notification test ------------------ - -Steps bellow describe basic testing procedure of the notification -system by creating a fake job record in the LB server, registering -a notification on any state change of this job, and forcing the job state -change. - -Our example program 'glite-lb-notify' is used as a notification -client here. It uses mentioned client API calls to manipulate with -registrations. - -LB server supporting notifications is running on skurut68-2.cesnet.cz:9100, -local-logger used for sending of events (there's no need to run it on the same -host) on skurut68-2.cesnet.cz:9002. - -1) Register a job - examples/glite-lb-job_reg -m skurut68-2.cesnet.cz:9100 -s UserInterface - - -> returns jobid and sequence code used in next steps - -EDG_JOBID="https://skurut68-2.cesnet.cz:9100/D1qbFGwvXLnd927JOcja1Q" -EDG_WL_SEQUENCE="UI=000002:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000:LBS=000000" - - -2) Create notification for this jobid - - GLITE_WMS_NOTIF_SERVER=skurut68-2.cesnet.cz:9100 bin/glite-lb-notify -new -j https://skurut68-2.cesnet.cz:9100/D1qbFGwvXLnd927JOcja1Q - - -> returns notification id - notification ID: https://skurut68-2.cesnet.cz:9100/NOTIF:tOsgB19Wz-M884anZufyUw - -3) Start process waiting for notifications on job state change - - GLITE_WMS_NOTIF_SERVER=skurut68-2.cesnet.cz:9100 bin/glite-lb-notify -receive -i 120 https://skurut68-2.cesnet.cz:9100/NOTIF:tOsgB19Wz-M884anZufyUw - -4) Change status of your job - -4a) - - using glite-lb-logevent (sequence code passed from glite-lb-job_reg - and between glite-lb-logevent calls - - GLITE_WMS_LOG_DESTINATION=skurut68-2.cesnet.cz:9002 bin/glite-lb-logevent \ - -j https://skurut68-2.cesnet.cz:9100/D1qbFGwvXLnd927JOcja1Q \ - -e Running -s LogMonitor --node hokus \ - -c "UI=000002:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000:LBS=000000" - - -> returns seq. code for later usage: - UI=000002:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000002:LRMS=000000:APP=000000:LBS=000000 - - - GLITE_WMS_LOG_DESTINATION=skurut68-2.cesnet.cz:9002 bin/glite-lb-logevent \ - -j https://skurut68-2.cesnet.cz:9100/D1qbFGwvXLnd927JOcja1Q \ - -e Done -s LogMonitor --status_code=OK --reason="hotovo" --exit_code=0 \ - -c "UI=000002:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000002:LRMS=000000:APP=000000:LBS=000000" - - -> returns - UI=000002:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000004:LRMS=000000:APP=000000:LBS=000000 - -4b) - - using examples/glite-lb-running.sh (sends corresponding set of events): - - GLITE_WMS_LOG_DESTINATION=skurut68-2.cesnet.cz:9002 \ - examples/glite-lb-running.sh \ - -j https://skurut68-2.cesnet.cz:9100/D1qbFGwvXLnd927JOcja1Q - -5) Watch incomming notifications. - - You should receive several notification, each correspondig - with job status change: - -https://skurut68-2.cesnet.cz:9100/D1qbFGwvXLnd927JOcja1Q Running /DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Miroslav Ruda - -https://skurut68-2.cesnet.cz:9100/D1qbFGwvXLnd927JOcja1Q Done /DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Miroslav Ruda - - -When you let notification client running several minutes without any incomming notification, it will finish and remove your registration from the server automatically. - -6) Destroy notification - - GLITE_WMS_NOTIF_SERVER=skurut68-2.cesnet.cz:9100 bin/glite-lb-notify \ - drop https://skurut68-2.cesnet.cz:9100/D1qbFGwvXLnd927JOcja1Q diff --git a/org.glite.lb.client/doc/glite-lb-dump.8 b/org.glite.lb.client/doc/glite-lb-dump.8 deleted file mode 100644 index aa2b6fe..0000000 --- a/org.glite.lb.client/doc/glite-lb-dump.8 +++ /dev/null @@ -1,62 +0,0 @@ -.TH GLITE-LB-DUMP 8 "April 2008" "EGEE Project" "Logging&Bookkeeping" - -.SH NAME -glite-lb-dump - utility for dumping job events from L&B database - -.SH SYNOPSIS -.B glite-lb-dump -.RI [ options ] -.br - -.SH DESCRIPTION -.B glite-lb-dump -is utility for dumping job events from L&B database. It is primarilly used for statistical purposes. By default, it dumps events from the time when the last dum ended upto now. - -.B glite-lb-dump -may be run periodically, however the periodic dumps are done by server itself, so check the configuration of the server first. - -.SH OPTIONS -.TP -.BI \-m \fR,\fP --server mkserver -L&B server machine name. If not specified, the environment variable EDG_WL_QUERY_SERVER is beeing checked. - -.TP -.BI \-f \fR,\fP --from YYYYMMDDHHmmss -Beginning of the time interval for events to be dumped. - -.TP -.BI \-t \fR,\fP --to YYYYMMDDHHmmss -End of the time interval for events to be dumped. - -.TP -.BI \-h \fR,\fP --help -Display help. - -.TP -.BI \-v \fR,\fP --version -Display version. - -.TP -.B "-d\fR,\fP --debug" -Print diagnostics on the -.I stderr\fR.\fP - -.\".SH USAGE -.\" Add any additional description here - -.PP - -.SH FILES -No configuration files needed. - -.SH ENVIRONMENT -No environment variables needed. - -.SH REPORTING BUGS -Please, report all bugs to EGEE Bug Tracking System located at https://savannah.cern.ch - -.SH SEE ALSO -.B glite-lb-bkindex\fR(8),\fP glite-lb-bkserverd\fR(8),\fP glite-lb-interlogd\fR(8),\fP glite-lb-logd\fR(8),\fP glite-lb-logevent\fR(1),\fP - -.SH AUTHOR -EU EGEE, JRA1. diff --git a/org.glite.lb.client/doc/glite-lb-load.8 b/org.glite.lb.client/doc/glite-lb-load.8 deleted file mode 100644 index 40509d7..0000000 --- a/org.glite.lb.client/doc/glite-lb-load.8 +++ /dev/null @@ -1,50 +0,0 @@ -.TH GLITE-LB-LOAD 8 "April 2008" "EGEE Project" "Logging&Bookkeeping" - -.SH NAME -glite-lb-load - utility for loading job events into the L&B database - -.SH SYNOPSIS -.B glite-lb-load -.RI [ options ] -.br - -.SH DESCRIPTION -.B glite-lb-load -is utility for loading job events into the L&B database. It is primarilly used for recovery purposes. By default, it loads events from the last dump. - -.SH OPTIONS -.IP "\-m, --server \fIbkserver\fR" -L&B server machine name. If not specified, the environment variable EDG_WL_QUERY_SERVER is beeing checked. - -.IP "\-f, --file \fIfilename\fR" -File with dumped data to be loaded. - -.IP "\-h, --help" -Display help. - -.IP "\-v, --version" -Display version. - -.IP "\-d, --debug" -Print diagnostics on the -.I stderr\fR.\fP - -.\".SH USAGE -.\" Add any additional description here - -.PP - -.SH FILES -No configuration files needed. - -.SH ENVIRONMENT -No environment variables needed. - -.SH REPORTING BUGS -Please, report all bugs to EGEE Bug Tracking System located at https://savannah.cern.ch - -.SH SEE ALSO -.B glite-lb-bkindex\fR(8),\fP glite-lb-bkserverd\fR(8),\fP glite-lb-dump\fR(8),\fP glite-lb-purge\fR(8),\fP - -.SH AUTHOR -EU EGEE, JRA1. diff --git a/org.glite.lb.client/doc/glite-lb-logevent.1 b/org.glite.lb.client/doc/glite-lb-logevent.1 deleted file mode 100644 index 63ce668..0000000 --- a/org.glite.lb.client/doc/glite-lb-logevent.1 +++ /dev/null @@ -1,98 +0,0 @@ -.TH GLITE-LB-LOGEVENT 1 "April 2008" "EU EGEE Project" "Logging&Bookkeeping" - -.SH NAME -glite-lb-logevent - program for logging events to L&B subsystem - -.SH SYNOPSIS -.B glite-lb-logevent -.B -s Application -e UserTag -.B -j -.I JOBID -.B -c -.I SEQCODE -.B --name -.I NAME -.B --value -.I VALUE -.br - -.SH DESCRIPTION -.B glite-lb-logevent -is a low-level program for logging events to the L&B service. -It is used internally by WMS components and has many more options, that are not recomend to be used at the user level. -At the user level it is supposed to be used only for logging user tag events. - -.SH USAGE -Besides -.I NAME -and -.I VALUE -of the tag, which are user defined, the user has to specify a valid -.I JOBID\fR,\fP -and -.I SEQCODE -(L&B event sequence code). - -The user application is always executed from within a -.I JobWrapper -script. The wrapper sets the appropriate JobId in the environment variable -EDG_WL_JOBID. The user should pass this value to the -j option of -.B glite-lb-logevent. - -Similarly, the wrapper sets an initial value of the event sequence code -in the environment variable EDG_WL_SEQUENCE_CODE. -If the user application calls -.B glite-lb-logevent -just once, it is sufficient to pass this value to the -c option. -However, if there are more subsequent calls, the user is responsible for -capturing an updated sequence code from the -.B stdout -of -.B glite-lb-logevent -and using it in subsequent calls. -The L&B design requires the sequence codes in order to be able to sort -events correctly while not relying on strictly synchronized clocks. - -.SH EXAMPLE -The example bellow is a job consisting of 100 phases. -A user tag -.I phase -is used to log the phase currently being executed. -Subsequently, the user may monitor execution of the job phases -as a part of the job status returned by L&B. - -.nf -#!/bin/sh - -for p in `seq 1 100`; do - - # log the UserTag event - EDG_WL_SEQUENCE_CODE=`glite-lb-logevent -s Application - -e UserTag - -j $EDG_WL_JOBID -c $EDG_WL_SEQUENCE_CODE - --name=phase --value=$p` - - # do the actual computation here -done - -.fi - - - -.SH OTHER OPTIONS -See command line help (glite-lb-logevent -h) for extensive help on all options. -However, EDG users should should follow the usage shown in SYNOPSIS strictly. -Logging other events may confuse the L&B service and cause wrong job status -information to be reported. - -.SH FILES -No configuration files needed. - -.SH REPORTING BUGS -Please, report all bugs to EU EGEE Bug Tracking System located at https://savannah.cern.ch - -.SH SEE ALSO -.B glite-lb-bkserverd\fR(8),\fP glite-lb-interlogd\fR(8),\fP glite-lb-logd\fR(8) - -.SH AUTHOR -EU EGEE, JRA1. diff --git a/org.glite.lb.client/doc/glite-lb-notify.1 b/org.glite.lb.client/doc/glite-lb-notify.1 deleted file mode 100644 index b6015f8..0000000 --- a/org.glite.lb.client/doc/glite-lb-notify.1 +++ /dev/null @@ -1,142 +0,0 @@ -.TH GLITE-LB-NOTIFY 1 "Apr 2008" "EU EGEE Project" "Logging&Bookkeeping" - -.SH NAME -glite-lb-notify - Register and receive notification from L&B - -.SH SYNOPSIS -.B glite-lb-notify -.br - \fBnew\fR [ { \fB-s\fI socket_fd\fR | \fB-a \fIfake_addr\fR } \fB-t \fIrequested_validity\fR \fB-j \fIjobid \fR| { \fB-o \fIowner \fR | \fB -O \fR } \fB-n \fInetwork_server \fR \fB-v\fI virtual_organization\fR \fB-c \fR \fB-f\fI flags\fR ] -.br - \fBbind \fR [ { \fB-s\fI socket_fd\fR | \fB-a \fIfake_addr\fR } \fB-t \fIrequested_validity\fR ] \fInotifid\fR -.br - \fBchange \fR \fInotifid\fR \fIjobid\fR -.br - \fBrefresh\fR [ \fB-t \fIrequested_validity \fR ] notifid -.br - \fBreceive\fR [ { \fB-s\fI socket_fd\fR | \fB-a \fIfake_addr\fR } \fB-t \fIrequested_validity\fR ] [ \fB -i \fItimeout \fR] [ \fB-r\fR] [ \fB-f\fI field1,field2\fR,... \fInotifid\fR -.br - \fBdrop\fR \fInotifid\fR -.br - \fBhelp\fR - - -.SH DESCRIPTION -.B glite-lb-notify -is a fairly simple wrapper on the L&B notification API. -It allows to create a notification (with a restricted richness of specifying -conditions), bind to it for receiving notifications, and drop it finally. - -L&B notification is a user-initiated trigger at the server. -Whenever a job enters a state matching conditions specified with the notification, -the current state of the job is sent to the notification client. -On the other hand, the notification client is a network listener -which receives server-initiated connections to get the notifications. -Unless -.B -s -is specified, the notification library creates the listener -socket. - -Within the notification validity, -clients can disappear and even migrate. -However, only a single active client for a notification is allowed. - -This command -is intended to be used in user scripts, graphical tools etc. where -direct access to the API is difficult. - -L&B server and port to contact is specified with GLITE_WMS_NOTIF_SERVER environment -variable. - -.SH USAGE -Common options (mostly) -.TP -.B -t -specifies a requested validity of the notification (in seconds of UNIX Epoch), -the server can truncate the value according to its policy. -.TP -.B -a -allows to specify a fake listener address to register with the notification, -i.e. to overcome firewalls etc. -When notifications are delivered, the server tries to connect to this -address rather than the true address of the listening socket. -Requires re-binding therefore it -can't be used in conjunction with -.B -s -. -.TP -.B -s -allows to pass a opened listening socket (filedescriptor number), see EXAMPLE bellow. -In this case there is no need to re-bind the notification -(it is assumed the socket is recycled) -This is critical for a real usage, as the re-bind operation is rather -expensive. - -.SH \ - -Subcommands: -.TP -.B new -Create a new notification. Conditions on matching jobs are specified -with exacltly one of -.B -j\fR, -.B -o\fR, -.B -n,\fR -.B -v -options. If the option -.B -O\fR -is used, credentials are retrieved from environment. The -.B -c\fR -set matching only on state change. -Prints ID of the created notification. - -.TP -.B bind - -Binds to an existing notification, changing its listener eventually. -Useful for debugging purposes mostly. - -.TP -.B change - -Connect notification with another job. - -.TP -.B refresh - -Extend validity of an existing notification. - -.TP -.B receive - -Bind to an existing notification, and start waiting for an incoming -event, at most the time specified with -.B -i -(seconds). -.B -r -attempts to refresh the notification handle in 1/2 of current validity. -.B -f -allows to specify a custom list of fields of the job status -to display. Run -.B glite-lb-notify -to get list of available fields. - -.TP -.B drop - -Drop the notification from the server, removing all messages on the way eventually. - -.SH EXAMPLE -Installed with the package as share/examples/glite-lb-notify.pl. -Demontstrates using the non-trivial -.B -s -option. - - -.SH SEE ALSO -.B glite-lb-bkserverd\fR(8),\fP glite-lb-interlogd\fR(8),\fP glite-lb-logd\fR(8) - -L&B Users Guide, http://www.glite.org - -.SH AUTHOR -EU EGEE, JRA1. diff --git a/org.glite.lb.client/examples/Makefile b/org.glite.lb.client/examples/Makefile deleted file mode 100644 index 8b4e31f..0000000 --- a/org.glite.lb.client/examples/Makefile +++ /dev/null @@ -1,79 +0,0 @@ -glite_location:=${GLITE_LOCATION} -glite_prefix:=${glite_location} - -host_cpu:=${shell uname -m} -ifeq (${host_cpu},x86_64) - LDFLAGS:=-L${glite_prefix}/lib64 -L${glite_prefix}/lib - nothrflavour=gcc64dbg - thrflavour=gcc64dbgpthr -else - LDFLAGS:=-L${glite_prefix}/lib - nothrflavour=gcc32dbg - thrflavour=gcc32dbgpthr -endif - -CC:=gcc -CXX:=g++ - -COMMON_LIB:=-lglite_lb_common_${nothrflavour} -COMMON_LIB_THR:=-lglite_lb_common_${thrflavour} -CLIENT_LIB:=-lglite_lb_client_${nothrflavour} -CLIENT_LIB_THR:=-lglite_lb_client_${thrflavour} -JOBID_LIB:=-lglite_jobid - -LIB:=${COMMON_LIB} ${CLIENT_LIB} ${JOBID_LIB} -LIB_THR:=${COMMON_LIB_THR} ${CLIENT_LIB_THR} ${JOBID_LIB} -PLUSLIB:= -PLUSLIB_THR:= - -CFLAGS:=${DEBUG} \ - -I${glite_prefix}/include \ - -D_GNU_SOURCE - -CXXFLAGS:=${CFLAGS} - -COMPILE:=libtool --mode=compile ${CC} ${CFLAGS} -CXXCOMPILE:=libtool --mode=compile ${CXX} ${CXXFLAGS} -LINK:=libtool --mode=link ${CC} ${LDFLAGS} -LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS} -INSTALL:=libtool --mode=install install - -EXAMPLES_SRC:=log_usertag_proxy.c job_log.c job_reg.c feed_shark.c query_ext.c query_seq_code.c stats.c abort_job.c change_acl.c stresslog.c flood_proxy.c dagids.c stress_context.c parse_eventsfile.c user_jobs.c job_status.c -EXAMPLES:=${EXAMPLES_SRC:.c=} - -# TODO: migrate them here from branch_RC31_3 -# EXAMPLES_PLUS_SRC:=indexed_attrs_plus.cpp job_status_plus.cpp query_events_plus.cpp listener.cpp user_jobs_plus.cpp job_log_plus.cpp notify_plus.cpp -# EXAMPLES_PLUS:=${EXAMPLES_PLUS_SRC:.cpp=} -# EXAMPLES_PLUS_THR_SRC:= -# EXAMPLES_PLUS_THR:=${EXAMPLES_PLUS_THR_SRC:.cpp=} - -EXAMPLES_THR_SRC:=user_jobs_threaded.c -EXAMPLES_THR:=${EXAMPLES_CL_THR_SRC:.c=} - -default all: examples - -examples: ${EXAMPLES} ${EXAMPLES_THR} ${EXAMPLES_PLUS} ${EXAMPLES_PLUS_THR} - -${EXAMPLES}: %: %.o - ${LINK} -o $@ $< ${LIB} - -${EXAMPLES_THR}: %: %.o - ${LINK} -o $@ $< ${LIB_THR} - -${EXAMPLES_PLUS}: %: %.o - ${LINKXX} -o $@ $< ${PLUSLIB} - -${EXAMPLES_PLUS_THR}: %: %.o - ${LINKXX} -o $@ $< ${PLUSLIB_THR} - -# catches $TOOLS and logevent compilation -%.o: %.c - ${CC} ${CFLAGS} -c $< - -%.o: %.cpp - ${CXX} ${CXXFLAGS} -c $< - -clean: - rm -rvf ${EXAMPLES} ${EXAMPLES_CL} ${EXAMPLES_CL_THR} - rm -rvf *.o .libs/ - diff --git a/org.glite.lb.client/examples/README.examples b/org.glite.lb.client/examples/README.examples deleted file mode 100644 index a500dfb..0000000 --- a/org.glite.lb.client/examples/README.examples +++ /dev/null @@ -1,32 +0,0 @@ -These are examples demonsrtating the usage of LB client API: - -abort_job.c - Manual abort of a job -change_acl.c - Change ACL -dagids.c - (sub)JobIds of a DAG job -feed_shark.c - Notifications "Shark" -flood_proxy.c - Log User Tag to LB Proxy from multiple processes -job_log.c - Return all events for given JobId -job_reg.c - Register a job in LB -job_status.c - Return a job status of given job -log_usertag_proxy.c - Log User Tag to LB Proxy -notify.c - Notifications handling tool (new, bind, change, refresh, receive, test, drop) -parse_eventsfile.c - Check parsing of dglogd* and notif-dglogd* files -query_ext.c - Complex querying tool -query_seq_code.c - How to query the sequence code of a job -stats.c - Return CE rank statistics from LB -stress_context.c - Stress test for working with LB context (Init, SetLoggingJob, Free - multiple processes) -stresslog.c - Stress test for logging (RegisterJOb, LogEvent) -user_jobs.c - Return jobs owned by given user -user_jobs_threaded.c - Return jobs owned by given user (threaded version) - - -The following RPMs must be installed in order to be able to build all the examples: - -glite-lb-client - -(and all its dependencies). - - -To build these examples, just set the GLITE_LOCATION environment variable and run make, e.g. - -$ GLITE_LOCATION=/opt/glite make diff --git a/org.glite.lb.client/examples/abort_job.c b/org.glite.lb.client/examples/abort_job.c deleted file mode 100644 index 6735881..0000000 --- a/org.glite.lb.client/examples/abort_job.c +++ /dev/null @@ -1,152 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#include -#include -#include -#include - -#include "glite/lb/events_parse.h" -#ifdef BUILDING_LB_CLIENT -#include "consumer.h" -#include "producer.h" -#else -#include "glite/lb/consumer.h" -#include "glite/lb/producer.h" -#endif -#include "glite/jobid/cjobid.h" -#include "glite/lb/context-int.h" - -static void free_events(edg_wll_Event *); - -static void help(const char* n) -{ - fprintf(stderr,"usage: %s \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; - } -} diff --git a/org.glite.lb.client/examples/aborted.l b/org.glite.lb.client/examples/aborted.l deleted file mode 100644 index 0f639c8..0000000 --- a/org.glite.lb.client/examples/aborted.l +++ /dev/null @@ -1,2 +0,0 @@ -:ready: --s JobController,-e Abort,--reason "just to test" diff --git a/org.glite.lb.client/examples/aborted_ft.l b/org.glite.lb.client/examples/aborted_ft.l deleted file mode 100644 index a592735..0000000 --- a/org.glite.lb.client/examples/aborted_ft.l +++ /dev/null @@ -1,5 +0,0 @@ -# macro definition for RUNNING state - -:running_ft: --s Application, -e FileTransfer, --result=FAIL, --reason="problem with transfer" --s JobController,-e Abort,--reason "just to test" diff --git a/org.glite.lb.client/examples/cancelled.l b/org.glite.lb.client/examples/cancelled.l deleted file mode 100644 index 1e0cc96..0000000 --- a/org.glite.lb.client/examples/cancelled.l +++ /dev/null @@ -1,2 +0,0 @@ -:running: --s LogMonitor, -e Done, --status_code=CANCELLED, --reason="reason for the change", --exit_code=0 diff --git a/org.glite.lb.client/examples/change_acl.c b/org.glite.lb.client/examples/change_acl.c deleted file mode 100644 index 77e2f70..0000000 --- a/org.glite.lb.client/examples/change_acl.c +++ /dev/null @@ -1,99 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include - -#include "glite/jobid/cjobid.h" -#ifdef BUILDING_LB_CLIENT -#include "producer.h" -#else -#include "glite/lb/producer.h" -#endif -#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_CHANGEACL_ADD; - int permission = EDG_WLL_CHANGEACL_READ; - int permission_type = EDG_WLL_CHANGEACL_ALLOW; - int user_id_type = EDG_WLL_CHANGEACL_DN; - 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_CHANGEACL_REMOVE; break; - case 'd': permission_type = EDG_WLL_CHANGEACL_DENY; break; - case 'g': user_id_type = EDG_WLL_CHANGEACL_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; -} diff --git a/org.glite.lb.client/examples/chkpt.l b/org.glite.lb.client/examples/chkpt.l deleted file mode 100644 index dbd7f23..0000000 --- a/org.glite.lb.client/examples/chkpt.l +++ /dev/null @@ -1,6 +0,0 @@ -# macro definition for DONE state - -:running: --s LRMS, -e Chkpt, --tag=chkpt1, --classad="" --s LRMS, -e Chkpt, --tag=chkpt2, --classad="" --s LogMonitor, -e Done, --status_code=OK, --reason="reason for the change", --exit_code=0 diff --git a/org.glite.lb.client/examples/cleared.l b/org.glite.lb.client/examples/cleared.l deleted file mode 100644 index 8b9f86c..0000000 --- a/org.glite.lb.client/examples/cleared.l +++ /dev/null @@ -1,4 +0,0 @@ -# macro definition for DONE state - -:done: --s LogMonitor, -e Clear, --reason=USER diff --git a/org.glite.lb.client/examples/cream_done.l b/org.glite.lb.client/examples/cream_done.l deleted file mode 100644 index 539700d..0000000 --- a/org.glite.lb.client/examples/cream_done.l +++ /dev/null @@ -1,4 +0,0 @@ -:cream_reallyrunning: --s LRMS,-e CREAMDone,--status_code=OK,--exit_code=123 --s LRMS,-e CREAMDone,--status_code=OK,--exit_code=123 --s BLAH,-e CREAMDone,--status_code=OK diff --git a/org.glite.lb.client/examples/cream_failed.l b/org.glite.lb.client/examples/cream_failed.l deleted file mode 100644 index 0a12e8e..0000000 --- a/org.glite.lb.client/examples/cream_failed.l +++ /dev/null @@ -1,2 +0,0 @@ -:cream_reallyrunning: --s LRMS,-e CREAMDone,--status_code=FAILED,--reason='Oh shit' diff --git a/org.glite.lb.client/examples/cream_idle.l b/org.glite.lb.client/examples/cream_idle.l deleted file mode 100644 index c9fb97b..0000000 --- a/org.glite.lb.client/examples/cream_idle.l +++ /dev/null @@ -1,4 +0,0 @@ -:cream_pending: --s CreamCore,-e CREAMCall,--callee=BLAH,--command=CMDSTART,--cmdid='this is call',--result=OK --s BLAH,-e CREAMCall,--callee=LRMS,--command=CMDSTART,--cmdid='this is call',--result=START --s BLAH,-e CREAMCall,--callee=LRMS,--command=CMDSTART,--cmdid='this is call',--result=OK,--destid='12345.in.torque' diff --git a/org.glite.lb.client/examples/cream_pending.l b/org.glite.lb.client/examples/cream_pending.l deleted file mode 100644 index 3104b96..0000000 --- a/org.glite.lb.client/examples/cream_pending.l +++ /dev/null @@ -1,4 +0,0 @@ -:cream_registered: --s CreamCore,-e CREAMStart --s CreamCore,-e CREAMStore,--command=CMDSTART,--result=START --s CreamCore,-e CREAMStore,--command=CMDSTART,--result=OK diff --git a/org.glite.lb.client/examples/cream_reallyrunning.l b/org.glite.lb.client/examples/cream_reallyrunning.l deleted file mode 100644 index 9a858d1..0000000 --- a/org.glite.lb.client/examples/cream_reallyrunning.l +++ /dev/null @@ -1,2 +0,0 @@ -:cream_running: --s LRMS,-e CREAMReallyRunning diff --git a/org.glite.lb.client/examples/cream_registered.l b/org.glite.lb.client/examples/cream_registered.l deleted file mode 100644 index d8960a2..0000000 --- a/org.glite.lb.client/examples/cream_registered.l +++ /dev/null @@ -1,2 +0,0 @@ -# only job registration needed for submitted state - diff --git a/org.glite.lb.client/examples/cream_running.l b/org.glite.lb.client/examples/cream_running.l deleted file mode 100644 index 0c4cbd6..0000000 --- a/org.glite.lb.client/examples/cream_running.l +++ /dev/null @@ -1,3 +0,0 @@ -:cream_idle: --s BLAH,-e CREAMRunning --s LRMS,-e CREAMRunning,--node='worker.node.14' diff --git a/org.glite.lb.client/examples/dagids.c b/org.glite.lb.client/examples/dagids.c deleted file mode 100644 index 634e23e..0000000 --- a/org.glite.lb.client/examples/dagids.c +++ /dev/null @@ -1,82 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#ifdef BUILDING_LB_CLIENT -#include "producer.h" -#else -#include "glite/lb/producer.h" -#endif -#include "glite/lb/events.h" - -extern char *optarg; -extern int opterr,optind; - -static void usage(char *me) -{ - fprintf(stderr,"usage: %s -m bkserver -n num_subjobs [-s seed]\n", me); -} - -int main(int argc, char *argv[]) -{ - char *seed = "seed", *server = NULL,*p; - int done = 0,num_subjobs = 0,i; - edg_wll_Context ctx; - edg_wlc_JobId jobid,*subjobs; - - - edg_wll_InitContext(&ctx); - opterr = 0; - - do { - switch (getopt(argc,argv,"m:n:s:")) { - case 's': seed = strdup(optarg); break; - case 'm': server = strdup(optarg); break; - case 'n': num_subjobs = atoi(optarg); break; - case '?': usage(argv[0]); exit(EINVAL); - case -1: done = 1; break; - } - } while (!done); - - if (!server) { - fprintf(stderr,"%s: -m server required\n",argv[0]); - exit(1); - } - - if (!num_subjobs) { - fprintf(stderr,"%s: -n num_subjobs required\n",argv[0]); - exit(1); - } - - p = strchr(server,':'); - if (p) *p=0; - edg_wlc_JobIdCreate(server,p?atoi(p+1):0,&jobid); - printf("seed=\"%s\"\nnodes=%d\ndag=\"%s\"\n",seed,num_subjobs,edg_wlc_JobIdUnparse(jobid)); - - edg_wll_GenerateSubjobIds(ctx,jobid,num_subjobs,seed,&subjobs); - - for (i=0; i -#include -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#ifdef BUILDING_LB_CLIENT -#include "consumer.h" -#else -#include "glite/lb/consumer.h" -#endif - -static void usage(char *me) { - fprintf(stderr,"usage: %s: YYYY-MM-DD:HH:MI YYYY-MM-DD:HH:MI\n" - "\t times specify interval to query\n",me - ); - exit(1); -} - -int main(int argc,char **argv) { - edg_wll_Context ctx; - struct tm tm; - time_t from,to; - int i, err = 0; - - edg_wll_QueryRec cond[3],jcond[2]; /* [2] is terminator */ - edg_wll_Event *events = NULL; - - edg_wll_InitContext(&ctx); - - if (argc != 3) usage(argv[0]); - - - memset(&tm,0,sizeof tm); - - if (sscanf(argv[1],"%d-%d-%d:%d:%d", - &tm.tm_year, - &tm.tm_mon, - &tm.tm_mday, - &tm.tm_hour, - &tm.tm_min) != 5) usage(argv[0]); - - tm.tm_mon--; - tm.tm_year -= 1900; - - from = mktime(&tm); - - if (sscanf(argv[2],"%d-%d-%d:%d:%d", - &tm.tm_year, - &tm.tm_mon, - &tm.tm_mday, - &tm.tm_hour, - &tm.tm_min) != 5) usage(argv[0]); - - tm.tm_mon--; - tm.tm_year -= 1900; - - to = mktime(&tm); - - memset(jcond,0,sizeof jcond); - - jcond[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jcond[0].op = EDG_WLL_QUERY_OP_UNEQUAL; - jcond[0].value.c = "nonexistent"; - - memset(cond,0,sizeof cond); - cond[0].attr = EDG_WLL_QUERY_ATTR_TIME; - cond[0].op = EDG_WLL_QUERY_OP_WITHIN; - cond[0].value.t.tv_sec = from; - cond[0].value2.t.tv_sec = to; - - cond[1].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE; - cond[1].value.i = EDG_WLL_EVENT_DONE; - - if (edg_wll_QueryEvents(ctx,jcond,cond,&events)) { - char *et,*ed; - et = ed = NULL; - - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_QueryEventsProxy: %s, %s\n", - et,ed ? ed : ""); - - free(et); free(ed); - err = 1; - goto cleanup; - } - - for (i=0; events[i].type; i++) { - edg_wll_Event *e = events+i; - - if (e->done.status_code == EDG_WLL_DONE_FAILED) { - char *job = glite_jobid_unparse(e->any.jobId); - - printf("%s\t%s\t%s\t%s\n", - job, - ctime(&e->done.timestamp.tv_sec), - e->done.host, - e->done.reason - ); - - free(job); - } - } - -cleanup: - if (events) { - for (i=0; events[i].type; i++) edg_wll_FreeEvent(events+i); - free(events); events = NULL; - } - - edg_wll_FreeContext(ctx); - - return err; -} diff --git a/org.glite.lb.client/examples/done_ft.l b/org.glite.lb.client/examples/done_ft.l deleted file mode 100644 index 4a5c71d..0000000 --- a/org.glite.lb.client/examples/done_ft.l +++ /dev/null @@ -1,4 +0,0 @@ -# macro definition for RUNNING state - -:running_ft: --s Application, -e FileTransfer, --result=OK, --reason="ok" diff --git a/org.glite.lb.client/examples/done_subjob.l b/org.glite.lb.client/examples/done_subjob.l deleted file mode 100644 index 883a367..0000000 --- a/org.glite.lb.client/examples/done_subjob.l +++ /dev/null @@ -1,4 +0,0 @@ -# macro definition for DONE state - -:running_subjob: --s LogMonitor, -e Done, --status_code=OK, --reason="reason for the change", --exit_code=0 diff --git a/org.glite.lb.client/examples/failed_dag.l b/org.glite.lb.client/examples/failed_dag.l deleted file mode 100644 index 023d5af..0000000 --- a/org.glite.lb.client/examples/failed_dag.l +++ /dev/null @@ -1,3 +0,0 @@ -:running_dag: - --s LogMonitor, -e Done, --status_code=Failed, --exit_code=1, --reason=shit diff --git a/org.glite.lb.client/examples/failed_subjob.l b/org.glite.lb.client/examples/failed_subjob.l deleted file mode 100644 index 9e1b6dc..0000000 --- a/org.glite.lb.client/examples/failed_subjob.l +++ /dev/null @@ -1,3 +0,0 @@ -:running_subjob: - --s LogMonitor, -e Done, --status_code=Failed, --exit_code=1, --reason=shit diff --git a/org.glite.lb.client/examples/feed_shark.c b/org.glite.lb.client/examples/feed_shark.c deleted file mode 100644 index 5019b42..0000000 --- a/org.glite.lb.client/examples/feed_shark.c +++ /dev/null @@ -1,216 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef BUILDING_LB_CLIENT -#include "notification.h" -#else -#include "glite/lb/notification.h" -#endif - -static void usage(const char *); -static void printstat(edg_wll_JobStat, int); - -int main(int argc,char *argv[]) -{ - int o; - edg_wll_Context ctx; - edg_wll_NotifId notif; - time_t valid = 0; - struct timeval timeout; - - edg_wll_InitContext(&ctx); - -/* parse options, reflect them in the LB context */ - while ((o = getopt(argc,argv,"s:")) >= 0) switch (o) { - case 's': { - char *server = strdup(optarg), - *port_s = strchr(server,':'); - - int port; - - if (port_s) { - *port_s = 0; - port = atoi(port_s+1); - } - - edg_wll_SetParam(ctx,EDG_WLL_PARAM_NOTIF_SERVER,server); - if (port_s) edg_wll_SetParam(ctx,EDG_WLL_PARAM_NOTIF_SERVER_PORT,port); - free(server); - } break; - - case '?': usage(argv[0]); exit(EX_USAGE); - } - -/* no notification Id supplied -- create a new one */ - if (argc == optind) { - edg_wll_QueryRec const *empty[] = { NULL }; - char *notif_s; - - if (edg_wll_NotifNew(ctx,empty,0,-1,NULL,¬if,&valid)) { - char *et,*ed; - - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_NotifNew(): %s (%s)\n",et,ed); - exit(EX_UNAVAILABLE); - } - - notif_s = edg_wll_NotifIdUnparse(notif); - printf("notification registered:\n\tId: %s\n\tExpires: %s", - notif_s,ctime(&valid)); - free(notif_s); - } -/* notification Id supplied -- bind to it */ - else if (argc == optind + 1) { - if (edg_wll_NotifIdParse(argv[optind],¬if)) { - fprintf(stderr,"%s: invalid notification Id\n", - argv[optind]); - exit(EX_DATAERR); - } - - if (edg_wll_NotifBind(ctx,notif,-1,NULL,&valid)) { - char *et,*ed; - - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_NotifBind(): %s (%s)\n",et,ed); - exit(EX_UNAVAILABLE); - } - printf("bound to %s\n\t Expires: %s",argv[optind],ctime(&valid)); - } - else { usage(argv[0]); exit(EX_USAGE); } - -/* main loop */ - while (1) { - edg_wll_JobStat stat; - char *et,*ed; - -/* calculate time left for this notification */ - gettimeofday(&timeout,NULL); - timeout.tv_sec = valid - timeout.tv_sec; - assert(timeout.tv_sec >= 0); /* XXX: hope we are no late */ - -/* half time before notification renewal */ - timeout.tv_sec /= 2; - - switch (edg_wll_NotifReceive(ctx,-1,&timeout,&stat,NULL)) { - case 0: /* OK, got it */ - printstat(stat,0); - edg_wll_FreeStatus(&stat); - break; - case EAGAIN: /* timeout */ - if (edg_wll_NotifRefresh(ctx,notif,&valid)) { - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_NotifRefresh(): %s (%s)\n",et,ed); - exit(EX_UNAVAILABLE); - } - printf("Notification refreshed, expires %s",ctime(&valid)); - break; - default: - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_NotifReceive(): %s (%s)\n",et,ed); - exit(EX_UNAVAILABLE); - } - } -} - - -static void usage(const char *me) -{ - fprintf(stderr,"usage: %s [ -s server[:port] ] [notif_id]\n",me); -} - - - -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("%ssubjob_failed : %d\n", ind, stat.subjob_failed); - printf("%sdone_code : %d\n", ind, 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); -} diff --git a/org.glite.lb.client/examples/flood_proxy.c b/org.glite.lb.client/examples/flood_proxy.c deleted file mode 100644 index dd1954b..0000000 --- a/org.glite.lb.client/examples/flood_proxy.c +++ /dev/null @@ -1,98 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef BUILDING_LB_CLIENT -#include "producer.h" -#else -#include "glite/lb/producer.h" -#endif -#include "glite/jobid/cjobid.h" - -static void slave(); - -int main(int argc,char **argv) -{ - int i,nproc; - - if (argc != 2) { - fprintf(stderr,"usage: %s nproc\n",argv[0]); - return 1; - } - - nproc = atoi(argv[1]); - if (nproc < 1) { - fprintf(stderr,"%s: nproc must be >= 1\n",argv[0]); - return 1; - } - - for (i=0; i/dev/null; then TYPE=-c; fi - -if [ -z "$EDG_JOBID" ] -then - # initial sequence code & jobid (normaly returned by job_reg) - EDG_JOBID= - SCRIPT=`$JOB_REG $TYPE $LBPROXY_REG -m $BKSERVER_HOST -s UserInterface | tail -n 2` - eval $SCRIPT - test -z "$EDG_JOBID" && exit 4 - echo EDG_JOBID=$EDG_JOBID -else - test -z "$EDG_WL_SEQUENCE" && EDG_WL_SEQUENCE="UI=000003:NS=0000000000:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000:LBS=000000" -fi - -send_log_ev() -{ - echo $LOGEV $LBPROXY $LBPROXY_STORE_SOCK -j "$EDG_JOBID" -c "$EDG_WL_SEQUENCE" "$@" 1>&$LOGFD - EDG_WL_SEQUENCE=`$LOGEV $LARGE_STRESS $LBPROXY $LBPROXY_STORE_SOCK -j $EDG_JOBID -c $EDG_WL_SEQUENCE "$@" 2>/dev/null` - test $? -ne 0 -o -z "$EDG_WL_SEQUENCE" && exit 4 - true -} - diff --git a/org.glite.lb.client/examples/gen_sample_job b/org.glite.lb.client/examples/gen_sample_job deleted file mode 100755 index b625838..0000000 --- a/org.glite.lb.client/examples/gen_sample_job +++ /dev/null @@ -1,155 +0,0 @@ -#!/bin/sh -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners/ for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -me=$0 -mydir=`dirname $0`; -export me mydir - - -set -- `getopt n $*` -# test whether it is recursive call - -NESTED="-v nested=0" -while [ $1 != '--' ]; do case $1 in - -n) NESTED="-v nested=1"; shift ;; -esac; done -shift - -awk -F, $NESTED \ -'BEGIN { - if (nested==0) system("cat $mydir/gen_begin"); - OFS = ","; - nlines = 0; -} -/^#/ || /^[ ]*$/ { next; } -{ - source = $2; - - event = $1; - - nline++; -} -# events processing - -/-e Transfer/ { logit(); - next;} - -/-e Accepted/ { if (checkNOP(7) == 0) logit(); - next;} - -/-e Refused/ { if (checkNOP(6) == 0) logit(); - next;} - -/-e EnQueued/ { if (checkNOP(6) == 0) logit(); - next;} - -/-e DeQueued/ { if (checkNOP(4) == 0) logit(); - next;} - -/-e HelperCall/ { if (checkNOP(5) == 0) logit(); - next;} - -/-e HelperReturn/ { if (checkNOP(5) == 0) logit(); - next;} - -/-e Running/ { if (checkNOP(3) == 0) logit(); - next;} - -/-e Resubmission/ { if (checkNOP(5) == 0) logit(); - next;} - -/-e Done/ { if (checkNOP(5) == 0) logit(); - next;} - -/-e Cancel/ { if (checkNOP(4) == 0) logit(); - next;} - -/-e Abort/ { if (checkNOP(3) == 0) logit(); - next;} - -/-e Clear/ { if (checkNOP(3) == 0) logit(); - next;} - -/-e Purge/ { if (checkNOP(2) == 0) logit(); - next;} - -/-e Match/ { if (checkNOP(3) == 0) logit(); - next;} - -/-e Pending/ { if (checkNOP(3) == 0) logit(); - next;} - -/-e RegJob/ { if (checkNOP(7) == 0) logit(); - next;} - -/-e Chkpt/ { if (checkNOP(4) == 0) logit(); - next;} - -/-e Listener/ { if (checkNOP(5) == 0) logit(); - next;} - -/-e CurDescr/ { if (checkNOP(3) == 0) logit(); - next;} - -/-e UserTag/ { if (checkNOP(4) == 0) logit(); - next;} - -/-e ReallyRunning/ { if (checkNOP(3) == 0) logit(); - next;} - -/-e CREAMStart/ { logit(); next;} -/-e CREAMStore/ { logit(); next;} -/-e CREAMPurge/ { logit(); next;} -/-e CREAMCall/ { logit(); next;} -/-e CREAMRunning/ { logit(); next;} -/-e CREAMReallyRunning/ { logit(); next;} -/-e CREAMDone/ { logit(); next;} -/-e CREAMCancel/ { logit(); next;} -/-e CREAMAbort/ { logit(); next;} - -/-e FileTransferRegister/ { if (checkNOP(4) == 0) logit(); - next;} -/-e FileTransfer/ { logit(); next;} -/-e Sandbox/ { logit(); next;} - -# shell escape (for sequence number branching) - -/^!/ { print substr($0,2,(length($0) - 1)); } - -# macro processing - macro name starts and ends with ':' -# in a file gen_MACRONAME.txt is the macro describtion - -/^:.*:$/ {system("$me -n $mydir/"substr($1,2,(length($1) - 2))".l" )} - - -function checkNOP(NOP) -{ - if (NF != NOP) { print nline" : "$2": "NOP" args required ("NF" supplied)" > "/dev/stderr"; return 1 } - else return 0; -} - -function logit() -{ - split($0,f); - - ff = ""; - for (i=1; i<=NF; i++) ff = ff " " f[i]; - - print "send_log_ev" ff; -} -' $1 diff --git a/org.glite.lb.client/examples/job-status.pl b/org.glite.lb.client/examples/job-status.pl deleted file mode 100755 index db38bf1..0000000 --- a/org.glite.lb.client/examples/job-status.pl +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/perl -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use SOAP::Lite; -use Data::Dumper; - -# see user-jobs.pl for comments on this magic - -$ENV{HTTPS_CA_DIR}='/etc/grid-security/certificates'; -$ENV{HTTPS_VERSION}='3'; - -$proxy = $ENV{X509_USER_PROXY} ? $ENV{X509_USER_PROXY} : "/tmp/x509up_u$<"; -$ENV{HTTPS_CERT_FILE}= $ENV{HTTPS_KEY_FILE} = $ENV{HTTPS_CA_FILE} = $proxy; - -$job = shift or die "usage: $0 jobid\n"; -$job =~ /(https:\/\/.*):([0-9]+)\/.*/ or die "$job: invalid jobid\n"; -$host = $1; $port = $2; -$server = $host . ':' . ($port + 3); - -$c = SOAP::Lite - -> proxy($server) - -> uri('http://glite.org/wsdl/services/lb'); - -service $c 'http://egee.cesnet.cz/cms/export/sites/egee/en/WSDL/HEAD/LB.wsdl'; -ns $c 'http://glite.org/wsdl/elements/lb'; - -# we need another namespace explicitely here -$c->serializer->register_ns('http://glite.org/wsdl/types/lb','lbtype'); - -on_fault $c sub { print Dumper($_[1]->fault); $fault = 1; }; - -# construct the request, see SOAP::Data docs for details -$req = SOAP::Data->value( - SOAP::Data->name(jobid=>$job), -# here the other namespace is used - SOAP::Data->name(flags=>'')->type('lbtype:jobFlags') - ); - -# call the WS op -$resp = JobStatus $c $req; -$body = $resp->body(); - -# print Dumper $resp->body(); - -# pick something reasonable from the response to print -unless ($fault) { - @fields = qw/state jobtype owner networkServer doneCode exitCode childrenNum/; - $stat = $resp->body()->{JobStatusResponse}->{stat}; - - for (@fields) { - print "$_: $stat->{$_}\n"; - } -} - diff --git a/org.glite.lb.client/examples/job_log.c b/org.glite.lb.client/examples/job_log.c deleted file mode 100644 index c87697e..0000000 --- a/org.glite.lb.client/examples/job_log.c +++ /dev/null @@ -1,165 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#include -#include -#include -#include - -#include "glite/lb/events_parse.h" -#ifdef BUILDING_LB_CLIENT -#include "consumer.h" -#else -#include "glite/lb/consumer.h" -#endif -#include "glite/jobid/cjobid.h" -#ifdef USE_CALLBACKS - #include "consumer_fake.h" -#endif - -static void free_events(edg_wll_Event *); - -static void help(const char* n) -{ - fprintf(stderr,"usage: %s [-r repeat] [-d delay] [ -x|-X non-default_sock_path ] \n", n); - exit(1); -} - -#ifdef USE_CALLBACKS -static int query_events_cb(edg_wll_Context context, edg_wll_Event **events) { - int i; - edg_wll_Event *event; - - i = 0; - while ((event = (*events) + i)->type != EDG_WLL_EVENT_UNDEF) { - event->any.timestamp.tv_sec = (double)rand() / RAND_MAX * 1000000000; - event->any.timestamp.tv_usec = (double)rand() / RAND_MAX * 1000000; - i++; - } - - return 0; -} -#endif - -int main(int argc,char **argv) -{ - edg_wll_Context ctx; - char *errt,*errd; - edg_wll_Event *events = NULL; - edg_wlc_JobId job; - int i,opt,delay = 1,count = 0, proxy = 0; - - if (argc < 2) - help(argv[0]); - - edg_wll_InitContext(&ctx); - - while ((opt=getopt(argc,argv,"r:d:xX:")) != -1) - switch (opt) { - case 'd': delay = atoi(optarg); break; - case 'r': count = atoi(optarg); break; - case 'x': proxy = 1; break; - case 'X': proxy = 1; - edg_wll_SetParam(ctx, EDG_WLL_PARAM_LBPROXY_SERVE_SOCK, optarg); - break; - default: - help(argv[0]); - } - - if (edg_wlc_JobIdParse(argv[optind],&job)) { - fprintf(stderr,"%s: can't parse job ID\n",argv[1]); - return 1; - } - -#ifdef USE_CALLBACKS - edg_wll_RegisterTestQueryEvents(query_events_cb); -#endif - - if ( proxy ? edg_wll_JobLogProxy(ctx,job,&events) : edg_wll_JobLog(ctx,job,&events) ) - { - edg_wll_Error(ctx,&errt,&errd); - fprintf(stderr,"%s: %s (%s)\n",argv[0],errt,errd); - } - - for ( i = 0; events && events[i].type != EDG_WLL_EVENT_UNDEF; i++ ) - { - char *e = edg_wll_UnparseEvent(ctx,events+i); - fputs(e,stdout); - fputs("\n",stdout); - free(e); - } - - free_events(events); - printf("\nFound %d events\n",i); - - while (count--) { - puts("Sleeping ..."); - sleep(delay); - if (proxy ? edg_wll_JobLogProxy(ctx,job,&events) : edg_wll_JobLog(ctx,job,&events)) { - edg_wll_Error(ctx,&errt,&errd); - fprintf(stderr,"%s: %s (%s)\n",argv[0],errt,errd); - free(errt); free(errd); errt = errd = NULL; - free_events(events); - } - else puts("OK"); - } - - edg_wlc_JobIdFree(job); - edg_wll_FreeContext(ctx); - -#ifdef USE_CALLBACKS - edg_wll_UnregisterTestQueryEvents(); -#endif - - return 0; - -#ifdef USE_CALLBACKS - edg_wll_UnregisterTestQueryEvents(); -#endif - 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_wlc_JobIdFree(job); - 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; - } -} diff --git a/org.glite.lb.client/examples/job_reg.c b/org.glite.lb.client/examples/job_reg.c deleted file mode 100644 index 6cdd141..0000000 --- a/org.glite.lb.client/examples/job_reg.c +++ /dev/null @@ -1,207 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#ifdef BUILDING_LB_CLIENT -#include "producer.h" -#else -#include "glite/lb/producer.h" -#endif -#include "glite/lb/events.h" - -extern char *optarg; -extern int opterr,optind; - -static void usage(char *me) -{ - fprintf(stderr,"usage: %s [-m bkserver] [-x|-X non-default_sock_path] [-j dg_jobid] [-s source_id] [-n num_subjobs [-S][-C]] [-P] [-l jdl_file] [-e seed] [-E]\n", me); -} - -int main(int argc, char *argv[]) -{ - char *src = NULL,*job = NULL,*server = NULL,*seq,*jdl = NULL, *seed = NULL; - int lbproxy = 0; - int done = 0,num_subjobs = 0,reg_subjobs = 0,i, collection = 0, pbs=0, cream=0, type, flags=0; - edg_wll_Context ctx; - edg_wlc_JobId jobid,*subjobs; - - - edg_wll_InitContext(&ctx); - opterr = 0; - - do { - switch (getopt(argc,argv,"xX:s:j:m:n:SCl:e:PcE")) { - case 'x': lbproxy = 1; break; - case 'X': lbproxy = 1; - edg_wll_SetParam(ctx, EDG_WLL_PARAM_LBPROXY_STORE_SOCK, optarg); - break; - case 's': src = (char *) strdup(optarg); break; - case 'j': job = (char *) strdup(optarg); break; - case 'm': server = strdup(optarg); break; - case 'n': num_subjobs = atoi(optarg); break; - case 'S': reg_subjobs = 1; break; - case 'C': collection = 1; break; - case 'P': pbs = 1; break; - case 'c': cream = 1; break; - case 'l': jdl = (char *) strdup(optarg); break; - case 'e': seed = strdup(optarg); break; - case 'E': flags = flags | EDG_WLL_LOGLFLAG_EXCL; break; - case '?': usage(argv[0]); exit(EINVAL); - case -1: done = 1; break; - } - } while (!done); - - if ((num_subjobs <= 0) && (reg_subjobs || collection) ) { - usage(argv[0]); - exit(EINVAL); - } - - if (!job && !server) { - fprintf(stderr,"%s: either -m server or -j jobid has to be specified\n",argv[0]); - exit(1); - } - - if (!src) { - fprintf(stderr,"%s: -s required\n",argv[0]); - exit(1); - } - - if (!job) { - char *p = strchr(server,':'); - if (p) *p=0; - edg_wlc_JobIdCreate(server,p?atoi(p+1):0,&jobid); - job = edg_wlc_JobIdUnparse(jobid); - printf("new jobid: %s\n",job); - } - else if ((errno = edg_wlc_JobIdParse(job,&jobid))) { - perror(job); - exit(1); - } - - if (jdl) { - int f = open(jdl,O_RDONLY,0); - off_t l,p,c; - - if (f<0) { perror(jdl); exit(1); } - l = lseek(f,0,SEEK_END); - lseek(f,0,SEEK_SET); - - jdl = malloc(l+1); - - for (p=0; p < l && (c = read(f,jdl+p,l-p)) > 0; p += c); - if (c<0) { - perror("read()"); - exit (1); - } - jdl[p] = 0; - } - - edg_wll_SetParam(ctx,EDG_WLL_PARAM_SOURCE,edg_wll_StringToSource(src)); - - type = pbs ? EDG_WLL_REGJOB_PBS - : (cream ? EDG_WLL_REGJOB_CREAM - : (num_subjobs ? - (collection?EDG_WLL_REGJOB_COLLECTION:EDG_WLL_REGJOB_DAG) - :EDG_WLL_REGJOB_SIMPLE - ) - ); - - if (lbproxy) { - if (edg_wll_RegisterJobProxy(ctx,jobid,type, - jdl ? jdl : "blabla", "NS", - num_subjobs,seed,&subjobs)) - { - char *et,*ed; - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_RegisterJobProxy(%s): %s (%s)\n",job,et,ed); - exit(1); - } - } else { - - if (flags) { - //printf("Registering with edg_wll_RegisterJobExt(). Flags = %d\n", flags); - if (edg_wll_RegisterJobExt(ctx,jobid,type, - jdl ? jdl : "blabla", "NS", - num_subjobs,seed,&subjobs,NULL,flags)) - { - char *et,*ed; - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_RegisterJobExt(%s): %s (%s)\n",job,et,ed); - exit(1); - } - } else { - if (edg_wll_RegisterJobSync(ctx,jobid,type, - jdl ? jdl : "blabla", "NS", - num_subjobs,seed,&subjobs)) - { - char *et,*ed; - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_RegisterJobSync(%s): %s (%s)\n",job,et,ed); - exit(1); - } - } - } - - seq = edg_wll_GetSequenceCode(ctx); - printf("\n%s=\"%s\"\n",num_subjobs?(collection?"EDG_WL_COLLECTION_JOBID":"EDG_WL_DAG_JOBID"):"EDG_JOBID",job); - printf("EDG_WL_SEQUENCE=\"%s\"\n",seq); - free(seq); - free(job); - - if (num_subjobs) for (i=0; subjobs[i]; i++) { - char *job_s = edg_wlc_JobIdUnparse(subjobs[i]); - printf("EDG_WL_SUB_JOBID[%d]=\"%s\"\n",i,job_s); - free(job_s); - } - - if (reg_subjobs) { - char ** jdls = (char**) calloc(num_subjobs+1, sizeof(char*)); - - for (i=0; subjobs[i]; i++) { - asprintf(jdls+i, "JDL of subjob #%d\n", i+1); - } - - if (lbproxy) { - if (edg_wll_RegisterSubjobsProxy(ctx, jobid, (const char **) jdls, "NS", subjobs)) { - char *et,*ed; - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_RegisterSubjobsProxy: %s (%s)\n", et, ed); - exit(1); - } - } else { - if (edg_wll_RegisterSubjobs(ctx, jobid, (const char **) jdls, "NS", subjobs)) { - char *et,*ed; - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_RegisterSubjobs: %s (%s)\n", et, ed); - exit(1); - } - } - - for (i=0; subjobs[i]; i++) free(jdls[i]); - } - - edg_wll_FreeContext(ctx); - - return 0; -} diff --git a/org.glite.lb.client/examples/job_status.c b/org.glite.lb.client/examples/job_status.c deleted file mode 100644 index b64d7ea..0000000 --- a/org.glite.lb.client/examples/job_status.c +++ /dev/null @@ -1,387 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include - -#include "glite/lb/context-int.h" -#ifdef BUILDING_LB_CLIENT -#include "consumer.h" -#else -#include "glite/lb/consumer.h" -#endif -#include "glite/lb/xml_conversions.h" -#include "glite/lb/jobstat.h" - -static void dgerr(edg_wll_Context,char *); -static void printstat(edg_wll_JobStat,int); - -#define MAX_SERVERS 20 - -static char *myname; - -static void usage(char *); -static int query_all(edg_wll_Context, edg_wll_JobStat **, edg_wlc_JobId **); - -int main(int argc,char *argv[]) -{ - edg_wll_Context sctx[MAX_SERVERS]; - char *servers[MAX_SERVERS]; - int i, result=0, nsrv=0, histflags = 0; - - - myname = argv[0]; - printf("\n"); - - if ( argc < 2 || strcmp(argv[1],"--help") == 0 ) { usage(argv[0]); return 0; } - - if ( edg_wll_InitContext(&sctx[0]) ) { - fprintf(stderr,"cannot initialize edg_wll_Context\n"); - exit(1); - } - - if ( !strcmp(argv[1], "-all" ) ) { - edg_wll_JobStat *statesOut; - edg_wlc_JobId *jobsOut; - - jobsOut = NULL; - statesOut = NULL; - if ( (result = query_all(sctx[0], &statesOut, &jobsOut)) ) dgerr(sctx[0], "edg_wll_QueryJobs"); - else for ( i = 0; statesOut[i].state; i++ ) printstat(statesOut[i],0); - - 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(sctx[0]); - - return result; - } - - if ( !strcmp(argv[1], "-x") ) { - edg_wlc_JobId job; - edg_wll_JobStat status; - - if ( argc < 3 ) { usage(argv[0]); return 1; } - if ( edg_wll_InitContext(&sctx[0]) ) { - fprintf(stderr,"%s: cannot initialize edg_wll_Context\n",myname); - exit(1); - } - edg_wll_SetParam(sctx[0], EDG_WLL_PARAM_LBPROXY_SERVE_SOCK, argv[2]); - for ( i = 3; i < argc; i++ ) { - memset(&status, 0, sizeof status); - if (edg_wlc_JobIdParse(argv[i],&job)) { - fprintf(stderr,"%s: %s: cannot parse jobId\n", myname, argv[i]); - continue; - } - if ( edg_wll_JobStatusProxy(sctx[0], job, EDG_WLL_STAT_CLASSADS | EDG_WLL_STAT_CHILDREN | EDG_WLL_STAT_CHILDSTAT, &status)) { - dgerr(sctx[0], "edg_wll_JobStatusProxy"); result = 1; - } else printstat(status, 0); - - if ( job ) edg_wlc_JobIdFree(job); - if ( status.state ) edg_wll_FreeStatus(&status); - } - edg_wll_FreeContext(sctx[0]); - - return result; - } - - for ( i = 1; i < argc; i++ ) { - if ( !strcmp(argv[i], "-fullhist") ) { - histflags = EDG_WLL_STAT_CHILDHIST_THOROUGH; - printf("\nFound a FULLHIST flag\n\n"); - } - - if ( !strcmp(argv[i], "-fasthist") ) { - histflags = EDG_WLL_STAT_CHILDHIST_FAST; - printf("\nFound a FASTHIST flag\n\n"); - } - } - - for ( i = 1; i < argc; i++ ) { - int j; - char *bserver; - edg_wlc_JobId job; - edg_wll_JobStat status; - - memset(&status,0,sizeof status); - - if ((strcmp(argv[i], "-fullhist"))&&(strcmp(argv[i], "-fasthist"))) { - if (edg_wlc_JobIdParse(argv[i],&job)) { - fprintf(stderr,"%s: %s: cannot parse jobId\n", myname,argv[i]); - continue; - } - 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; - } - for ( j = 0; j < nsrv && strcmp(bserver, servers[j]); j++ ); - if ( j == nsrv ) { - if ( i > 0 ) 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 | histflags, &status)) { - dgerr(sctx[j],"edg_wll_JobStatus"); result = 1; - } else printstat(status,0); - - 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 -usage(char *name) -{ - fprintf(stderr,"Usage: %s [-x lb_proxy_serve_sock] [-fasthist|-fullhist] [job_id [...]]\n", name); - fprintf(stderr," %s -all\n", name); -} - -static int -query_all(edg_wll_Context ctx, edg_wll_JobStat **statesOut, edg_wlc_JobId **jobsOut) -{ - edg_wll_QueryRec jc[2]; - int ret; - - 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 ( (ret = edg_wll_QueryJobs(ctx, jc, 0, jobsOut, statesOut)) ) { - if ( ret == E2BIG ) { - int r; - if ( edg_wll_GetParam(ctx, EDG_WLL_PARAM_QUERY_RESULTS, &r) ) return ret; - if ( r != EDG_WLL_QUERYRES_LIMITED ) return ret; - - printf("Warning: only limited result returned!\n"); - return 0; - } else return ret; - } - - return ret; -} - -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, *j1,*j2, 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, j1 = edg_wlc_JobIdUnparse(stat.jobId)); free(j1); - printf("%sowner : %s\n", ind, stat.owner); - switch (stat.jobtype) { - case EDG_WLL_STAT_SIMPLE: - printf("%sjobtype : SIMPLE\n", ind); - break; - case EDG_WLL_STAT_DAG: - printf("%sjobtype : DAG\n", ind); - break; - case EDG_WLL_STAT_COLLECTION: - printf("%sjobtype : COLLECTION\n", ind); - break; - case EDG_WLL_STAT_PBS: - printf("%sjobtype : PBS\n", ind); - break; - case EDG_WLL_STAT_CONDOR: - printf("%sjobtype : CONDOR\n", ind); - break; - case EDG_WLL_STAT_CREAM: - printf("%sjobtype : CREAM\n", ind); - break; - case EDG_WLL_STAT_FILE_TRANSFER: - printf("%sjobtype : FILE_TRANSFER\n", ind); - break; - case EDG_WLL_STAT_FILE_TRANSFER_COLLECTION: - printf("%sjobtype : FILE_TRANSFER_COLLECTION\n", ind); - break; - default: - printf("%sjobtype : UNKNOWN\n", ind); - break; - } - printf("%sparent_job : %s\n", ind, - j2 = 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++) { - time_t st = stat.stateEnterTimes[i]; - - printf("%s%14s %s", ind, edg_wll_StatToString(i-1), st == 0 ? - " - not available -\n" : ctime(&st)); - } - 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("%spayload_running: %d\n", ind, stat.payload_running); - if (stat.possible_destinations) { - printf("%spossible_destinations : \n", ind); - for (i=0; stat.possible_destinations[i]; i++) - printf("%s\t%s \n", ind, stat.possible_destinations[i]); - } - if (stat.possible_ce_nodes) { - printf("%spossible_ce_nodes : \n", ind); - for (i=0; stat.possible_ce_nodes[i]; i++) - printf("%s\t%s \n", ind, stat.possible_ce_nodes[i]); - } - printf("%ssuspended : %d\n", ind, stat.suspended); - printf("%ssuspend_reason : %s\n", ind, stat.suspend_reason); - printf("%sfailure_reasons : %s\n", ind, stat.failure_reasons); - printf("%sremove_from_proxy : %d\n", ind, stat.remove_from_proxy); - printf("%sui_host : %s\n", ind, stat.ui_host); - if (stat.user_fqans) { - printf("%suser_fqans : \n", ind); - for (i=0; stat.user_fqans[i]; i++) - printf("%s\t%s \n", ind, stat.user_fqans[i]); - } - printf("%ssandbox_retrieved : %d\n", ind, stat.sandbox_retrieved); - printf("%sjw_status : %s\n", ind, edg_wll_JWStatToString(stat.jw_status)); - - printf("%sisb_transfer : %s\n", ind, j1 = edg_wlc_JobIdUnparse(stat.isb_transfer)); free(j1); - printf("%sosb_transfer : %s\n", ind, j1 = edg_wlc_JobIdUnparse(stat.osb_transfer)); free(j1); - - /* PBS state section */ - if (stat.jobtype == EDG_WLL_STAT_PBS) { - printf("%spbs_state : %s\n", ind, stat.pbs_state); - printf("%spbs_queue : %s\n", ind, stat.pbs_queue); - printf("%spbs_owner : %s\n", ind, stat.pbs_owner); - printf("%spbs_name : %s\n", ind, stat.pbs_name); - printf("%spbs_reason : %s\n", ind, stat.pbs_reason); - printf("%spbs_scheduler : %s\n", ind, stat.pbs_scheduler); - printf("%spbs_dest_host : %s\n", ind, stat.pbs_dest_host); - printf("%spbs_pid : %d\n", ind, stat.pbs_pid); - printf("%spbs_resource_usage : %s%s\n", ind, - (stat.pbs_resource_usage) ? "\n" : "", stat.pbs_resource_usage); - printf("%spbs_exit_status : %d\n", ind, stat.pbs_exit_status); - printf("%spbs_error_desc : %s%s\n", ind, - (stat.pbs_error_desc) ? "\n" : "", stat.pbs_error_desc); - } - - /* CREAM state section */ - if (stat.jobtype == EDG_WLL_STAT_CREAM) { - char *cream_stat_name = edg_wll_CreamStatToString(stat.cream_state); - - printf("%scream_state : %s\n", ind, cream_stat_name); - printf("%scream_owner : %s\n", ind, stat.cream_owner); - printf("%scream_endpoint : %s\n", ind, stat.cream_endpoint); - printf("%scream_jdl : %s\n", ind, stat.cream_jdl); - printf("%scream_reason : %s\n", ind, stat.cream_reason); - printf("%scream_lrms_id : %s\n", ind, stat.cream_lrms_id); - printf("%scream_node : %s\n", ind, stat.cream_node); - printf("%scream_done_code : %d\n", ind, stat.cream_done_code); - printf("%scream_exit_code : %d\n", ind, stat.cream_exit_code); - printf("%scream_cancelling : %d\n", ind, stat.cream_cancelling); - printf("%scream_cpu_time : %d\n", ind, stat.cream_cpu_time); - printf("%scream_jw_status : %s\n", ind, edg_wll_JWStatToString(stat.cream_jw_status)); - - free(cream_stat_name); - } - - /* File Transfer section */ - printf("%sft_compute_job : %s\n", ind, j1 = edg_wlc_JobIdUnparse(stat.ft_compute_job)); free(j1); - if (stat.ft_sandbox_type == EDG_WLL_STAT_INPUT) - printf("%sft_sandbox_type : INPUT\n", ind); - else if (stat.ft_sandbox_type == EDG_WLL_STAT_OUTPUT) - printf("%sft_sandbox_type : OUTPUT\n", ind); - else - printf("%sft_sandbox_type : UNKNOWN\n", ind); - printf("%sft_src : %s\n", ind, stat.ft_src); - printf("%sft_dest : %s\n", ind, stat.ft_dest); - - - printf("\n"); - - free(j2); - free(s); -} - diff --git a/org.glite.lb.client/examples/log_usertag_proxy.c b/org.glite.lb.client/examples/log_usertag_proxy.c deleted file mode 100644 index f889864..0000000 --- a/org.glite.lb.client/examples/log_usertag_proxy.c +++ /dev/null @@ -1,133 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#include "glite/lb/notifid.h" -#include "glite/lb/events.h" - -#ifdef BUILDING_LB_CLIENT -#include "producer.h" -#else -#include "glite/lb/producer.h" -#endif - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"sock", 1, NULL, 's'}, - {"jobid", 1, NULL, 'j'}, - {"user", 1, NULL, 'u'}, - {"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-u, --user User DN.\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, *user, *name, *value; - int opt, err = 0; - - - server = code = jobid_s = name = value = NULL; - while ( (opt = getopt_long(argc, argv, "hs:j:u: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 'u': user = 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 ( !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; } - - edg_wll_InitContext(&ctx); - - if ( !user ) { - /* - edg_wll_GssStatus gss_stat; - - if ( edg_wll_gss_acquire_cred_gsi( - ctx->p_proxy_filename ? : ctx->p_cert_filename, - ctx->p_proxy_filename ? : ctx->p_key_filename, - NULL, &gss_stat) ) { - fprintf(stderr, "failed to load GSI credentials\n"); - retrun 1; - } - */ - } - - 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_SetLoggingJobProxy(ctx, jobid, code, user, 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; -} diff --git a/org.glite.lb.client/examples/multiple_user_jobs.c b/org.glite.lb.client/examples/multiple_user_jobs.c deleted file mode 100644 index d11e9bd..0000000 --- a/org.glite.lb.client/examples/multiple_user_jobs.c +++ /dev/null @@ -1,142 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include - -#include "glite/lb/context.h" -#include "glite/lb/xml_conversions.h" -#include "consumer.h" - -int use_proxy = 0; - -int (*user_jobs)(edg_wll_Context, glite_jobid_t **, edg_wll_JobStat **); - - -void -usage(char *me) -{ - fprintf(stderr,"This example demonstrates the use of several user identities provided byi\n" - "proxy files to access a single bkserver and retrieve appropriate information.\n\n" - "usage: %s [-h] \n" - "\t-h, --help\t show this help\n" - "\t\t A list of proxy files to use to contact the bkserver\n" - "\t \t Give \"default\" for default (EDG_WLL_PARAM_X509_PROXY == NULL)\n" - "\n" - ,me); - -} - -int main(int argc,char **argv) -{ - edg_wll_Context *p_ctx; - char *errt,*errd; - glite_jobid_t **jobs = NULL; - edg_wll_JobStat **states = NULL; - int i,j,k; - int no_of_runs; - - if ((argc<2) || !strcmp(argv[1], "-h")) {usage(argv[0]); exit(0);} - - no_of_runs = argc-1; - - p_ctx = (edg_wll_Context*) calloc (sizeof(edg_wll_Context), no_of_runs); - jobs = (glite_jobid_t**) calloc (sizeof(glite_jobid_t*), no_of_runs); - states = (edg_wll_JobStat**) calloc (sizeof(edg_wll_JobStat*), no_of_runs); - - user_jobs = edg_wll_UserJobs; - for ( i = 1; i <= no_of_runs; i++ ) { - printf ("Proxy file No. %d: %s\n",i,argv[i]); - - edg_wll_InitContext(&p_ctx[i-1]); - if (strcmp(argv[i],"default")) edg_wll_SetParam(p_ctx[i-1], EDG_WLL_PARAM_X509_PROXY, argv[i]); - if (user_jobs(p_ctx[i-1],&jobs[i-1],&states[i-1])) goto err; - - } - - for (k=0; k < no_of_runs; k++) { - printf("Jobs retrieved using file No. %d (%s)\n" - "------------------------------------------\n", k + 1, argv[k + 1]); - for (i=0; states[k][i].state != EDG_WLL_JOB_UNDEF; i++) { - char *id = glite_jobid_unparse(states[k][i].jobId), - *st = edg_wll_StatToString(states[k][i].state); - - if (!states[k][i].parent_job) { - if (states[k][i].jobtype == EDG_WLL_STAT_SIMPLE) { - printf(" %s .... %s %s\n", id, st, (states[k][i].state==EDG_WLL_JOB_DONE) ? edg_wll_done_codeToString(states[k][i].done_code) : "" ); - } - else if ((states[k][i].jobtype == EDG_WLL_STAT_DAG) || - (states[k][i].jobtype == EDG_WLL_STAT_COLLECTION)) { - printf("%s %s .... %s %s\n", (states[k][i].jobtype==EDG_WLL_STAT_DAG)?"DAG ":"COLL",id, st, (states[k][i].state==EDG_WLL_JOB_DONE) ? edg_wll_done_codeToString(states[k][i].done_code) : ""); - for (j=0; states[k][j].state != EDG_WLL_JOB_UNDEF; j++) { - if (states[k][j].parent_job) { - char *par_id = glite_jobid_unparse(states[k][j].parent_job); - - if (!strcmp(id,par_id)) { - char *sub_id = glite_jobid_unparse(states[k][j].jobId), - *sub_st = edg_wll_StatToString(states[k][j].state); - - printf(" `- %s .... %s %s\n", sub_id, sub_st, (states[k][j].state==EDG_WLL_JOB_DONE) ? edg_wll_done_codeToString(states[k][j].done_code) : ""); - free(sub_id); - free(sub_st); - } - free(par_id); - } - } - } - } - - free(id); - free(st); - } - } - - printf("\nFound %d jobs\n",i); - -err: - if (jobs) { - for (k=0; k < no_of_runs; k++) { - if (jobs[k]) - for (i=0; jobs[k][i]; i++) glite_jobid_free(*jobs[i]); - } - free(jobs); - } - - if (states) { - for (k=0; k < no_of_runs; k++) { - if (states[k]) - for (i=0; states[k][i].state; i++) edg_wll_FreeStatus(states[i]); - } - free(states); - } - - for (k=0; k < no_of_runs; k++) { - if (edg_wll_Error(p_ctx[k],&errt,&errd)) { - fprintf(stderr,"%s: %s (%s)\n",argv[0],errt,errd); - return 1; - } - } - - - for (k=0; k < no_of_runs; k++) { - edg_wll_FreeContext(p_ctx[k]); - } - - return 0; -} - diff --git a/org.glite.lb.client/examples/notify.pl b/org.glite.lb.client/examples/notify.pl deleted file mode 100755 index 63de838..0000000 --- a/org.glite.lb.client/examples/notify.pl +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/perl -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use Socket; -use Fcntl; - -$notif = $ENV{NOTIFY_CMD} ? $ENV{NOTIFY_CMD} : './notify'; - -socket SOCK,PF_INET,SOCK_STREAM,getprotobyname('tcp') || die "socket: $!\n"; -bind SOCK,sockaddr_in(0,INADDR_ANY) || die "bind: $!\n"; -listen SOCK,10; - -$fd = fileno SOCK; - -$flags = fcntl SOCK,F_GETFD,0; -fcntl SOCK,F_SETFD,$flags & ~FD_CLOEXEC; - - -$cmd = "$notif new -s $fd"; - -for (@ARGV) { $cmd .= " '$_'"; } -system $cmd; - -$fdin = ''; -vec($fdin,$fd,1) = 1; - -while (1) { - select($fdin,undef,undef,undef); - print "got connection\n"; - - system "$notif receive -s $fd -i 3"; -} - - diff --git a/org.glite.lb.client/examples/parse_eventsfile.c b/org.glite.lb.client/examples/parse_eventsfile.c deleted file mode 100644 index d4d1a25..0000000 --- a/org.glite.lb.client/examples/parse_eventsfile.c +++ /dev/null @@ -1,137 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include - -#ifdef BUILDING_LB_CLIENT -#include "producer.h" -#else -#include "glite/lb/producer.h" -#endif -#include "glite/lb/events.h" -#include "glite/lb/events_parse.h" - -#define MAXMSGSIZE 10240 - -extern char *optarg; -extern int opterr,optind; - -static const char *me; - -static void usage() -{ - fprintf(stderr,"usage: %s [-n] -f file_name\n", me); -} - -int main(int argc, char *argv[]) -{ - char *filename = NULL; - char buf[MAXMSGSIZE]; - int done = 0,i=0,notif=0; - edg_wll_Context ctx; - edg_wll_Event *event = NULL; - FILE *f; - edg_wll_ErrorCode (*parse)(edg_wll_Context context,edg_wll_LogLine logline,edg_wll_Event **event); - edg_wll_LogLine (*unparse)(edg_wll_Context context,edg_wll_Event *event); - const char *parse_str,*unparse_str; - - edg_wll_InitContext(&ctx); - opterr = 0; - - me = strdup(argv[0]); - - do { - switch (getopt(argc,argv,"nf:")) { - case 'n': notif = 1; break; - case 'f': filename = (char *) strdup(optarg); break; - case '?': usage(); exit(EINVAL); - case -1: done = 1; break; - } - } while (!done); - - /* choose the right (un)parser */ - if (notif) { - parse = edg_wll_ParseNotifEvent; - parse_str = "edg_wll_ParseNotifEvent"; - unparse = edg_wll_UnparseNotifEvent; - unparse_str = "edg_wll_UnparseNotifEvent"; - } else { - parse = edg_wll_ParseEvent; - parse_str = "edg_wll_ParseEvent"; - unparse = edg_wll_UnparseEvent; - unparse_str = "edg_wll_UnparseEvent"; - } - - if (!filename) { - fprintf(stderr,"%s: -f required\n",me); - usage(); - exit(1); - } - - if ( (f = fopen(filename,"r")) == NULL) { - perror(filename); - exit(1); - } else { - fprintf(stderr,"Parsing file '%s' for correctness:\n",filename); - } - - /* parse events */ - i = 1; - while (!feof(f)) { - if (!fgets(buf,sizeof(buf),f)) break; - if (strcmp(buf,"\n")) { - // fprintf(stdout,"%d: %s\n",i,buf); - - if (parse(ctx,buf,&event) != 0) { - /* Parse ERROR: */ - char *et=NULL,*ed=NULL; - - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"line %d: %s() error: %s (%s)\n",i,parse_str,et,ed); - if (et) free(et); - if (ed) free(ed); - } else { - /* Parse OK : */ - char *es=NULL; - edg_wll_LogLine logline = NULL; - - es=edg_wll_EventToString(event->type); - logline = unparse(ctx,event); - fprintf(stderr,"line %d: %s() o.k. (event %s), ",i,parse_str,es); - if (logline) { - fprintf(stderr,"%s() o.k.\n",unparse_str); - free(logline); - } else { - fprintf(stderr,"%s() error\n",unparse_str); - } - if (es) free(es); - } - if (event) edg_wll_FreeEvent(event); - } - i++; - } - fclose(f); - - edg_wll_FreeContext(ctx); - - return 0; -} diff --git a/org.glite.lb.client/examples/purge_test b/org.glite.lb.client/examples/purge_test deleted file mode 100644 index d70b3dd..0000000 --- a/org.glite.lb.client/examples/purge_test +++ /dev/null @@ -1,206 +0,0 @@ -#!/usr/bin/perl -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners/ for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - - -BEGIN{ -$inst = $ENV{GLITE_PREFIX}; -$inst = "/opt/glite" unless $inst; -$sbin = "$inst/sbin"; -$bin = "$inst/bin"; -$test = "$inst/examples"; -$purge = "$bin/glite-lb-purge"; -$status = "$test/glite-lb-job_status"; -$log = "$test/glite-lb-job_log"; -$prefix = "/tmp/purge_test_$$"; -$delay = 60; - -$ENV{PATH} .= ":$bin"; -} - -$option = shift; -$server = shift; - -die qq{ -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - This script will DESTROY ALL DATA in the specified bookkeeping server. - -Don't run it unless you are absolutely sure what you are doing. -If you really mean it, the magic usage is: - - $0 --i-want-to-purge server:port - -Good luck! - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -} unless $option eq '--i-want-to-purge'; - -die "usage: $0 --i-want-to-purge server:port\n" unless $server; - -sub logit { - my $ids = shift; - my $prefix = shift; - my $failed = 0; - - for (qw/aborted cleared cancelled waiting/) { - my $key = $_ eq waiting ? 'other' : $_; - $id = `$test/glite-lb-$_.sh -m $server`; - chomp $id; - die "$test/glite-lb-$_.sh" if $?; - $id =~ s/EDG_JOBID=//; - $ids->{$key} = $id; -#print "$status $id | head -1\n"; - $stat = `$status $id | head -2 | tail -1`; - chomp $stat; - $stat =~ s/state :\s*//; -#print "$id: ".uc($stat)." ".uc($_)."\n"; - $failed = 1 if uc($stat) ne uc($_); - - system "$log $id | grep -v '^[ ]*\$' | grep -v '^Found' >${prefix}_$_"; - } - - !$failed; -} - -print "** Hey, purging the whole database\n"; -system "$purge --server $server --return-list --aborted=0 --cleared=0 --cancelled=0 --other=0"; -die "$purge: $!\n" if $!; - -print "** Logging test jobs\n"; - -die "!! failed\n" if !logit \%old,"${prefix}_old"; -print "** So far good, sleeping $delay seconds\n"; -sleep $delay; -print "** OK, another set of jobs\n"; -die "!! failed\n" if !logit \%new,"${prefix}_new"; - -print "** Dry run\n"; -$failed = 0; - -$half = $delay/2; -for (qw/aborted cleared cancelled other/) { - open LIST,"$purge --server $server --dry-run --return-list --$_=${half}s| grep '^https://'|" or die "!! run $purge\n"; - - $id = ; chomp $id; - if ($old{$_} ne $id) { - $failed = 1; - print "!! $old{$_} (old $_) is not there\n"; - } - else { - print "$_ $id OK\n"; - } - $id = ; - if ($id) { - $failed = 1; - chomp $id; - print "!! $id should not be there\n"; - } - close LIST; - - open LIST,"$purge --server $server --dry-run --return-list --$_=0s | grep '^https://'|" or die "!! run $purge\n"; - - $cnt = 0; - while ($id = ) { - chomp $id; - if ($old{$_} ne $id && $new{$_} ne $id) { - $failed = 1; - print "!! $id should not be there\n"; - } - else { - print "$_ $id OK\n"; - } - $cnt++; - } - - close LIST; - if ($cnt != 2) { - $failed = 1; - print "!! bad number of $_ jobs ($cnt)\n"; - } -} - -die "!! aborting\n" if $failed; - -print "** Server defaults\n"; - -open LIST,"$purge --server $server --dry-run --return-list | grep '^https://'|" or die "!! run $purge\n"; - -$failed = 0; -while ($id = ) { - $failed = 1; - print "$id\n"; -} - -die "!! Oops, should not do anything, too short defaults?\n" if $failed; - -print "Nothing purged as expected\n"; - -print "** Purge the first set of jobs\n"; - -open DUMP,"$purge --server $server --server-dump --aborted=${half}s --cleared=${half}s --cancelled=${half}s --other=${half}s | grep '^Server dump:'|" - or die "!! run $purge\n"; - -$dump = ; chomp $dump; $dump =~ s/Server dump: //; -close DUMP; - -die "!! no dump file reported\n" unless $dump; -#print "DEBUG: dump file: '$dump'\n"; -@list = glob "${prefix}_old*"; -system "cat @list | sort >${prefix}_old_all"; -system "cat $dump | sed -e s/^.*DATE/DATE/ | sort >${prefix}_old_dump"; -sleep 60; -system "diff ${prefix}_old_all ${prefix}_old_dump >/dev/null"; - -die "!! aggregate log and dump differ\n" if $? & 0xff00; - -print "diff OK\n"; - -print "** Purge the rest\n"; -open DUMP,"$purge --server $server --server-dump --aborted=0 --cleared=0 --cancelled=0 --other=0 | grep '^Server dump:'|" - or die "!! run $purge\n"; - -$dump = ; chomp $dump; $dump =~ s/Server dump: //; -close DUMP; - -die "!! no dump file reported\n" unless $dump; -#print "DEBUG: dump file: '$dump'\n"; -@list = glob "${prefix}_new*"; -system "cat @list | sort >${prefix}_new_all"; -system "cat $dump | sed -e s/^.*DATE/DATE/ | sort >${prefix}_new_dump"; -system "diff ${prefix}_new_all ${prefix}_new_dump >/dev/null"; - -die "!! aggregate log and dump differ\n" if $? & 0xff00; - -print "diff OK\n"; - - -print "** Anything left?\n"; -open LIST,"$purge --server $server --return-list --dry-run --aborted=0 --cleared=0 --cancelled=0 --other=0 | grep '^https://'|" or die "!! $purge\n"; - -$id = ; -close LIST; -die "!! Yes, but should not\n" if $id; -print "No, OK\n"; - -print "\n** All tests passed **\n"; -exit 0; - -END{ unlink glob "${prefix}*" if $prefix; } diff --git a/org.glite.lb.client/examples/query_ext.c b/org.glite.lb.client/examples/query_ext.c deleted file mode 100644 index 3443d33..0000000 --- a/org.glite.lb.client/examples/query_ext.c +++ /dev/null @@ -1,944 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#ifdef BUILDING_LB_CLIENT -#include "consumer.h" -#else -#include "glite/lb/consumer.h" -#endif - -#define BUFF_LEN 1024 -#define MAX_AND_CONDS 20 - -enum -{ - PQRV_ERR, - PQRV_EOF, - PQRV_EMPTY_LINE, -}; - - -static void printstat(edg_wll_JobStat); -static int cond_parse(edg_wll_QueryRec ***, int); -static void dgerr(edg_wll_Context, char *); -static void free_QueryRec(edg_wll_QueryRec *qr); -static void printconds(edg_wll_QueryRec **); -static time_t StrToTime(char *t); -static char *TimeToStr(time_t t); - -static char *myname; -static FILE *fin; -static char buffer[BUFF_LEN+1], - tmps[500]; -static int query_jobs = 1; -#define query_events (!query_jobs) -static int query_lbproxy = 0; -#define query_bkserver (!query_lbproxy) -static int verbose = 0; - - -static void usage(void) -{ - fprintf(stderr, "Usage: %s [-hvs] [-i file]\n", myname); - fprintf(stderr, " -h show this help\n"); - fprintf(stderr, " -v increase verbosity level\n"); - fprintf(stderr, " -s results described verbosely (query jobs only)\n"); - fprintf(stderr, " -m server name\n"); - fprintf(stderr, " -i file input file (default is stdin)\n\n"); - fprintf(stderr, " -e query events (default is 'query jobs')\n"); - fprintf(stderr, " -P query the L&B Proxy server\n"); - fprintf(stderr, " -p L&B Proxy socket path\n"); - fprintf(stderr, " -r type returned results: limited | all | none\n\n"); - fprintf(stderr, " -J num jobs soft limit\n\n"); - fprintf(stderr, " -E num events soft limit (query events only)\n\n"); -} - -int main(int argc,char *argv[]) -{ - edg_wll_Context ctx; - edg_wll_QueryResults rslts = EDG_WLL_QUERYRES_UNDEF; - edg_wll_QueryRec **jc = NULL, - **ec = NULL; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - edg_wll_Event *eventsOut = NULL; - char *fname = NULL, - *server = NULL, - *proxy_sock = NULL, - *s; - int result = 0, - jobsLimit = 0, - stdisp = 0, - eventsLimit = 0, - i, j, ret, - errCode; - - myname = argv[0]; - ret = 0; - do { - switch ( getopt(argc,argv,"hvsePp:i:m:r:J:E:") ) { - case 'h': usage(); exit(0); - case '?': usage(); exit(EINVAL); - case 'v': verbose = 1; break; - case 'i': fname = strdup(optarg); break; - case 'm': server = strdup(optarg); break; - case 's': stdisp = 1; break; - case 'e': query_jobs = 0; break; - case 'P': query_lbproxy = 1; break; - case 'p': proxy_sock = strdup(optarg); break; - case 'r': - if ( !strcasecmp(optarg, "limited") ) rslts = EDG_WLL_QUERYRES_LIMITED; - else if ( !strcasecmp(optarg, "none") ) rslts = EDG_WLL_QUERYRES_NONE; - else if ( !strcasecmp(optarg, "all") ) rslts = EDG_WLL_QUERYRES_ALL; - else { usage(); exit(EINVAL); } - break; - case 'J': jobsLimit = atoi(optarg); break; - case 'E': eventsLimit = atoi(optarg); break; - case -1: ret = 1; break; - } - } while ( !ret ); - - if ( edg_wll_InitContext(&ctx) ) { - if ( verbose ) fprintf(stderr,"%s: cannot initialize edg_wll_Context\n",myname); - exit(1); - } - - if ( jobsLimit > 0 ) { - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_JOBS_LIMIT, jobsLimit); - if ( verbose ) printf("Soft query limit for jobs: %d\n", jobsLimit); - } - else if ( verbose ) printf("Soft query limit for jobs not set\n"); - - if ( query_events ) { - if ( eventsLimit > 0 ) { - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_EVENTS_LIMIT, eventsLimit); - if ( verbose ) printf("Soft query limit for events: %d\n", eventsLimit); - } - else if ( verbose ) printf("Soft query limit for events not set\n"); - } - - if ( rslts != EDG_WLL_QUERYRES_UNDEF ) - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_RESULTS, rslts); - else - edg_wll_GetParam(ctx, EDG_WLL_PARAM_QUERY_RESULTS, &rslts); - - if ( verbose ) printf("When any limit overflows, the returned result set is: %s\n", - rslts==EDG_WLL_QUERYRES_LIMITED? "limited": - (rslts==EDG_WLL_QUERYRES_ALL? "unlimited": "empty")); - - if ( server ) { - char *p = strchr(server, ':'); - if ( p ) { - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, atoi(p+1)); - *p = 0; - } - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER, server); - free(server); - } - - if ( proxy_sock ) { - edg_wll_SetParam(ctx, EDG_WLL_PARAM_LBPROXY_SERVE_SOCK, proxy_sock); - free(proxy_sock); - } - - if ( fname ) { - fin = fopen(fname, "r"); - if ( !fin ) { - if ( verbose ) fprintf(stderr, "Can't open given input file %s. Using stdin.\n", fname); - fin = stdin; - } - free(fname); - } else { - if ( verbose ) fprintf(stderr, "No input file given. Using stdin.\n"); - fin = stdin; - } - - jobsOut = NULL; - statesOut = NULL; - eventsOut = NULL; - - - do - { - if ( verbose && (fin == stdin) ) printf("Enter job conditions:\n"); - - ret = cond_parse(&jc, 1); - if ( ret == PQRV_ERR ) { result = 1; goto cleanup; } - if ( query_events && (ret != PQRV_EOF) ) { - if ( verbose && (fin == stdin) ) printf("Enter event conditions:\n"); - ret = cond_parse(&ec, 0); - if ( ret == PQRV_ERR ) { result = 1; goto cleanup; } - } - - if ( (ret == PQRV_EOF) && !jc && (query_jobs || (query_events && !ec)) ) break; - - if ( verbose ) { - printf("job conditions list: "); - printconds(jc); - if ( query_events ) { printf("event condition list: "); printconds(ec); } - } - - if ( query_jobs ) { - if ( query_bkserver ) - errCode = edg_wll_QueryJobsExt(ctx, - (const edg_wll_QueryRec **) jc, - 0, &jobsOut, stdisp? &statesOut: NULL); - else - errCode = edg_wll_QueryJobsExtProxy(ctx, - (const edg_wll_QueryRec **) jc, - 0, &jobsOut, stdisp? &statesOut: NULL); - } else { - if ( query_bkserver ) - errCode = edg_wll_QueryEventsExt(ctx, - (const edg_wll_QueryRec **) jc, - (const edg_wll_QueryRec **) ec, - &eventsOut); - else - errCode = edg_wll_QueryEventsExtProxy(ctx, - (const edg_wll_QueryRec **) jc, - (const edg_wll_QueryRec **) ec, - &eventsOut); - } - - if ( errCode ) { - dgerr(ctx, NULL); - if ( (errCode != EPERM) && (errCode != E2BIG) ) goto cycle_cleanup; - } else if ( verbose ) { - if ( query_jobs ) printf("Matched jobs: "); - else printf("Matched events: "); - } - - if ( verbose ) { - if ( (query_jobs && jobsOut && jobsOut[0]) || - (query_events && eventsOut && eventsOut[0].type) ) - putchar('\n'); - else printf("No one matches\n"); - } - - if ( query_jobs && jobsOut && !stdisp ) { - for ( i = 0; jobsOut[i]; i++ ) { - s = edg_wlc_JobIdUnparse(jobsOut[i]); - printf("jobId: %s\n", edg_wlc_JobIdUnparse(jobsOut[i])); - free(s); - edg_wlc_JobIdFree(jobsOut[i]); - } - free(jobsOut); - jobsOut = NULL; - } - if ( query_jobs && statesOut ) { - if ( stdisp ) for ( i = 0; statesOut[i].state; i++ ) printstat(statesOut[i]); - for ( i = 0; statesOut[i].state; i++ ) edg_wll_FreeStatus(&statesOut[i]); - free(statesOut); - statesOut = NULL; - } - if ( query_events && eventsOut ) { - for ( i = 0; eventsOut[i].type; i++ ) { - s = edg_wlc_JobIdUnparse(eventsOut[i].any.jobId); - printf("event: %-11s (jobid %s)\n", edg_wll_EventToString(eventsOut[i].type), s); - free(s); - } - free(eventsOut); - eventsOut = NULL; - } - -cycle_cleanup: - if ( jc ) { - for ( i = 0; jc[i]; i++ ) { - for ( j = 0; jc[i][j].attr; j++ ) free_QueryRec(&jc[i][j]); - free(jc[i]); - } - free(jc); - } - - if ( ec ) { - for ( i = 0; ec[i]; i++ ) { - for ( j = 0; ec[i][j].attr; j++ ) free_QueryRec(&ec[i][j]); - free(ec[i]); - } - free(ec); - } - } while ( ret != PQRV_EOF ); - -cleanup: - if ( fin != stdin ) fclose(fin); - edg_wll_FreeContext(ctx); - - return result; -} - -static void free_QueryRec(edg_wll_QueryRec *qr) -{ - switch ( qr->attr ) - { - case EDG_WLL_QUERY_ATTR_JOBID: - case EDG_WLL_QUERY_ATTR_PARENT: - glite_jobid_free((glite_jobid_t)qr->value.j); - break; - - case EDG_WLL_QUERY_ATTR_STATUS: - case EDG_WLL_QUERY_ATTR_DONECODE: - case EDG_WLL_QUERY_ATTR_EXITCODE: - case EDG_WLL_QUERY_ATTR_RESUBMITTED: - break; - - case EDG_WLL_QUERY_ATTR_OWNER: - case EDG_WLL_QUERY_ATTR_LOCATION: - case EDG_WLL_QUERY_ATTR_DESTINATION: - case EDG_WLL_QUERY_ATTR_JDL_ATTR: - free(qr->value.c); - break; - - case EDG_WLL_QUERY_ATTR_USERTAG: - free(qr->attr_id.tag); - free(qr->value.c); - break; - - default: - break; - } -} - -#define isop(c) ((c == '=') || (c == '<') || (c == '>') || (c == '@')) - -static char *get_attr_name(char *src, char *dest, int sz) -{ - int i = 0, - ct = 0; - - - while ( (src[i] != '\0') && isblank(src[i]) ) i++; /* skip whitespaces */ - while ( (src[i] != '\n') && (src[i] != '\0') && !isop(src[i]) && !isblank(src[i]) ) - { - if ( ct < sz ) - dest[ct++] = src[i]; - i++; - } - dest[ct] = '\0'; - - return src+i; -} - -static char *get_op(char *src, edg_wll_QueryOp *op) -{ - int i = 0; - - - while ( (src[i] != '\0') && isblank(src[i]) ) i++; /* skip whitespaces */ - - if ( src[i] == '=' ) *op = EDG_WLL_QUERY_OP_EQUAL; - else if ( src[i] == '@' ) *op = EDG_WLL_QUERY_OP_WITHIN; - else if ( src[i] == '>' ) *op = EDG_WLL_QUERY_OP_GREATER; - else if ( src[i] == '<' ) - { - if ( (src[i+1] != '\0') && (src[++i] == '>') ) - *op = EDG_WLL_QUERY_OP_UNEQUAL; - else - *op = EDG_WLL_QUERY_OP_LESS; - } - else return NULL; - - return src+i+1; -} - -static char *get_attr_value(char *src, char *dest, int sz) -{ - int i = 0, - ct = 0; - - - while ( (src[i] != '\0') && isblank(src[i]) ) i++; /* skip whitespaces */ - if ( src[i] == '"' ) - { - i++; - while ( (src[i] != '\n') && (src[i] != '\0') && (src[i] != '"') ) - { - if ( ct < sz ) - dest[ct++] = src[i]; - i++; - } - dest[ct] = '\0'; - if ( src[i] != '"' ) - return NULL; - - return src+i+1; - } - - while ( (src[i] != '\n') && (src[i] != '\0') && (src[i] != ';') && !isblank(src[i]) ) - { - if ( ct < sz ) - dest[ct++] = src[i]; - i++; - } - dest[ct] = '\0'; - - return src+i; -} - -static char *get_job_condition(char *src, edg_wll_QueryRec *cond) -{ - char *s; - - - s = get_attr_name(src, tmps, 500); - - if ( tmps[0] == '\0' ) return NULL; - - if ( !strcmp(tmps, "jobid") ) cond->attr = EDG_WLL_QUERY_ATTR_JOBID; - else if ( !strcmp(tmps, "owner") ) cond->attr = EDG_WLL_QUERY_ATTR_OWNER; - else if ( !strcmp(tmps, "status") ) cond->attr = EDG_WLL_QUERY_ATTR_STATUS; - else if ( !strcmp(tmps, "location") ) cond->attr = EDG_WLL_QUERY_ATTR_LOCATION; - else if ( !strcmp(tmps, "destination") ) cond->attr = EDG_WLL_QUERY_ATTR_DESTINATION; - else if ( !strcmp(tmps, "done_code") ) cond->attr = EDG_WLL_QUERY_ATTR_DONECODE; - else if ( !strcmp(tmps, "exit_code") ) cond->attr = EDG_WLL_QUERY_ATTR_EXITCODE; - else if ( !strcmp(tmps, "parent_job") ) cond->attr = EDG_WLL_QUERY_ATTR_PARENT; - else if ( !strcmp(tmps, "time") ) cond->attr = EDG_WLL_QUERY_ATTR_TIME; - else if ( !strcmp(tmps, "state_enter_time") ) cond->attr = EDG_WLL_QUERY_ATTR_STATEENTERTIME; - else if ( !strcmp(tmps, "last_update_time") ) cond->attr = EDG_WLL_QUERY_ATTR_LASTUPDATETIME; - else if ( !strcmp(tmps, "jdl_attr") ) cond->attr = EDG_WLL_QUERY_ATTR_JDL_ATTR; - - - /**< When entered current status */ - /**< Time of the last known event of the job */ - /**< Network server aka RB aka WMproxy endpoint */ - - else - { - cond->attr = EDG_WLL_QUERY_ATTR_USERTAG; - cond->attr_id.tag = strdup(tmps); - } - - if ( !(s = get_op(s, &(cond->op))) ) return NULL; - - if ( !(s = get_attr_value(s, tmps, 500)) ) return NULL; - - switch ( cond->attr ) - { - case EDG_WLL_QUERY_ATTR_JOBID: - case EDG_WLL_QUERY_ATTR_PARENT: - if ( glite_jobid_parse(tmps, (glite_jobid_t *)&cond->value.j) ) - { - fprintf(stderr,"%s: %s: cannot parse jobId\n", myname, tmps); - return NULL; - } - break; - - case EDG_WLL_QUERY_ATTR_OWNER: - if ( !strcmp("NULL", tmps) ) - cond->value.c = NULL; - else if ( !(cond->value.c = strdup(tmps)) ) - return 0; - break; - - case EDG_WLL_QUERY_ATTR_LOCATION: - case EDG_WLL_QUERY_ATTR_DESTINATION: - case EDG_WLL_QUERY_ATTR_USERTAG: - if ( !(cond->value.c = strdup(tmps)) ) - return 0; - break; - - case EDG_WLL_QUERY_ATTR_JDL_ATTR: - if ( !(cond->value.c = strdup(tmps)) ) - return 0; - if ( !(s = get_attr_value(s, tmps, 500)) ) return NULL; - if ( tmps[0] == '\0' ) - { - fprintf(stderr,"%s: you need to specify attribute name\n", myname); - return NULL; - } - if ( !(cond->attr_id.tag = strdup(tmps)) ) - return 0; - break; - - case EDG_WLL_QUERY_ATTR_STATUS: - if ( !strcasecmp(tmps, "Submitted") ) cond->value.i = EDG_WLL_JOB_SUBMITTED; - else if ( !strcasecmp(tmps, "Waiting") ) cond->value.i = EDG_WLL_JOB_WAITING; - else if ( !strcasecmp(tmps, "Ready") ) cond->value.i = EDG_WLL_JOB_READY; - else if ( !strcasecmp(tmps, "Scheduled") ) cond->value.i = EDG_WLL_JOB_SCHEDULED; - else if ( !strcasecmp(tmps, "Running") ) cond->value.i = EDG_WLL_JOB_RUNNING; - else if ( !strcasecmp(tmps, "Done") ) cond->value.i = EDG_WLL_JOB_DONE; - else if ( !strcasecmp(tmps, "Aborted") ) cond->value.i = EDG_WLL_JOB_ABORTED; - else if ( !strcasecmp(tmps, "Cancelled") ) cond->value.i = EDG_WLL_JOB_CANCELLED; - else if ( !strcasecmp(tmps, "Cleared") ) cond->value.i = EDG_WLL_JOB_CLEARED; - else - { - fprintf(stderr,"%s: invalid status value (%s)\n", myname, tmps); - return 0; - } - break; - - case EDG_WLL_QUERY_ATTR_DONECODE: - case EDG_WLL_QUERY_ATTR_EXITCODE: - case EDG_WLL_QUERY_ATTR_RESUBMITTED: - cond->value.i = atoi(tmps); - if ( cond->op == EDG_WLL_QUERY_OP_WITHIN ) - { - if ( !(s = get_attr_value(s, tmps, 500)) ) return NULL; - if ( tmps[0] == '\0' ) - { - fprintf(stderr,"%s: second interval boundary not set\n", myname); - return NULL; - } - cond->value2.i = atoi(tmps); - } - break; - case EDG_WLL_QUERY_ATTR_TIME: - cond->value.t.tv_sec = StrToTime(tmps); - if ( cond->op == EDG_WLL_QUERY_OP_WITHIN ) - { - if ( !(s = get_attr_value(s, tmps, 500)) ) return NULL; - if ( tmps[0] == '\0' ) - { - fprintf(stderr,"%s: second interval boundary not set\n", myname); - return NULL; - } - cond->value2.t.tv_sec = StrToTime(tmps); - } - if ( !(s = get_attr_value(s, tmps, 500)) ) return NULL; - if ( tmps[0] == '\0' ) - { - fprintf(stderr,"%s: time condition must be associated with state condition\n", myname); - return NULL; - } - if ( !strcasecmp(tmps, "Submitted") ) cond->attr_id.state = EDG_WLL_JOB_SUBMITTED; - else if ( !strcasecmp(tmps, "Waiting") ) cond->attr_id.state = EDG_WLL_JOB_WAITING; - else if ( !strcasecmp(tmps, "Ready") ) cond->attr_id.state = EDG_WLL_JOB_READY; - else if ( !strcasecmp(tmps, "Scheduled") ) cond->attr_id.state = EDG_WLL_JOB_SCHEDULED; - else if ( !strcasecmp(tmps, "Running") ) cond->attr_id.state = EDG_WLL_JOB_RUNNING; - else if ( !strcasecmp(tmps, "Done") ) cond->attr_id.state = EDG_WLL_JOB_DONE; - else if ( !strcasecmp(tmps, "Aborted") ) cond->attr_id.state = EDG_WLL_JOB_ABORTED; - else if ( !strcasecmp(tmps, "Cancelled") ) cond->attr_id.state = EDG_WLL_JOB_CANCELLED; - else if ( !strcasecmp(tmps, "Cleared") ) cond->attr_id.state = EDG_WLL_JOB_CLEARED; - else - { - fprintf(stderr,"%s: invalid status value (%s)\n", myname, tmps); - return 0; - } - break; - - case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: - case EDG_WLL_QUERY_ATTR_STATEENTERTIME: - cond->value.t.tv_sec = StrToTime(tmps); - if ( cond->op == EDG_WLL_QUERY_OP_WITHIN ) - { - if ( !(s = get_attr_value(s, tmps, 500)) ) return NULL; - if ( tmps[0] == '\0' ) - { - fprintf(stderr,"%s: second interval boundary not set\n", myname); - return NULL; - } - cond->value2.t.tv_sec = StrToTime(tmps); - } - break; - - default: - break; - } - - while ( isblank(*s) || (*s == ';') ) s++; /* skip whitespaces */ - - return s; -} - -static char *get_event_condition(char *src, edg_wll_QueryRec *cond) -{ - char *s; - - - s = get_attr_name(src, tmps, 500); - - if ( tmps[0] == '\0' ) return NULL; - - if ( !strcmp(tmps, "time") ) cond->attr = EDG_WLL_QUERY_ATTR_TIME; - else if ( !strcmp(tmps, "state_enter_time") ) cond->attr = EDG_WLL_QUERY_ATTR_STATEENTERTIME; - else if ( !strcmp(tmps, "last_update_time") ) cond->attr = EDG_WLL_QUERY_ATTR_LASTUPDATETIME; - else if ( !strcmp(tmps, "jdl_attr") ) cond->attr = EDG_WLL_QUERY_ATTR_JDL_ATTR; - else if ( !strcmp(tmps, "level") ) cond->attr = EDG_WLL_QUERY_ATTR_LEVEL; - else if ( !strcmp(tmps, "host") ) cond->attr = EDG_WLL_QUERY_ATTR_HOST; - else if ( !strcmp(tmps, "source") ) cond->attr = EDG_WLL_QUERY_ATTR_SOURCE; - else if ( !strcmp(tmps, "instance") ) cond->attr = EDG_WLL_QUERY_ATTR_INSTANCE; - else if ( !strcmp(tmps, "event_type") ) cond->attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE; - else - { - cond->attr = EDG_WLL_QUERY_ATTR_USERTAG; - cond->attr_id.tag = strdup(tmps); - } - - if ( !(s = get_op(s, &(cond->op))) ) return NULL; - - if ( !(s = get_attr_value(s, tmps, 500)) ) return NULL; - - switch ( cond->attr ) - { - case EDG_WLL_QUERY_ATTR_USERTAG: - case EDG_WLL_QUERY_ATTR_HOST: - case EDG_WLL_QUERY_ATTR_INSTANCE: - case EDG_WLL_QUERY_ATTR_JDL_ATTR: - if ( !(cond->value.c = strdup(tmps)) ) - return 0; - break; - - case EDG_WLL_QUERY_ATTR_SOURCE: - if ( !strcasecmp(tmps, "UserInterface") ) cond->value.i = EDG_WLL_SOURCE_USER_INTERFACE; - else if ( !strcasecmp(tmps, "NetworkServer") ) cond->value.i = EDG_WLL_SOURCE_NETWORK_SERVER; - else if ( !strcasecmp(tmps, "WorkloadManager") ) cond->value.i = EDG_WLL_SOURCE_WORKLOAD_MANAGER; - else if ( !strcasecmp(tmps, "BigHelper") ) cond->value.i = EDG_WLL_SOURCE_BIG_HELPER; - else if ( !strcasecmp(tmps, "JobController") ) cond->value.i = EDG_WLL_SOURCE_JOB_SUBMISSION; - else if ( !strcasecmp(tmps, "LogMonitor") ) cond->value.i = EDG_WLL_SOURCE_LOG_MONITOR; - else if ( !strcasecmp(tmps, "LRMS") ) cond->value.i = EDG_WLL_SOURCE_LRMS; - else if ( !strcasecmp(tmps, "Application") ) cond->value.i = EDG_WLL_SOURCE_APPLICATION; - else - { - fprintf(stderr,"%s: invalid source value (%s)\n", myname, tmps); - return NULL; - } - break; - - case EDG_WLL_QUERY_ATTR_EVENT_TYPE: - case EDG_WLL_QUERY_ATTR_LEVEL: - cond->value.i = atoi(tmps); - if ( cond->op == EDG_WLL_QUERY_OP_WITHIN ) - { - if ( !(s = get_attr_value(s, tmps, 500)) ) return NULL; - if ( tmps[0] == '\0' ) - { - fprintf(stderr,"%s: second interval boundary not set\n", myname); - return NULL; - } - cond->value2.i = atoi(tmps); - } - break; - - case EDG_WLL_QUERY_ATTR_TIME: - cond->value.t.tv_sec = StrToTime(tmps); - if ( cond->op == EDG_WLL_QUERY_OP_WITHIN ) - { - if ( !(s = get_attr_value(s, tmps, 500)) ) return NULL; - if ( tmps[0] == '\0' ) - { - fprintf(stderr,"%s: second interval boundary not set\n", myname); - return NULL; - } - cond->value2.t.tv_sec = StrToTime(tmps); - } - break; - - default: - break; - } - - while ( isblank(*s) || (*s == ';') ) s++; /* skip whitespaces */ - - return s; -} - -static int cond_parse(edg_wll_QueryRec ***pcond, int jobs) -{ - edg_wll_QueryRec **cond = NULL; - int n, - icond, - ret; - char *s; - - - - n = 0; - if ( !(cond = malloc(sizeof(*cond))) ) - { - perror("cond_parse()"); - exit(ENOMEM); - } - - while ( 1 ) - { - if ( !fgets(buffer, BUFF_LEN, fin) ) - { - if ( !feof(fin) ) - { - fprintf(stderr, "parse_query_cond(): file reading error\n"); - exit(EINVAL); - } - - ret = PQRV_EOF; - goto cleanup; - } - - if ( buffer[0] == '\n' ) - { - ret = PQRV_EMPTY_LINE; - goto cleanup; - } - - if ( !(cond[n] = (edg_wll_QueryRec *) malloc(sizeof(edg_wll_QueryRec))) ) - { - perror("cond_parse()"); - exit(ENOMEM); - } - s = buffer; - icond = 0; - while ( 1 ) - { - if ( jobs ) - s = get_job_condition(s, &(cond[n][icond])); - else - s = get_event_condition(s, &(cond[n][icond])); - - if ( !s ) - { - free(cond[n]); - cond[n] = NULL; - ret = PQRV_ERR; - goto cleanup; - } - icond++; - if ( !(cond[n] = realloc(cond[n], (icond+1)*sizeof(edg_wll_QueryRec))) ) - { - perror("cond_parse()"); - exit(ENOMEM); - } - cond[n][icond].attr = EDG_WLL_QUERY_ATTR_UNDEF; - if ( (*s == '\n') || (*s == '\0') ) - break; - } - - n++; - if ( !(cond = realloc(cond, (n+1)*sizeof(*cond))) ) - { - perror("cond_parse()"); - exit(ENOMEM); - } - cond[n] = NULL; - } - -cleanup: - if ( !n ) - { - free(cond); - *pcond = NULL; - } - else - *pcond = cond; - - return ret; -} - -static void printconds(edg_wll_QueryRec **cond) -{ - int i, j; - int any = 0; - char *s; - - - if ( !cond ) - { - printf("empty\n"); - return ; - } - - for ( i = 0; cond[i]; i++ ) - { - if ( cond[i][0].attr ) - { - any = 1; - if ( i ) - printf(" AND ("); - else - printf("("); - } - for ( j = 0; cond[i][j].attr; j++ ) - { - if ( j ) - printf(" OR "); - switch ( cond[i][j].attr ) - { - case EDG_WLL_QUERY_ATTR_JOBID: printf("jobid"); break; - case EDG_WLL_QUERY_ATTR_OWNER: printf("owner"); break; - case EDG_WLL_QUERY_ATTR_STATUS: printf("status"); break; - case EDG_WLL_QUERY_ATTR_LOCATION: printf("location"); break; - case EDG_WLL_QUERY_ATTR_DESTINATION: printf("destination"); break; - case EDG_WLL_QUERY_ATTR_DONECODE: printf("done_code"); break; - case EDG_WLL_QUERY_ATTR_EXITCODE: printf("exit_code"); break; - case EDG_WLL_QUERY_ATTR_PARENT: printf("parent_job"); break; - case EDG_WLL_QUERY_ATTR_RESUBMITTED: printf("resubmitted"); break; - case EDG_WLL_QUERY_ATTR_USERTAG: printf("%s",cond[i][j].attr_id.tag); break; - case EDG_WLL_QUERY_ATTR_TIME: printf("time"); break; - case EDG_WLL_QUERY_ATTR_STATEENTERTIME: printf("state_enter_time"); break; - case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: printf("last_update_time"); break; - case EDG_WLL_QUERY_ATTR_JDL_ATTR: printf("jdl_attr"); break; - case EDG_WLL_QUERY_ATTR_LEVEL: printf("level"); break; - case EDG_WLL_QUERY_ATTR_HOST: printf("host"); break; - case EDG_WLL_QUERY_ATTR_SOURCE: printf("source"); break; - case EDG_WLL_QUERY_ATTR_INSTANCE: printf("instance"); break; - case EDG_WLL_QUERY_ATTR_EVENT_TYPE: printf("ev_type"); break; - default: break; - } - switch ( cond[i][j].op ) - { - case EDG_WLL_QUERY_OP_EQUAL: printf("="); break; - case EDG_WLL_QUERY_OP_UNEQUAL: printf("<>"); break; - case EDG_WLL_QUERY_OP_LESS: printf("<"); break; - case EDG_WLL_QUERY_OP_GREATER: printf(">"); break; - case EDG_WLL_QUERY_OP_WITHIN: printf("@"); break; - case EDG_WLL_QUERY_OP_CHANGED: printf("->"); break; - } - switch ( cond[i][j].attr ) - { - case EDG_WLL_QUERY_ATTR_JOBID: - case EDG_WLL_QUERY_ATTR_PARENT: - s = edg_wlc_JobIdUnparse(cond[i][j].value.j); - printf("%s", s); - free(s); - break; - case EDG_WLL_QUERY_ATTR_OWNER: - case EDG_WLL_QUERY_ATTR_LOCATION: - case EDG_WLL_QUERY_ATTR_DESTINATION: - case EDG_WLL_QUERY_ATTR_HOST: - case EDG_WLL_QUERY_ATTR_INSTANCE: - case EDG_WLL_QUERY_ATTR_USERTAG: - case EDG_WLL_QUERY_ATTR_JDL_ATTR: - printf("%s", cond[i][j].value.c); - break; - case EDG_WLL_QUERY_ATTR_STATUS: - case EDG_WLL_QUERY_ATTR_DONECODE: - case EDG_WLL_QUERY_ATTR_EXITCODE: - case EDG_WLL_QUERY_ATTR_RESUBMITTED: - case EDG_WLL_QUERY_ATTR_SOURCE: - if ( cond[i][j].op == EDG_WLL_QUERY_OP_WITHIN ) - printf("[%d,%d]", cond[i][j].value.i, cond[i][j].value2.i); - else - printf("%d", cond[i][j].value.i); - break; - case EDG_WLL_QUERY_ATTR_TIME: - if ( cond[i][j].op == EDG_WLL_QUERY_OP_WITHIN ) - { - printf("[%s,", TimeToStr(cond[i][j].value.t.tv_sec)); - printf("%s] & state = %d", TimeToStr(cond[i][j].value2.t.tv_sec), cond[i][j].attr_id.state); - } - else - printf("%s & state = %d", TimeToStr(cond[i][j].value.t.tv_sec), cond[i][j].attr_id.state); - break; - default: - break; - } - } - if ( j ) - printf(")"); - } - if ( any ) printf("\n"); -} - -static void printstat(edg_wll_JobStat stat) -{ - char *s, *j; - - - s = edg_wll_StatToString(stat.state); - printf("STATUS:\t%s\n\n",s); -/* print whole flat structure */ - printf("state : %s\n", s); - printf("jobId : %s\n", j = edg_wlc_JobIdUnparse(stat.jobId)); - printf("owner : %s\n", stat.owner); - printf("jobtype : %d\n", stat.jobtype); - if (stat.jobtype) {; - printf("seed : %s\n", stat.seed); - printf("children_num : %d\n", stat.children_num); -// XXX deal with subjobs (children, children_hist, children_states) - } - printf("condorId : %s\n", stat.condorId); - printf("globusId : %s\n", stat.globusId); - printf("localId : %s\n", stat.localId); - printf("jdl : %s\n", stat.jdl); - printf("matched_jdl : %s\n", stat.matched_jdl); - printf("destination : %s\n", stat.destination); - printf("network server : %s\n", stat.network_server); - printf("condor_jdl : %s\n", stat.condor_jdl); - printf("rsl : %s\n", stat.rsl); - printf("reason : %s\n", stat.reason); - printf("location : %s\n", stat.location); - printf("ce_node : %s\n", stat.ce_node); - printf("subjob_failed : %d\n", stat.subjob_failed); - printf("done_code : %d\n", stat.done_code); - printf("exit_code : %d\n", stat.exit_code); - printf("resubmitted : %d\n", stat.resubmitted); - printf("cancelling : %d\n", stat.cancelling); - printf("cancelReason : %s\n", stat.cancelReason); - printf("cpuTime : %d\n", stat.cpuTime); -// XXX user_tags user_values - printf("stateEnterTime : %ld.%06ld\n", stat.stateEnterTime.tv_sec,stat.stateEnterTime.tv_usec); - printf("lastUpdateTime : %ld.%06ld\n", stat.lastUpdateTime.tv_sec,stat.lastUpdateTime.tv_usec); - printf("expectUpdate : %d\n", stat.expectUpdate); - printf("expectFrom : %s\n", stat.expectFrom); - - free(j); - free(s); -} - -time_t StrToTime(char *t) -{ - struct tm tm; - - memset(&tm,0,sizeof(tm)); - setenv("TZ","UTC",1); - tzset(); - sscanf(t,"%4d-%02d-%02d %02d:%02d:%02d", - &tm.tm_year,&tm.tm_mon,&tm.tm_mday, - &tm.tm_hour,&tm.tm_min,&tm.tm_sec); - tm.tm_year -= 1900; - tm.tm_mon--; - - return mktime(&tm); -} - -static char tbuf[256]; - -char *TimeToStr(time_t t) -{ - struct tm *tm = gmtime(&t); - - sprintf(tbuf,"'%4d-%02d-%02d %02d:%02d:%02d'", - tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, - tm->tm_hour,tm->tm_min,tm->tm_sec); - - return tbuf; -} - -static void dgerr(edg_wll_Context ctx, char *where) -{ - char *errText, - *errDesc; - - - edg_wll_Error(ctx, &errText, &errDesc); - fprintf(stderr, "%s", errText); - if ( where ) - fprintf(stderr, ": %s", where); - if ( errDesc ) - fprintf(stderr, " (%s)\n", errDesc); - else - putc('\n', stderr); - free(errText); - free(errDesc); -} - diff --git a/org.glite.lb.client/examples/query_seq_code.c b/org.glite.lb.client/examples/query_seq_code.c deleted file mode 100644 index edc0840..0000000 --- a/org.glite.lb.client/examples/query_seq_code.c +++ /dev/null @@ -1,101 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#ifdef BUILDING_LB_CLIENT -#include "consumer.h" -#else -#include "glite/lb/consumer.h" -#endif - - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"sock", 1, NULL, 's'}, - {"jobid", 1, NULL, 'j'}, -}; - -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" - , me); -} - - -int main(int argc, char *argv[]) -{ - edg_wll_Context ctx; - edg_wlc_JobId jobid = NULL; - char *server, *jobid_s, *code; - int opt, err = 0; - - - server = code = jobid_s = NULL; - while ( (opt = getopt_long(argc, argv, "hs:j:c:n:v:", opts, NULL)) != EOF) - switch (opt) { - case 'h': usage(argv[0]); return 0; - case 's': server = strdup(optarg); break; - case 'j': jobid_s = strdup(optarg); break; - case '?': usage(argv[0]); return 1; - } - - if ( !jobid_s ) { fprintf(stderr, "JobId not given\n"); return 1; } - if ( !server ) { fprintf(stderr, "LB proxy socket not given\n"); return 1; } - - if ( (errno = edg_wlc_JobIdParse(jobid_s, &jobid)) ) { perror(jobid_s); return 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_SERVE_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); - } -*/ - if ( (err = edg_wll_QuerySequenceCodeProxy(ctx, jobid, &code)) ) { - char *et,*ed; - - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"%s: edg_wll_QuerySequenceCodeProxy(): %s (%s)\n", - argv[0],et,ed); - free(et); free(ed); - } - - if ( code ) { - puts(code); - free(code); - } - - edg_wll_FreeContext(ctx); - - return err; -} diff --git a/org.glite.lb.client/examples/ready.l b/org.glite.lb.client/examples/ready.l deleted file mode 100644 index 536f8a5..0000000 --- a/org.glite.lb.client/examples/ready.l +++ /dev/null @@ -1,18 +0,0 @@ -# macro definition for WAITING state - -:waiting: -# NetworkServer - --s NetworkServer,-e EnQueued, --queue="destination queue", --job="job description in receiver language", --result=OK, --reason="detailed description of transfer" -# -s NetworkServer,-e Transfer,--destination="WorkloadManager",--dest_host="destination hostname",--dest_instance="destination instance",--job="job description in receiver language",--result=OK,--reason="detailed description of transfer",--dest_jobid="destination internal jobid" - -# WorkloadManager - --s WorkloadManager,-e DeQueued, --queue="queue name", --local_jobid="new jobId assigned by the receiving component" --s WorkloadManager,-e HelperCall, --helper_name="name of the called component",--helper_params="parameters of the call", --src_role=CALLING -#-s Helper,-e HelperCall, --helper_name="name of the called component",--helper_params="parameters of the call", --src_role=CALLED -#-s Helper,-e HelperReturn, --helper_name="name of the called component",--retval="returned data", --src_role=CALLED --s WorkloadManager,-e Match,--dest_id="${DESTINATION:-destination CE/queue}" --s WorkloadManager,-e HelperReturn, --helper_name="name of the called component",--retval="returned data", --src_role=CALLING --s WorkloadManager,-e EnQueued, --queue="destination queue", --job="job description in receiver language", --result=OK, --reason="detailed description of transfer" - diff --git a/org.glite.lb.client/examples/ready_dag.l b/org.glite.lb.client/examples/ready_dag.l deleted file mode 100644 index aa7deae..0000000 --- a/org.glite.lb.client/examples/ready_dag.l +++ /dev/null @@ -1,13 +0,0 @@ -# macro definition for WAITING state - -:waiting_dag: -# NetworkServer - --s NetworkServer,-e EnQueued, --queue="destination queue", --job="job description in receiver language", --result=OK, --reason="detailed description of transfer" - -# WorkloadManager - --s WorkloadManager,-e DeQueued, --queue="queue name", --local_jobid="new jobId assigned by the receiving component" - --s WorkloadManager,-e EnQueued, --queue="destination queue", --job="job description in receiver language", --result=OK, --reason="detailed description of transfer" - diff --git a/org.glite.lb.client/examples/ready_subjob.l b/org.glite.lb.client/examples/ready_subjob.l deleted file mode 100644 index 3f40632..0000000 --- a/org.glite.lb.client/examples/ready_subjob.l +++ /dev/null @@ -1,8 +0,0 @@ -# macro definition for WAITING state - -:waiting_subjob: -# WorkloadManager - --s WorkloadManager,-e Match,--dest_id="Id of the destination CE/queue" --s WorkloadManager,-e HelperReturn, --helper_name="name of the called component",--retval="returned data", --src_role=CALLING - diff --git a/org.glite.lb.client/examples/resubmission.l b/org.glite.lb.client/examples/resubmission.l deleted file mode 100644 index b55f972..0000000 --- a/org.glite.lb.client/examples/resubmission.l +++ /dev/null @@ -1,19 +0,0 @@ -# one resubmission cycle - --s LogMonitor,-e EnQueued, --queue="wm_input.fl", --job="job description in receiver language", --result=OK, --reason="detailed description of transfer" - --s WorkloadManager,-e DeQueued, --queue="wm_input.fl", --local_jobid="WM_ID" --s WorkloadManager, -e Resubmission, --result=${RESUB:-WILLRESUB}, --reason="let's try again", --tag=none --s WorkloadManager,-e HelperCall, --helper_name="name of the called component",--helper_params="parameters of the call", --src_role=CALLING --s WorkloadManager,-e Match,--dest_id="${DESTINATION:-destination CE/queue}" --s WorkloadManager,-e HelperReturn, --helper_name="name of the called component",--retval="returned data", --src_role=CALLING --s WorkloadManager,-e EnQueued, --queue="wm_output.fl", --job="job description in receiver language", --result=OK, --reason="detailed description of transfer" - --s JobController,-e DeQueued, --queue="wm_output.fl", --local_jobid="JC_ID" --s JobController,-e Transfer,--destination="LRMS",--dest_host="destination hostname",--dest_instance="destination instance",--job="job description in receiver language",--result=OK,--reason="detailed description of transfer",--dest_jobid="destination internal jobid" - --s LogMonitor,-e Accepted, --from="JobController", --from_host="sending component hostname", --from_instance="sending component instance", --local_jobid="new jobId (Condor, Globus ...)" --s LogMonitor,-e Transfer,--destination="LRMS",--dest_host="destination hostname",--dest_instance="destination instance",--job="job description in receiver language",--result=OK,--reason="detailed description of transfer",--dest_jobid="destination internal jobid" - --s LogMonitor,-e Running,--node="${CE_NODE:-worker node}" - diff --git a/org.glite.lb.client/examples/resubmitted.l b/org.glite.lb.client/examples/resubmitted.l deleted file mode 100644 index df5d055..0000000 --- a/org.glite.lb.client/examples/resubmitted.l +++ /dev/null @@ -1,20 +0,0 @@ -# resubmitted job example - -! DESTINATION=CE1/queue1 -! CE_NODE=worker1 -:running: - --s LogMonitor, -e Done, --status_code=FAILED, --reason="reason for the change", --exit_code=141 --s LogMonitor, -e Resubmission, --result=WILLRESUB, --reason="let's try again", --tag=none - -! DESTINATION=CE2/queue2 -! CE_NODE=worker2 -:resubmission_deep: - --s LogMonitor, -e Done, --status_code=FAILED, --reason="reason for the change", --exit_code=141 --s LogMonitor, -e Resubmission, --result=WILLRESUB, --reason="let's try again", --tag=none - -! DESTINATION=CE3/queue3 -! CE_NODE=worker3 -:resubmission_deep: - diff --git a/org.glite.lb.client/examples/running.l b/org.glite.lb.client/examples/running.l deleted file mode 100644 index 60dfe6a..0000000 --- a/org.glite.lb.client/examples/running.l +++ /dev/null @@ -1,4 +0,0 @@ -# macro definition for RUNNING state - -:scheduled: --s LogMonitor,-e Running,--node="${CE_NODE:-worker node}" diff --git a/org.glite.lb.client/examples/running_dag.l b/org.glite.lb.client/examples/running_dag.l deleted file mode 100644 index 74e1efa..0000000 --- a/org.glite.lb.client/examples/running_dag.l +++ /dev/null @@ -1,4 +0,0 @@ -# macro definition for RUNNING state - -:scheduled_dag: --s LogMonitor,-e Running,--node"DAGMan running on server" diff --git a/org.glite.lb.client/examples/running_ft.l b/org.glite.lb.client/examples/running_ft.l deleted file mode 100644 index ad248c1..0000000 --- a/org.glite.lb.client/examples/running_ft.l +++ /dev/null @@ -1,4 +0,0 @@ -# macro definition for RUNNING state - -:submitted_ft_reg: --s Application, -e FileTransfer, --result=START, --reason="started" diff --git a/org.glite.lb.client/examples/running_subjob.l b/org.glite.lb.client/examples/running_subjob.l deleted file mode 100644 index c48ac45..0000000 --- a/org.glite.lb.client/examples/running_subjob.l +++ /dev/null @@ -1,4 +0,0 @@ -# macro definition for RUNNING state - -:scheduled_subjob: --s LogMonitor,-e Running,--node="worker node where the executable is run" diff --git a/org.glite.lb.client/examples/sandbox_transfers.sh b/org.glite.lb.client/examples/sandbox_transfers.sh deleted file mode 100644 index 798d052..0000000 --- a/org.glite.lb.client/examples/sandbox_transfers.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/sh -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - - -# Example script illustrating injection of LB commands into Job Wrapper -# to log sandbox transfer related events - -# It can be used as a submitted job to check the functionality, however, -# in this way it interferes with sequence codes logged by JW itself. -# Therefore it should be taken as an example only; the commands from here -# should end up in the generated job wrapper instead. - - -# register sandbox transfers with LB -# sets environment variables: -# GLITE_WMS_SEQUENCE_CODE updated seq. code for the job itself -# GLITE_LB_ISB_JOBID -# GLITE_LB_ISB_SEQUENCE - -eval `glite-lb-register_sandbox \ - --jobid $GLITE_WMS_JOBID \ - --input \ - --from http://users.machine/path/to/sandbox.file \ - --to file://where/it/is/sandbox.file \ - --sequence $GLITE_WMS_SEQUENCE_CODE` - - -eval `glite-lb-register_sandbox \ - --jobid $GLITE_WMS_JOBID \ - --output \ - --from file://where/it/is/sandbox.file2 \ - --to http://users.machine/path/to/sandbox.file2 \ - --sequence $GLITE_WMS_SEQUENCE_CODE` - -# ISB transfer -GLITE_LB_ISB_SEQUENCE=`glite-lb-logevent \ - --source LRMS \ - --jobid $GLITE_LB_ISB_JOBID \ - --sequence $GLITE_LB_ISB_SEQUENCE \ - --event FileTransfer \ - --result START` - -# it takes looong -sleep 60 - -GLITE_LB_ISB_SEQUENCE=`glite-lb-logevent \ - --source LRMS \ - --jobid $GLITE_LB_ISB_JOBID \ - --sequence $GLITE_LB_ISB_SEQUENCE \ - --event FileTransfer \ - --result OK` - -# or FAIL with --reason "because of bad weather" - -# job payload here -sleep 120 - - -GLITE_LB_OSB_SEQUENCE=`glite-lb-logevent \ - --source LRMS \ - --jobid $GLITE_LB_OSB_JOBID \ - --sequence $GLITE_LB_OSB_SEQUENCE \ - --event FileTransfer \ - --result START` - -sleep 60 - -GLITE_LB_OSB_SEQUENCE=`glite-lb-logevent \ - --source LRMS \ - --jobid $GLITE_LB_OSB_JOBID \ - --sequence $GLITE_LB_OSB_SEQUENCE \ - --event FileTransfer \ - --result OK` - diff --git a/org.glite.lb.client/examples/scheduled.l b/org.glite.lb.client/examples/scheduled.l deleted file mode 100644 index f269722..0000000 --- a/org.glite.lb.client/examples/scheduled.l +++ /dev/null @@ -1,13 +0,0 @@ -# macro definition for SCHEDULED state - -:ready: -# JobSubmition - --s JobController,-e DeQueued, --queue="queue name", --local_jobid="new jobId assigned by the receiving component" --s JobController,-e Transfer,--destination="LRMS",--dest_host="destination hostname",--dest_instance="destination instance",--job="job description in receiver language",--result=OK,--reason="detailed description of transfer",--dest_jobid="destination internal jobid" - -# LogMonitor - --s LogMonitor,-e Accepted, --from="JobController", --from_host="sending component hostname", --from_instance="sending component instance", --local_jobid="new jobId (Condor, Globus ...)" --s LogMonitor,-e Transfer,--destination="LRMS",--dest_host="destination hostname",--dest_instance="destination instance",--job="job description in receiver language",--result=OK,--reason="detailed description of transfer",--dest_jobid="destination internal jobid" - diff --git a/org.glite.lb.client/examples/scheduled_dag.l b/org.glite.lb.client/examples/scheduled_dag.l deleted file mode 100644 index 3d7e10d..0000000 --- a/org.glite.lb.client/examples/scheduled_dag.l +++ /dev/null @@ -1,12 +0,0 @@ -# macro definition for SCHEDULED state - -:ready_dag: -# JobSubmition - --s JobController,-e DeQueued, --queue="queue name", --local_jobid="new jobId assigned by the receiving component" --s JobController,-e Transfer,--destination="LogMonitor",--dest_host="destination hostname",--dest_instance="destination instance",--job="job description in receiver language",--result=START,--reason="detailed description of transfer",--dest_jobid="destination internal jobid" - -# LogMonitor - --s LogMonitor,-e Accepted, --from="JobController", --from_host="sending component hostname", --from_instance="sending component instance", --local_jobid="new jobId (Condor, Globus ...)" - diff --git a/org.glite.lb.client/examples/scheduled_subjob.l b/org.glite.lb.client/examples/scheduled_subjob.l deleted file mode 100644 index 76eeec5..0000000 --- a/org.glite.lb.client/examples/scheduled_subjob.l +++ /dev/null @@ -1,7 +0,0 @@ -# macro definition for SCHEDULED state - -:ready_subjob: -# LogMonitor - --s LogMonitor,-e Transfer,--destination="LRMS",--dest_host="destination hostname",--dest_instance="destination instance",--job="job description in receiver language",--result=OK,--reason="detailed description of transfer",--dest_jobid="destination internal jobid" - diff --git a/org.glite.lb.client/examples/shallow_and_full_resub.l b/org.glite.lb.client/examples/shallow_and_full_resub.l deleted file mode 100644 index c171348..0000000 --- a/org.glite.lb.client/examples/shallow_and_full_resub.l +++ /dev/null @@ -1,40 +0,0 @@ -# shallow resubmission job example - -! DESTINATION=CE1/queue1 -! CE_NODE=worker1 -:running: - --s LogMonitor, -e Done, --status_code=FAILED, --reason="reason for the change", --exit_code=141 --s LogMonitor, -e Resubmission, --result=WILLRESUB, --reason="let's try again", --tag=none - -! DESTINATION=CE2/queue2 -! CE_NODE=worker2 -! RESUB=SHALLOW -:resubmission: - --s LogMonitor, -e Done, --status_code=FAILED, --reason="reason for the change", --exit_code=141 --s LogMonitor, -e Resubmission, --result=WILLRESUB, --reason="let's try again", --tag=none - -! DESTINATION=CE3/queue3 -! CE_NODE=worker3 -! RESUB=SHALLOW -:resubmission: - --s LogMonitor, -e ReallyRunning, --wn_seq="$EDG_WL_SEQUENCE" - -# deep resubmission - --s LogMonitor, -e Done, --status_code=FAILED, --reason="reason for the change", --exit_code=141 --s LogMonitor, -e Resubmission, --result=WILLRESUB, --reason="let's try again", --tag=none - -! DESTINATION=CE2/queue2 -! CE_NODE=worker2 -! RESUB=DEEP -:resubmission: - -# payload_running=false -# destination=CE2/queue2 -# ce_node=worker2 -# possible_destinations=CE2/queue2 -# possible_ce_nodes=worker2 - diff --git a/org.glite.lb.client/examples/shallow_resub_complex.l b/org.glite.lb.client/examples/shallow_resub_complex.l deleted file mode 100644 index ba1201b..0000000 --- a/org.glite.lb.client/examples/shallow_resub_complex.l +++ /dev/null @@ -1,48 +0,0 @@ -# shallow resubmission job example - -! DESTINATION=CE1/queue1 -! CE_NODE=worker1 -! RESUB=SHALLOW -:running: - --s LogMonitor, -e Done, --status_code=FAILED, --reason="reason for the change", --exit_code=141 --s LogMonitor, -e Resubmission, --result=WILLRESUB, --reason="let's try again", --tag=none - -! DESTINATION=CE2/queue2 -! CE_NODE=worker2 -! RESUB=SHALLOW -:resubmission: -! BRANCH_SEQUENCE="$EDG_WL_SEQUENCE" - --s LogMonitor, -e Done, --status_code=FAILED, --reason="reason for the change", --exit_code=141 --s LogMonitor, -e Resubmission, --result=WILLRESUB, --reason="let's try again", --tag=none - -! DESTINATION=CE3/queue3 -! CE_NODE=worker3 -! RESUB=SHALLOW -:resubmission: - --s LogMonitor, -e ReallyRunning, --wn_seq="$BRANCH_SEQUENCE" - -# payload_running=true -# destination=CE2/queue2 -# ce_node=worker2 -# possible_destinations=CE1/queue1 CE2/queue2 CE3/queue3 -# possible_ce_nodes=worker1 worker2 worker3 - -# deep resubmission - --s LogMonitor, -e Done, --status_code=FAILED, --reason="reason for the change", --exit_code=141 --s LogMonitor, -e Resubmission, --result=WILLRESUB, --reason="let's try again", --tag=none - -! DESTINATION=CE4/queue4 -! CE_NODE=worker4 -! RESUB=DEEP -:resubmission: - -# payload_running=false -# destination=CE4/queue4 -# ce_node=worker4 -# possible_destinations=CE4/queue4 -# possible_ce_nodes=worker4 - diff --git a/org.glite.lb.client/examples/shallow_resub_simple.l b/org.glite.lb.client/examples/shallow_resub_simple.l deleted file mode 100644 index 134368f..0000000 --- a/org.glite.lb.client/examples/shallow_resub_simple.l +++ /dev/null @@ -1,30 +0,0 @@ -# shallow resubmission job example - -! DESTINATION=CE1/queue1 -! CE_NODE=worker1 -:running: - --s LogMonitor, -e Done, --status_code=FAILED, --reason="reason for the change", --exit_code=141 --s LogMonitor, -e Resubmission, --result=WILLRESUB, --reason="let's try again", --tag=none - -! DESTINATION=CE2/queue2 -! CE_NODE=worker2 -! RESUB=SHALLOW -:resubmission: - --s LogMonitor, -e Done, --status_code=FAILED, --reason="reason for the change", --exit_code=141 --s LogMonitor, -e Resubmission, --result=WILLRESUB, --reason="let's try again", --tag=none - -! DESTINATION=CE3/queue3 -! CE_NODE=worker3 -! RESUB=SHALLOW -:resubmission: - --s LogMonitor, -e ReallyRunning, --wn_seq="$EDG_WL_SEQUENCE" - -# payload_running=true -# destination=CE3/queue3 -# ce_node=worker3 -# possible_destinations=CE1/queue1 CE2/queue2 CE3/queue3 -# possible_ce_nodes=worker1 worker2 worker3 - diff --git a/org.glite.lb.client/examples/shallow_resub_simple2.l b/org.glite.lb.client/examples/shallow_resub_simple2.l deleted file mode 100644 index 1cb74c2..0000000 --- a/org.glite.lb.client/examples/shallow_resub_simple2.l +++ /dev/null @@ -1,31 +0,0 @@ -# shallow resubmission job example - -! DESTINATION=CE1/queue1 -! CE_NODE=worker1 -:running: - --s LogMonitor, -e Done, --status_code=FAILED, --reason="reason for the change", --exit_code=141 --s LogMonitor, -e Resubmission, --result=WILLRESUB, --reason="let's try again", --tag=none - -! DESTINATION=CE2/queue2 -! CE_NODE=worker2 -! RESUB=SHALLOW -:resubmission: -! BRANCH_SEQUENCE="$EDG_WL_SEQUENCE" - --s LogMonitor, -e Done, --status_code=FAILED, --reason="reason for the change", --exit_code=141 --s LogMonitor, -e Resubmission, --result=WILLRESUB, --reason="let's try again", --tag=none - -! DESTINATION=CE3/queue3 -! CE_NODE=worker3 -! RESUB=SHALLOW -:resubmission: - --s LogMonitor, -e ReallyRunning, --wn_seq="$BRANCH_SEQUENCE" - -# payload_running=true -# destination=CE2/queue2 -# ce_node=worker2 -# possible_destinations=CE1/queue1 CE2/queue2 CE3/queue3 -# possible_ce_nodes=worker1 worker2 worker3 - diff --git a/org.glite.lb.client/examples/stats.c b/org.glite.lb.client/examples/stats.c deleted file mode 100644 index 82cab20..0000000 --- a/org.glite.lb.client/examples/stats.c +++ /dev/null @@ -1,104 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include - -#ifdef BUILDING_LB_CLIENT -#include "statistics.h" -#else -#include "glite/lb/statistics.h" -#endif - - -int main(int argc,char **argv) -{ - edg_wll_Context ctx; - edg_wll_QueryRec group[2]; - time_t now,from,to; - char *cfrom,*cto; - int from_res,to_res; - float val; - - - edg_wll_InitContext(&ctx); - - if (argc < 3) { - fprintf(stderr,"usage: %s CE major [minor]\n",argv[0]); - return 1; - } - -/* the only supported grouping for now */ - group[0].attr = EDG_WLL_QUERY_ATTR_DESTINATION; - group[0].op = EDG_WLL_QUERY_OP_EQUAL; - group[0].value.c = argv[1]; - group[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - - time(&now); - to = now; - from = now - 60; - -/* not implemented yet - if (edg_wll_StateDuration(ctx,group,EDG_WLL_JOB_SCHEDULED,0, - &from,&to,&val,&from_res,&to_res)) - { - char *et,*ed; - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_StateDuration(): %s, %s\n",et,ed); - return 1; - } - - cfrom = strdup(ctime(&from)); - cto = strdup(ctime(&to)); - cfrom[strlen(cfrom)-1] = 0; - cto[strlen(cto)-1] = 0; - - printf("Average queue traversal time at \"%s\": %f s\n" - " Measuered from %s to %s\n" - " With resolution from %d to %d s\n", - argv[1],val,cfrom,cto,from_res,to_res); - -*/ - - to = now; - from = now - 60; - - if (edg_wll_StateRate(ctx,group,atoi(argv[2]),argc >=4 ? atoi(argv[3]) : 0, - &from,&to,&val,&from_res,&to_res)) - { - char *et,*ed; - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_StateRate(): %s, %s\n",et,ed); - return 1; - } - - cfrom = strdup(ctime(&from)); - cto = strdup(ctime(&to)); - cfrom[strlen(cfrom)-1] = 0; - cto[strlen(cto)-1] = 0; - - printf("Average failure rate at \"%s\": %f jobs/s\n" - " Measuered from %s to %s\n" - " With resolution from %d to %d s\n", - argv[1],val,cfrom,cto,from_res,to_res); - - return 0; -} - diff --git a/org.glite.lb.client/examples/stress_context.c b/org.glite.lb.client/examples/stress_context.c deleted file mode 100644 index c51b5d1..0000000 --- a/org.glite.lb.client/examples/stress_context.c +++ /dev/null @@ -1,131 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#ifdef BUILDING_LB_CLIENT -#include "producer.h" -#else -#include "glite/lb/producer.h" -#endif -#include "glite/lb/events.h" - -char *outfile = "context_errors"; -edg_wlc_JobId job; - -static int stop; - -struct { - int err; - char *text,*desc; -} *errors; - -int nerrors; - -static void killslaves(int sig) -{ - kill(0,SIGTERM); - exit(0); -} - -static void terminate(int sig) -{ - stop = sig; -} - -static void slave(int num) -{ - int good = 0,i; - char fname[PATH_MAX]; - FILE *errf; - edg_wll_Context ctx; - - signal(SIGINT,terminate); - signal(SIGTERM,terminate); - signal(SIGHUP,terminate); - - - while (!stop) { - edg_wll_InitContext(&ctx); - edg_wll_SetParam(ctx, EDG_WLL_PARAM_SOURCE, EDG_WLL_SOURCE_WORKLOAD_MANAGER); - - if (edg_wll_SetLoggingJobProxy(ctx,job,NULL,"/I/am/the/user",EDG_WLL_SEQ_NORMAL) && !stop) { - errors = realloc(errors,(nerrors+1) * sizeof(*errors)); - errors[nerrors].err = edg_wll_Error(ctx,&errors[nerrors].text,&errors[nerrors].desc); - nerrors++; - } - else good++; - - edg_wll_FreeContext(ctx); - } - - sprintf(fname,"%s_%03d",outfile,num); - errf = fopen(fname,"w"); - if (!errf) { perror(fname); exit(1); } - - for (i=0; i -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#ifdef BUILDING_LB_CLIENT -#include "producer.h" -#else -#include "glite/lb/producer.h" -#endif -#include "glite/lb/events.h" - -#define MAXMSGSIZE 10240 - -extern char *optarg; -extern int opterr,optind; - -extern int edg_wll_DoLogEvent(edg_wll_Context context, edg_wll_LogLine logline); -extern int edg_wll_DoLogEventServer(edg_wll_Context context, int flags,edg_wll_LogLine logline); - -static const char *me; - -static void usage() -{ - fprintf(stderr,"usage: %s -m bkserver [-x|-y] [-N numjobs] [-n subjobs (each)] -f file_name \n", me); - fprintf(stderr," - event file not containing DG.JOBID and without -x or -z not containing DG.USER\n"); -} - -int main(int argc, char *argv[]) -{ - char *job = NULL,*server = NULL,*seq = NULL,*filename = NULL; - char buf[MAXMSGSIZE]; - int lbproxy = 0, num_subjobs = 0, lbdirect = 0; - int done = 0, njobs = 1,i,j; - edg_wll_Context ctx; - edg_wlc_JobId jobid,*subjobs; - FILE *f; - - edg_wll_InitContext(&ctx); - - opterr = 0; - - me = strdup(argv[0]); - - do { - switch (getopt(argc,argv,"m:xyN:n:f:")) { - case 'm': server = strdup(optarg); break; - case 'x': lbproxy = 1; break; - case 'y': lbdirect = 1; break; - case 'N': njobs = atoi(optarg); break; - case 'n': num_subjobs = atoi(optarg); break; - case 'f': filename = (char *) strdup(optarg); break; - case '?': usage(); exit(EINVAL); - case -1: done = 1; break; - } - } while (!done); - - if (lbproxy && lbdirect) { - fprintf(stderr,"%s: only one of -x or -y options may be specified \n",me); - usage(); - exit(1); - } - - if (!server) { - fprintf(stderr,"%s: -m required\n",me); - usage(); - exit(1); - } - - if ((njobs <= 0) || (num_subjobs < 0)) { - fprintf(stderr,"%s: wrong number of jobs\n",me); - usage(); - exit(1); - } - - if (!filename) { - fprintf(stderr,"%s: -f required\n",me); - usage(); - exit(1); - } - - if ( (f = fopen(filename,"r")) == NULL) { - perror(filename); - exit(1); - } - -/* MAIN LOOP */ -for (i = 0; i -#include - -#include "notification.h" - -int main(int argc,char **argv) -{ - edg_wll_Context ctx; - edg_wll_QueryRec chj[2], chs[2]; - const edg_wll_QueryRec const *ch2[3] = { chj, chs, NULL }; - char *et,*ed; - edg_wll_NotifId id; - edg_wll_JobStat stat; - time_t valid = 0; - - edg_wll_InitContext(&ctx); - - memset(&chj,0,sizeof chj); - chj[0].op = EDG_WLL_QUERY_OP_CHANGED; - chj[0].attr = EDG_WLL_QUERY_ATTR_JDL_ATTR; - chj[0].attr_id.tag = NULL; - - memset(&chs,0,sizeof chs); - chs[0].op = EDG_WLL_QUERY_OP_EQUAL; - chs[0].attr = EDG_WLL_QUERY_ATTR_STATUS; - chs[0].value.i = EDG_WLL_JOB_WAITING; - - if (edg_wll_NotifNew(ctx,ch2,EDG_WLL_STAT_CLASSADS,-1,NULL,&id,&valid)) { - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_NotifNew(): %s %s\n",et,ed); - return 1; - } - - printf("notif %s\n",edg_wll_NotifIdUnparse(id)); - - for (;;) { - struct timeval tv = {120,0}; - if (edg_wll_NotifReceive(ctx,-1,&tv,&stat,&id)) { - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_NotifReceive(): %s %s\n",et,ed); - return 1; - } - - printf("JDL: %s\n",stat.jdl); - } -} diff --git a/org.glite.lb.client/examples/test_notif_rotate.pl b/org.glite.lb.client/examples/test_notif_rotate.pl deleted file mode 100755 index 698cae9..0000000 --- a/org.glite.lb.client/examples/test_notif_rotate.pl +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/perl -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use Socket; -use Fcntl; - -$notif = $ENV{NOTIFY_CMD} ? $ENV{NOTIFY_CMD} : './notify'; - -$notifid = shift or die "usage: $0 notifid\n"; - -socket SOCK,PF_INET,SOCK_STREAM,getprotobyname('tcp') || die "socket: $!\n"; -bind SOCK,sockaddr_in(0,INADDR_ANY) || die "bind: $!\n"; -listen SOCK,10; - -$fd = fileno SOCK; - -$flags = fcntl SOCK,F_GETFD,0; -fcntl SOCK,F_SETFD,$flags & ~FD_CLOEXEC; - - -$cmd = "$notif bind -s $fd $notifid"; - -system $cmd; - -die "failed $cmd\n" if $? == 1; -$ret = $? >> 8; -die "$cmd: $ret\n" if $ret; - -print "Bind ok. Press Enter ... "; <>; - -$fdin = ''; -vec($fdin,$fd,1) = 1; - -while (1) { - select($fdin,undef,undef,undef); - print "got connection\n"; - - $cmd = "$notif receive -s $fd -i 3"; - system $cmd; - die "failed $cmd\n" if $? == 1; - $ret = $? >> 8; - die "$cmd: $ret\n" if $ret; - -# print "Receive OK. Press Enter ..."; <>; -} - - diff --git a/org.glite.lb.client/examples/ulmfields.pl b/org.glite.lb.client/examples/ulmfields.pl deleted file mode 100644 index 3f4c1de..0000000 --- a/org.glite.lb.client/examples/ulmfields.pl +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/perl -n -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -BEGIN{ - @pf = split /,/,shift; -}; - -next if /^\s*$/; - -@F = split / /; - -undef $prev; -undef %f; - -for $f (@F) { - if ($f =~ /^[.A-Z_]+="/) { -# print $prev,"\n" if $prev; - @P = split /=/,$prev,2; - $f{$P[0]} = $P[1]; - $prev = $f; - } - else { $prev .= $f; } -} - -# print $prev,"\n"; -@P = split /=/,$prev,2; -$f{$P[0]} = $P[1]; - -for $f (@pf) { - print "$f=$f{$f}\n" if $f{$f}; -} -print "\n"; diff --git a/org.glite.lb.client/examples/user-jobs.pl b/org.glite.lb.client/examples/user-jobs.pl deleted file mode 100755 index 72a55d5..0000000 --- a/org.glite.lb.client/examples/user-jobs.pl +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/perl -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use SOAP::Lite; -use Data::Dumper; - -$ENV{HTTPS_CA_DIR}='/etc/grid-security/certificates'; - -# necessary to get compatible SSL handshake with the Globus server implementation -$ENV{HTTPS_VERSION}='3'; - -# a trick to make proxy credentials work -$proxy = $ENV{X509_USER_PROXY} ? $ENV{X509_USER_PROXY} : "/tmp/x509up_u$<"; -$ENV{HTTPS_CERT_FILE}= $ENV{HTTPS_KEY_FILE} = $ENV{HTTPS_CA_FILE} = $proxy; - -$server = shift or die "usage: $0 server\n"; - -# initialize the server handle, wsdl, and namespace -$c = SOAP::Lite - -> proxy($server) - -> uri('http://glite.org/wsdl/services/lb'); - -service $c 'http://egee.cesnet.cz/cms/export/sites/egee/en/WSDL/HEAD/LB.wsdl'; -ns $c 'http://glite.org/wsdl/elements/lb'; - -# setup trivial fault handler -on_fault $c sub { print Dumper($_[1]->fault); $fault = 1; }; - -# call the actual WS operation -$resp = UserJobs $c; - -$body = $resp->body(); - -# too much rubbish -# print Dumper $body; - -# follow the response structure and pick just jobids and states to print -unless ($fault) { - $njobs = $#{$body->{UserJobsResponse}->{jobs}}; - for ($i = 0; $i <= $njobs; $i++) { - print "$body->{UserJobsResponse}->{jobs}->[$i]\t", - $body->{UserJobsResponse}->{states} ? $body->{UserJobsResponse}->{states}->[$i]->{state} : '', - "\n"; - } -} - diff --git a/org.glite.lb.client/examples/user_jobs.c b/org.glite.lb.client/examples/user_jobs.c deleted file mode 100644 index 85186b6..0000000 --- a/org.glite.lb.client/examples/user_jobs.c +++ /dev/null @@ -1,127 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include - -#include "glite/lb/context.h" -#include "glite/lb/xml_conversions.h" -#ifdef BUILDING_LB_CLIENT -#include "consumer.h" -#else -#include "glite/lb/consumer.h" -#endif - -int use_proxy = 0; - -int (*user_jobs)(edg_wll_Context, edg_wlc_JobId **, edg_wll_JobStat **); - - -void -usage(char *me) -{ - fprintf(stderr,"usage: %s [-h] [-x] [userid]\n", me); -} - -int main(int argc,char **argv) -{ - edg_wll_Context ctx; - char *errt,*errd; - edg_wlc_JobId *jobs = NULL; - edg_wll_JobStat *states = NULL; - int i,j; - char *owner = NULL; - - user_jobs = edg_wll_UserJobs; - for ( i = 1; i < argc; i++ ) { - if ( !strcmp(argv[i], "-h") || !strcmp(argv[i], "--help") ) { - usage(argv[0]); - exit(0); - } else if ( !strcmp(argv[i], "-x") ) { - user_jobs = edg_wll_UserJobsProxy; - continue; - } - - owner = strdup(argv[i]); - break; - } - - edg_wll_InitContext(&ctx); - if ( user_jobs == edg_wll_UserJobsProxy && owner ) - edg_wll_SetParam(ctx, EDG_WLL_PARAM_LBPROXY_USER, owner); - - if (user_jobs(ctx,&jobs,&states)) goto err; - for (i=0; states[i].state != EDG_WLL_JOB_UNDEF; i++) { - char *id = edg_wlc_JobIdUnparse(states[i].jobId), - *st = edg_wll_StatToString(states[i].state); - - if (!states[i].parent_job) { - if (states[i].jobtype == EDG_WLL_STAT_SIMPLE) { - printf(" %s .... %s %s\n", id, st, (states[i].state==EDG_WLL_JOB_DONE) ? edg_wll_done_codeToString(states[i].done_code) : "" ); - } - else if ((states[i].jobtype == EDG_WLL_STAT_DAG) || - (states[i].jobtype == EDG_WLL_STAT_COLLECTION)) { - printf("%s %s .... %s %s\n", (states[i].jobtype==EDG_WLL_STAT_DAG)?"DAG ":"COLL",id, st, (states[i].state==EDG_WLL_JOB_DONE) ? edg_wll_done_codeToString(states[i].done_code) : ""); - for (j=0; states[j].state != EDG_WLL_JOB_UNDEF; j++) { - if (states[j].parent_job) { - char *par_id = edg_wlc_JobIdUnparse(states[j].parent_job); - - if (!strcmp(id,par_id)) { - char *sub_id = edg_wlc_JobIdUnparse(states[j].jobId), - *sub_st = edg_wll_StatToString(states[j].state); - - printf(" `- %s .... %s %s\n", sub_id, sub_st, (states[j].state==EDG_WLL_JOB_DONE) ? edg_wll_done_codeToString(states[j].done_code) : ""); - free(sub_id); - free(sub_st); - } - free(par_id); - } - } - } - } - - free(id); - free(st); - } - - printf("\nFound %d jobs\n",i); - -err: - free(owner); - if (jobs) { - for (i=0; jobs[i]; i++) edg_wlc_JobIdFree(jobs[i]); - free(jobs); - } - - if (states) { - for (i=0; states[i].state; i++) edg_wll_FreeStatus(&states[i]); - free(states); - } - - if (edg_wll_Error(ctx,&errt,&errd)) { - fprintf(stderr,"%s: %s (%s)\n",argv[0],errt,errd); - edg_wll_FreeContext(ctx); - return 1; - } - - edg_wll_FreeContext(ctx); - return 0; -} - diff --git a/org.glite.lb.client/examples/user_jobs_threaded.c b/org.glite.lb.client/examples/user_jobs_threaded.c deleted file mode 100644 index 14800e0..0000000 --- a/org.glite.lb.client/examples/user_jobs_threaded.c +++ /dev/null @@ -1,242 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include - -#include - -#include "glite/lb/context.h" -#include "glite/lb/xml_conversions.h" -#include "glite/security/glite_gss.h" -#include "consumer.h" - -int use_proxy = 0; - -int (*user_jobs)(edg_wll_Context, edg_wlc_JobId **, edg_wll_JobStat **); - - - -static const char *get_opt_string = "hxj:t:p:r:s:w:"; - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"proxy", 0, NULL, 'x'}, - {"owner", 1, NULL, 'o'}, - {"num-threads", 1, NULL, 't'}, - {"port_range", 1, NULL, 'p'}, - {"repeat", 1, NULL, 'r'}, - {"rand-start", 1, NULL, 's'}, -// {"rand-work", 1, NULL, 'w'}, - {NULL, 0, NULL, 0} -}; - - - -static void usage(char *me) -{ - fprintf(stderr,"usage: %s [option]\n" - "\t-h, --help\t show this help\n" - "\t-x, --proxy\t contact proxy (not implemented yet)\n" - "\t-o, --owner DN\t show jobs of user with this DN\n" - "\t-t, --num-threads N\t number for threads to create\n" - "\t-p, --port-range N\t connect to server:port, server:port+10, \n" - "\t\t\t ... server:port+N*10 bkservers\n" - "\t-r, --repeat N\t repeat query in each slave N-times \n" - "\t-s, --rand-start N\t start threads in random interval <0,N> sec\n" -// "\t-w, --rand-work N\t simulate random server respose time <0,N> sec\n" - "\n" - ,me); -} - - -typedef struct { - char *owner; - int proxy; - int rand_start; - int port_range; - int repeat; - char *argv_0;} thread_code_args; - -void *thread_code(thread_code_args *arguments) { - - edg_wll_Context ctx; - char *errt,*errd; - edg_wlc_JobId *jobs = NULL; - edg_wll_JobStat *states = NULL; - int i,j,k,port; - long sl; - - - sl = (unsigned long) ((double) random()/ RAND_MAX * arguments->rand_start * 1000000); - printf("Thread [%lu] - sleeping for %ld us\n",(unsigned long)pthread_self(),sl); - usleep( sl ); - - user_jobs = edg_wll_UserJobs; - - if (arguments->proxy) { - user_jobs = edg_wll_UserJobsProxy; - } - - edg_wll_InitContext(&ctx); - if ( user_jobs == edg_wll_UserJobsProxy && arguments->owner ) - edg_wll_SetParam(ctx, EDG_WLL_PARAM_LBPROXY_USER, arguments->owner); - - edg_wll_GetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, &port); - // pthread_self tend to return even number, so /7 makes some odd numbers... - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, - port + ((long) pthread_self()/7 % arguments->port_range)*10 ); - - for (k=0; krepeat; k++) { - if (user_jobs(ctx,&jobs,&states)) goto err; - for (i=0; states[i].state != EDG_WLL_JOB_UNDEF; i++) { - char *id = edg_wlc_JobIdUnparse(states[i].jobId), - *st = edg_wll_StatToString(states[i].state); - - if (!states[i].parent_job) { - if (states[i].jobtype == EDG_WLL_STAT_SIMPLE) { - printf(" %s .... %s %s\n", id, st, - (states[i].state==EDG_WLL_JOB_DONE) ? - edg_wll_done_codeToString(states[i].done_code) : "" ); - } - else if (states[i].jobtype == EDG_WLL_STAT_DAG) { - printf("DAG %s .... %s %s\n", id, st, - (states[i].state==EDG_WLL_JOB_DONE) ? - edg_wll_done_codeToString(states[i].done_code) : ""); - for (j=0; states[j].state != EDG_WLL_JOB_UNDEF; j++) { - if (states[j].parent_job) { - char *par_id = edg_wlc_JobIdUnparse(states[j].parent_job); - - if (!strcmp(id,par_id)) { - char *sub_id = edg_wlc_JobIdUnparse(states[j].jobId), - *sub_st = edg_wll_StatToString(states[j].state); - - printf(" `- %s .... %s %s\n", sub_id, sub_st, - (states[j].state==EDG_WLL_JOB_DONE) ? - edg_wll_done_codeToString(states[j].done_code) : ""); - free(sub_id); - free(sub_st); - } - free(par_id); - } - } - } - } - - free(id); - free(st); - } - - printf("\nFound %d jobs\n",i); - } -err: - free(arguments->owner); - if (jobs) { - for (i=0; jobs[i]; i++) edg_wlc_JobIdFree(jobs[i]); - free(jobs); - } - - if (states) { - for (i=0; states[i].state; i++) edg_wll_FreeStatus(&states[i]); - free(states); - } - - if (edg_wll_Error(ctx,&errt,&errd)) { - fprintf(stderr,"%s: %s (%s)\n",arguments->argv_0,errt,errd); - edg_wll_FreeContext(ctx); - pthread_exit(NULL); - } - - edg_wll_FreeContext(ctx); - -// printf("Thread %d exitting\n",(int)pthread_self()); - - pthread_exit(NULL); - -} - -int main(int argc,char **argv) -{ - thread_code_args arguments = { NULL, 0, 0, 1, 1,NULL }; - int i,rc,status,opt; - int thr_num = 10; // default - - - while ((opt = getopt_long(argc,argv,get_opt_string,opts,NULL)) != EOF) switch (opt) { - case 'x': arguments.proxy = 1; break; - case 'o': arguments.owner = optarg; break; - case 't': thr_num = atoi(optarg); break; - case 'p': arguments.port_range = atoi(optarg); break; - case 'r': arguments.repeat = atoi(optarg); break; - case 's': arguments.rand_start = atoi(optarg); break; - default : usage(argv[0]); exit(0); break; - } - - arguments.argv_0 = argv[0]; - - /* threads && Globus */ - if (edg_wll_gss_initialize()) { - printf("can't initialize GSS\n"); - return 1; - } - - /* Do a thready work */ - { - pthread_t threads[thr_num]; - pthread_attr_t attr; - - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); - - for (i=0;i 0) proxyFile = args[0]; - if (args.length > 1) endpoint = args[1]; - - ConsoleAppender ca = new ConsoleAppender(new org.apache.log4j.SimpleLayout()); -// ca.activateOptions(); - log.addAppender(ca); - - log.info("endpoint being used "+ endpoint); - if (proxyFile != null) log.info("proxy location being used " + proxyFile); - - URL url = new URL(endpoint); - int port = url.getPort(); - String protocol = url.getProtocol(); - String path = url.getPath(); - log.info(" port number "+ port + ", protocol ("+ protocol + "), path: " + path); - - System.setProperty("sslProtocol", "SSLv3"); - AxisProperties.setProperty("axis.socketSecureFactory","org.glite.security.trustmanager.axis.AXISSocketFactory"); - // certificate based authentication */ -// System.setProperty("sslCertFile","/home/valtri/.cert/hostcert.pem"); -// System.setProperty("sslKey","/home/valtri/.cert/hostkey.pem"); -// System.setProperty("sslKeyPasswd",""); - - // proxy based authentication - if (proxyFile != null) System.setProperty("gridProxyFile", proxyFile); - - try { - LoggingAndBookkeeping_ServiceLocator loc = new LoggingAndBookkeeping_ServiceLocator(); - String sn = loc.getLoggingAndBookkeepingWSDDServiceName(); - log.info(" service name " + sn); - - LoggingAndBookkeepingPortType stub = loc.getLoggingAndBookkeeping(url); - log.info(" got endpoint "); - - String version = stub.getVersion(null); - log.info("LB version "+ version); - JobStatus status = stub.jobStatus("https://scientific.civ.zcu.cz:9000/PnSBRXoIHVzX68H5vAtxmA", null); - log.info("job status "+ status); - } catch (AxisFault af) { - log.error( " AxisFault - " + af.getFaultString()); - af.printStackTrace(); - } - } -} diff --git a/org.glite.lb.client/examples/webservices/java/Makefile b/org.glite.lb.client/examples/webservices/java/Makefile deleted file mode 100644 index 4d3f24c..0000000 --- a/org.glite.lb.client/examples/webservices/java/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -CLASSPATH:=${shell echo `find lib -type f | tr '\n' ':'`build} -VPATH=src:build - -all: wsdl build - -wsdl: org/glite/wsdl/services/lb/stubs - -build: org/glite/wsdl/services/lb/example - -run: - if test -z "${FILE}" -o -z "${PASS}"; then echo 'Specify FILE and PASS variables.'; exit 1; fi - java -classpath $(CLASSPATH) org.glite.wsdl.services.lb.example.LBClientExample ${FILE} ${PASS} ${ENDPOINT} - -clean: - rm -rvf build/ - -org/glite/wsdl/services/lb/stubs: - java -classpath $(CLASSPATH) org.apache.axis.wsdl.WSDL2Java -v \ - --buildFile \ - --package org.glite.wsdl.services.lb.stubs \ - --output build \ - http://egee.cesnet.cz/cms/export/sites/egee/en/WSDL/HEAD/LB.wsdl - -org/glite/wsdl/services/lb/example: build/org/glite/wsdl/services/lb/stubs - -mkdir build - javac -classpath $(CLASSPATH) -d build src/*.java build/org/glite/wsdl/services/lb/{stubs,stubs/holders}/*.java - -.PHONY: all wsdl run clean diff --git a/org.glite.lb.client/examples/webservices/java/README b/org.glite.lb.client/examples/webservices/java/README deleted file mode 100644 index 0af4d6b..0000000 --- a/org.glite.lb.client/examples/webservices/java/README +++ /dev/null @@ -1,28 +0,0 @@ -How to build -============ - -1) copy following files to lib/ directory: - -axis-ant.jar -axis.jar -commons-discovery-0.2.jar -commons-logging-1.0.4.jar -jaxrpc.jar -log4j.properties -log4j-1.2.13.jar -saaj.jar -wsdl4j-1.5.1.jar - -2) generate source stubs and build the example by: - - make - - -Launch -====== - - make run FILE=file.p12 PASS=passphrase ENDPOINT=https://host:9003 - -or: - - java -cp `find lib -type f | tr '\n' ':'`:build org.glite.wsdl.services.lb.example.LBClientExample https://host:9003 diff --git a/org.glite.lb.client/examples/webservices/java/src/ExampleSSLSocketFactory.java b/org.glite.lb.client/examples/webservices/java/src/ExampleSSLSocketFactory.java deleted file mode 100644 index 711ab29..0000000 --- a/org.glite.lb.client/examples/webservices/java/src/ExampleSSLSocketFactory.java +++ /dev/null @@ -1,125 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.wsdl.services.lb.example; - -import org.apache.axis.components.net.BooleanHolder; -import org.apache.axis.components.net.DefaultSocketFactory; -import org.apache.axis.components.net.SecureSocketFactory; -import org.apache.log4j.Logger; - -import javax.net.ssl.*; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.net.SocketException; -import java.security.PrivateKey; -import java.security.cert.Certificate; -import java.security.cert.X509Certificate; -import java.util.ArrayList; -import java.util.Date; -import java.util.Hashtable; - -/** - * Factory for SSLSockets for Axis, which creates sockets for SSLv3 connection. - * Globus SSL libraries don't support SSLv2 initial packet, so SSLv2Hello protocol - * on SSLSocket must be disabled. - * - * @author Martin Kuba makub@ics.muni.cz - */ -public class ExampleSSLSocketFactory extends DefaultSocketFactory implements SecureSocketFactory { - - static Logger log = Logger.getLogger(ExampleSSLSocketFactory.class); - - static Certificate[] cChain = null; - static PrivateKey pKey = null; - static X509Certificate[] certAuths = null; - - static void registerForAxis(Certificate[] certs, PrivateKey privateKey, X509Certificate[] certificateAuthorities) { - log.debug("registering as Axis SecureSocketFactory"); - cChain = certs; - pKey = privateKey; - certAuths = certificateAuthorities; - System.setProperty("org.apache.axis.components.net.SecureSocketFactory", ExampleSSLSocketFactory.class.getName()); - } - - protected SSLSocketFactory sslFactory = null; - - public ExampleSSLSocketFactory(Hashtable attributes) throws Exception { - super(attributes); - SSLContext sctx = SSLContext.getInstance("SSL"); - KeyManager[] myKeys = new KeyManager[]{new MyX509KeyManager(cChain, pKey)}; - TrustManager[] myTrust = new TrustManager[]{new MyX509TrustManager(certAuths)}; - //init SSLContext with our keymanager and trustmanager, and default random device - sctx.init(myKeys, myTrust, null); - if (log.isDebugEnabled()) { - log.debug("attributes: " + attributes); - log.debug("SSLContext.provider: " + sctx.getProvider().getInfo()); - } - sslFactory = sctx.getSocketFactory(); - } - - - public Socket create(String host, int port, StringBuffer otherHeaders, BooleanHolder useFullURL) throws IOException, SocketException { - int i; - - log.debug("create(" + host + ":" + port + ")"); - //create SSL socket - SSLSocket socket = (SSLSocket) sslFactory.createSocket(); - //enable only SSLv3 - socket.setEnabledProtocols(new String[]{"SSLv3"}); // SSLv2Hello, SSLv3,TLSv1 - //enable only ciphers without RC4 (some bug, probably in older globus) - String[] ciphers = socket.getEnabledCipherSuites(); - ArrayList al = new ArrayList(ciphers.length); - for (i = 0; i < ciphers.length; i++) { - if (ciphers[i].indexOf("RC4") == -1) al.add(ciphers[i]); - } - socket.setEnabledCipherSuites((String [])al.toArray(new String[al.size()])); - //connect as client - socket.setUseClientMode(true); - socket.setSoTimeout(30000); //read timeout - socket.connect(new InetSocketAddress(host, port), 3000); //connect timeout - //create or join a SSL session - SSLSession sess = socket.getSession(); - if (sess == null) { - log.debug("sess is null"); - return socket; - } - - if (log.isDebugEnabled()) { - //print all we know - byte[] id = sess.getId(); - StringBuffer sb = new StringBuffer(id.length * 2); - for (i = 0; i < id.length; i++) { - sb.append(Integer.toHexString(id[i] < 0 ? 256 - id[i] : id[i])); - } - log.debug("SSLSession.id = " + sb.toString()); -// log.debug("peerHost:Port = " + sess.getPeerHost() + ":" + sess.getPeerPort()); - log.debug("cipherSuite = " + sess.getCipherSuite()); - log.debug("protocol = " + sess.getProtocol()); -// log.debug("isValid = " + sess.isValid()); - log.debug("creationTime = " + (new Date(sess.getCreationTime()))); - log.debug("lastAccessedTime= " + (new Date(sess.getLastAccessedTime()))); -// log.debug("applicationBufferSize= " + sess.getApplicationBufferSize()); -// log.debug("packetBufferSize= " + sess.getPacketBufferSize()); -// log.debug("localPrincipal= " + sess.getLocalPrincipal()); -// log.debug("peerPrincipal= " + sess.getPeerPrincipal()); - } - return socket; - } - -} diff --git a/org.glite.lb.client/examples/webservices/java/src/LBClientExample.java b/org.glite.lb.client/examples/webservices/java/src/LBClientExample.java deleted file mode 100644 index d442056..0000000 --- a/org.glite.lb.client/examples/webservices/java/src/LBClientExample.java +++ /dev/null @@ -1,96 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.wsdl.services.lb.example; - -import org.apache.log4j.Logger; -import org.glite.wsdl.services.lb.stubs.LoggingAndBookkeepingPortType; -import org.glite.wsdl.services.lb.stubs.LoggingAndBookkeeping_ServiceLocator; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URL; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; -import java.security.cert.Certificate; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; -import java.util.Enumeration; - -/** - * Example client of LoggingAndBookkeeping web service. Please note that the client depends - * only on Axis and Log4j libraries, it uses cryptography included in the JDK. - * - * @author Martin Kuba makub@ics.muni.cz - * @version $Id$ - */ -public class LBClientExample { - static Logger log = Logger.getLogger(LBClientExample.class); - - public static void main(String[] args) throws Exception { - if(args.length<2) { - System.out.println("usage: java LBClientExample []"); - System.exit(-1); - } - File keyfile = new File(args[0]); - String password = args[1]; - URL url = new URL("https://localhost:9003/"); - if(args.length==3) { - url = new URL(args[2]); - } - - //read in a keystore file - KeyStore ks = readKeyStoreFile(keyfile, password); - //find key alias (name) - String alias = null; - for (Enumeration en = ks.aliases(); en.hasMoreElements();) { - alias = (String)en.nextElement(); - if (ks.isKeyEntry(alias)) break; - else alias = null; - } - if (alias == null) throw new RuntimeException("the keystore contains no keys"); - //get my private key and certificates - Certificate[] certs = ks.getCertificateChain(alias); - PrivateKey key = (PrivateKey) ks.getKey(alias, password.toCharArray()); - //use my CA as the only trusted certificate authority - X509Certificate[] trustedCertAuths = new X509Certificate[]{(X509Certificate) certs[certs.length - 1]}; - - //register our SSL handling - ExampleSSLSocketFactory.registerForAxis(certs, key, trustedCertAuths); - - //get client stub - LoggingAndBookkeepingPortType lb = new LoggingAndBookkeeping_ServiceLocator().getLoggingAndBookkeeping(url); - - //call the service - String version = lb.getVersion(null); - System.out.println("LB version: " + version); - } - - public static KeyStore readKeyStoreFile(File ksfile, String password) throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException { - String kstype; - if (ksfile.getName().endsWith("ks")) kstype = "JKS"; - else if (ksfile.getName().endsWith(".p12")) kstype = "PKCS12"; - else throw new IOException("Only JKS (*ks) and PKCS12 (*.p12) files are supported "); - KeyStore store = KeyStore.getInstance(kstype); - store.load(new FileInputStream(ksfile), password != null ? password.toCharArray() : null); - return store; - } - -} diff --git a/org.glite.lb.client/examples/webservices/java/src/MyX509KeyManager.java b/org.glite.lb.client/examples/webservices/java/src/MyX509KeyManager.java deleted file mode 100644 index 6731c9a..0000000 --- a/org.glite.lb.client/examples/webservices/java/src/MyX509KeyManager.java +++ /dev/null @@ -1,81 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.wsdl.services.lb.example; - -import org.apache.log4j.Logger; - -import javax.net.ssl.X509KeyManager; -import java.net.Socket; -import java.security.Principal; -import java.security.PrivateKey; -import java.security.cert.Certificate; -import java.security.cert.X509Certificate; - -/** - * Implementation of X509KeyManager, which always returns one pair of a private key and certificate chain. - */ -public class MyX509KeyManager implements X509KeyManager { - static Logger log = Logger.getLogger(MyX509KeyManager.class); - private final X509Certificate[] certChain; - private final PrivateKey key; - - public MyX509KeyManager(Certificate[] cchain, PrivateKey key) { - this.certChain = new X509Certificate[cchain.length]; - System.arraycopy(cchain, 0, this.certChain, 0, cchain.length); - this.key = key; - } - - //not used - public String[] getClientAliases(String string, Principal[] principals) { - log.debug("getClientAliases()"); - return null; - } - - - // Intented to be implemented by GUI for user interaction, but we have only one key. - public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) { - if (log.isDebugEnabled()) { - log.debug("chooseClientAlias()"); - for (int i = 0; i < keyType.length; i++) log.debug("keyType[" + i + "]=" + keyType[i]); - for (int i = 0; i < issuers.length; i++) log.debug("issuers[" + i + "]=" + issuers[i]); - } - return "thealias"; - } - - //not used on a client - public String[] getServerAliases(String string, Principal[] principals) { - log.debug("getServerAliases()"); - return null; - } - - //not used on a client - public String chooseServerAlias(String string, Principal[] principals, Socket socket) { - log.debug("chooseServerAlias()"); - return null; - } - - public X509Certificate[] getCertificateChain(String alias) { - log.debug("getCertificateChain()"); - return certChain; - } - - public PrivateKey getPrivateKey(String alias) { - log.debug("getPrivateKey()"); - return key; - } -} diff --git a/org.glite.lb.client/examples/webservices/java/src/MyX509TrustManager.java b/org.glite.lb.client/examples/webservices/java/src/MyX509TrustManager.java deleted file mode 100644 index 3c218ce..0000000 --- a/org.glite.lb.client/examples/webservices/java/src/MyX509TrustManager.java +++ /dev/null @@ -1,100 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package org.glite.wsdl.services.lb.example; - -import org.apache.log4j.Logger; - -import javax.net.ssl.X509TrustManager; -import java.security.InvalidAlgorithmParameterException; -import java.security.NoSuchAlgorithmException; -import java.security.cert.*; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -/** - * Simple trust manager validating server certificates against supplied trusted CAs. - * - * @author Martin Kuba makub@ics.muni.cz - * @version $Id$ - */ -public class MyX509TrustManager implements X509TrustManager { - static Logger log = Logger.getLogger(MyX509TrustManager.class); - private final X509Certificate[] certificateAuthorities; - private final Set trustAnchors; - - /** - * Creates an instance with supplied trusted root CAs. - * @param certificateAuthorities - */ - public MyX509TrustManager(X509Certificate[] certificateAuthorities) { - int i; - - this.certificateAuthorities = certificateAuthorities; - this.trustAnchors = new HashSet(); - for (i = 0; i < certificateAuthorities.length; i++) { - this.trustAnchors.add(new TrustAnchor(certificateAuthorities[i], null)); - } - } - - //not used on a client - public X509Certificate[] getAcceptedIssuers() { - log.debug("getAcceptedIssuers()"); - return this.certificateAuthorities; - } - - //not used on a client - public void checkClientTrusted(X509Certificate[] certs, String authType) { - log.debug("checkClientTrusted()"); - } - - /** - * Validates certificate chain sent by a server against trusted CAs. - * @param certs - * @param authType - * @throws CertificateException - */ - public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException { - if (log.isDebugEnabled()) { - log.debug("checkServerTrusted(certs: "+ certs.length + ", authType=" + authType+")"); - for (int i = 0; i < certs.length; i++) { - log.debug("cert[" + i + "]=" + certs[i].getSubjectX500Principal().toString()); - } - } - //validate server certificate - try { - PKIXParameters pkixParameters = new PKIXParameters(this.trustAnchors); - pkixParameters.setRevocationEnabled(false); - CertificateFactory certFact = CertificateFactory.getInstance("X.509"); - CertPath path = certFact.generateCertPath(Arrays.asList(certs)); - CertPathValidator certPathValidator = CertPathValidator.getInstance("PKIX"); - certPathValidator.validate(path, pkixParameters); - } catch (NoSuchAlgorithmException e) { - log.error(e.getMessage(), e); - } catch (InvalidAlgorithmParameterException e) { - log.error(e.getMessage(), e); - } catch (CertPathValidatorException e) { - CertificateException ce; - log.error(e.getMessage(), e); - ce = new CertificateException(e.getMessage()); - ce.setStackTrace(e.getStackTrace()); - throw ce; - } - log.debug("server is trusted"); - } -} diff --git a/org.glite.lb.client/examples/webservices/java/src/log4j.properties b/org.glite.lb.client/examples/webservices/java/src/log4j.properties deleted file mode 100644 index cfdcee3..0000000 --- a/org.glite.lb.client/examples/webservices/java/src/log4j.properties +++ /dev/null @@ -1,30 +0,0 @@ -# Set root category priority to INFO and its only appender to CONSOLE. -# names CONSOLE, R, F are arbitrary -log4j.rootCategory=INFO, CONSOLE - -# Set the enterprise logger category to FATAL and its only appender to CONSOLE. -log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE -log4j.logger.org.apache.axis.utils.JavaUtils=FATAL -log4j.logger.org.glite.wsdl.services.lb=DEBUG - -# CONSOLE is set to be a ConsoleAppender using a PatternLayout. -log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender -log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout -#viz http://logging.apache.org/log4j/docs/api/org/apache/log4j/PatternLayout.html -# %d - date -# %t - thread -# %p - priority -# %c{1} - category (jmeno loggeru) s poctem zobrazovanych casti oddelenych teckou -# %m - message -# %n - line separator -log4j.appender.CONSOLE.layout.ConversionPattern=%d [%t] %-5p %c{1} - %m%n - -log4j.appender.F=org.apache.log4j.FileAppender -log4j.appender.F.File=txt.log -log4j.appender.F.layout=org.apache.log4j.PatternLayout -log4j.appender.F.layout.ConversionPattern=%d [%t] %-5p %c - %m%n - -log4j.appender.R=org.apache.log4j.DailyRollingFileAppender -log4j.appender.R.File=xml.log -log4j.appender.R.layout=org.apache.log4j.xml.XMLLayout -log4j.appender.R.DatePattern='.'yyyy-MM-dd diff --git a/org.glite.lb.client/interface/Event.h.T b/org.glite.lb.client/interface/Event.h.T deleted file mode 100644 index 9832182..0000000 --- a/org.glite.lb.client/interface/Event.h.T +++ /dev/null @@ -1,325 +0,0 @@ -#ifndef GLITE_LB_EVENT_HPP -#define GLITE_LB_EVENT_HPP - - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -/** @file Event.h - * @version $Revision$ - */ - -/* -@@@AUTO -*/ -@@@LANG: C++ - -#include -#include -#include - -#include "glite/jobid/JobId.h" - -#ifdef BUILDING_LB_COMMON -#include "CountRef.h" -#include "events.h" -#include "notifid.h" -#else -#include "glite/lb/CountRef.h" -#include "glite/lb/events.h" -#include "glite/lb/notifid.h" -#endif - -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; -public: - /** Event type codes - * identify which of the event fields are valid. - */ - enum Type { - UNDEF = 0, /**< Undefined event type. */ -@@@{ - for my $e ($event->getTypesOrdered) { - my $u = uc $e; - my $c = getTypeComment $event $e; - gen "\t\t$u = EDG_WLL_EVENT_$u,\t/**< $c */\n"; - } -@@@} - TYPE_MAX = EDG_WLL_EVENT__LAST /**< Limit for checking type validity. */ - }; - - /** 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 { -@@@{ - - require "../src/EventAttrNames.pl"; - my %EventAttrNums; - my $evno = 0; - for (@main::EventAttrNames) { - $EventAttrNums{$_} = $evno++; - } - - my $max = 0; - for (sort {$a cmp $b} getAllFields $event) { - my $u = $_; -# $u =~ s/([a-z])([A-Z])/$1_$2/g; - $u = uc $u; - - my $c = "\t/**\n"; - for my $t (sort $event->getFieldOccurence($_)) { - selectType $event $t; - my $cc = getFieldComment $event $_; - $t = 'common' if $t eq '_common_'; - $c .= "\t * \\n\[$t\] $cc\n"; - } - $c .= "\t */\n"; - - gen defined($EventAttrNums{$u}) ? - "$c\t\t$u = $EventAttrNums{$u},\n" : - "#error \"$u not defined in EventAttrNames\"\n"; - - $max = $EventAttrNums{$u} if defined($EventAttrNums{$u}) && $EventAttrNums{$u} > $max; - } - $max++; - gen "\t\tATTR_MAX = $max /**< Limit for checking attribute code validity. */\n"; -@@@} - }; - -@@@{ - for my $f (getAllFields $event) { - for my $t (getFieldOccurence $event $f) { - my $ff; - my $ut; - my $utf; - my $fc; - my $fn; - if ($t eq '_common_') { - $ff = $f; - $ut = ''; - $utf = ''; - $fc = ''; - } - else { - selectType $event $t; - selectField $event $f; - $ff = getField $event; - $ut = uc $t . '_'; - $utf = ucfirst $t; - $fc = $event->getFieldComment($f); - } - $fn = ucfirst $ff->{name}; - my @a = ($fn =~ /_(.)/g); - while (@a) { my $c = uc shift @a; $fn =~ s/_(.)/$c/; } - if ($ff->{codes}) { - gen qq{ -! /** $fc */ -! enum ${utf}${fn}Code \{ -}; - for (@{$ff->{codes}}) { - gen qq{ -! $ut$_->{name} = EDG_WLL_$ut$_->{name}, /**< $_->{comment} */ -}; - } - gen qq{ -! \}; -}; - unless ($main::defined_enums{$utf}) { - gen qq{/* backward compatibility */ -!\#define ${utf}Code ${utf}${fn}Code -! -}; - $main::defined_enums{$utf} = 1; - } - } - } - } -@@@} - - /** 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. */ - FLOAT_T, /**< Float value. */ - DOUBLE_T, /**< Double value. */ - }; - - 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. - * - * 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. - * - * 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. - * - * 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 float attribute. - * - * Retrieves value for attributes of float 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. - */ - float getValFloat(Attr name) const; - - /** Retrieve double attribute. - * - * Retrieves value for attributes of double 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. - */ - double getValDouble(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. - * - * 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 - * - * 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::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 attribute name. - * - */ - static const std::string & getAttrName(Attr name); - - /** 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 > & getAttrs(void) const; - - /** Event name. - * - * Retrieves string representation of the event type. - * \param[in] type Symbolic name of the event type. - * \returns String name of the event. - * \throw Exception Invalid event type. - * - */ - static const std::string getEventName(Type type); - -private: - std::string my_name; - static void destroyFlesh(void *); - CountRef *flesh; -}; - -EWL_END_NAMESPACE - -#endif /* GLITE_LB_EVENT_HPP */ diff --git a/org.glite.lb.client/interface/Job.h b/org.glite.lb.client/interface/Job.h deleted file mode 100644 index a9cb29a..0000000 --- a/org.glite.lb.client/interface/Job.h +++ /dev/null @@ -1,215 +0,0 @@ -#ifndef GLITE_LB_JOB_HPP -#define GLITE_LB_JOB_HPP - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include "glite/jobid/JobId.h" - - -#ifdef BUILDING_LB_CLIENT -#include "Event.h" -#include "JobStatus.h" -#include "ServerConnection.h" -#else -#include "glite/lb/Event.h" -#include "glite/lb/JobStatus.h" -#include "glite/lb/ServerConnection.h" -#endif - - -/** - * @file Job.h - * @version $Revision$ - */ - -EWL_BEGIN_NAMESPACE - -/** 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: - /** 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::jobid::JobId &jobid); - - - /** Destructor. - * - * All the actual work is done by member destructors, namely ServerConnection. - */ - ~Job(); - - /** 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::jobid::JobId &jobid); - - /* - * 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. - * - * 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 - * - * 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 &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 log(void) 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 queryListener(const std::string &name) 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::jobid::JobId jobId; -}; - -EWL_END_NAMESPACE - -#endif /* GLITE_LB_JOB_HPP */ diff --git a/org.glite.lb.client/interface/JobStatus.h.T b/org.glite.lb.client/interface/JobStatus.h.T deleted file mode 100644 index afe1d4e..0000000 --- a/org.glite.lb.client/interface/JobStatus.h.T +++ /dev/null @@ -1,328 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#ifndef GLITE_LB_JOBSTATUS_HPP -#define GLITE_LB_JOBSTATUS_HPP - -/* -@@@AUTO -*/ - -@@@LANG: C++ - -#include -#include -#include -#include - -#include "glite/jobid/JobId.h" - -#include "glite/lb/jobstat.h" -#include "glite/lb/CountRef.h" - -EWL_BEGIN_NAMESPACE; - -/** 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 RUNNING or * DONE, 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; -public: - - /** Symbolic names of job states. */ - enum Code { - UNDEF = 0, /**< Indicates invalid, i.e. uninitialized instance. */ -@@@{ - for my $stat ($status->getTypesOrdered) - { - my $u = uc($stat); - my $c = getTypeComment $status $stat; - gen qq{ -! $u, /**< $c */ -}; - } -@@@} - 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 { -@@@{ - require '../src/StatusAttrNames.pl'; - my %StatusAttrNums; - my $stno = 0; - for (@main::StatusAttrNames) { - $StatusAttrNums{$_} = $stno++; - } - - my $max = 0; - selectType $status '_common_'; - for my $u (sort {$a cmp $b} getAllFields $status) { - selectField $status $u; - my $f = getField $status; - $u =~ s/([a-z])([A-Z])/$1_$2/g; - $u = uc $u; - - gen defined($StatusAttrNums{$u}) ? - "\t/** $f->{comment} */\n\t\t$u = $StatusAttrNums{$u},\n" : - "#error \"$u not defined in StatusAttrNames\"\n"; - $max = $StatusAttrNums{$u} if defined($StatusAttrNums{$u}) && $StatusAttrNums{$u} > $max; - } - $max++; - gen "\t\tATTR_MAX = $max /**< Limit for range checking. */\n"; -@@@} - }; - -@@@{ - selectType $status '_common_'; - for my $n (getAllFields $status) { - selectField $status $n; - my $f = getField $status; - if ($f->{codes}) { - my $n = uc getName $f; - gen qq{ -! enum \{ -}; - for (@{$f->{codes}}) { - my $name = $_->{name}; - $name =~ tr/-/_/; - gen qq{ -! $n\_$name, /**< $_->{comment} */ -}; - } - gen qq{ -! \}; -}; - } - } -@@@} - /** 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, /**< struct timeval 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. */ - CCLASSAD_T /**< Unparsed classad */ - }; - - /** Numeric status code. - * - * This code represents the state of the job. - * \see Code. - */ - Code status; - - /** Get state name. - * - * Returns string representation of the job's state. - */ - const std::string & name(void) 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; - - /** 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; - - /** Access method for attribute values. - * - * Retrieve struct timeval 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; - - /** 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::jobid::JobId getValJobId(Attr name) const; - - /** Access method for attribute values. - * - * Retrieve bool 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; - - /** 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 getValIntList(Attr name) 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 getValStringList(Attr name) 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 > getValTagList(Attr name) 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 getValJobStatusList(Attr name) 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. - */ - static const std::string& getAttrName(Attr name); - - /** Find attribute by name (case insensitive) - * \param[in] name String name. - * \returns enum attr value. - * \throws LoggingException Invalid attribute name. - */ - static Attr attrByName(std::string const &); - - /** 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 >& getAttrs(void) const; - - /** Get name of state. - * - * Retrieve string representation of symbolic job state. - * \param[in] state Symbolic state name. - * \returns String state name. - * \throw Exception Invalid state. - * - */ - static const std::string &getStateName(Code state); - - /** Default constructor. - * - * Initializes an empty instance. - */ - JobStatus(void); - - /** 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. - * \param[in] destroy destroy src after use. - */ - JobStatus(const edg_wll_JobStat &src,int destroy = 1); - - /** 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: - edg_wll_JobStat *c_ptr(void); - -private: - static void destroyFlesh(void *); - CountRef *flesh; -}; - -EWL_END_NAMESPACE; - -#endif /* GLITE_LB_JOBSTATUS_HPP */ diff --git a/org.glite.lb.client/interface/Notification.h b/org.glite.lb.client/interface/Notification.h deleted file mode 100644 index b463592..0000000 --- a/org.glite.lb.client/interface/Notification.h +++ /dev/null @@ -1,119 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#ifndef GLITE_LB_NOTIFICATION_HPP -#define GLITE_LB_NOTIFICATION_HPP - - -#include "glite/jobid/JobId.h" - -#ifdef BUILDING_LB_CLIENT -#include "consumer.h" -#include "JobStatus.h" -#include "notification.h" -#else -#include "glite/lb/consumer.h" -#include "glite/lb/JobStatus.h" -#include "glite/lb/notification.h" -#endif - - -EWL_BEGIN_NAMESPACE - - -/** Manage LB notifications. - * Simplified API, covers only a subset of C API functinality - */ - -class Notification { -public: - /** Create an empty object - * to be used for new notifications, i.e. with Register() - */ - Notification(); - - /** Create from server host,port pair - * to be used for new notifications, i.e. with Register() - * \param[in] host host - * \param[in] port port - */ - Notification(const std::string host,const u_int16_t port); - - /** Create from NotifId - * to be used for existing notifications, i.e. with Bind() - * \param[in] notifId NotifId - */ - Notification(const std::string notifId); - - ~Notification(); - - std::string getNotifId() const; /**< retrieve NotifId */ - time_t getValid() const; /**< retrieve time until when it is valid */ - int getFd() const; /**< retrieve local listener filedescriptor */ - - /** 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::jobid::JobId &jobId); - - /** Remove job from the list, local op again. - * \param[in] jobId JobId - */ - void removeJob(const glite::jobid::JobId &jobId); - - /** Get jobs on the list */ - std::string getJobs(); - - /** Receive notifications on these states */ - void setStates(const std::vector &); - - /** Get states */ - std::string getStates(); - - /** Register (or re-register, i.e. change and extend) - * with the server - */ - void Register(); - - /** Bind to the existing notification at the server - * i.e. change the receiving local address - * \param[in] address address override - */ - void Bind(const std::string address); - - /** Receive notification. - * Blocks at most the specified timeout (maybe 0 for local polling). - * \retval 0 OK - * \retval 1 timeout - */ - int receive(glite::lb::JobStatus &,timeval &); - -private: - std::vector jobs; - std::vector states; - - edg_wll_Context ctx; - edg_wll_NotifId notifId; - time_t valid; -}; - - -EWL_END_NAMESPACE - -#endif /* GLITE_LB_NOTIFICATION_HPP */ diff --git a/org.glite.lb.client/interface/ServerConnection.h b/org.glite.lb.client/interface/ServerConnection.h deleted file mode 100644 index 6e38b82..0000000 --- a/org.glite.lb.client/interface/ServerConnection.h +++ /dev/null @@ -1,760 +0,0 @@ -#ifndef GLITE_LB_SERVERCONNECTION_HPP -#define GLITE_LB_SERVERCONNECTION_HPP - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -/** - * @file ServerConnection.h - * @version $Revision$ - */ - -#include -#include - -#include "glite/jobid/JobId.h" - - -#ifdef BUILDING_LB_CLIENT -#include "Event.h" -#include "JobStatus.h" -#include "consumer.h" -#else -#include "glite/lb/Event.h" -#include "glite/lb/JobStatus.h" -#include "glite/lb/consumer.h" -#endif - -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 &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 = EDG_WLL_QUERY_ATTR_JOBID, /**< Job id. */ - OWNER = EDG_WLL_QUERY_ATTR_OWNER, /**< Job owner (certificate subject). */ - STATUS = EDG_WLL_QUERY_ATTR_STATUS, /**< Current job status code. */ - LOCATION = EDG_WLL_QUERY_ATTR_LOCATION, /**< Where is the job being processed. */ - DESTINATION = EDG_WLL_QUERY_ATTR_DESTINATION, /**< Destination CE. */ - DONECODE = EDG_WLL_QUERY_ATTR_DONECODE, /**< Minor done status (OK,fail,cancel). */ - USERTAG = EDG_WLL_QUERY_ATTR_USERTAG, /**< User tag. */ - TIME = EDG_WLL_QUERY_ATTR_TIME, /**< Timestamp of the event. */ - LEVEL = EDG_WLL_QUERY_ATTR_LEVEL, /**< Logging level. */ - HOST = EDG_WLL_QUERY_ATTR_HOST, /**< Hostname where the event was generated. */ - SOURCE = EDG_WLL_QUERY_ATTR_SOURCE, /**< Source component that sent the event. */ - INSTANCE = EDG_WLL_QUERY_ATTR_INSTANCE, /**< Instance of the source component. */ - EVENT_TYPE = EDG_WLL_QUERY_ATTR_EVENT_TYPE, /**< Event type. */ - CHKPT = EDG_WLL_QUERY_ATTR_CHKPT_TAG, /**< Checkpoint tag. */ - RESUBMITTED = EDG_WLL_QUERY_ATTR_RESUBMITTED, /**< Job was resubmitted */ - PARENT = EDG_WLL_QUERY_ATTR_PARENT, /**< Id of the parent job. */ - EXITCODE = EDG_WLL_QUERY_ATTR_EXITCODE, /**< Job system exit code. */ - JDLATTR = EDG_WLL_QUERY_ATTR_JDL_ATTR, /**< Arbitrary JDL attribute */ - }; - - /** Symbolic names of predicates. - * - * These are the predicates used for creating atomic query - * conditions. - */ - enum Op { - 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 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::jobid::JobId &value); - - /* this one is for attr==TIME and particular state */ - /** 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 */ - /** 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 */ - /** 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(); - - /** 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: - - /* conversion to C API type */ - operator edg_wll_QueryRec() const; - -private: - Attr attr; - Op oper; - std::string tag_name; - int state; - std::string string_value; - glite::jobid::JobId jobid_value; - int int_value; - struct timeval timeval_value; - std::string string_value2; - int int_value2; - struct timeval timeval_value2; -}; - - -/** Supported aggregate operations. */ -enum AggOp { AGG_MIN=1, AGG_MAX, AGG_COUNT }; - - -/** - * 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 (cond1) or (cond2) - * \li conjunction of disjunctive queries, as in ( (cond1) - * or (cond2) ) and ( (cond3) or (cond4) ) - * 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. - * - * \throws Exception Always. - */ - ServerConnection(const std::string &); - - /** DEPRECATED. - * - * \throws Exception Always. - */ - void open(const std::string &); - - /** DEPRECATED. - * - * \throws Exception Always. - */ - void close(void); - - /* END DEPRECATED */ - - /* set & get parameter methods */ - - /** 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 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 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. - * \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 .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). - */ - std::vector > > - getIndexedAttrs(void); - - /* 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 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. - * \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& job_cond, - const std::vector& event_cond, - std::vector& events) const; - - /** Convenience form of queryEvents. - * - */ - const std::vector queryEvents(const std::vector& job_cond, - const std::vector& event_cond) const; - - /** Another modification of queryEvents. - * - * The same method, but the results are returned as a list - * instead of vector. - */ - const std::list queryEventsList(const std::vector& job_cond, - const std::vector& event_cond) const; - - - /** 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& job_cond, - const std::vector& event_cond, - enum AggOp const op, - std::string const attr) const; - - - /** Retrieve all events satisfying the conjunctive-disjunctive - * query. - * - * Returns all events belonging to the jobs specified by - * job_cond and satisfying query_cond. The - * conditions are given in conjunctive-disjunctive form - * ((cond1 OR cond2 OR ...) AND ...) - * \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 >& job_cond, - const std::vector >& event_cond, - std::vector& eventList) const; - - /** Convenience form of queryEvents. - * - * The same as previous, but the resulting vector is passed as - * a return value. - */ - const std::vector - queryEvents(const std::vector >& job_cond, - const std::vector >& event_cond) const; - - - /** 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& query, - std::vector& jobList) const; - - /** Convenience form of queryJobs. - * - * The same as above, but job id's are passed as a return - * value. - */ - const std::vector - queryJobs(const std::vector& query) const; - - - /** 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 >& query, - std::vector& jobList) const; - - /** Convenience form of queryJobs. - * - * Same as above, but result is passed as a retutrn value. - */ - const std::vector - queryJobs(const std::vector >& query) const; - - /** 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& query, - int flags, - std::vector & states) const; - - /** Convenience form of queryJobStates. - * - * Same as above, but the result is passed as a return value. - */ - const std::vector queryJobStates(const std::vector& query, - int flags) const; - - /** Convenience form of queryJobStates. - * - * Same as above, but results are returned as list instead of - * vector. - */ - const std::list queryJobStatesList(const std::vector& query, - int flags) const; - - /** 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 >& query, - int flags, - std::vector & states) const; - - /** Convenience form of queryJobStates. - * - * Same as above, but the result is passed as a return value. - */ - const std::vector - queryJobStates(const std::vector >& query, - int flags) const; - - /** 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& stateList) const; - const std::vector userJobStates() const; - - - /** 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 &jobs) const; - - /** Convenience form of userJobs. - * - * Same as above, but results are passed as a return value. - */ - const std::vector userJobs() 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 getContext(void) const; - -private: - edg_wll_Context context; -}; - -EWL_END_NAMESPACE - -#endif /* GLITE_LB_SERVERCONNECTION_HPP */ diff --git a/org.glite.lb.client/interface/connection.h b/org.glite.lb.client/interface/connection.h deleted file mode 100644 index 9109fda..0000000 --- a/org.glite.lb.client/interface/connection.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef GLITE_LB_CONNECTION_H -#define GLITE_LB_CONNECTION_H - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -int edg_wll_close(edg_wll_Context ctx,int *); -int edg_wll_open(edg_wll_Context ctx,int *); -int edg_wll_accept(edg_wll_Context ctx, int fd); -int edg_wll_http_send_recv(edg_wll_Context, char *, const char * const *, char *, char **, char ***, char **); - -int edg_wll_close_proxy(edg_wll_Context ctx); -int edg_wll_open_proxy(edg_wll_Context ctx); -int edg_wll_http_send_recv_proxy(edg_wll_Context, char *, const char * const *, char *, char **, char ***, char **); - -int http_check_status(edg_wll_Context, char *); - -int ConnectionIndex(edg_wll_Context ctx, const char *name, int port); -int AddConnection(edg_wll_Context ctx, char *name, int port); -int ReleaseConnection(edg_wll_Context ctx, char *name, int port); -int CloseConnection(edg_wll_Context ctx, int conn_index); -int CloseConnectionNotif(edg_wll_Context ctx); - -#define PROXY_CONNECT_RETRY 10 /* ms */ - - -#endif /* GLITE_LB_CONNECTION_H */ diff --git a/org.glite.lb.client/interface/consumer.h b/org.glite.lb.client/interface/consumer.h deleted file mode 100644 index c10329b..0000000 --- a/org.glite.lb.client/interface/consumer.h +++ /dev/null @@ -1,353 +0,0 @@ -#ifndef GLITE_LB_CONSUMER_H -#define GLITE_LB_CONSUMER_H - -/*! - * \file consumer.h - * \brief L&B consumer API - */ - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include "glite/jobid/cjobid.h" -#include "glite/lb/context.h" -#include "glite/lb/events.h" -#include "glite/lb/jobstat.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#include "glite/lb/query_rec.h" - -/** - * \defgroup Functions for 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 - *@{ - */ - -/** - * General query on events. - * 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[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, - const edg_wll_QueryRec * job_conditions, - const edg_wll_QueryRec * event_conditions, - 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, - const edg_wll_QueryRec ** event_conditions, - edg_wll_Event ** events -); - - -/** - * 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, - const edg_wll_QueryRec * job_conditions, - const edg_wll_QueryRec * event_conditions, - 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, - const edg_wll_QueryRec ** event_conditions, - edg_wll_Event ** events -); - -/** - * General query on jobs. - * Return jobs (and possibly their states) for which an event satisfying the conditions - * exists. - * \see edg_wll_QueryEvents - * \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, - const edg_wll_QueryRec * conditions, - int flags, - glite_jobid_t ** jobs, - 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, - int flags, - glite_jobid_t ** jobs, - edg_wll_JobStat ** states -); - - -/** - * 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, - const edg_wll_QueryRec * conditions, - int flags, - glite_jobid_t ** jobs, - 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, - int flags, - glite_jobid_t ** jobs, - edg_wll_JobStat ** states -); - -/** Return status of a single job. - * \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( - edg_wll_Context context, - glite_jobid_const_t jobid, - int flags, - edg_wll_JobStat *status -); - -/** - * 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, - glite_jobid_const_t jobid, - int flags, - edg_wll_JobStat *status -); - -/** - * Return all events related to a single job. - * Convenience wrapper around edg_wll_Query() - * \param[in] context context to work with - * \param[in] jobId job to query - * \param[out] events list of events - */ - -int edg_wll_JobLog( - edg_wll_Context context, - glite_jobid_const_t jobId, - edg_wll_Event ** events -); - - -/** - * 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, - glite_jobid_const_t jobId, - edg_wll_Event ** events -); - -/** - * All current user's jobs. - * \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, - glite_jobid_t ** jobs, - edg_wll_JobStat ** states -); - - -/** - * 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, - glite_jobid_t ** jobs, - edg_wll_JobStat ** states -); - -/** - * Server supported indexed attributes - * \see DataGrid-01-TEN-0125 - * \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 - */ -int edg_wll_GetIndexedAttrs( - edg_wll_Context context, - edg_wll_QueryRec ***attrs -); - -/** - * Retrieve limit on query result size (no. of events or jobs). - * \warning not implemented. - * \see DataGrid-01-TEN-0125 - * \param[in] context context to work with - * \param[out] limit server imposed limit - */ -int edg_wll_GetServerLimit( - edg_wll_Context context, - int *limit -); - -/** - * 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, - glite_jobid_const_t jobId, - const char * name, - char ** host, - uint16_t * port -); - - -/** - * Query LBProxy and use plain communication - */ -int edg_wll_QueryListenerProxy( - edg_wll_Context context, - glite_jobid_const_t jobId, - const char * name, - char ** host, - uint16_t * port -); - -/** - * Ask LB Proxy server for sequence number - * \param[in] context context to work with - * \param[in] jobId job to query - * \param[out] code sequence code - */ - - -int edg_wll_QuerySequenceCodeProxy( - edg_wll_Context context, - glite_jobid_const_t jobId, - char ** code -); - -/* - *@} 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 ** -); - -extern int http_check_status( - edg_wll_Context, - char * -); - -extern int set_server_name_and_port( - edg_wll_Context, - const edg_wll_QueryRec ** -); - -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* GLITE_LB_CONSUMER_H */ diff --git a/org.glite.lb.client/interface/notification.h b/org.glite.lb.client/interface/notification.h deleted file mode 100644 index 072c395..0000000 --- a/org.glite.lb.client/interface/notification.h +++ /dev/null @@ -1,208 +0,0 @@ -#ifndef GLITE_LB_NOTIFICATION_H -#define GLITE_LB_NOTIFICATION_H - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include "glite/jobid/cjobid.h" -#include "glite/lb/notifid.h" -#include "glite/lb/notif_rec.h" -#include "glite/lb/context.h" - -#ifdef BUILDING_LB_CLIENT -#include "consumer.h" -#else -#include "glite/lb/consumer.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** allocate memory for notification buffer using block of size XY -*/ -#define NOTIF_POOL_BUFFER_BLOCK_SIZE 16384 - -/** - * \defgroup notifications Notifications handling - * \brief Notifications handling. - *@{ - */ - -/** 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[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[in] flags verbosity of notifications - 0 - send basic job status info - EDG_WLL_STAT_CLASSADS - send also JDL in job status - * \param[in] fd = -1 create or reuse the default listening socket (one per context) - * >= 0 non-default listening socket - * \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[in,out] valid until when the registration is valid - in: requested validity (NULL means 'give me server defaults') - out: value really set on the server - * \param[out] id_out returened NotifId - * the value - * \retval 0 OK - * \retval EINVAL restrictions on conditions are not met - * - */ -int edg_wll_NotifNew( - edg_wll_Context context, - edg_wll_QueryRec const * const *conditions, - int flags, - int fd, - const char *address_override, - edg_wll_NotifId *id_out, - time_t *valid -); - - -/** Change the receiving local address. - * Report the new address to the server. - * - * \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,out] valid same as for \ref edg_wll_NotifNew - */ - -int edg_wll_NotifBind( - edg_wll_Context context, - const edg_wll_NotifId id, - int fd, - const char *address_override, - time_t *valid -); - -/** Modify the query conditions for this notification. - * - * If op is either EDG_WLL_NOTIF_ADD or EDG_WLL_NOTIF_REMOVE, for the sake - * of uniqueness the original conditions must have contained only a single - * OR-ed row of conditions on the attributes infolved in the change. - * - * \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, - * \see edg_wll_NotifChangeOp (defined in common notif_rec.h) - */ -int edg_wll_NotifChange( - edg_wll_Context context, - const edg_wll_NotifId id, - edg_wll_QueryRec const * const * conditions, - edg_wll_NotifChangeOp op -); - -/** Refresh the registration, i.e. extend its validity period. - * \param[in,out] context context to work with - * \param[in] id notification ID you are working with - * \param[in,out] valid same as for \ref edg_wll_NotifNew - */ - -int edg_wll_NotifRefresh( - edg_wll_Context context, - const edg_wll_NotifId id, - time_t *valid -); - -/** 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( - edg_wll_Context context, - edg_wll_NotifId id -); - -/** Receive notification. - * The first incoming notification is returned. - * \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 - */ - -int edg_wll_NotifReceive( - edg_wll_Context context, - int fd, - const struct timeval *timeout, - edg_wll_JobStat *state_out, - edg_wll_NotifId *id_out -); - - -/** Default socket descriptor where to select(2) for notifications. - * 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 - */ - -int edg_wll_NotifGetFd( - edg_wll_Context context -); - -/** Close the default local listening socket. - * 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 -); - -/** Close all connections in notifPool and free it. - * \param[in,out] context context to work with - */ - -int edg_wll_NotifClosePool( - edg_wll_Context context -); - - -/* - *@} end of group - */ - -#ifdef __cplusplus -} -#endif - -#endif /* GLITE_LB_NOTIFICATION_H */ diff --git a/org.glite.lb.client/interface/prod_proto.h b/org.glite.lb.client/interface/prod_proto.h deleted file mode 100644 index 08c0cee..0000000 --- a/org.glite.lb.client/interface/prod_proto.h +++ /dev/null @@ -1,138 +0,0 @@ -#ifndef GLITE_LB_PROD_PROTO_H -#define GLITE_LB_PROD_PROTO_H - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#ifdef __cplusplus -extern "C" { -#endif - -#include "glite/security/glite_gss.h" -#include "glite/lb/log_proto.h" -#include "glite/lb/context-int.h" - -#define PROXY_CONNECT_RETRY 10 /* ms */ - -/** - * connect to local-logger - * \param[in,out] ctx context to work with - * \param[out] conn opened connection (index in the connection pool) - * \return errno - */ -int edg_wll_log_connect(edg_wll_Context ctx, int *conn); - -/** - * close connection to local-logger - * \param[in,out] ctx context to work with - * \param[in] conn opened connection - * \return errno - */ -int edg_wll_log_close(edg_wll_Context ctx, int conn); - -/** - * write/send to local-logger - * \param[in,out] ctx context to work with - * \param[in] conn connection to use - * \param[in] logline message to send - * \return the number of bytes written (zero indicates nothing was written) or -1 on error - */ -int edg_wll_log_write(edg_wll_Context ctx, int conn, edg_wll_LogLine logline); - -/** - * read/receive answer (stored in context) from local-logger - * \param[in,out] ctx context to work with - * \param[in] conn connection to use - * \return the number of bytes read (zero indicates nothing was read) or -1 on error - */ -int edg_wll_log_read(edg_wll_Context ctx, int conn); - - -/** - * connect to lbproxy - * \param[in,out] ctx context to work with - * \param[out] conn opened connection - * \return errno - */ -int edg_wll_log_proxy_connect(edg_wll_Context ctx, edg_wll_PlainConnection *conn); - -/** - * close connection to lbproxy - * \param[in,out] ctx context to work with - * \param[out] conn opened connection - * \return errno - */ -int edg_wll_log_proxy_close(edg_wll_Context ctx, edg_wll_PlainConnection *conn); - -/** - * write/send to lbproxy - * \param[in,out] ctx context to work with - * \param[in] conn connection to use - * \param[in] logline message to send - * \return the number of bytes written (zero indicates nothing was written) or -1 on error - */ -int edg_wll_log_proxy_write(edg_wll_Context ctx, edg_wll_PlainConnection *conn, edg_wll_LogLine logline); - -/** - * read/receive from lbproxy - * \param[in,out] ctx context to work with - * \param[in] conn connection to use - * \return the number of bytes read (zero indicates nothing was read) or -1 on error - */ -int edg_wll_log_proxy_read(edg_wll_Context ctx, edg_wll_PlainConnection *conn); - - -/** - * connect to bkserver - * \param[in,out] ctx context to work with - * \param[out] conn opened connection - * \return errno - */ -int edg_wll_log_direct_connect(edg_wll_Context ctx, edg_wll_GssConnection *conn); - -/** - * close connection to bkserver - * \param[in,out] ctx context to work with - * \param[out] conn opened connection - * \return errno - */ -int edg_wll_log_direct_close(edg_wll_Context ctx, edg_wll_GssConnection *conn); - -/** - * write/send to bkserver - * \param[in,out] ctx context to work with - * \param[in] conn connection to use - * \param[in] logline message to send - * \return the number of bytes written (zero indicates nothing was written) or -1 on error - */ -int edg_wll_log_direct_write(edg_wll_Context ctx, edg_wll_GssConnection *conn, edg_wll_LogLine logline); - -/** - * read/receive from bkserver - * \param[in,out] ctx context to work with - * \param[in] conn connection to use - * \return the number of bytes read (zero indicates nothing was read) or -1 on error - */ -int edg_wll_log_direct_read(edg_wll_Context ctx, edg_wll_GssConnection *conn); - -#ifdef __cplusplus -} -#endif - -#endif /* GLITE_LB_PROD_PROTO_H */ diff --git a/org.glite.lb.client/interface/producer.h.T b/org.glite.lb.client/interface/producer.h.T deleted file mode 100644 index 05648c5..0000000 --- a/org.glite.lb.client/interface/producer.h.T +++ /dev/null @@ -1,393 +0,0 @@ -#ifndef GLITE_LB_PRODUCER_H -#define GLITE_LB_PRODUCER_H - -/** - * \file producer.h - * \brief client API for storing data into L&B service - */ - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* -@@@AUTO -*/ -@@@LANG: C - -#ifdef __cplusplus -extern "C" { -#endif - -#include "glite/lb/context.h" -#include "glite/lb/events.h" - -/* Event sources: */ - -#if 0 /* obsolete */ -#define EDG_WLL_SOURCE_UI "UserInterface" -#define EDG_WLL_SOURCE_RB "ResourceBroker" -#define EDG_WLL_SOURCE_JSS "JobSubmissionService" /* aka Condor-G */ -#define EDG_WLL_SOURCE_JOBMGR "GlobusJobmanager" -#define EDG_WLL_SOURCE_LRMS "LocalResourceManager" -#define EDG_WLL_SOURCE_APP "Application" - -#define EDG_WLL_SOURCE_NS "NetworkServer" -#define EDG_WLL_SOURCE_WM "WorkloadManager" -#define EDG_WLL_SOURCE_BH "BigHelper" -#define EDG_WLL_SOURCE_LM "LogMonitor" - -#endif - -/* edg_wll_LogEvent shortcuts */ -@@@{ -$PRINTPROTOTYPESONLY = 1; -$PRINTDOC = 1; - -require '../src/uiwrap.T'; - -@@@} - - -/** - * Formats a logging message and sends it asynchronously to local-logger - * (the connection is through GSS) - * \brief generic asynchronous logging function - * \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., - * \retval ENOMEM failed to allocate memory, - * \retval ECONNREFUSED cannot connect to the specified local logger, - * \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_LogEvent( - edg_wll_Context context, - edg_wll_EventCode event, - char *fmt, ...); - -/** - * Formats a logging message and sends it synchronously to local-logger - * (the connection is through GSS) - * \brief generic synchronous logging function - * \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., - * \retval ENOMEM failed to allocate memory, - * \retval ECONNREFUSED cannot connect to the specified local logger, - * \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, - * \retval EPERM the user is not authorized to add events to this job, - * \retval EDG_WLL_ERROR_DB_DUP_KEY exactly the same event has been already stored. - */ -extern int edg_wll_LogEventSync( - edg_wll_Context context, - edg_wll_EventCode event, - char *fmt, ...); - -/** - * Formats a logging message and sends it synchronously to L&B Proxy - * (the connection is through UNIX socket) - * \brief generic synchronous logging function - * \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., - * \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[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. - */ -extern int edg_wll_LogFlush( - edg_wll_Context context, - struct timeval *timeout); - - -/** - * Instructs interlogger to to deliver all pending events - * \brief flush all events from interlogger - * \note same as edg_wll_LogFlush() for all jobs known to interlogger - * \see edg_wll_LogFlush() - */ -extern int edg_wll_LogFlushAll( - edg_wll_Context context, - struct timeval *timeout); - -/** - * Set a current job for given context. - * \note Should be called before any logging call. - * \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, - glite_jobid_const_t job, - const char * code, - int flags -); - -/** - * Set a current job for given context. - * \note Should be called before any call logging to lbproxy. - * \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] user user credentials - * \param[in] flags flags on code handling (\see API documentation) - */ -extern int edg_wll_SetLoggingJobProxy( - edg_wll_Context context, - glite_jobid_const_t job, - const char * code, - const char * user, - int flags -); - -/** - * Register job with L&B service. - * Done via logging REGJOB event directly to LB server (the connection is asynchronous through GSS) - * - 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 the number of subjobs becomes known. - * - * \brief asynchronous job registration - * \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[out] subjobs returned subjob id's - */ - -/* backward compatibility */ -#define EDG_WLL_JOB_SIMPLE EDG_WLL_REGJOB_SIMPLE -#define edg_wll_RegisterJobAsync edg_wll_RegisterJob - -extern int edg_wll_RegisterJob( - edg_wll_Context context, - glite_jobid_const_t job, - enum edg_wll_RegJobJobtype type, - const char * jdl, - const char * ns, - int num_subjobs, - const char * seed, - glite_jobid_t ** subjobs -); - -#if 0 -DEPRECATED? -/** - * Synchronous variant of edg_wll_RegisterJob - */ - -extern int edg_wll_RegisterJobSync( - edg_wll_Context context, - glite_jobid_const_t job, - enum edg_wll_RegJobJobtype type, - const char * jdl, - const char * ns, - int num_subjobs, - const char * seed, - glite_jobid_t ** subjobs -); -#endif -#define edg_wll_RegisterJobSync edg_wll_RegisterJob - -/** - * Register job with L&B Proxy service. - * Done via logging REGJOB event in parallel both - * to LB proxy (through UNIX socket) and - * to LB server (through GSS) - * - 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[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[out] subjobs returned subjob id's - */ - -extern int edg_wll_RegisterJobProxy( - edg_wll_Context context, - glite_jobid_const_t job, - enum edg_wll_RegJobJobtype type, - const char * jdl, - const char * ns, - int num_subjobs, - const char * seed, - glite_jobid_t ** subjobs -); - -/** - * Job registration with an extra ACL specifying WMS to acces the job - * (the connection to LB server is asynchronous through GSS) - * \param[in] wms_dn DN of WMS handling the job - */ - -extern int edg_wll_RegisterJobExt( - edg_wll_Context context, - glite_jobid_const_t job, - enum edg_wll_RegJobJobtype type, - const char * jdl, - const char * ns, - int num_subjobs, - const char * seed, - glite_jobid_t ** subjobs, - char ** wms_dn, - int flags -); - -extern int edg_wll_RegisterJobProxyExt( - edg_wll_Context context, - glite_jobid_const_t job, - enum edg_wll_RegJobJobtype type, - const char * jdl, - const char * ns, - int num_subjobs, - const char * seed, - glite_jobid_t ** subjobs, - char ** wms_dn, - int flags -); - -#ifdef LB_PERF -/* register only to LBProxy */ -/* useful for performance measurements */ - -extern int edg_wll_RegisterJobProxyOnly( - edg_wll_Context context, - glite_jobid_const_t job, - enum edg_wll_RegJobJobtype type, - const char * jdl, - const char * ns, - int num_subjobs, - const char * seed, - glite_jobid_t ** subjobs -); -#endif - - - -/** - * 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[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[in] subjobs array of jobid's in the same order - */ - -extern int edg_wll_RegisterSubjobs( - edg_wll_Context context, - glite_jobid_const_t parent, - char const * const * jdls, - const char * ns, - glite_jobid_t const * subjobs -); - - -/** - * Register subjobs to LB Proxyin a batch. - * Mainly used to provide JDL's of individual subjobs in a more efficient - * way than logging them one by one. - * \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[in] subjobs array of jobid's in the same order - */ - -extern int edg_wll_RegisterSubjobsProxy( - edg_wll_Context context, - glite_jobid_const_t parent, - char const * const * jdls, - const char * ns, - glite_jobid_t const * subjobs -); - - -/** - * Change ACL for given job. - * \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[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( - edg_wll_Context context, - glite_jobid_const_t job, - const char * user_id, - enum edg_wll_ChangeACLUser_id_type user_id_type, - enum edg_wll_ChangeACLPermission permission, - enum edg_wll_ChangeACLPermission_type permission_type, - enum edg_wll_ChangeACLOperation operation -); - - -#ifdef __cplusplus -} -#endif - -#endif /* GLITE_LB_PRODUCER_H */ diff --git a/org.glite.lb.client/interface/stat_fields.h b/org.glite.lb.client/interface/stat_fields.h deleted file mode 100644 index 2b1f5f7..0000000 --- a/org.glite.lb.client/interface/stat_fields.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#ifdef __cplusplus -extern "C" { -#endif - -char * glite_lb_parse_stat_fields(const char *,void **); -void glite_lb_print_stat_fields(void **,edg_wll_JobStat *); -void glite_lb_dump_stat_fields(void); - -#include - -static char *TimeToStr(time_t t) -{ - struct tm *tm = gmtime(&t); - static char tbuf[1000]; - - sprintf(tbuf,"'%4d-%02d-%02d %02d:%02d:%02d UTC'", - tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, - tm->tm_hour,tm->tm_min,tm->tm_sec); - - return tbuf; -} - - -#ifdef __cplusplus -} -#endif diff --git a/org.glite.lb.client/interface/statistics.h b/org.glite.lb.client/interface/statistics.h deleted file mode 100644 index e7c8342..0000000 --- a/org.glite.lb.client/interface/statistics.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#ifndef GLITE_LB_STATISTICS_H -#define GLITE_LB_STATISTICS_H - -#ifdef BUILDING_LB_CLIENT -#include "consumer.h" -#else -#include "glite/lb/consumer.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** Count the number of jobs which entered the specified state. - * \param[in] group group of jobs of interest, eg. DESTINATION = something - * (XXX: this is the only query supported right now) - * \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[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( - edg_wll_Context context, - const edg_wll_QueryRec *group, - edg_wll_JobStatCode major, - int minor, - time_t *from, - time_t *to, - float *rate, - int *res_from, - int *res_to -); - - -/** Compute average time for which jobs stay in the specified state. - * \see edg_wll_StateRate for description of parameters. - */ - -int edg_wll_StateDuration( - edg_wll_Context context, - const edg_wll_QueryRec *group, - edg_wll_JobStatCode major, - int minor, - time_t *from, - time_t *to, - float *duration, - int *res_from, - int *res_to -); - - - -#ifdef __cplusplus -} -#endif - -#endif /* GLITE_LB_CONSUMER_H */ diff --git a/org.glite.lb.client/m4/glite_lb.m4 b/org.glite.lb.client/m4/glite_lb.m4 deleted file mode 100644 index 0c81292..0000000 --- a/org.glite.lb.client/m4/glite_lb.m4 +++ /dev/null @@ -1,172 +0,0 @@ -AC_DEFUN([GLITE_CHECK_LB_COMMON], -[AC_MSG_CHECKING([for org.glite.lb.common]) -save_CPPFLAGS=$CPPFLAGS -CPPFLAGS="$CPPFLAGS $GLITE_CPPFLAGS" -save_LDFLAGS=$LDFLAGS -LDFLAGS="$LDFLAGS $GLITE_LDFLAGS" -save_LIBS=$LIBS - -AC_LANG_PUSH([C]) - -# prepare the test program, to link agains the different combinations -# of globus flavours - -AC_LANG_CONFTEST( - [AC_LANG_PROGRAM( - [@%:@include "glite/lb/context.h"], - [edg_wll_InitContext((edg_wll_Context*)0)] - )] -) - -LIBS="-lglite_lb_common_$GLOBUS_THR_FLAVOR $LIBS" -AC_LINK_IFELSE([], - [AC_SUBST([GLITE_LB_COMMON_THR_LIBS], [-lglite_lb_common_$GLOBUS_THR_FLAVOR])], - [AC_MSG_ERROR([cannot find org.glite.lb.common ($GLOBUS_THR_FLAVOR)])] -) -LIBS=$save_LIBS - -LIBS="-lglite_lb_common_$GLOBUS_NOTHR_FLAVOR $LIBS" -AC_LINK_IFELSE([], - [AC_SUBST([GLITE_LB_COMMON_NOTHR_LIBS], [-lglite_lb_common_$GLOBUS_NOTHR_FLAVOR])], - [AC_MSG_ERROR([cannot find org.glite.lb.common (GLOBUS_NOTHR_FLAVOR)])] -) -LIBS=$save_LIBS - -LDFLAGS=$save_LDFLAGS -CPPFLAGS=$save_CPPFLAGS - -AC_LANG_POP([C]) - -AC_MSG_RESULT([yes]) - -]) - -dnl Usage: -dnl AC_GLITE_LB -dnl - GLITE_LB_THR_CLIENT_LIBS -dnl - GLITE_LB_THR_CLIENTPP_LIBS -dnl - GLITE_LB_THR_COMMON_LIBS -dnl - GLITE_LB_NOTHR_CLIENT_LIBS -dnl - GLITE_LB_NOTHR_CLIENTPP_LIBS -dnl - GLITE_LB_NOTHR_COMMON_LIBS -dnl - GLITE_STATIC_LB_NOTHR_CLIENT_LIBS -dnl - GLITE_STATIC_LB_NOTHR_COMMON_LIBS - -AC_DEFUN([AC_GLITE_LB], -[ - ac_glite_lb_prefix=$GLITE_LOCATION - - AC_SEC_GSOAP_PLUGIN - - if test -n "ac_glite_lb_prefix" ; then - dnl - dnl - dnl - ac_glite_lb_lib="-L$ac_glite_lb_prefix/lib" - GLITE_LB_THR_CLIENT_LIBS="$ac_glite_lb_lib -lglite_lb_client_$GLOBUS_THR_FLAVOR" - GLITE_LB_THR_CLIENTPP_LIBS="$ac_glite_lb_lib -lglite_lb_clientpp_$GLOBUS_THR_FLAVOR" - GLITE_LB_THR_COMMON_LIBS="$ac_glite_lb_lib -lglite_lb_common_$GLOBUS_THR_FLAVOR $SEC_GSOAP_PLUGIN_GSS_THR_LIBS" - GLITE_LB_NOTHR_CLIENT_LIBS="$ac_glite_lb_lib -lglite_lb_client_$GLOBUS_NOTHR_FLAVOR" - GLITE_LB_NOTHR_CLIENTPP_LIBS="$ac_glite_lb_lib -lglite_lb_clientpp_$GLOBUS_NOTHR_FLAVOR" - GLITE_LB_NOTHR_COMMON_LIBS="$ac_glite_lb_lib -lglite_lb_common_$GLOBUS_NOTHR_FLAVOR $SEC_GSOAP_PLUGIN_GSS_NOTHR_LIBS" - GLITE_STATIC_LB_NOTHR_CLIENT_LIBS="$ac_glite_lb_prefix/lib/libglite_lb_client_$GLOBUS_NOTHR_FLAVOR.a" - GLITE_STATIC_LB_NOTHR_COMMON_LIBS="$ac_glite_lb_prefix/lib/libglite_lb_common_$GLOBUS_NOTHR_FLAVOR.a $SEC_GSOAP_PLUGIN_GSS_STATIC_NOTHR_LIBS" - ifelse([$2], , :, [$2]) - else - GLITE_LB_THR_CLIENT_LIBS="" - GLITE_LB_THR_CLIENTPP_LIBS="" - GLITE_LB_THR_COMMON_LIBS="" - GLITE_LB_NOTHR_CLIENT_LIBS="" - GLITE_LB_NOTHR_CLIENTPP_LIBS="" - GLITE_LB_NOTHR_COMMON_LIBS="" - GLITE_STATIC_LB_NOTHR_CLIENT_LIBS="" - GLITE_STATIC_LB_NOTHR_COMMON_LIBS="" - ifelse([$3], , :, [$3]) - fi - - AC_SUBST(GLITE_LB_THR_CLIENT_LIBS) - AC_SUBST(GLITE_LB_THR_CLIENTPP_LIBS) - AC_SUBST(GLITE_LB_THR_COMMON_LIBS) - AC_SUBST(GLITE_LB_NOTHR_CLIENT_LIBS) - AC_SUBST(GLITE_LB_NOTHR_CLIENTPP_LIBS) - AC_SUBST(GLITE_LB_NOTHR_COMMON_LIBS) - AC_SUBST(GLITE_STATIC_LB_NOTHR_CLIENT_LIBS) - AC_SUBST(GLITE_STATIC_LB_NOTHR_COMMON_LIBS) -]) - -AC_DEFUN([GLITE_CHECK_LB_CLIENT], -[AC_MSG_CHECKING([for org.glite.lb.client]) -save_CPPFLAGS=$CPPFLAGS -CPPFLAGS="$CPPFLAGS $GLITE_CPPFLAGS" -save_LDFLAGS=$LDFLAGS -LDFLAGS="$LDFLAGS $GLITE_LDFLAGS -L$GLOBUS_LOCATION/lib" -save_LIBS=$LIBS - -AC_LANG_PUSH([C]) - -# prepare the test program, to link against the different combinations -# of globus flavours - -AC_LANG_CONFTEST( - [AC_LANG_PROGRAM( - [@%:@include "glite/lb/consumer.h"], - [edg_wll_QueryEvents( - (edg_wll_Context)0, - (const edg_wll_QueryRec*)0, - (const edg_wll_QueryRec*)0, - (edg_wll_Event**)0 - );] - )] -) - -LIBS="-lglite_lb_client_$GLOBUS_THR_FLAVOR $LIBS" -AC_LINK_IFELSE([], - [AC_SUBST([GLITE_LB_CLIENT_THR_LIBS], [-lglite_lb_client_$GLOBUS_THR_FLAVOR])], - [AC_MSG_ERROR([cannot find org.glite.lb.client ($GLOBUS_THR_FLAVOR)])] -) -LIBS=$save_LIBS - -LIBS="-lglite_lb_client_$GLOBUS_NOTHR_FLAVOR $LIBS" -AC_LINK_IFELSE([], - [AC_SUBST([GLITE_LB_CLIENT_NOTHR_LIBS], [-lglite_lb_client_$GLOBUS_NOTHR_FLAVOR])], - [AC_MSG_ERROR([cannot find org.glite.lb.client ($GLOBUS_NOTHR_FLAVOR)])] -) -LIBS=$save_LIBS - -AC_LANG_POP([C]) - -AC_LANG_PUSH([C++]) - -# prepare the test program, to link against the different combinations -# of globus flavours - -AC_LANG_CONFTEST( - [AC_LANG_PROGRAM( - [@%:@include "glite/lb/Job.h"], - [glite::lb::Job job;] - )] -) - -save_LIBS=$LIBS -LIBS="-lglite_lb_clientpp_$GLOBUS_THR_FLAVOR $LIBS" -AC_LINK_IFELSE([], - [AC_SUBST([GLITE_LB_CLIENTPP_THR_LIBS], [-lglite_lb_clientpp_$GLOBUS_THR_FLAVOR])], - [AC_MSG_ERROR([cannot find org.glite.lb.client (C++ - $GLOBUS_THR_FLAVOR)])] -) -LIBS=$save_LIBS - -LIBS="-lglite_lb_clientpp_$GLOBUS_NOTHR_FLAVOR $LIBS" -AC_LINK_IFELSE([], - [AC_SUBST([GLITE_LB_CLIENTPP_NOTHR_LIBS], [-lglite_lb_clientpp_$GLOBUS_NOTHR_FLAVOR])], - [AC_MSG_ERROR([cannot find org.glite.lb.client (C++ - $GLOBUS_NOTHR_FLAVOR)])] -) -LIBS=$save_LIBS - -AC_LANG_POP([C++]) - -LDFLAGS="$save_LDFLAGS" -CPPFLAGS=$save_CPPFLAGS - -AC_MSG_RESULT([yes]) - -]) diff --git a/org.glite.lb.client/project/.cvsignore b/org.glite.lb.client/project/.cvsignore deleted file mode 100644 index 2b56473..0000000 --- a/org.glite.lb.client/project/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -MultiStruct.pm -StructField.pm -at3 -events.T -status.T -types.T diff --git a/org.glite.lb.client/project/ChangeLog b/org.glite.lb.client/project/ChangeLog deleted file mode 100644 index be133b2..0000000 --- a/org.glite.lb.client/project/ChangeLog +++ /dev/null @@ -1,88 +0,0 @@ -3.1.0-1 (lb-1.7.0-1) -- key connections in the pool also with certificate; allows using LB client - while swithing among multiple identities safely -- don't keep proxy connections at all (workaround bug #25153 with little - perfomance impact only) - -3.1.1-1 (lb-1.7.1-1) -- check for loaded credentials in connection pool management (avoid SEGV) -- minor fixes to manpage - -3.1.2-1 (lb-1.7.2-1) -- allow aditional options for purger (variables GLITE_LB_PURGE_OTHER_OPTIONS, - GLITE_LB_DUMP_EXPORTER_OTHER_OPTIONS -- pass errors from credential loading to upper layers properly - -3.1.2-2 (lb-1.7.4-1) -- rebuild wrt. downgraded security 3.1.57-1 - -3.1.3-1 (lb-1.7.5-1) -- align attr_names[] (used in getAttrName methods) in Event and JobStatus - to definitions in *.h from lb.client-interface - -3.1.4-1 -- do the previous quick fix thoroughly -- don't smash name_with_underscores - and nameWithUppercaseLetters - -3.2.0-1 (lb-1.8.0-1) -- added ui_host to jobstat -- store purge files (to be uploaded to JP) in GLITE_LOCATION_VAR rahter then GLITE_TMP - -3.2.1-1 -- use -1 as an invalid socken number instead of 0 -- handle errors generated by gss inquire credentials correctly (#37084) -- correctly release unused credentials (#37069) and reuse connection -- handle gss errors whene receiving notifications (#35118) -- fix producer connection management (re-establishing connections) (#37074) - -4.0.0-1 -- LB 2.0 release - -4.0.0-2 -- fixed configure to work in etics - -4.0.0-3 -- configure script update (globus flavors added to configure call) - -4.0.1-1 -- (from 3.2.2-1) Fix edg_wll_NotifDrop prototype (#34649). -- Notification pool implementation - -4.0.2-1 -- don't use hard-wired types for ACLs events but the ones generated automatically -- change_acl code adapted to the new API using generated types -- new options to the glite-lb-notify command - -4.0.3-1 -- Man page update -- Minor fixes in example builds -- stats extended for any job state - -4.0.3-2 -- install libraries into $libdir - -4.0.4-1 -- Connection pool lock optimization and fixes -- Rare crash fixes in notify example - -4.0.5-1 -- Compatibility with IPv6 compliant clients - -4.0.6-1 -- Install glite_lb.m4 rather than glite_lb_client.m4 - -4.0.7-1 -- hard-coded 'lib' fixed in glite_lb.m4 - -4.1.0-1 -- Support for CREAM jobs -- Support for logging sandbox transfers as jobs of a specific type -- Memory allocation fixes -- Relation 'changed' used in queries implemented for other relevant attributes rather than just Job State -- Connection Pool locking fixed (Savannah bug #37081) -- Extended with WMS DNs and other flags (producer API cleanup) - -4.1.1-1 -- Job registration example supports the 'exclusive' flag -- Notification client can read server address from JobID - diff --git a/org.glite.lb.client/project/build.number b/org.glite.lb.client/project/build.number deleted file mode 100644 index 3a9ef16..0000000 --- a/org.glite.lb.client/project/build.number +++ /dev/null @@ -1,2 +0,0 @@ -#Fri Aug 18 12:27:36 CEST 2006 -module.build=0243 diff --git a/org.glite.lb.client/project/build.properties b/org.glite.lb.client/project/build.properties deleted file mode 100644 index e69de29..0000000 diff --git a/org.glite.lb.client/project/configure.properties.xml b/org.glite.lb.client/project/configure.properties.xml deleted file mode 100644 index f6ae77c..0000000 --- a/org.glite.lb.client/project/configure.properties.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - -top_srcdir=.. -builddir=build -stagedir=${stage.abs.dir} -distdir=${dist.dir} -globalprefix=${global.prefix} -lbprefix=${subsystem.prefix} -package=${module.package.name} -# PREFIX=${install.dir} -version=${module.version} -glite_location=${with.glite.location} -globus_prefix=${with.globus.prefix} -expat_prefix=${with.expat.prefix} -mysql_prefix=${with.mysql.prefix} -mysql_version=${ext.mysql.version} -cppunit_prefix=${with.cppunit.prefix} -thrflavour=${with.globus.thr.flavor} -nothrflavour=${with.globus.nothr.flavor} - - - diff --git a/org.glite.lb.client/project/package.description b/org.glite.lb.client/project/package.description deleted file mode 100644 index f32857d..0000000 --- a/org.glite.lb.client/project/package.description +++ /dev/null @@ -1 +0,0 @@ -glite-lb-client is the library implementing client side of gLite LB API. This package contains the library, client tools and many examples. diff --git a/org.glite.lb.client/project/package.summary b/org.glite.lb.client/project/package.summary deleted file mode 100644 index d8535e8..0000000 --- a/org.glite.lb.client/project/package.summary +++ /dev/null @@ -1 +0,0 @@ -gLite Logging and Bookkeeping client library and CLI tools diff --git a/org.glite.lb.client/project/properties.xml b/org.glite.lb.client/project/properties.xml deleted file mode 100755 index d067cbd..0000000 --- a/org.glite.lb.client/project/properties.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb.client/project/tar_exclude b/org.glite.lb.client/project/tar_exclude deleted file mode 100644 index e1fcd1a..0000000 --- a/org.glite.lb.client/project/tar_exclude +++ /dev/null @@ -1,10 +0,0 @@ -tar_exclude -CVS -build.xml -build -build.properties -properties.xml -configure.properties.xml -.cvsignore -.project -.cdtproject diff --git a/org.glite.lb.client/project/version.properties b/org.glite.lb.client/project/version.properties deleted file mode 100644 index 41764a6..0000000 --- a/org.glite.lb.client/project/version.properties +++ /dev/null @@ -1,3 +0,0 @@ -# $Header$ -module.version=4.1.1 -module.age=1 diff --git a/org.glite.lb.client/src/Event.cpp.T b/org.glite.lb.client/src/Event.cpp.T deleted file mode 100644 index a5bfad9..0000000 --- a/org.glite.lb.client/src/Event.cpp.T +++ /dev/null @@ -1,445 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* -@@@AUTO -*/ - -#include -#include -#include -#include - -#include - -#include "glite/jobid/cjobid.h" - -#include "Event.h" -#include "glite/lb/events.h" -#include "glite/lb/notifid.h" -#include "glite/lb/LoggingExceptions.h" - -#include "consumer.h" - -EWL_BEGIN_NAMESPACE; - -#define CLASS_PREFIX "glite::lb::Event::" - -@@@{ - -require '../src/EventAttrNames.pl'; - -sub typeswitch { - my $ftype = shift; - my $resc = shift; - local $_; - my %ctype; - $ctype{$_} = 1 while $_ = shift; - - $resc = 'break;' unless $resc; - - gen $indent."switch (attr) {\n"; - selectType $event $ftype; - for (getFields $event) { - my $f = selectField $event $_; - if($ctype{$f->{type}}) { - my $cstr = $ftype eq '_common_' ? 'any' : lcfirst $ftype; - if ($cstr =~ m/^pBS/) { $cstr = ucfirst $cstr; } - if ($cstr =~ m/^cREAM/) { $cstr = ucfirst $cstr; } - if ($cstr =~ m/^condor/) { $cstr = ucfirst $cstr; } - my $cname = getName $f 'C'; - gen "$indent\tcase Event::".uc($f->{name}).": return(cev->$cstr.$cname);\n"; - } elsif (($f->{type} eq "int") && - ($ctype{"string"}) && - $f->{codes}) { - # conversion from int to string (well, enum to string) - my $cstr = $ftype eq '_common_' ? 'any' : lcfirst $ftype; - if ($cstr =~ m/^pBS/) { $cstr = ucfirst $cstr; } - if ($cstr =~ m/^cREAM/) { $cstr = ucfirst $cstr; } - if ($cstr =~ m/^condor/) { $cstr = ucfirst $cstr; } - my $cname = getName $f 'C'; - my $fn = $ftype eq '_common_' ? "" : ucfirst $ftype; - my $c = $fn . ucfirst $f->{name}; - $cast = ($c eq 'Level') ? "(edg_wll_Level)" : ""; - gen "$indent\tcase Event::".uc($f->{name}).": return((const char *)edg_wll_${c}ToString(${cast}cev->$cstr.$cname));\n"; - } elsif (($f->{type} eq "jobid") && - ($ctype{"string"})) { - # conversion from jobid to string - } - } - gen "$indent\tdefault: $resc\n" if $resc; - gen "$indent\}\n"; -} -@@@} - -Event::Event(void) -{ - type = UNDEF; - flesh = 0; -} - - -Event::Event(const Event &in) -{ - type = in.type; - flesh = in.flesh; - if (flesh) flesh->use(); -} - - -Event::Event(edg_wll_Event *in) -{ - type = (Type)in->type; - flesh = new CountRef((void*)in); -} - - -Event::~Event(void) -{ - if (flesh) flesh->release(); -} - - -Event & -Event::operator= (const Event &in) -{ - if (flesh) flesh->release(); - type = in.type; - flesh = in.flesh; - if (flesh) flesh->use(); - - return *this; -} - -int Event::getValInt(Attr attr) const -{ - edg_wll_Event const *cev = (edg_wll_Event *) flesh->ptr; - -@@@{ - $indent = "\t"; - typeswitch '_common_',undef,'int','port','logsrc'; -@@@} - - switch (cev->type) { -@@@{ - $indent = "\t\t"; - for my $t (getTypes $event) { - gen "\t\tcase ".uc($t).":\n"; - typeswitch $t,'goto badattr;','int','port','logsrc'; - } -@@@} - default: - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, EINVAL, - "attribute is not of int type")); - } -badattr: - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, ENOENT, "invalid attribute")); - return -1; /* gcc, shut up! */ -} - -float Event::getValFloat(Attr attr) const -{ - edg_wll_Event const *cev = (edg_wll_Event *) flesh->ptr; - -@@@{ - $indent = "\t"; - typeswitch '_common_',undef,'float'; -@@@} - - switch (cev->type) { -@@@{ - $indent = "\t\t"; - for my $t (getTypes $event) { - gen "\t\tcase ".uc($t).":\n"; - typeswitch $t,'goto badattr;','float'; - } -@@@} - default: - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, EINVAL, - "attribute is not of float type")); - } -badattr: - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, ENOENT, "invalid attribute")); - return -1; /* gcc, shut up! */ -} - -double Event::getValDouble(Attr attr) const -{ - edg_wll_Event const *cev = (edg_wll_Event *) flesh->ptr; - -@@@{ - $indent = "\t"; - typeswitch '_common_',undef,'double'; -@@@} - - switch (cev->type) { -@@@{ - $indent = "\t\t"; - for my $t (getTypes $event) { - gen "\t\tcase ".uc($t).":\n"; - typeswitch $t,'goto badattr;','double'; - } -@@@} - default: - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, EINVAL, - "attribute is not of double type")); - } -badattr: - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, ENOENT, "invalid attribute")); - return -1; /* gcc, shut up! */ -} - -static char const *get_string_val(const edg_wll_Event *cev, Event::Attr attr) -{ -@@@{ - $indent = "\t"; - typeswitch '_common_',undef,'string'; -@@@} - - switch (cev->type) { -@@@{ - $indent = "\t\t"; - for my $t (getTypes $event) { - gen "\t\tcase Event::".uc($t).":\n"; - typeswitch $t,'goto badattr;','string'; - } -@@@} - default: - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, EINVAL, - "attribute is not of string type and can not be converted")); - } -badattr: - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, ENOENT, "invalid attribute")); - return NULL; /* gcc, shut up! */ -} - - -std::string -Event::getValString(Attr attr) const -{ - edg_wll_Event const *cev = (edg_wll_Event *) flesh->ptr; - std::string ret; - - try { - char const *s = get_string_val(cev,attr); - if (s) ret.assign(s); - return ret; - } catch (Exception &e) { - STACK_ADD; - throw; - } -} - - -struct timeval -Event::getValTime(Attr attr) const -{ - edg_wll_Event const *cev = (edg_wll_Event *) flesh->ptr; -@@@{ - $indent = "\t"; - typeswitch '_common_',undef,'timeval'; -@@@} - - /* XXX - * to make things simpler we don't include this here as there are no - * type specific timeval attributes currently - * - * switch (cev->type) { - */ - - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, ENOENT, "invalid attribute")); -} - -static -edg_wlc_JobId -get_val_jobid(edg_wll_Event const *cev, Event::Attr attr) -{ -@@@{ - $indent = "\t"; - typeswitch '_common_', undef,'jobid'; -@@@} - switch (cev->type) { -@@@{ - $indent = "\t\t"; - for my $t (getTypes $event) { - gen "\t\tcase Event::".uc($t).":\n"; - typeswitch $t,'goto badattr;','jobid'; - } -@@@} - default: - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, EINVAL, - "attribute is not of jobid type")); - } -badattr: - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, ENOENT, "invalid attribute")); - return NULL; /* gcc, shut up! */ -} - -const -glite::jobid::JobId -Event::getValJobId(Attr attr) const -{ - edg_wll_Event const *cev = (edg_wll_Event *) flesh->ptr; - try { - edg_wlc_JobId job_id = get_val_jobid(cev,attr); - return(glite::jobid::JobId(job_id)); - } - catch (Exception &e) { - STACK_ADD; - throw; - } - -} - - -static std::string const names[Event::TYPE_MAX] = { - "undefined", -@@@{ - for (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } - $event->getTypes) - { - gen "\t\"$_\",\n"; - } -@@@} -}; - -const std::string & -Event::name(void) const -{ - if (type<0 || type>TYPE_MAX) { - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, EINVAL, "invalid event type")); - } - return names[type]; -} - - -static -std::string const attr_names[Event::ATTR_MAX] = { -@@@{ - my %s; - - for (getAllFields $event) { - my $id = $_; - $id =~ s/([a-z])([A-Z])/$1_$2/g; - $s{uc($id)} = $_; - $s{uc($_)} = $_; - } - for (@main::EventAttrNames) { - gen "\t\"$s{$_}\",\n"; - } -@@@} -}; - -const std::string & -Event::getAttrName(Attr attr) -{ - if (attr<0 || attr>=ATTR_MAX) { - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, EINVAL, "invalid attribute")); - } - return attr_names[attr]; -} - - -typedef std::pair tpair; -static std::vector attrs[Event::TYPE_MAX]; - -#define apush(etype,attr,atype) \ - attrs[etype].push_back(tpair(attr,atype)) - -static bool attrs_inited = false; - -static void init_attrs(void) -{ -@@@{ - for my $t (getTypes $event) { - my $tu = uc $t; - selectType $event '_common_'; - for (getFields $event) { - my $fu = uc $_; - my $f = selectField $event $_; - my $ftu = uc "$f->{type}_T"; - gen "\tapush(Event::$tu,Event::$fu,Event::$ftu);\n"; - } - selectType $event $t; - for (getFields $event) { - my $fu = uc $_; - my $f = selectField $event $_; - my $ftu = uc "$f->{type}_T"; - gen "\tapush(Event::$tu,Event::$fu,Event::$ftu);\n"; - } - } -@@@} -} - -std::vector > const & Event::getAttrs(void) const -{ - if (type<0 || type>=TYPE_MAX) { - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, EINVAL, "invalid event type")); - } - - /* FIXME: thread safety */ - if (!attrs_inited) { - init_attrs(); - attrs_inited = true; - } - - return attrs[type]; -} - - -const std::string Event::getEventName(Type type) -{ - char *s; - - if(type < 0 || type >= TYPE_MAX) { - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, EINVAL, "invalid event type")); - } - - s = edg_wll_EventToString(edg_wll_EventCode(type)); - if (!s) { - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, EINVAL, "invalid event type")); - } - std::string ret(s); - free(s); - return ret; -} - - -void -Event::destroyFlesh(void *in) -{ - edg_wll_FreeEvent((edg_wll_Event *) in); - free(in); -} - -EWL_END_NAMESPACE; diff --git a/org.glite.lb.client/src/EventAttrNames.pl b/org.glite.lb.client/src/EventAttrNames.pl deleted file mode 100644 index 0483291..0000000 --- a/org.glite.lb.client/src/EventAttrNames.pl +++ /dev/null @@ -1,117 +0,0 @@ -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# The order of strings in this array determines assigned numeric value in the Event::Attr enum. -# It must not be changed unless API major number is incremented - -@main::EventAttrNames = qw/ - ARRIVED - CHILD - CHILD_EVENT - CLASSAD - DESCR - DEST_HOST - DEST_ID - DEST_INSTANCE - DEST_JOBID - DEST_PORT - DESTINATION - DONE_CODE - ERROR_DESC - EXIT_CODE - EXIT_STATUS - FROM - FROM_HOST - FROM_INSTANCE - HELPER_NAME - HELPER_PARAMS - HISTOGRAM - HOST - JDL - JOB - JOBID - JOB_EXIT_STATUS - JOB_PID - JOBSTAT - JOBTYPE - LEVEL - LOCAL_JOBID - NAME - NODE - NOTIFID - NS - NSUBJOBS - OPERATION - OWNER - PARENT - PERMISSION - PERMISSION_TYPE - PID - PREEMPTING - PRIORITY - QUANTITY - QUEUE - REASON - RESOURCE - RESULT - RETVAL - SCHEDULER - SEED - SEQCODE - SHADOW_EXIT_STATUS - SHADOW_HOST - SHADOW_PID - SHADOW_PORT - SHADOW_STATUS - SOURCE - SRC_INSTANCE - SRC_ROLE - STARTER_EXIT_STATUS - STARTER_PID - STATE - STATUS_CODE - SVC_HOST - SVC_NAME - SVC_PORT - TAG - TIMESTAMP - UNIT - UNIVERSE - USAGE - USER - USER_ID - USER_ID_TYPE - VALUE - WN_SEQ - EXPIRES - COMMAND - CMDID - CALLEE - DESTID - NEW_STATE - OLD_STATE - ORIG_TIMESTAMP - SRC - DEST - SANDBOX_TYPE - TRANSFER_JOB - COMPUTE_JOB - DEST_URL - LRMS_JOBID - WORKER_NODE - FAILURE_REASON - WMS_DN -/; diff --git a/org.glite.lb.client/src/Job.cpp b/org.glite.lb.client/src/Job.cpp deleted file mode 100644 index f105a30..0000000 --- a/org.glite.lb.client/src/Job.cpp +++ /dev/null @@ -1,220 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -/** - * @file Job.cpp - * @version $Revision$ - */ - - -#include -#include -#include - -#include - -#include "Job.h" -#include "consumer.h" -#include "glite/lb/LoggingExceptions.h" -#include "glite/lb/context-int.h" - -EWL_BEGIN_NAMESPACE; - -#define CLASS_PREFIX "glite::lb::Job::" - -const int Job::STAT_CLASSADS = EDG_WLL_STAT_CLASSADS; -const int Job::STAT_CHILDREN = EDG_WLL_STAT_CHILDREN; -const int Job::STAT_CHILDSTAT = EDG_WLL_STAT_CHILDSTAT; - -Job::Job(void) - : jobId() -{ -} - - -Job::Job(const glite::jobid::JobId &in) - : jobId(in) -{ -} - - -Job::~Job(void) -{ -} - - -Job & Job::operator= (const glite::jobid::JobId &in) -{ - try { - jobId = in; - return *this; - } catch (Exception &) { - STACK_ADD; - throw; - } -} - - -JobStatus -Job::status(int flags) const -{ - JobStatus jobStatus; - - try { - edg_wll_JobStat *cstat = jobStatus.c_ptr(); - int ret = edg_wll_JobStatus(server.getContext(), - jobId.c_jobid(), - flags, - cstat); - check_result(ret, - server.getContext(), - "edg_wll_JobStatus"); - -/* XXX the enums match due to automatic generation */ - jobStatus.status = (JobStatus::Code) cstat->state; - - return(jobStatus); - - } catch (Exception &e) { - STACK_ADD; - throw; - } -} - - -void -Job::log(std::vector &eventList) const -{ - edg_wll_Event *events = NULL,*ev; - int result, qresults_param; - char *errstr = NULL; - edg_wll_Context context; - - try { - context = server.getContext(); - result = edg_wll_JobLog(context, jobId.c_jobid(), &events); - if (result == E2BIG) { - edg_wll_Error(context, NULL, &errstr); - check_result(edg_wll_GetParam(context, - EDG_WLL_PARAM_QUERY_RESULTS, &qresults_param), - context, - "edg_wll_GetParam(EDG_WLL_PARAM_QUERY_RESULTS)"); - if (qresults_param != EDG_WLL_QUERYRES_LIMITED) { - edg_wll_SetError(context, result, errstr); - check_result(result, context,"edg_wll_JobLog"); - } - } else { - check_result(result, context,"edg_wll_JobLog"); - } - - for (int i=0; events[i].type != EDG_WLL_EVENT_UNDEF; i++) { - ev = (edg_wll_Event *) malloc(sizeof *ev); - memcpy(ev,events+i,sizeof *ev); - eventList.push_back(Event(ev)); - } - - free(events); - - if (result) { - edg_wll_SetError(context, result, errstr); - check_result(result, context,"edg_wll_JobLog"); - } - } catch (Exception &e) { - if(errstr) free(errstr); - - STACK_ADD; - throw; - } - -} - - -const std::vector -Job::log(void) const -{ - std::vector eventList; - - log(eventList); - return(eventList); -} - - -const std::pair -Job::queryListener(std::string const & name) const -{ - std::string host; - char *c_host = NULL; - uint16_t port; - - try { - int ret = edg_wll_QueryListener(server.getContext(), - jobId.c_jobid(), - name.c_str(), - &c_host, - &port); - check_result(ret, - server.getContext(), - "edg_wll_QueryListener"); - - host = c_host; - free(c_host); - return(std::pair(host,port)); - - } catch (Exception &e) { - if(c_host) free(c_host); - STACK_ADD; - throw; - } -} - - -void Job::setParam(edg_wll_ContextParam par, int val) -{ - server.setParam(par,val); -} - -void Job::setParam(edg_wll_ContextParam par, const std::string val) -{ - server.setParam(par,val); -} - -void Job::setParam(edg_wll_ContextParam par, const struct timeval & val) -{ - server.setParam(par,val); -} - - -int Job::getParamInt(edg_wll_ContextParam par) const -{ - return server.getParamInt(par); -} - -std::string Job::getParamString(edg_wll_ContextParam par) const -{ - return server.getParamString(par); -} - -struct timeval Job::getParamTime(edg_wll_ContextParam par) const -{ - return server.getParamTime(par); -} - - - -EWL_END_NAMESPACE; diff --git a/org.glite.lb.client/src/JobStatus.cpp.T b/org.glite.lb.client/src/JobStatus.cpp.T deleted file mode 100644 index 3f1ed7b..0000000 --- a/org.glite.lb.client/src/JobStatus.cpp.T +++ /dev/null @@ -1,533 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include - -#include "glite/jobid/JobId.h" -#include "glite/lb/LoggingExceptions.h" - -#include "consumer.h" -#include "JobStatus.h" - - -EWL_BEGIN_NAMESPACE; - -#define CLASS_PREFIX "glite::lb::JobStatus::" - -@@@{ - -require '../src/StatusAttrNames.pl'; - -sub typeswitch { - my ($ftype,$ctype,$resc) = @_; - local $_; - - $resc = "break;" unless $resc; - - gen $indent."switch (attr) {\n"; - selectType $status $ftype; - for (getFields $status) { - my $f = selectField $status $_; - if($f->{type} eq $ctype) { - my $fnu = $f->{name}; - $fnu =~ s/([a-z])([A-Z])/$1_$2/g; - $fnu = uc $fnu; - my $cname = getName $f 'C'; - gen "$indent\tcase JobStatus::$fnu: return cstat->$cname;\n" - }; - # XXX: when there are conversion functions, we may get these as strings as well - #elsif (($f->{type} eq "int") && - # ($ctype eq "string") && - # $f->{codes}) { - # my $fnu = $f->{name}; - # $fnu =~ s/([a-z])([A-Z])/$1_$2/g; - # $fnu = uc $fnu; - # my $cname = getName $f 'C'; - # my $fn = $ftype eq '_common_' ? "" : ucfirst $ftype; - # my $c = $fn . ucfirst $f->{name}; - # $cast = ($c eq 'Level') ? "(edg_wll_Level)" : ""; - # gen "$indent\tcase JobStatus::$fnu: return((const char *)edg_wll_${c}ToString(${cast}cstat->$cname));\n"; } - } - gen "$indent\tdefault: $resc\n" if $resc; - gen "$indent\}\n"; -} -@@@} - -JobStatus::JobStatus(void) -{ - status = UNDEF; - flesh = 0; -} - -JobStatus::JobStatus(const JobStatus & in) -{ - status = in.status; - flesh = in.flesh; - if (flesh) flesh->use(); -} - -JobStatus & -JobStatus::operator=(const JobStatus & in) -{ - if (flesh) flesh->release(); - status = in.status; - flesh = in.flesh; - if (flesh) flesh->use(); - return *this; -} - -JobStatus::JobStatus(const edg_wll_JobStat & in,int destroy) -{ - status = (Code)in.state; - flesh = new CountRef((void*)&in); - if (!destroy) flesh->use(); -} - -JobStatus & -JobStatus::operator=(const edg_wll_JobStat & in) -{ - if(flesh) - flesh->release(); - status = (Code)in.state; - flesh = new CountRef((void*)&in); - return(*this); -} - -JobStatus::~JobStatus() -{ - if (flesh) flesh->release(); -} - -edg_wll_JobStat * -JobStatus::c_ptr(void) -{ - edg_wll_JobStat *s; - - if(flesh) - return((edg_wll_JobStat*)flesh->ptr); - - s = new edg_wll_JobStat; - // XXX - is it neccessary? new should throw exception itself... - if(!s) throw(Exception(EXCEPTION_MANDATORY, - ENOMEM, - "out of memory allocating c-struct for JobStatus")); - - edg_wll_InitStatus(s); - flesh = new CountRef((void*)s); - return(s); -} - - -static std::string const names[JobStatus::CODE_MAX] = { - "undefined", -@@@{ - for (sort { $status->{order}->{$a} <=> $status->{order}->{$b} } - $status->getTypes) - { - gen "\t\"$_\",\n"; - } -@@@} -}; - -const std::string& JobStatus::name(void) const -{ - if (status<0 || status>=CODE_MAX) { - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, - EINVAL, - "status code invalid")); - } - return names[status]; -} - -int JobStatus::getValInt(JobStatus::Attr attr) const -{ - edg_wll_JobStat const *cstat = (edg_wll_JobStat *) flesh->ptr; -@@@{ - $indent = "\t"; - typeswitch '_common_','int'; -@@@} - - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, - ENOENT, - "no such attribute")); - return -1; /* make gcc shut up -- never returns */ -} - -bool JobStatus::getValBool(JobStatus::Attr attr) const -{ - edg_wll_JobStat const *cstat = (edg_wll_JobStat *) flesh->ptr; -@@@{ - $indent = "\t"; - typeswitch '_common_','bool'; -@@@} - - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, - ENOENT, - "no such attribute")); - return -1; /* make gcc shut up -- never returns */ -} - -static const char * -get_string_val(const edg_wll_JobStat *cstat,JobStatus::Attr attr) -{ -@@@{ - $indent = "\t"; - typeswitch '_common_','string'; -@@@} - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, - ENOENT, - "no such attribute")); - return 0; /* make gcc shut up -- never returns */ -} - -std::string -JobStatus::getValString(JobStatus::Attr attr) const -{ - edg_wll_JobStat const *cstat = (edg_wll_JobStat *) flesh->ptr; - std::string ret; - - try{ - const char *s = get_string_val(cstat,attr); - if (s) ret.assign(s); - return ret; - } catch (Exception &e) { - STACK_ADD; - throw; - } -} - - -struct timeval -JobStatus::getValTime(Attr attr) const -{ - edg_wll_JobStat const *cstat = (edg_wll_JobStat *) flesh->ptr; - -@@@{ - $indent = "\t"; - typeswitch '_common_','timeval'; -@@@} - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, - ENOENT, - "no such attribute")); -} - - -const -edg_wlc_JobId -get_val_jobid(edg_wll_JobStat const *cstat, JobStatus::Attr attr) -{ -@@@{ - $indent = "\t"; - typeswitch '_common_','jobid'; -@@@} - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, - ENOENT, - "no such attribute")); - return 0; /* make gcc shut up -- never returns */ -} - - -const -glite::jobid::JobId -JobStatus::getValJobId(Attr attr) const -{ - edg_wll_JobStat const *cstat = (edg_wll_JobStat *) flesh->ptr; - - try { - edg_wlc_JobId job_id = get_val_jobid(cstat, attr); - return(glite::jobid::JobId(job_id)); - } - catch(Exception &e) { - STACK_ADD; - throw; - } -} - -const -int * -get_val_intlist(edg_wll_JobStat const *cstat, JobStatus::Attr attr) -{ -@@@{ - $indent = "\t"; - typeswitch '_common_','intlist'; -@@@} - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, - ENOENT, - "no such attribute")); - return 0; /* make gcc shut up -- never returns */ -} - - -const -std::vector -JobStatus::getValIntList(Attr attr) const -{ - edg_wll_JobStat const *cstat = (edg_wll_JobStat *) flesh->ptr; - - std::vector result; - const int *r; - - try { - r = get_val_intlist(cstat, attr); - if(r) - for(int i = 1; i <= r[0]; i++) - result.push_back(r[i]); - } catch(Exception &e) { - STACK_ADD; - throw; - } - return result; -} - - -char ** const -get_val_stringlist(edg_wll_JobStat const *cstat, JobStatus::Attr attr) -{ -@@@{ - $indent = "\t"; - typeswitch '_common_','strlist'; -@@@} - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, - ENOENT, - "no such attribute")); - return 0; /* make gcc shut up -- never returns */ -} - - -const -std::vector -JobStatus::getValStringList(Attr attr) const -{ - edg_wll_JobStat const *cstat = (edg_wll_JobStat *) flesh->ptr; - - std::vector result; - char **r , **p; - - try { - r = (char**)get_val_stringlist(cstat, attr); - if(r) - for(p = r; *p; p++) - result.push_back(std::string(*p)); - } catch(Exception &e) { - STACK_ADD; - throw; - } - return result; -} - - -edg_wll_TagValue * const -get_val_taglist(edg_wll_JobStat const *cstat, JobStatus::Attr attr) -{ -@@@{ - $indent = "\t"; - typeswitch '_common_','taglist'; -@@@} - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, - ENOENT, - "no such attribute")); - return 0; /* make gcc shut up -- never returns */ -} - - -const -std::vector > -JobStatus::getValTagList(Attr attr) const -{ - edg_wll_JobStat const *cstat = (edg_wll_JobStat *) flesh->ptr; - - std::vector > result; - edg_wll_TagValue *r , *p; - - try { - r = get_val_taglist(cstat, attr); - if(r) - for(p = r; p->tag ; p++) - result.push_back(std::pair - (std::string(p->tag),std::string(p->value))); - } catch(Exception &e) { - STACK_ADD; - throw; - } - return result; -} - - -const -edg_wll_JobStat * -get_val_stslist(edg_wll_JobStat const *cstat, JobStatus::Attr attr) -{ -@@@{ - $indent = "\t"; - typeswitch '_common_','stslist'; -@@@} - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, - ENOENT, - "no such attribute")); - return 0; /* make gcc shut up -- never returns */ -} - - -const -std::vector -JobStatus::getValJobStatusList(Attr attr) const -{ - edg_wll_JobStat const *cstat = (edg_wll_JobStat *) flesh->ptr; - - std::vector result; - const edg_wll_JobStat *r, *p; - - try { - r = get_val_stslist(cstat, attr); - if(r) - for(p=r; p->state != EDG_WLL_JOB_UNDEF; p++) { - edg_wll_JobStat *jsep = new edg_wll_JobStat; - if (!edg_wll_CpyStatus(p,jsep)) { - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, - ENOMEM, - "cannot copy edg_wll_JobStat")); - } - result.push_back(JobStatus(*jsep)); - } - } catch(Exception &e) { - STACK_ADD; - throw; - } - return(result); -} - - -static std::string const attr_names[JobStatus::ATTR_MAX] = { -@@@{ - my %s; - - for (getAllFields $status) { - my $id = $_; - $id =~ s/([a-z])([A-Z])/$1_$2/g; - $s{uc($id)} = $_; - $s{uc($_)} = $_; - } - for (@main::StatusAttrNames) { - gen "\t\"$s{$_}\",\n"; - } -@@@} -}; - -const std::string & -JobStatus::getAttrName(JobStatus::Attr attr) -{ - if (attr<0 || attr>=ATTR_MAX) { - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, - ENOENT, - "no such attribute")); - } - - return attr_names[attr]; -} - -JobStatus::Attr JobStatus::attrByName(std::string const & name) -{ - int a; - for (a=0; a tpair; -static std::vector attrs; - -static bool attrs_inited = false; - -static void init_attrs(void) -{ -/* XXX: currently only common attributes in JobStatus */ -@@@{ - selectType $status '_common_'; - for (getFields $status) { - my $fu = $_; - my $f = selectField $status $_; - my $ftu = uc "$f->{type}_T"; - $fu =~ s/([a-z])([A-Z])/$1_$2/g; - $fu = uc $fu; - - gen "\tattrs.push_back(tpair(JobStatus::$fu,JobStatus::$ftu));\n"; - } -@@@} -} - - -const std::vector& -JobStatus::getAttrs(void) const -{ - if (status<0 || status>=CODE_MAX) { - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, - EINVAL, - "status code invalid")); - } - -/* FIXME: thread safety */ - if (!attrs_inited) { - init_attrs(); - attrs_inited = true; - } - return attrs; -} - -const std::string & -JobStatus::getStateName(Code state) -{ - if (state<0 || state>=CODE_MAX) { - STACK_ADD; - throw(Exception(EXCEPTION_MANDATORY, - EINVAL, - "status code invalid")); - } - return names[state]; -} - - -void -JobStatus::destroyFlesh(void *p) -{ - edg_wll_JobStat *stat = (edg_wll_JobStat *) p; - if (stat) { - edg_wll_FreeStatus(stat); - free(stat); - } -} - -EWL_END_NAMESPACE; diff --git a/org.glite.lb.client/src/Notification.cpp b/org.glite.lb.client/src/Notification.cpp deleted file mode 100644 index bb61340..0000000 --- a/org.glite.lb.client/src/Notification.cpp +++ /dev/null @@ -1,357 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -/** - * @file Notification.cpp - * @version $Revision$ - */ - -#include -#include -#include - -#include -#include - -#include "Notification.h" -#include "JobStatus.h" -#include "glite/lb/LoggingExceptions.h" -#include "ServerConnection.h" - -#include "glite/lb/notifid.h" -#include "notification.h" - -EWL_BEGIN_NAMESPACE; - -#define CLASS_PREFIX "glite::lb::Notification::" - -/* external prototypes */ -extern edg_wll_QueryRec ** -convertQueryVectorExt(const std::vector > &); - -extern void -freeQueryRecVector(edg_wll_QueryRec *); - -/* Constructors */ -Notification::Notification(void) -{ - try { - int ret = edg_wll_InitContext(&this->ctx); - check_result(ret,this->ctx,"edg_wll_InitContext"); - this->notifId = NULL; - this->valid = 0; - } catch (Exception &e) { - STACK_ADD; - throw; - } -} - -Notification::Notification(const std::string notifid_str) -{ - try { - char *host; - unsigned int port; - int ret = edg_wll_InitContext(&this->ctx); - check_result(ret,this->ctx,"edg_wll_InitContext"); - ret = edg_wll_NotifIdParse(notifid_str.c_str(),&this->notifId); - check_result(ret,this->ctx,"edg_wll_NotifIdParse"); - edg_wll_NotifIdGetServerParts(this->notifId,&host,&port); - edg_wll_SetParam(this->ctx, EDG_WLL_PARAM_NOTIF_SERVER, host); - edg_wll_SetParam(this->ctx, EDG_WLL_PARAM_NOTIF_SERVER_PORT, port); - free(host); - this->valid = 0; - } catch (Exception &e) { - STACK_ADD; - throw; - } -} - -Notification::Notification(const std::string host,const u_int16_t port) -{ - try { - int ret = edg_wll_InitContext(&ctx); - check_result(ret,ctx,"edg_wll_InitContext"); - edg_wll_SetParam(ctx, EDG_WLL_PARAM_NOTIF_SERVER, host.c_str()); - edg_wll_SetParam(ctx, EDG_WLL_PARAM_NOTIF_SERVER_PORT, port); - this->notifId = NULL; - this->valid = 0; - check_result(ret,ctx,"edg_wll_NotifIdCreate"); - } catch (Exception &e) { - STACK_ADD; - throw; - } -} - -/* Destructor */ -Notification::~Notification(void) -{ - try { - edg_wll_FreeContext(this->ctx); - edg_wll_NotifIdFree(this->notifId); - } catch (Exception &e) { - STACK_ADD; - throw; - } -} - -/* Methods */ -std::string -Notification::getNotifId(void) const -{ - try { - std::string notifid_str; - if (this->notifId != NULL) { - notifid_str = edg_wll_NotifIdUnparse(this->notifId); - return(notifid_str); - } else { - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "notifId not known at the moment"); - } - } catch (Exception &e) { - STACK_ADD; - throw; - } -} - -time_t -Notification::getValid(void) const -{ - return(this->valid); -} - -int -Notification::getFd(void) const -{ - try { - int ret = edg_wll_NotifGetFd(this->ctx); - check_result(ret,this->ctx,"edg_wll_NotifGetFd"); - return(ret); - } catch (Exception &e) { - STACK_ADD; - throw; - } -} - -void -Notification::addJob(const glite::jobid::JobId &jobId) -{ - std::vector::iterator it; - - try { - if (this->notifId != NULL) { - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "adding jobs allowed only before registering"); - } - for( it = jobs.begin(); it != jobs.end(); it++ ) { - if ( (*it).toString() == jobId.toString() ) { - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "job already exists"); - } - } - jobs.push_back(jobId); - - } catch (Exception &e) { - STACK_ADD; - throw; - } -} - -void -Notification::removeJob(const glite::jobid::JobId &jobId) -{ - std::vector::iterator it; - int removed = 0; - - try { - if (this->notifId != NULL) { - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "removing jobs allowed only before registering"); - } - for( it = jobs.begin(); it != jobs.end(); it++ ) { - if ( (*it).toString() == jobId.toString() ) { - jobs.erase(it); - removed += 1; -// break; - } - } - } catch (Exception &e) { - STACK_ADD; - throw; - } - - if (removed == 0) { - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "no job to remove"); - } -} - -/* XXX: obsolete, used only for debugging purposes */ - -std::string -Notification::getJobs(void) -{ - std::vector::iterator it; - std::string ret=""; - - try { - for( it = jobs.begin(); it != jobs.end(); it++ ) { - ret += (*it).toString(); - ret += "\n"; - } - return ret; - - } catch (Exception &e) { - STACK_ADD; - throw; - } -} - -void -Notification::setStates(const std::vector &jobStates) -{ - if (this->notifId != NULL) { - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "removing jobs allowed only before registering"); - } - states = jobStates; -} - -std::string -Notification::getStates(void) -{ - std::vector::iterator it; - JobStatus js; - std::string ret=""; - - try { - for( it = states.begin(); it != states.end(); it++ ) { - js.status = (*it); - ret += js.name(); - ret += "\n"; - } - return ret; - - } catch (Exception &e) { - STACK_ADD; - throw; - } -} - -void -Notification::Register(void) -{ - int ret = 0; - std::vector::iterator it; - std::vector::iterator its; - std::vector > queryExt; - edg_wll_QueryRec **conditions = NULL; - unsigned i; - - try { - if (this->notifId != NULL) { - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "registering job allowed only once"); - } - /* fill in the query: */ - std::vector query; - for( it = jobs.begin(); it != jobs.end(); it++ ) { - QueryRecord r0(QueryRecord::JOBID,QueryRecord::EQUAL,*it); - query.push_back(r0); - } - queryExt.push_back(query); - query.clear(); - - for( its = states.begin(); its != states.end(); its++ ) { - QueryRecord r(QueryRecord::STATUS,QueryRecord::EQUAL,*its); - query.push_back(r); - } - queryExt.push_back(query); - - /* convert query to conditions */ - conditions = convertQueryVectorExt(queryExt); - /* register */ - ret = edg_wll_NotifNew(ctx,conditions,0,-1,NULL,¬ifId,&valid); - check_result(ret,ctx,"edg_wll_NotifNew"); - /* clean */ - if (conditions) { - for( i = 0; conditions[i]; i++ ) { -// FIXME: not working :o( -// freeQueryRecVector(conditions[i]); - delete[] conditions[i]; - } - delete[] conditions; - } - } catch (Exception &e) { - /* clean */ - if (conditions) { - for( i = 0; conditions[i]; i++ ) { -// FIXME: not working :o( -// freeQueryRecVector(conditions[i]); - delete[] conditions[i]; - } - delete[] conditions; - } - STACK_ADD; - throw; - } -} - -void -Notification::Bind(const std::string address_override) -{ - try { - if (this->notifId == NULL) { - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "binding allowed only for given notifId"); - } - int ret = edg_wll_NotifBind(this->ctx,this->notifId,-1,address_override.c_str(),&this->valid); - check_result(ret,this->ctx,"edg_wll_NotifBind"); - } - catch (Exception &e) { - STACK_ADD; - throw; - } -} - - - - -int Notification::receive(glite::lb::JobStatus &jobStatus,timeval &timeout) -{ - try { - int ret = 0; - edg_wll_JobStat *status = (edg_wll_JobStat *) calloc(1,sizeof(edg_wll_JobStat)); - if (status == NULL) { - STACK_ADD; - throw OSException(EXCEPTION_MANDATORY, ENOMEM, "allocating jobStatus"); - } - ret = edg_wll_NotifReceive(ctx,-1,&timeout,status,¬ifId); - if ( ret == ETIMEDOUT ) - return 1; - check_result(ret,ctx,"edg_wll_NotifReceive"); - jobStatus = JobStatus(*status); - return 0; - } - catch (Exception &e) { - STACK_ADD; - throw; - } -} - -EWL_END_NAMESPACE; diff --git a/org.glite.lb.client/src/ServerConnection.cpp b/org.glite.lb.client/src/ServerConnection.cpp deleted file mode 100644 index 14ad299..0000000 --- a/org.glite.lb.client/src/ServerConnection.cpp +++ /dev/null @@ -1,1358 +0,0 @@ -//#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -/** - * @file ServerConnection.cpp - * @version $Revision$ - */ -#include -#include -#include - -#include -#include -#include - -#include "glite/jobid/JobId.h" -#include "glite/lb/context-int.h" -#include "glite/lb/xml_conversions.h" - -#include "ServerConnection.h" -#include "glite/lb/LoggingExceptions.h" - -EWL_BEGIN_NAMESPACE; - -/** - * definitions of QueryRecord class - */ -#define CLASS_PREFIX "glite::lb::QueryRecord::" - - -QueryRecord::QueryRecord(const Attr a, - const Op o, - const std::string & v) - : attr(a), oper(o), state(EDG_WLL_JOB_UNDEF), string_value(v) -{ - switch(a) { - case OWNER: - case LOCATION: - case DESTINATION: - case HOST: - case INSTANCE: - break; - - default: - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "invalid value for attribute: " + v); - } -} - - -QueryRecord::QueryRecord(const Attr a, - const Op o, - const int v) - : attr(a), oper(o), state(EDG_WLL_JOB_UNDEF), int_value(v) -{ - switch(a) { - case DONECODE: - case STATUS: - case SOURCE: - case EVENT_TYPE: - case LEVEL: - case EXITCODE: - break; - - default: - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "attribute is not of integer type"); - } -} - - -QueryRecord::QueryRecord(const Attr a, - const Op o, - const struct timeval& v) - : attr(a), oper(o), state(EDG_WLL_JOB_UNDEF), timeval_value(v) -{ - switch(a) { - case TIME: - break; - - default: - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "attribute is not of timeval type"); - } -} - - -QueryRecord::QueryRecord(const Attr a, - const Op o, - const glite::jobid::JobId& v) - : attr(a), oper(o), state(EDG_WLL_JOB_UNDEF), jobid_value(v) -{ - switch(a) { - case JOBID: - case PARENT: - break; - - default: - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "attribute is not of JobId type"); - } -} - - -QueryRecord::QueryRecord(const Attr a, - const Op o, - const int s, - const struct timeval &v) - : attr(a), oper(o), state(s), timeval_value(v) -{ - switch(a) { - case TIME: - break; - - default: - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "attribute is not of timeval type"); - } -} - - -QueryRecord::QueryRecord(const Attr a, - const Op o, - const std::string &v1, - const std::string &v2) - : attr(a), oper(o), state(EDG_WLL_JOB_UNDEF), string_value(v1), string_value2(v2) -{ - switch(a) { - case OWNER: - case LOCATION: - case DESTINATION: - case HOST: - case INSTANCE: - break; - - default: - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "invalid value for attribute type"); - } - if(o != WITHIN) { - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "only operator WITHIN allowed with two values"); - } -} - - -QueryRecord::QueryRecord(const Attr a, - const Op o, - const int v1, - const int v2) - : attr(a), oper(o), state(EDG_WLL_JOB_UNDEF), int_value(v1), int_value2(v2) -{ - switch(a) { - case DONECODE: - case STATUS: - case SOURCE: - case EVENT_TYPE: - case LEVEL: - case EXITCODE: - break; - - default: - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "attribute is not of integer type"); - } - if(o != WITHIN) { - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "only operator WITHIN allowed with two values"); - } -} - - -QueryRecord::QueryRecord(const Attr a, - const Op o, - const struct timeval &v1, - const struct timeval &v2) - : attr(a), oper(o), state(EDG_WLL_JOB_UNDEF), timeval_value(v1), timeval_value2(v2) -{ - switch(a) { - case TIME: - break; - - default: - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "attribute is not of timeval type"); - } - if(o != WITHIN) { - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "only operator WITHIN allowed with two values"); - } -} - - -QueryRecord::QueryRecord(const Attr a, - const Op o, - const int s, - const struct timeval &v1, - const struct timeval &v2) - : attr(a), oper(o), state(s), timeval_value(v1), timeval_value2(v2) -{ - switch(a) { - case TIME: - break; - - default: - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "attribute is not of timeval type"); - } - if(o != WITHIN) { - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "only operator WITHIN allowed with two values"); - } -} - - -QueryRecord::QueryRecord(const std::string &tag, - const Op o, - const std::string &val) - : attr(USERTAG), oper(o), tag_name(tag), state(EDG_WLL_JOB_UNDEF), string_value(val) -{ -} - - -QueryRecord::QueryRecord(const std::string &tag, - const Op o, - const std::string &v1, - const std::string &v2) - : attr(USERTAG), oper(o), tag_name(tag), state(EDG_WLL_JOB_UNDEF), - string_value(v1), string_value2(v2) - -{ - if(o != WITHIN) { - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "only operator WITHIN allowed with two values"); - } -} - - -QueryRecord::QueryRecord(const QueryRecord &src) -{ - attr = src.attr; - oper = src.oper; - - switch (attr) { - - case USERTAG: - tag_name = src.tag_name; - - case OWNER: - case LOCATION: - case DESTINATION: - case HOST: - case INSTANCE: - string_value = src.string_value; - if(src.oper == WITHIN) - string_value2 = src.string_value2; - break; - - case DONECODE: - case STATUS: - case SOURCE: - case EVENT_TYPE: - case LEVEL: - case EXITCODE: - int_value = src.int_value; - if(src.oper == WITHIN) - int_value2 = src.int_value2; - break; - - case TIME: - timeval_value = src.timeval_value; - if(src.oper == WITHIN) - timeval_value2 = src.timeval_value2; - state = src.state; - break; - - case JOBID: - jobid_value = src.jobid_value; - break; - - default: - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "query attribute not defined"); - } -} - - -QueryRecord::QueryRecord() : attr(UNDEF), oper(EQUAL) -{ -} - - -QueryRecord::~QueryRecord() -{ -} - - -QueryRecord& -QueryRecord::operator=(const QueryRecord &src) -{ - if(this == &src) - return(*this); - - attr = src.attr; - oper = src.oper; - - switch (attr) { - - case USERTAG: - tag_name = src.tag_name; - - case OWNER: - case LOCATION: - case DESTINATION: - case HOST: - case INSTANCE: - string_value = src.string_value; - if(oper == WITHIN) - string_value2 = src.string_value2; - break; - - case DONECODE: - case STATUS: - case SOURCE: - case EVENT_TYPE: - case LEVEL: - case EXITCODE: - int_value = src.int_value; - if(oper == WITHIN) - int_value2 = src.int_value2; - break; - - case TIME: - timeval_value = src.timeval_value; - state = src.state; - if(oper == WITHIN) - timeval_value2 = src.timeval_value2; - break; - - case JOBID: - jobid_value = src.jobid_value; - break; - - default: - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "query attribute not defined"); - } - - return *this; -} - - -QueryRecord::operator edg_wll_QueryRec() const -{ - edg_wll_QueryRec out; - - out.attr = edg_wll_QueryAttr(attr); - out.op = edg_wll_QueryOp(oper); - - switch (attr) { - - case USERTAG: - out.attr_id.tag = strdup(tag_name.c_str()); - - case OWNER: - case LOCATION: - case DESTINATION: - case HOST: - case INSTANCE: - out.value.c = strdup(string_value.c_str()); - if(oper == WITHIN) - out.value2.c = strdup(string_value2.c_str()); - break; - - - case DONECODE: - case STATUS: - case SOURCE: - case EVENT_TYPE: - case LEVEL: - case EXITCODE: - out.value.i = int_value; - if(oper == WITHIN) - out.value2.i = int_value2; - break; - - case TIME: - out.value.t = timeval_value; - out.attr_id.state = (edg_wll_JobStatCode)state; - if(oper == WITHIN) - out.value2.t = timeval_value2; - break; - - case JOBID: - if(glite_jobid_dup(jobid_value.c_jobid(), (glite_jobid_t*)&out.value.j)) { - throw std::bad_alloc(); - } - break; - - case UNDEF: - break; - - default: - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, EINVAL, "query attribute not defined"); - } - - return(out); -} - -const std::string QueryRecord::AttrName(const QueryRecord::Attr attr) -{ - char *an = edg_wll_query_attrToString(edg_wll_QueryAttr(attr)); - std::string ret(an); - free(an); - return ret; -} - - -/** - * definitions of ServerConnection class - */ -#undef CLASS_PREFIX -#define CLASS_PREFIX "glite::lb::ServerConnection::" - -ServerConnection::ServerConnection() -{ - int ret; - edg_wll_Context tmp_context; - - if((ret=edg_wll_InitContext(&tmp_context)) < 0) { - STACK_ADD; - throw OSException(EXCEPTION_MANDATORY, ret, "initializing context"); - } - - context = tmp_context; -} - - -ServerConnection::~ServerConnection() -{ - /* no exceptions should be thrown from destructors */ - edg_wll_FreeContext(context); -} - - -/********************/ -/* BEGIN DEPRECATED */ - -ServerConnection::ServerConnection(const std::string &in) -{ - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, 0, "method deprecated"); -} - - -void -ServerConnection::open(const std::string & in) -{ - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, 0, "method deprecated"); -} - - -void -ServerConnection::close(void) -{ - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, 0, "method deprecated"); -} - -/* END DEPRECATED */ -/******************/ - - -void -ServerConnection::setQueryServer(const std::string& server, int port) -{ - check_result(edg_wll_SetParamString(context, - EDG_WLL_PARAM_QUERY_SERVER, - server.c_str()), - context, - "setting query server address"); - check_result(edg_wll_SetParamInt(context, - EDG_WLL_PARAM_QUERY_SERVER_PORT, - port), - context, - "setting query server port"); -} - - -void -ServerConnection::setQueryTimeout(int timeout) -{ - check_result(edg_wll_SetParamInt(context, - EDG_WLL_PARAM_QUERY_TIMEOUT, - timeout), - context, - "setting query timeout"); -} - - -void ServerConnection::setX509Proxy(const std::string& proxy) -{ - check_result(edg_wll_SetParamString(context, - EDG_WLL_PARAM_X509_PROXY, - proxy.c_str()), - context, - "setting X509 proxy"); -} - - -void ServerConnection::setX509Cert(const std::string& cert, const std::string& key) -{ - check_result(edg_wll_SetParamString(context, - EDG_WLL_PARAM_X509_CERT, - cert.c_str()), - context, - "setting X509 certificate"); - check_result(edg_wll_SetParamString(context, - EDG_WLL_PARAM_X509_KEY, - key.c_str()), - context, - "setting X509 key"); -} - - -void -ServerConnection::setQueryEventsLimit(int max) { - check_result(edg_wll_SetParamInt(context, - EDG_WLL_PARAM_QUERY_EVENTS_LIMIT, - max), - context, - "setting query events limit"); -} - -void -ServerConnection::setQueryJobsLimit(int max) { - check_result(edg_wll_SetParamInt(context, - EDG_WLL_PARAM_QUERY_JOBS_LIMIT, - max), - context, - "setting query jobs limit"); -} - - -std::pair -ServerConnection::getQueryServer() const -{ - 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(strdup(hostname)), port); -} - - -int -ServerConnection::getQueryTimeout() const -{ - 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 -{ - 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 -ServerConnection::getX509Cert() const -{ - 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(strdup(cert)), - std::string(strdup(key))); -} - -// static -void freeQueryRecVector(edg_wll_QueryRec *v) -{ - for(; v->attr != EDG_WLL_QUERY_ATTR_UNDEF; v++) - edg_wll_QueryRecFree(v); -} - -// static -void freeQueryRecVectorExt(edg_wll_QueryRec **v) -{ - for(; *v; v++) - edg_wll_QueryRecFree(*v); -} - -std::vector > > -ServerConnection::getIndexedAttrs(void) { - edg_wll_QueryRec **recs; - int i,j; - std::vector > > out; - - check_result(edg_wll_GetIndexedAttrs(context,&recs),context, - "edg_wll_GetIndexedAttrs()"); - - if (!recs) return out; - - for (i=0; recs[i]; i++) { - std::vector > idx; - for (j=0; recs[i][j].attr; j++) { - char *s = strdup(""); - if (recs[i][j].attr == EDG_WLL_QUERY_ATTR_USERTAG) - s = strdup(recs[i][j].attr_id.tag); - else if (recs[i][j].attr == EDG_WLL_QUERY_ATTR_TIME) - s = edg_wll_StatToString(recs[i][j].attr_id.state); - idx.push_back( - std::pair( - QueryRecord::Attr(recs[i][j].attr),s) - ); - free(s); - } - freeQueryRecVector(recs[i]); - out.push_back(idx); - } - free(recs); - return out; -} - - - - -edg_wll_QueryRec * -convertQueryVector(const std::vector &in) -{ - unsigned i; - edg_wll_QueryRec *out = new edg_wll_QueryRec[in.size() + 1]; - QueryRecord empty; - - if(out == NULL) { - STACK_ADD; - throw OSException(EXCEPTION_MANDATORY, ENOMEM, "allocating vector for conversion"); - } - - try { - for(i = 0; i < in.size(); i++) { - out[i] = in[i]; - } - out[i] = empty; - } catch (Exception &e) { - STACK_ADD; - throw; - } - return(out); -} - - -edg_wll_QueryRec ** -convertQueryVectorExt(const std::vector > &in) -{ - unsigned i; - edg_wll_QueryRec **out = new edg_wll_QueryRec*[in.size() + 1]; - - if(out == NULL) { - STACK_ADD; - throw OSException(EXCEPTION_MANDATORY, ENOMEM, "allocating vector for conversion"); - } - - try { - for(i = 0; i < in.size(); i++) { - out[i] = convertQueryVector(in[i]); - } - out[i] = NULL; - } catch (Exception &e) { - STACK_ADD; - throw; - } - return(out); -} - -void -ServerConnection::queryEvents(const std::vector& job_cond, - const std::vector& event_cond, - std::vector & eventList) const -{ - edg_wll_QueryRec *job_rec = NULL, *event_rec = NULL; - edg_wll_Event *events = NULL; - unsigned i; - int result, qresults_param; - char *errstr = NULL; - - /* convert input */ - try { - job_rec = convertQueryVector(job_cond); - event_rec = convertQueryVector(event_cond); - - /* do the query */ - - result = edg_wll_QueryEvents(context, job_rec, event_rec, &events); - if (result == E2BIG) { - edg_wll_Error(context, NULL, &errstr); - check_result(edg_wll_GetParam(context, - EDG_WLL_PARAM_QUERY_RESULTS, &qresults_param), - context, - "edg_wll_GetParam(EDG_WLL_PARAM_QUERY_RESULTS)"); - if (qresults_param != EDG_WLL_QUERYRES_LIMITED) { - edg_wll_SetError(context, result, errstr); - check_result(result, context,"edg_wll_QueryEvents"); - } - } else { - check_result(result, context,"edg_wll_QueryEvents"); - } - - /* convert output */ - for (i=0; events[i].type != EDG_WLL_EVENT_UNDEF; i++) { - edg_wll_Event *ev = (edg_wll_Event *) malloc(sizeof *ev); - memcpy(ev,events+i,sizeof *ev); - Event e(ev); - - eventList.push_back(e); - } - - if (result) { - edg_wll_SetError(context, result, errstr); - check_result(result, context,"edg_wll_QueryEvents"); - } - - free(events); - freeQueryRecVector(job_rec); - freeQueryRecVector(event_rec); - delete[] job_rec; - delete[] event_rec; - - } catch(Exception &e) { - freeQueryRecVector(job_rec); - freeQueryRecVector(event_rec); - if(job_rec) delete[] job_rec; - if(event_rec) delete[] event_rec; - if(events) free(events); - if(errstr) free(errstr); - - STACK_ADD; - throw; - } -} - - -const std::vector -ServerConnection::queryEvents(const std::vector& job_cond, - const std::vector& event_cond) const -{ - std::vector eventList; - - queryEvents(job_cond, event_cond,eventList); - return eventList; -} - -const std::list -ServerConnection::queryEventsList(const std::vector& job_cond, - const std::vector& event_cond) const -{ - std::vector events; - - queryEvents(job_cond, event_cond, events); - return std::list(events.begin(),events.end()); -} - -std::string -ServerConnection::queryEventsAggregate(const std::vector& job_cond, - const std::vector& event_cond, - enum AggOp const op, - std::string const attr) const -{ - STACK_ADD; - throw Exception(EXCEPTION_MANDATORY, 0, "method not implemented"); - return ""; // gcc warning; -} - - -void -ServerConnection::queryEvents(const std::vector >& job_cond, - const std::vector >& event_cond, - std::vector& eventList) const -{ - edg_wll_QueryRec **job_rec = NULL, **event_rec = NULL; - edg_wll_Event *events = NULL; - unsigned i; - - /* convert input */ - try { - job_rec = convertQueryVectorExt(job_cond); - event_rec = convertQueryVectorExt(event_cond); - - /* do the query */ - - check_result(edg_wll_QueryEventsExt(context, - (const edg_wll_QueryRec**)job_rec, - (const edg_wll_QueryRec**)event_rec, - &events), - context, - "edg_wll_QueryEvents"); - - /* convert output */ - for (i=0; events[i].type != EDG_WLL_EVENT_UNDEF; i++) { - edg_wll_Event *ev = (edg_wll_Event *) malloc(sizeof *ev); - memcpy(ev,events+i,sizeof *ev); - Event e(ev); - - eventList.push_back(e); - } - - free(events); - - freeQueryRecVectorExt(job_rec); - freeQueryRecVectorExt(event_rec); - delete[] job_rec; - delete[] event_rec; - - } catch(Exception &e) { - - freeQueryRecVectorExt(job_rec); - freeQueryRecVectorExt(event_rec); - delete[] job_rec; - delete[] event_rec; - if(events) free(events); - - STACK_ADD; - throw; - } -} - - -const std::vector -ServerConnection::queryEvents(const std::vector >& job_cond, - const std::vector >& event_cond) const -{ - std::vector eventList; - - queryEvents(job_cond, event_cond,eventList); - return eventList; -} - - -void ServerConnection::queryJobs(const std::vector& query, - std::vector & ids) const -{ - edg_wll_QueryRec *cond = NULL; - edg_wlc_JobId *jobs, *j; - int result, qresults_param; - char *errstr = NULL; - - try { - cond = convertQueryVector(query); - - result = edg_wll_QueryJobs(context, cond, 0, &jobs, NULL); - if (result == E2BIG) { - edg_wll_Error(context, NULL, &errstr); - check_result(edg_wll_GetParam(context, - EDG_WLL_PARAM_QUERY_RESULTS, &qresults_param), - context, - "edg_wll_GetParam(EDG_WLL_PARAM_QUERY_RESULTS)"); - if (qresults_param != EDG_WLL_QUERYRES_LIMITED) { - edg_wll_SetError(context, result, errstr); - check_result(result, context,"edg_wll_QueryJobs"); - } - } else { - check_result(result, context,"edg_wll_QueryJobs"); - } - - for(j = jobs; *j; j++) - ids.push_back(glite::jobid::JobId(*j)); - - if (result) { - edg_wll_SetError(context, result, errstr); - check_result(result, context,"edg_wll_QueryJobs"); - } - - free(jobs); - freeQueryRecVector(cond); - delete[] cond; - - } catch (Exception &e) { - if(cond) { - freeQueryRecVector(cond); - delete[] cond; - } - if (errstr) free(errstr); - - STACK_ADD; - throw; - } -} - - -const std::vector -ServerConnection::queryJobs(const std::vector& query) const -{ - std::vector jobList; - - queryJobs(query, jobList); - return jobList; -} - - -void -ServerConnection::queryJobs(const std::vector >& query, - std::vector& ids) const -{ - edg_wll_QueryRec **cond = NULL; - edg_wlc_JobId *jobs, *j; - int result, qresults_param; - char *errstr = NULL; - - try { - cond = convertQueryVectorExt(query); - - result = edg_wll_QueryJobsExt(context, (const edg_wll_QueryRec**)cond, - 0, &jobs, NULL); - if (result == E2BIG) { - edg_wll_Error(context, NULL, &errstr); - check_result(edg_wll_GetParam(context, - EDG_WLL_PARAM_QUERY_RESULTS, &qresults_param), - context, - "edg_wll_GetParam(EDG_WLL_PARAM_QUERY_RESULTS)"); - if (qresults_param != EDG_WLL_QUERYRES_LIMITED) { - edg_wll_SetError(context, result, errstr); - check_result(result, context,"edg_wll_QueryJobsExt"); - } - } else { - check_result(result, context,"edg_wll_QueryJobsExt"); - } - - for(j = jobs; *j; j++) - ids.push_back(glite::jobid::JobId(*j)); - - if (result) { - edg_wll_SetError(context, result, errstr); - check_result(result, context,"edg_wll_QueryJobsExt"); - } - - free(jobs); - { - unsigned i; - - for(i = 0; cond[i]; i++) { - freeQueryRecVector(cond[i]); - delete[] cond[i]; - } - delete[] cond; - } - - } catch (Exception &e) { - unsigned i; - if(cond) { - for(i = 0; cond[i]; i++) { - freeQueryRecVector(cond[i]); - delete[] cond[i]; - } - delete[] cond; - } - if (errstr) free(errstr); - - STACK_ADD; - throw; - } -} - - -const -std::vector -ServerConnection::queryJobs(const std::vector >& query) const -{ - std::vector jobList; - - queryJobs(query, jobList); - return jobList; -} - - -void -ServerConnection::queryJobStates(const std::vector& query, - int flags, - std::vector & states) const -{ - edg_wll_QueryRec *cond = NULL; - edg_wll_JobStat *jobs, *j; - int result, qresults_param; - char *errstr = NULL; - - try { - cond = convertQueryVector(query); - - result = edg_wll_QueryJobs(context, cond, flags, NULL, &jobs); - if (result == E2BIG) { - edg_wll_Error(context, NULL, &errstr); - check_result(edg_wll_GetParam(context, - EDG_WLL_PARAM_QUERY_RESULTS, &qresults_param), - context, - "edg_wll_GetParam(EDG_WLL_PARAM_QUERY_RESULTS)"); - if (qresults_param != EDG_WLL_QUERYRES_LIMITED) { - edg_wll_SetError(context, result, errstr); - check_result(result, context,"edg_wll_QueryJobs"); - } - } else { - check_result(result, context,"edg_wll_QueryJobs"); - } - - for(j = jobs; j->state != EDG_WLL_JOB_UNDEF; j++) { - edg_wll_JobStat *jsep = new edg_wll_JobStat; - if (jsep != NULL) { - memcpy(jsep, j, sizeof(*j)); - states.push_back(JobStatus(*jsep)); - } - } - - if (result) { - edg_wll_SetError(context, result, errstr); - check_result(result, context,"edg_wll_QueryJobs"); - } - - delete jobs; - - freeQueryRecVector(cond); - delete[] cond; - - } catch (Exception &e) { - if(cond) { - freeQueryRecVector(cond); - delete[] cond; - } - if (errstr) free(errstr); - - STACK_ADD; - throw; - } -} - - -const std::vector -ServerConnection::queryJobStates(const std::vector& query, - int flags) const -{ - std::vector states; - - queryJobStates(query, flags, states); - return(states); -} - -const std::list -ServerConnection::queryJobStatesList(const std::vector& query, - int flags) const -{ - std::vector states; - - queryJobStates(query, flags, states); - return std::list(states.begin(),states.end()); -} - - -void -ServerConnection::queryJobStates(const std::vector >& query, - int flags, - std::vector & states) const -{ - edg_wll_QueryRec **cond = NULL; - edg_wll_JobStat *jobs, *j; - int result, qresults_param; - char *errstr = NULL; - - try { - cond = convertQueryVectorExt(query); - - result = edg_wll_QueryJobsExt(context, (const edg_wll_QueryRec**)cond, - flags, NULL, &jobs); - if (result == E2BIG) { - edg_wll_Error(context, NULL, &errstr); - check_result(edg_wll_GetParam(context, - EDG_WLL_PARAM_QUERY_RESULTS, &qresults_param), - context, - "edg_wll_GetParam(EDG_WLL_PARAM_QUERY_RESULTS)"); - if (qresults_param != EDG_WLL_QUERYRES_LIMITED) { - edg_wll_SetError(context, result, errstr); - check_result(result, context,"edg_wll_QueryJobsExt"); - } - } else { - check_result(result, context,"edg_wll_QueryJobsExt"); - } - - for(j = jobs; j->state != EDG_WLL_JOB_UNDEF; j++) { - edg_wll_JobStat *jsep = new edg_wll_JobStat; - if (jsep != NULL) { - memcpy(jsep, j, sizeof(*j)); - states.push_back(JobStatus(*jsep)); - } - } - - if (result) { - edg_wll_SetError(context, result, errstr); - check_result(result, context,"edg_wll_QueryJobsExt"); - } - - delete jobs; - - { - unsigned i; - - for(i = 0; cond[i]; i++) { - freeQueryRecVector(cond[i]); - delete[] cond[i]; - } - delete[] cond; - } - - - } catch (Exception &e) { - unsigned i; - if(cond) { - for(i = 0; cond[i]; i++) { - freeQueryRecVector(cond[i]); - delete[] cond[i]; - } - delete[] cond; - } - if (errstr) free(errstr); - - STACK_ADD; - throw; - } -} - - -const std::vector -ServerConnection::queryJobStates(const std::vector >& query, - int flags) const -{ - std::vector states; - - queryJobStates(query, flags, states); - return(states); -} - - -void ServerConnection::userJobs(std::vector & ids) const -{ - edg_wlc_JobId *jobs, *j; - int result, qresults_param; - char *errstr = NULL; - - try { - result = edg_wll_UserJobs(context, &jobs, NULL); - if (result == E2BIG) { - edg_wll_Error(context, NULL, &errstr); - check_result(edg_wll_GetParam(context, - EDG_WLL_PARAM_QUERY_RESULTS, &qresults_param), - context, - "edg_wll_GetParam(EDG_WLL_PARAM_QUERY_RESULTS)"); - if (qresults_param != EDG_WLL_QUERYRES_LIMITED) { - edg_wll_SetError(context, result, errstr); - check_result(result, context,"edg_wll_UserJobs"); - } - } else { - check_result(result, context,"edg_wll_UserJobs"); - } - - for(j = jobs; *j; j++) - ids.push_back(glite::jobid::JobId(*j)); - - if (result) { - edg_wll_SetError(context, result, errstr); - check_result(result, context,"edg_wll_QueryJobsExt"); - } - - free(jobs); - - } catch (Exception &e) { - if (errstr) free(errstr); - - STACK_ADD; - throw; - } -} - - -const std::vector -ServerConnection::userJobs() const -{ - std::vector jobList; - - userJobs(jobList); - return jobList; -} - - -void -ServerConnection::userJobStates(std::vector & states) const -{ - edg_wll_JobStat *jobs, *j; - int result, qresults_param; - char *errstr = NULL; - - try { - result = edg_wll_UserJobs(context, NULL, &jobs); - if (result == E2BIG) { - edg_wll_Error(context, NULL, &errstr); - check_result(edg_wll_GetParam(context, - EDG_WLL_PARAM_QUERY_RESULTS, &qresults_param), - context, - "edg_wll_GetParam(EDG_WLL_PARAM_QUERY_RESULTS)"); - if (qresults_param != EDG_WLL_QUERYRES_LIMITED) { - edg_wll_SetError(context, result, errstr); - check_result(result, context,"edg_wll_UserJobs"); - } - } else { - check_result(result, context,"edg_wll_UserJobs"); - } - - for(j = jobs; j->state != EDG_WLL_JOB_UNDEF; j++) { - edg_wll_JobStat *jsep = new edg_wll_JobStat; - if (jsep != NULL) { - memcpy(jsep, j, sizeof(*j)); - states.push_back(JobStatus(*jsep)); - } - } - - if (result) { - edg_wll_SetError(context, result, errstr); - check_result(result, context,"edg_wll_QueryJobsExt"); - } - - delete jobs; - - } catch (Exception &e) { - if (errstr) free(errstr); - - STACK_ADD; - throw; - } -} - - -const std::vector -ServerConnection::userJobStates() const -{ - std::vector states; - - userJobStates(states); - return(states); -} - - -edg_wll_Context -ServerConnection::getContext(void) const -{ - return(context); -} - - -void ServerConnection::setParam(edg_wll_ContextParam par, int val) -{ - check_result(edg_wll_SetParamInt(context,par,val), - context, - "edg_wll_SetParamInt()"); -} - -void ServerConnection::setParam(edg_wll_ContextParam par, const std::string &val) -{ - check_result(edg_wll_SetParamString(context,par,val.c_str()), - context, - "edg_wll_SetParamString()"); -} - -void ServerConnection::setParam(edg_wll_ContextParam par, const struct timeval & val) -{ - check_result(edg_wll_SetParamTime(context,par,&val), - context, - "edg_wll_SetParamTime()"); -} - -int ServerConnection::getParamInt(edg_wll_ContextParam par) const -{ - int ret; - check_result(edg_wll_GetParam(context,par,&ret), - context, - "edg_wll_GetParam()"); - return ret; -} - -std::string ServerConnection::getParamString(edg_wll_ContextParam par) const -{ - char *ret; - std::string out; - - check_result(edg_wll_GetParam(context,par,&ret), - context, - "edg_wll_GetParam()"); - - out = ret; - free(ret); - return out; -} - -struct timeval ServerConnection::getParamTime(edg_wll_ContextParam par) const -{ - struct timeval ret; - check_result(edg_wll_GetParam(context,par,&ret), - context, - "edg_wll_GetParam()"); - return ret; -} - -EWL_END_NAMESPACE; diff --git a/org.glite.lb.client/src/StatusAttrNames.pl b/org.glite.lb.client/src/StatusAttrNames.pl deleted file mode 100644 index ec36be1..0000000 --- a/org.glite.lb.client/src/StatusAttrNames.pl +++ /dev/null @@ -1,113 +0,0 @@ -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# The order of strings in this array determines assigned numeric value in the JobStatus::Attr enum. -# It must not be changed unless API major number is incremented - -@main::StatusAttrNames = qw/ - ACL - CANCEL_REASON - CANCELLING - CE_NODE - CHILDREN - CHILDREN_HIST - CHILDREN_NUM - CHILDREN_STATES - CONDOR_ID - CONDOR_DEST_HOST - CONDOR_ERROR_DESC - CONDOR_JDL - CONDOR_JOB_EXIT_STATUS - CONDOR_JOB_PID - CONDOR_OWNER - CONDOR_PREEMPTING - CONDOR_REASON - CONDOR_SHADOW_EXIT_STATUS - CONDOR_SHADOW_PID - CONDOR_STARTER_EXIT_STATUS - CONDOR_STARTER_PID - CONDOR_STATUS - CONDOR_UNIVERSE - CPU_TIME - DESTINATION - DONE_CODE - EXIT_CODE - EXPECT_FROM - EXPECT_UPDATE - FAILURE_REASONS - GLOBUS_ID - JDL - JOB_ID - JOBTYPE - LAST_UPDATE_TIME - LOCAL_ID - LOCATION - MATCHED_JDL - NETWORK_SERVER - OWNER - PARENT_JOB - PAYLOAD_RUNNING - PBS_DEST_HOST - PBS_ERROR_DESC - PBS_EXIT_STATUS - PBS_NAME - PBS_OWNER - PBS_PID - PBS_QUEUE - PBS_REASON - PBS_RESOURCE_USAGE - PBS_SCHEDULER - PBS_STATE - POSSIBLE_CE_NODES - POSSIBLE_DESTINATIONS - REASON - RESUBMITTED - RSL - SEED - STATE_ENTER_TIME - STATE_ENTER_TIMES - SUBJOB_FAILED - SUSPEND_REASON - SUSPENDED - USER_TAGS - REMOVE_FROM_PROXY - UI_HOST - USER_FQANS - SANDBOX_RETRIEVED - JW_STATUS - JDL_CLASSAD - CREAM_CANCEL_REASON - CREAM_CANCELLING - CREAM_CPU_TIME - CREAM_DONE_CODE - CREAM_ENDPOINT - CREAM_EXIT_CODE - CREAM_JDL - CREAM_JW_STATUS - CREAM_LRMS_ID - CREAM_NODE - CREAM_OWNER - CREAM_REASON - CREAM_STATE - FT_COMPUTE_JOB - FT_SANDBOX_TYPE - FT_SRC - FT_DEST - ISB_TRANSFER - OSB_TRANSFER - CREAM_FAILURE_REASON - CREAM_ID -/; diff --git a/org.glite.lb.client/src/args.c.T b/org.glite.lb.client/src/args.c.T deleted file mode 100644 index 72daeb2..0000000 --- a/org.glite.lb.client/src/args.c.T +++ /dev/null @@ -1,605 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* -@@@AUTO -*/ - -@@@LANG: C - -#include "args.h" -#include "glite/lb/events.h" - -#include -#include -#include -#include -#include -#include -#include -#include - - -typedef struct { - int argc; - char** argv; - const char* help; - int idx; - edg_wll_Args list[1000]; - int last; -} opt_ctx_t; - -/* lists of accepted tags */ -@@@{ - gen "static const char * const eventJobCommon\[] = {"; - selectType $event '_common_'; - for (getFieldsOrdered $event) { - my $f = selectField $event $_; - my $fn = $f->{name}; - gen "\"$fn\", "; - } - gen "NULL };\n"; -@@@} -@@@{ - for my $t (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } - $event->getTypes) { - gen "static const char * const event$t\[] = {"; - selectType $event $t; - for (getFieldsOrdered $event) { - my $f = selectField $event $_; - my $fn = $f->{name}; - gen "\"$fn\", " - } - gen "NULL };\n"; - } -@@@} - -static const char * const * const eventTags[] = { - eventJobCommon, -@@@{ - for my $t (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } - $event->getTypes) { - gen "\tevent$t,\n"; - } - gen "\tNULL\n};\n"; -@@@} - -static int read_bool(const edg_wll_Args* o, char* arg, char* par) -{ - int b = 1; - int rs = 0; - - if (par) - { - if (!strcasecmp(par, "off") || !strcmp(par, "0") - || !strcasecmp(par, "false")) - { - b = 0; - rs = 1; - } - else if (!strcasecmp(par, "on") || !strcmp(par, "1") - || !strcasecmp(par, "true")) - { - rs = 1; - } - } - - if (o->value) - *(int*)o->value = b; - return rs; -} - -static void read_float(const edg_wll_Args* o, char* arg, char* par) -{ - float d; - if (!par) - { - printf("Option: %s - missing float value\n", arg); - exit(1); - } - d = strtof(par,NULL); - if (o->min != o->max) - { - if (d < o->min && d > o->max) - { - printf("Option: %s - value: %f out of range <%d, %d>", - arg, d, o->min, o->max); - exit(1); - } - } - if (o->value) - *(float*)o->value = d; -} - -static void read_double(const edg_wll_Args* o, char* arg, char* par) -{ - double d; - if (!par) - { - printf("Option: %s - missing double value\n", arg); - exit(1); - } - d = strtod(par,NULL); - if (o->min != o->max) - { - if (d < o->min && d > o->max) - { - printf("Option: %s - value: %f out of range <%d, %d>", - arg, d, o->min, o->max); - exit(1); - } - } - if (o->value) - *(double*)o->value = d; -} - -static void read_string(const edg_wll_Args* o, char* arg, char* par) -{ - if (!par) - { - printf("Option: %s - missing string value\n", arg); - exit(1); - } - if (o->value) - { - if (strstr(arg, "-file")) - { - struct stat buf; - int fd = open(par, O_RDONLY); - if (fd >= 0) - { - char* b; - fstat(fd, &buf); - b = (char*) malloc(buf.st_size); - if (b) - { - int p = 0; - printf("Opened & reading %s %lld\n", - par, (long long)buf.st_size); - while (p < buf.st_size) - { - int r = read(fd, b + p, buf.st_size); - if (r < 0) - break; - p += r; - } - - *(char**)o->value = b; - } - close(fd); - } - else - fprintf(stderr, "can't open file: \"%s\" (%s)\n", par, strerror(errno)); - - } - else - *(char**)o->value = strdup(par); - } -} - -static void read_int(const edg_wll_Args* o, char* arg, char* par) -{ - int v = 0; - if (!par) - { - printf("Option: %s - missing integer value\n", arg); - exit(1); - } - sscanf(par, "%i", &v); - if (o->min != o->max) - { - if (v < o->min && v > o->max) - { - printf("Option: %s - value: %d out of range <%d, %d>", - arg, v, o->min, o->max); - exit(1); - } - } - if (o->value) - *(int*)o->value = v; -} - -static void read_uint16(const edg_wll_Args* o, char* arg, char* par) -{ - int v = 0; - if (!par) - { - printf("Option: %s - missing integer value\n", arg); - exit(1); - } - sscanf(par, "%i", &v); - if (o->min != o->max) - { - if (v < o->min && v > o->max) - { - printf("Option: %s - value: %d out of range <%d, %d>", - arg, v, o->min, o->max); - exit(1); - } - } - if (o->value) - *(u_int16_t*)o->value = v; -} - -static void read_event(const edg_wll_Args* o, char* arg, char* par) -{ - edg_wll_EventCode ec = edg_wll_StringToEvent(par); - if (ec == EDG_WLL_EVENT_UNDEF) - { - if (strcmp(par, "help") == 0) - { - // list type - int i, k = EDG_WLL_EVENT_UNDEF + 1; - printf("Available events: extra options\n"); -/* XXX: holes in edg_wll_EventCode */ - for (i = EDG_WLL_EVENT_UNDEF + 1; i < EDG_WLL_EVENT__LAST; i++) - { - char* e = edg_wll_EventToString(i); - if (e) - { - int j = 0; - printf(" %s: ", e); - while (eventTags[k][j]) - printf("%s ", eventTags[k][j++]); - fputc('\n', stdout); - k++; - free(e); - } - } - } - else - fprintf(stderr,"ERROR %s unknown event: %s\n", arg, par); - exit(1); - } - if (o->value) - *(edg_wll_EventCode*)o->value = ec; - -} - -static void read_source(const edg_wll_Args* o, char* arg, char* par) -{ - edg_wll_Source s = edg_wll_StringToSource(par); - if (s == EDG_WLL_SOURCE_NONE) - { - if (strcmp(par, "help") == 0) - { - // list type - int i; - printf("Valid sources:\n"); - for (i = EDG_WLL_SOURCE_NONE + 1; i < EDG_WLL_SOURCE__LAST; i++) - { - char* e = edg_wll_SourceToString(i); - if (e) - { - printf(" %s\n", e); - free(e); - } - } - } - else - fprintf(stderr,"ERROR %s unknown source: %s\n", arg, par); - exit(1); - } - if (o->value) - *(edg_wll_Source*)o->value = s; -} - -/* FIXME: parse timeval from string correctly */ -static void read_timeval(const edg_wll_Args* o, char* arg, char* par) -{ - int v = 0; - if (!par) - { - printf("Option: %s - missing timeval value\n", arg); - exit(1); - } - sscanf(par, "%i", &v); - if (o->min != o->max) - { - if (v < o->min && v > o->max) - { - printf("Option: %s - value: %d out of range <%d, %d>", - arg, v, o->min, o->max); - exit(1); - } - } - if (o->value) - *(int*)o->value = v; -} - -static void show_help(const edg_wll_Args* o, int prefix) -{ - unsigned max = 0; - char** l = malloc(sizeof(char*) * 1000); - int li = 0; - unsigned i = 0; - - for (i = 0; o[i].type != EDG_WLL_ARGS_NONE; i++) - { - char b[80]; - unsigned len; - if (o[i].type == EDG_WLL_ARGS_HELP) - sprintf(b, " -h --help"); - else - sprintf(b, " %c%s %s%s", - (o[i].oshort && prefix) ? '-' : ' ', - o[i].oshort ? o[i].oshort : " ", - (o[i].olong && prefix) ? "--" : "", - o[i].olong ? o[i].olong : "" - //opt[i].options ? opt[i].options : "", - //o[i].help ? o[i].help : "" - ); - l[li] = strdup(b); - li++; - len = strlen(b); - if (max < len) - max = len; - } - for (i = 0; o[i].type != EDG_WLL_ARGS_NONE; i++) - { - if (!o[i].oshort && !o[i].olong - && o[i].type != EDG_WLL_ARGS_HELP - && o[i].type != EDG_WLL_ARGS_OPTIONS) - continue; - - if (o[i].type != EDG_WLL_ARGS_OPTIONS) - { - unsigned s; - fputs(l[i], stdout); - for (s = strlen(l[i]); s <= max; s++) - fputc(' ', stdout); - if (o[i].type == EDG_WLL_ARGS_HELP) - fputs("this help message", stdout); - } - - if (o[i].value) - { - switch (o[i].type) - { - case EDG_WLL_ARGS_INT: - if (o[i].help) - printf(o[i].help, *(int*)o[i].value, - o[i].min, o[i].max); - break; - case EDG_WLL_ARGS_STRING: - case EDG_WLL_ARGS_SELECTSTRING: - if (o[i].help) - printf(o[i].help, *(const char**)o[i].value); - break; - case EDG_WLL_ARGS_OPTIONS: - show_help((const edg_wll_Args*)o[i].value, prefix); - continue; - default: - if (o[i].help) - fputs(o[i].help, stdout); - break; - } - } - else if (o[i].help) - fputs(o[i].help, stdout); - - fputs("\n", stdout); - } - while (--li>=0) free(l[li]); - free(l); -} -#if 0 -static void parse_suboptions(const Option* o, const char* oname, char* pars, const char* r) -{ - avm::vector arr; - split(arr, pars); - - if (!arr.size() || strcmp(arr[0], "help") == 0) - { - printf("Available options for '%s' (optA=x:optB=...)\n", oname); - show_help(o, false); - exit(0); - } - for (unsigned i = 0; i < arr.size(); i++) - { - char* par = strchr(arr[i], '='); - if (par) - { - *par = 0; - par++; - } - - for (unsigned j = 0; o[j].type != Args::Option::NONE; j++) - { - if ((o[j].oshort && strcmp(o[j].oshort, arr[i]) == 0) - || (o[j].olong && strcmp(o[j].olong, arr[i]) == 0)) - { - switch(o[j].type) - { - case Args::Option::BOOL: - read_bool(&o[j], arr[i], par, r); - break; - case Args::Option::FLOAT: - read_float(&o[j], arr[i], par, r); - break; - case Args::Option::DOUBLE: - read_double(&o[j], arr[i], par, r); - break; - case Args::Option::INT: - read_int(&o[j], arr[i], par, r); - break; - default: - ; - } - } - } - } -} -#endif - -static int findOpt(opt_ctx_t* ctx, int olong) -{ - char* arg = ctx->argv[ctx->idx] + olong + 1; - char* par = strchr(arg, '='); - const edg_wll_Args* o = NULL; - const edg_wll_Args* ol[200]; - int olb = 0; - int ole = 0; - - char* argnofile = strdup(arg); - char* nofile = strstr(argnofile, "-file"); // should be the ending - if (nofile && (nofile - argnofile) > 2) - nofile[0] = 0; - - olong++; - if (par) - { - *par = 0; - par++; - } - else if ((ctx->idx + 1) < ctx->argc) - { - par = ctx->argv[++ctx->idx]; - } - - ol[ole++] = ctx->list; - while (ole > olb) - { - o = ol[olb++]; - for (; o->type != EDG_WLL_ARGS_NONE; o++) - { - //printf("OPTION %d '%s' %d '%s' '%s'\n", o->type, arg, olong, o->oshort, o->olong); - if (o->type == EDG_WLL_ARGS_HELP - && (strcasecmp(arg, "h") == 0 - || strcmp(arg, "?") == 0 - || strcasecmp(arg, "help") == 0)) - break; - if (o->type == EDG_WLL_ARGS_OPTIONS) - { - ol[ole++] = o->value; - continue; - } - - if (olong < 2) - { - if (o->oshort && - (strcmp(arg, o->oshort) == 0 - || strcmp(argnofile, o->oshort) == 0)) - break; - } - else if (o->olong && (strcmp(arg, o->olong) == 0 - || strcmp(argnofile, o->olong) == 0)) - break; - } - if (o->type != EDG_WLL_ARGS_NONE) - break; - } - - switch (o->type) - { - case EDG_WLL_ARGS_NONE: - return -1; - case EDG_WLL_ARGS_BOOL: - if (!read_bool(o, arg, par)) - ctx->idx--; // no argument given - break; - case EDG_WLL_ARGS_FLOAT: - read_float(o, arg, par); - break; - case EDG_WLL_ARGS_DOUBLE: - read_double(o, arg, par); - break; - case EDG_WLL_ARGS_STRING: - read_string(o, arg, par); - break; - case EDG_WLL_ARGS_INT: - read_int(o, arg, par); - break; - case EDG_WLL_ARGS_UINT16: - read_uint16(o, arg, par); - break; - case EDG_WLL_ARGS_EVENT: - read_event(o, arg, par); - break; - case EDG_WLL_ARGS_SOURCE: - read_source(o, arg, par); - break; - case EDG_WLL_ARGS_HELP: - printf("\nUsage: %s %s\n\n", ctx->argv[0], ctx->help); - show_help(ctx->list, 1); - exit(0); - //case EDG_WLL_ARGS_SUBOPTIONS: - //parse_suboptions((const edg_wll_Args*)o->value, arg, par, regname); - case EDG_WLL_ARGS_TIMEVAL: - read_timeval(o, arg, par); - break; - default: - printf("FIXME: unhandle option type %d\n", o->type); - break; - } - - if (argnofile) - free(argnofile); - - return 0; -} - -static void addOptions(opt_ctx_t* ctx, const edg_wll_Args* options) -{ - const edg_wll_Args* o = options; - - while (o->type != EDG_WLL_ARGS_NONE) - { - ctx->list[ctx->last++] = *o; - o++; - } -} - -void edg_wll_ParseArgs(int* argc, char** argv, const edg_wll_Args* options, - const char* help) -{ - int sidx = 1; - opt_ctx_t ctx; - - ctx.argc = *argc; - ctx.argv = argv; - ctx.help = help; - ctx.last = 0; - - addOptions(&ctx, options); - - for (ctx.idx = 1; ctx.idx < ctx.argc; ctx.idx++) - { - if (argv[ctx.idx][0] == '-') - { - int olong = (argv[ctx.idx][1] == '-'); - if (olong && argv[ctx.idx][2] == 0) - break; // end of options - //printf("ARG %d %s\n", ctx.idx, argv[ctx.idx]); - if (findOpt(&ctx, olong) == 0) - continue; - } - else if (sidx != ctx.idx) - { - fprintf(stderr,"SIDX %d %d\n", sidx, ctx.idx); - argv[sidx] = argv[ctx.idx]; - } - sidx++; - } - - while (ctx.idx < *argc && sidx != ctx.idx) - { - argv[sidx++] = argv[ctx.idx++]; - } - - *argc = sidx; -} diff --git a/org.glite.lb.client/src/args.h b/org.glite.lb.client/src/args.h deleted file mode 100644 index 4e894b1..0000000 --- a/org.glite.lb.client/src/args.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#ifndef __EDG_WORKLOAD_LOGGING_CLIENT_ARGS_H__ - -typedef enum { - EDG_WLL_ARGS_NONE = 0, - EDG_WLL_ARGS_BOOL, - EDG_WLL_ARGS_INT, - EDG_WLL_ARGS_UINT16, - EDG_WLL_ARGS_FLOAT, - EDG_WLL_ARGS_DOUBLE, - EDG_WLL_ARGS_STRING, - EDG_WLL_ARGS_HELP, - EDG_WLL_ARGS_JOBID, - EDG_WLL_ARGS_NOTIFID, - EDG_WLL_ARGS_SOURCE, - EDG_WLL_ARGS_EVENT, - EDG_WLL_ARGS_OPTIONS, - EDG_WLL_ARGS_SUBOPTIONS, - EDG_WLL_ARGS_SELECTSTRING, - EDG_WLL_ARGS_TIMEVAL, -} edg_wll_ArgsCode; - -typedef struct { - edg_wll_ArgsCode type; - const char* oshort; - const char* olong; - const char* help; - void* value; - int min; - int max; -} edg_wll_Args; - -void edg_wll_ParseArgs(int* argc, char** argv, const edg_wll_Args* parray, - const char* help); - -#endif /* __EDG_WORKLOAD_LOGGING_CLIENT_ARGS_H__ */ diff --git a/org.glite.lb.client/src/connection.c b/org.glite.lb.client/src/connection.c deleted file mode 100644 index ea73bb6..0000000 --- a/org.glite.lb.client/src/connection.c +++ /dev/null @@ -1,816 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#include "glite/security/glite_gss.h" -#include "glite/lb/context-int.h" -#include "glite/lb/mini_http.h" -#include "glite/lb/connpool.h" - -#include "consumer.h" -#include "connection.h" - - -int CloseConnection(edg_wll_Context ctx, int conn_index) -{ - /* close connection and free its structures */ - int cIndex,ret = 0; - - cIndex = conn_index; - - assert(ctx->connections->connOpened); - - if (ctx->connections->connPool[cIndex].gss.sock >= 0) - ret = edg_wll_gss_close(&ctx->connections->connPool[cIndex].gss, &ctx->p_tmp_timeout); - if (ctx->connections->connPool[cIndex].gsiCred != NULL) - edg_wll_gss_release_cred(&ctx->connections->connPool[cIndex].gsiCred, NULL); - free(ctx->connections->connPool[cIndex].peerName); - free(ctx->connections->connPool[cIndex].buf); - free(ctx->connections->connPool[cIndex].certfile); - - memset(ctx->connections->connPool + cIndex, 0, sizeof(edg_wll_ConnPool)); - ctx->connections->connPool[cIndex].gss.sock = -1; - - ctx->connections->connOpened--; - - return ret; -} - - -int CloseConnectionNotif(edg_wll_Context ctx) -{ - /* close connection and free its structures */ - int cIndex,ret = 0; - - - cIndex = ctx->connNotif->connToUse; - - assert(ctx->connNotif->connOpened); - - if (ctx->connNotif->connPool[cIndex].gss.sock >= 0) - edg_wll_gss_close(&ctx->connNotif->connPool[cIndex].gss, &ctx->p_tmp_timeout); // always returns 0 - if (ctx->connNotif->connPool[cIndex].gsiCred != NULL) - if ( (ret = edg_wll_gss_release_cred(&ctx->connNotif->connPool[cIndex].gsiCred, NULL)) ) - edg_wll_SetError(ctx,ret,"error in edg_wll_gss_release_cred()"); - free(ctx->connNotif->connPool[cIndex].peerName); - free(ctx->connNotif->connPool[cIndex].buf); - free(ctx->connNotif->connPool[cIndex].bufOut); - free(ctx->connNotif->connPool[cIndex].certfile); - - memset(ctx->connNotif->connPool + cIndex, 0, sizeof(edg_wll_ConnPool)); - ctx->connNotif->connPool[cIndex].gss.sock = -1; - - ctx->connNotif->connOpened--; - - return edg_wll_Error(ctx,NULL,NULL); -} - - - -int ConnectionIndex(edg_wll_Context ctx, const char *name, int port) -{ - int i; - struct stat statinfo; - int using_certfile = 0; - - if (ctx->p_proxy_filename || ctx->p_cert_filename) { - stat(ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_cert_filename, &statinfo); - using_certfile = 1; - } - - for (i=0; iconnections->poolSize;i++) { -// printf("*** Testing connection %d: peerName = %s, peerPort = %d, file = %s\n", i, ctx->connections->connPool[i].peerName != NULL ? ctx->connections->connPool[i].peerName : "NULL", ctx->connections->connPool[i].peerPort, ctx->connections->connPool[i].file); - if ((ctx->connections->connPool[i].peerName != NULL) && // Conn Pool record must exist - !strcmp(name, ctx->connections->connPool[i].peerName) && // Server names must be equal - (port == ctx->connections->connPool[i].peerPort) && // Ports must be equal - (!using_certfile || // we are either using the default cert file - ((ctx->connections->connPool[i].certfile) && // or checking which file - (ctx->connections->connPool[i].certfile->st_ino == statinfo.st_ino) && // this conn - (ctx->connections->connPool[i].certfile->st_dev == statinfo.st_dev)))) { // uses to auth. - - - /* TryLock (next line) is in fact used only - to check the mutex status */ - switch (edg_wll_connectionTryLock(ctx, i)) { - case 0: - /* Connection was not locked but now it is. Since we do not - really know wheter we are interested in that connection, we - are simply unlocking it now. */ - edg_wll_connectionUnlock(ctx, i); - return i; - - case EBUSY: - /* Connection locked. Do not consider it */ - // try to find another free connection - break; - default: - /* Some obscure error occured. Need inspection */ - perror("ConnectionIndex() - locking problem \n"); - assert(0); - } - } - } - - return -1; -} - - -int AddConnection(edg_wll_Context ctx, char *name, int port) -{ - int i,index = -1; - - for (i = 0; i < ctx->connections->poolSize; i++) { - if (ctx->connections->connPool[i].peerName == NULL) { - if (!edg_wll_connectionTryLock(ctx, i)) { - index = i; // This connection is free and was not locked. We may lock it and use it. - break; - } - } - } - - if (index < 0) return -1; - - free(ctx->connections->connPool[index].peerName); // should be empty; just to be sure - ctx->connections->connPool[index].peerName = strdup(name); - ctx->connections->connPool[index].peerPort = port; - ctx->connections->connPool[index].gsiCred = NULL; // initial value - ctx->connections->connPool[index].certfile = NULL; - ctx->connections->connOpened++; - - return index; -} - - -int SetFreeConnectionIndexNotif(edg_wll_Context ctx) -{ - int i; - - - ctx->connNotif->connToUse = -1; - - for (i = 0; i < ctx->connNotif->poolSize; i++) - if (ctx->connNotif->connPool[i].gss.sock == -1) { - ctx->connNotif->connToUse = i; - ctx->connNotif->connOpened++; - assert(!ctx->connNotif->connPool[i].buf); - break; - } - - return ctx->connNotif->connToUse; -} - - - -int ReleaseConnection(edg_wll_Context ctx, char *name, int port) -{ - int i, index = 0, foundConnToDrop = 0; - long min; - - - edg_wll_ResetError(ctx); - if (ctx->connections->connOpened == 0) return 0; /* nothing to release */ - - if (name) { - if ((index = ConnectionIndex(ctx, name, port)) >= 0) - CloseConnection(ctx, index); - } - else { /* free the oldest (unlocked) connection */ - for (i=0; iconnections->poolSize; i++) { - assert(ctx->connections->connPool[i].peerName); // Full pool expected - accept non-NULL values only - if (!edg_wll_connectionTryLock(ctx, i)) { - edg_wll_connectionUnlock(ctx, i); // Connection unlocked. Consider releasing it - if (foundConnToDrop) { // This is not the first unlocked connection - if (ctx->connections->connPool[i].lastUsed.tv_sec < min) { - min = ctx->connections->connPool[i].lastUsed.tv_sec; - index = i; - foundConnToDrop++; - } - } - else { // This is the first unlocked connection we have found. - foundConnToDrop++; - index = i; - min = ctx->connections->connPool[i].lastUsed.tv_sec; - } - } - } - if (!foundConnToDrop) return edg_wll_SetError(ctx,EAGAIN,"all connections in the connection pool are locked"); - CloseConnection(ctx, index); - } - return edg_wll_Error(ctx,NULL,NULL); -} - - -int ReleaseConnectionNotif(edg_wll_Context ctx) -{ - int i, index = 0; - long min; - - - edg_wll_ResetError(ctx); - if (ctx->connNotif->connOpened == 0) return 0; /* nothing to release */ - - min = ctx->connNotif->connPool[0].lastUsed.tv_sec; - - /* free the oldest (unlocked) connection */ - for (i=0; iconnNotif->poolSize; i++) { - assert(ctx->connNotif->connPool[i].gss.sock > -1); // Full pool expected - accept non-NULL values only - - if (ctx->connections->connPool[i].lastUsed.tv_sec < min) { - min = ctx->connections->connPool[i].lastUsed.tv_sec; - index = i; - } - } - - ctx->connNotif->connToUse = index; - CloseConnectionNotif(ctx); - - return edg_wll_Error(ctx,NULL,NULL); -} - - - -int edg_wll_close(edg_wll_Context ctx, int* connToUse) -{ - edg_wll_ResetError(ctx); - if (*connToUse == -1) return 0; - - CloseConnection(ctx, *connToUse); - - edg_wll_connectionUnlock(ctx, *connToUse); /* Forgetting the conn. Unlocking is safe. */ - - *connToUse = -1; - return edg_wll_Error(ctx,NULL,NULL); -} - - - -int edg_wll_close_proxy(edg_wll_Context ctx) -{ - edg_wll_plain_close(&ctx->connProxy->conn); - - return edg_wll_ResetError(ctx); -} - - - -int edg_wll_open(edg_wll_Context ctx, int* connToUse) -{ - int index; - edg_wll_GssStatus gss_stat; - time_t lifetime = 0; - struct stat statinfo; - int acquire_cred = 0; - - - edg_wll_ResetError(ctx); - - edg_wll_poolLock(); /* We are going to search the pool, it has better be locked */ - - /* July 12, 2007 - ZS - Searching the pool for srvName/srvPort is not enough. - we also need to check the user identity so that there may be several connections - open to the same server using different identities. */ - - if ( (index = ConnectionIndex(ctx, ctx->srvName, ctx->srvPort)) == -1 ) { - /* no such open connection in pool */ - if (ctx->connections->connOpened == ctx->connections->poolSize) - if(ReleaseConnection(ctx, NULL, 0)) goto end; - - index = AddConnection(ctx, ctx->srvName, ctx->srvPort); - if (index < 0) { - edg_wll_SetError(ctx,EAGAIN,"connection pool size exceeded"); - goto end; - } - - #ifdef EDG_WLL_CONNPOOL_DEBUG - printf("Connection to %s:%d opened as No. %d in the pool\n",ctx->srvName,ctx->srvPort,index); - #endif - - } - /* else - there is cached open connection, reuse it */ - #ifdef EDG_WLL_CONNPOOL_DEBUG - else printf("Connection to %s:%d exists (No. %d in the pool) - reusing\n",ctx->srvName,ctx->srvPort,index); - #endif - - *connToUse = index; - - //Lock the select connection, unlock the rest of the pool - edg_wll_connectionTryLock(ctx, index); - edg_wll_poolUnlock(); - - /* Old Comment: support anonymous connections, perhaps add a flag to the connPool - * struct specifying whether or not this connection shall be authenticated - * to prevent from repeated calls to edg_wll_gss_acquire_cred_gsi() */ - - // In case of using a specifically given cert file, stat it and check for the need to reauthenticate - if (ctx->p_proxy_filename || ctx->p_cert_filename) { - if (ctx->connections->connPool[index].certfile) { // Has the file been stated before? - stat(ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_cert_filename, &statinfo); - if (ctx->connections->connPool[index].certfile->st_mtime != statinfo.st_mtime) - acquire_cred = 1; // File has been modified. Need to acquire new creds. - } - else acquire_cred = 1; - } - - // Check if credentials exist. If so, check validity - if (ctx->connections->connPool[index].gsiCred) { - lifetime = ctx->connections->connPool[index].gsiCred->lifetime; - #ifdef EDG_WLL_CONNPOOL_DEBUG - printf ("Credential exists, lifetime: %d\n", lifetime); - #endif - if (!lifetime) acquire_cred = 1; // Credentials exist and lifetime is OK. No need to authenticate. - } - else { - acquire_cred = 1; // No credentials exist so far, acquire. - } - - - if (acquire_cred) { - edg_wll_GssCred newcred = NULL; - if (edg_wll_gss_acquire_cred_gsi( - ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_cert_filename, - ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_key_filename, - &newcred, &gss_stat)) { - edg_wll_SetErrorGss(ctx, "failed to load GSI credentials", &gss_stat); - goto err; - } else { - if (ctx->connections->connPool[index].gsiCred != NULL) - edg_wll_gss_release_cred(&ctx->connections->connPool[index].gsiCred,&gss_stat); - ctx->connections->connPool[index].gsiCred = newcred; - newcred = NULL; - - // Credentials Acquired successfully. Storing file identification. - #ifdef EDG_WLL_CONNPOOL_DEBUG - printf("Cert file: %s\n", ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_cert_filename); - #endif - - if (ctx->p_proxy_filename || ctx->p_cert_filename) { - if (!ctx->connections->connPool[index].certfile) // Allocate space for certfile stats - ctx->connections->connPool[index].certfile = - (struct stat*)calloc(1, sizeof(struct stat)); - stat(ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_cert_filename, ctx->connections->connPool[index].certfile); - } - } - } - - if (acquire_cred && ctx->connections->connPool[index].gss.context != NULL) { - edg_wll_gss_close(&ctx->connections->connPool[index].gss, &ctx->p_tmp_timeout); - } - if (ctx->connections->connPool[index].gss.context == NULL) { - switch (edg_wll_gss_connect(ctx->connections->connPool[index].gsiCred, - ctx->connections->connPool[index].peerName, ctx->connections->connPool[index].peerPort, - &ctx->p_tmp_timeout,&ctx->connections->connPool[index].gss, - &gss_stat)) { - - case EDG_WLL_GSS_OK: - goto ok; - case EDG_WLL_GSS_ERROR_ERRNO: - edg_wll_SetError(ctx,errno,"edg_wll_gss_connect()"); - break; - case EDG_WLL_GSS_ERROR_GSS: - edg_wll_SetErrorGss(ctx, "failed to authenticate to server", &gss_stat); - break; - case EDG_WLL_GSS_ERROR_HERRNO: - { const char *msg1; - char *msg2; - msg1 = hstrerror(errno); - asprintf(&msg2, "edg_wll_gss_connect(): %s", msg1); - edg_wll_SetError(ctx,EDG_WLL_ERROR_DNS, msg2); - free(msg2); - } - break; - case EDG_WLL_GSS_ERROR_EOF: - edg_wll_SetError(ctx,ECONNREFUSED,"edg_wll_gss_connect():" - " server closed the connection, probably due to overload"); - break; - case EDG_WLL_GSS_ERROR_TIMEOUT: - edg_wll_SetError(ctx,ETIMEDOUT,"edg_wll_gss_connect()"); - break; - } - } - else goto ok; - -err: - /* some error occured; close created connection - * and free all fields in connPool[index] */ - if (index >= 0) { - CloseConnection(ctx, index); - edg_wll_connectionUnlock(ctx, index); - } - *connToUse = -1; -ok: - - if (*connToUse>-1) edg_wll_connectionTryLock(ctx, *connToUse); /* Just to be sure we have not forgotten to lock it */ - -end: - -// edg_wll_poolUnlock(); /* One way or the other, there are no more pool-wide operations */ -// ZS, 2 Feb 2010: Overall pool lock replaced with a connection-specific -// lock for the most part - -// xxxxx - - return edg_wll_Error(ctx,NULL,NULL); -} - - - -int edg_wll_open_proxy(edg_wll_Context ctx) -{ - struct sockaddr_un saddr; - int flags; - int err; - char *ed = NULL; - int retries = 0; - - edg_wll_ResetError(ctx); - - edg_wll_ResetError(ctx); - - if (ctx->connProxy->conn.sock > -1) { - // XXX: test path socket here? - return edg_wll_ResetError(ctx); - } - ctx->connProxy->conn.sock = socket(PF_UNIX, SOCK_STREAM, 0); - if (ctx->connProxy->conn.sock < 0) { - edg_wll_SetError(ctx, errno, "socket() error"); - goto err; - } - - memset(&saddr, 0, sizeof(saddr)); - saddr.sun_family = AF_UNIX; - if (!ctx->p_lbproxy_serve_sock) { - edg_wll_SetError(ctx, EINVAL, "Proxy socket path not set!"); - goto err; - } - - if (strlen(ctx->p_lbproxy_serve_sock) > 108) { // UNIX_PATH_MAX (def. in linux/un.h) - // but not defined in sys/un.h - edg_wll_SetError(ctx, EINVAL, "proxy_filename too long!"); - goto err; - } - strcpy(saddr.sun_path, ctx->p_lbproxy_serve_sock); - - if ((flags = fcntl(ctx->connProxy->conn.sock, F_GETFL, 0)) < 0 || - fcntl(ctx->connProxy->conn.sock, F_SETFL, flags | O_NONBLOCK) < 0) { - edg_wll_SetError(ctx, errno, "fcntl()"); - goto err; - } - - while ((err = connect(ctx->connProxy->conn.sock, (struct sockaddr *)&saddr, sizeof(saddr))) < 0 && - errno == EAGAIN && - ctx->p_tmp_timeout.tv_sec >= 0 && ctx->p_tmp_timeout.tv_usec >= 0 && - !(ctx->p_tmp_timeout.tv_sec == 0 && ctx->p_tmp_timeout.tv_usec == 0) - ) - { - struct timespec ns = { 0, PROXY_CONNECT_RETRY * 1000000 /* 10 ms */ },rem; - - nanosleep(&ns,&rem); - - ctx->p_tmp_timeout.tv_usec -= ns.tv_nsec/1000; - ctx->p_tmp_timeout.tv_usec += rem.tv_nsec/1000; - - ctx->p_tmp_timeout.tv_sec -= ns.tv_sec; - ctx->p_tmp_timeout.tv_sec += rem.tv_sec; - - if (ctx->p_tmp_timeout.tv_usec < 0) { - ctx->p_tmp_timeout.tv_usec += 1000000; - ctx->p_tmp_timeout.tv_sec--; - } - retries++; - } - - /* printf("retries %d\n",retries); */ - - if (err) { - if (errno == EAGAIN) edg_wll_SetError(ctx,ETIMEDOUT, "edg_wll_open_proxy()"); - else edg_wll_SetError(ctx, errno, "connect()"); - goto err; - } - - return 0; - -err: - /* some error occured; close created connection */ - - err = edg_wll_Error(ctx,NULL,&ed); - edg_wll_close_proxy(ctx); - edg_wll_SetError(ctx,err,ed); - free(ed); - - return err; -} - - - -/* transform HTTP error code to ours */ -int http_check_status( - edg_wll_Context ctx, - char *response) - -{ - int code = HTTP_INTERNAL,len = 0; - - edg_wll_ResetError(ctx); - sscanf(response,"HTTP/%*f %n%d",&len,&code); - switch (code) { - case HTTP_OK: - break; - /* soft errors - some useful data may be returned too */ - case HTTP_UNAUTH: /* EPERM */ - case HTTP_NOTFOUND: /* ENOENT */ - case HTTP_NOTIMPL: /* ENOSYS */ - case HTTP_UNAVAIL: /* EAGAIN */ - case HTTP_INVALID: /* EINVAL */ - break; - case EDG_WLL_GSS_ERROR_HERRNO: - { const char *msg1; - char *msg2; - msg1 = hstrerror(errno); - asprintf(&msg2, "edg_wll_gss_connect(): %s", msg1); - edg_wll_SetError(ctx,EDG_WLL_ERROR_DNS, msg2); - free(msg2); - } - break; - case HTTP_NOTALLOWED: - edg_wll_SetError(ctx, ENXIO, "Method Not Allowed"); - break; - case HTTP_UNSUPPORTED: - edg_wll_SetError(ctx, ENOTSUP, "Protocol versions incompatible"); - break; - case HTTP_INTERNAL: - /* fall through */ - default: - edg_wll_SetError(ctx,EDG_WLL_ERROR_SERVER_RESPONSE,response+len); - } - return edg_wll_Error(ctx,NULL,NULL); -} - - - -int edg_wll_http_send_recv( - edg_wll_Context ctx, - char *request, - const char * const *req_head, - char *req_body, - char **response, - char ***resp_head, - char **resp_body) -{ - int ec; - char *ed = NULL; - int connToUse = -1; //Index of the connection to use. Used to be a context member. - - if (edg_wll_open(ctx,&connToUse)) return edg_wll_Error(ctx,NULL,NULL); - - switch (edg_wll_http_send(ctx,request,req_head,req_body,&ctx->connections->connPool[connToUse])) { - case ENOTCONN: - edg_wll_close(ctx,&connToUse); - if (edg_wll_open(ctx,&connToUse) - || edg_wll_http_send(ctx,request,req_head,req_body,&ctx->connections->connPool[connToUse])) - goto err; - /* fallthrough */ - case 0: break; - default: goto err; - } - - switch (edg_wll_http_recv(ctx,response,resp_head,resp_body,&ctx->connections->connPool[connToUse])) { - case ENOTCONN: - edg_wll_close(ctx,&connToUse); - if (edg_wll_open(ctx,&connToUse) - || edg_wll_http_send(ctx,request,req_head,req_body,&ctx->connections->connPool[connToUse]) - || edg_wll_http_recv(ctx,response,resp_head,resp_body,&ctx->connections->connPool[connToUse])) - goto err; - /* fallthrough */ - case 0: break; - default: goto err; - } - - assert(connToUse >= 0); - gettimeofday(&ctx->connections->connPool[connToUse].lastUsed, NULL); - - edg_wll_connectionUnlock(ctx, connToUse); - - return 0; - -err: - ec = edg_wll_Error(ctx,NULL,&ed); - edg_wll_close(ctx,&connToUse); - edg_wll_SetError(ctx,ec,ed); - free(ed); - return ec; -} - - - -int edg_wll_http_send_recv_proxy( - edg_wll_Context ctx, - char *request, - const char * const *req_head, - char *req_body, - char **response, - char ***resp_head, - char **resp_body) -{ - int err; - char *et = NULL; - - if (edg_wll_open_proxy(ctx)) return edg_wll_Error(ctx,NULL,NULL); - - switch (edg_wll_http_send_proxy(ctx,request,req_head,req_body)) { - case ENOTCONN: - edg_wll_close_proxy(ctx); - if (edg_wll_open_proxy(ctx) - || edg_wll_http_send_proxy(ctx,request,req_head,req_body)) - return edg_wll_Error(ctx,NULL,NULL); - /* fallthrough */ - case 0: break; - default: return edg_wll_Error(ctx,NULL,NULL); - } - - if (edg_wll_http_recv_proxy(ctx,response,resp_head,resp_body) == ENOTCONN) { - edg_wll_close_proxy(ctx); - (void) (edg_wll_open_proxy(ctx) - || edg_wll_http_send_proxy(ctx,request,req_head,req_body) - || edg_wll_http_recv_proxy(ctx,response,resp_head,resp_body)); - } - - /* XXX: workaround for bug #25153, don't keep proxy connection at all - * May have slight performance impact, it would be nice to cover proxy - * connections in the pool too. - */ - - err = edg_wll_Error(ctx,NULL,&et); - edg_wll_close_proxy(ctx); - if (err) { - edg_wll_SetError(ctx,err,et); - free(et); - } - - return edg_wll_Error(ctx,NULL,NULL); -} - - -int edg_wll_accept(edg_wll_Context ctx, int fd) -{ - int recv_sock; - edg_wll_GssStatus gss_stat; - time_t lifetime = 0; - struct stat statinfo; - int acquire_cred = 0; - struct sockaddr_storage a; - socklen_t alen; - edg_wll_GssStatus gss_code; - - - edg_wll_ResetError(ctx); - assert(fd > 0); - - alen=sizeof(a); - recv_sock = accept(fd,(struct sockaddr *)&a,&alen); - if (recv_sock <0) { - edg_wll_SetError(ctx, errno, "accept() failed"); - goto err; - } - - if (ctx->connNotif->connOpened == ctx->connNotif->poolSize) - if (ReleaseConnectionNotif(ctx)) goto err; - - if (SetFreeConnectionIndexNotif(ctx) < 0) { - edg_wll_SetError(ctx,EAGAIN,"connection pool size exceeded"); - goto err; - } - - #ifdef EDG_WLL_CONNPOOL_DEBUG - printf("Connection with fd %d accepted. %d in the pool\n",>srvName,ctx->srvPort,ctx->connNotif->connToUse); - #endif - - - // In case of using a specifically given cert file, stat it and check for the need to reauthenticate - if (ctx->p_proxy_filename || ctx->p_cert_filename) { - if (ctx->connNotif->connPool[ctx->connNotif->connToUse].certfile) { // Has the file been stated before? - stat(ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_cert_filename, &statinfo); - if (ctx->connNotif->connPool[ctx->connNotif->connToUse].certfile->st_mtime != statinfo.st_mtime) - acquire_cred = 1; // File has been modified. Need to acquire new creds. - } - else acquire_cred = 1; - } - - // Check if credentials exist. If so, check validity - if (ctx->connNotif->connPool[ctx->connNotif->connToUse].gsiCred) { - lifetime = ctx->connNotif->connPool[ctx->connNotif->connToUse].gsiCred->lifetime; - #ifdef EDG_WLL_CONNPOOL_DEBUG - printf ("Credential exists, lifetime: %d\n", lifetime); - #endif - if (!lifetime) acquire_cred = 1; // Credentials exist and lifetime is OK. No need to authenticate. - } - else { - acquire_cred = 1; // No credentials exist so far, acquire. - } - - - if (acquire_cred) { - edg_wll_GssCred newcred = NULL; - if (edg_wll_gss_acquire_cred_gsi( - ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_cert_filename, - ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_key_filename, - &newcred, &gss_stat)) { - edg_wll_SetErrorGss(ctx, "failed to load GSI credentials", &gss_stat); - goto err; - } else { - if (ctx->connNotif->connPool[ctx->connNotif->connToUse].gsiCred != NULL) - edg_wll_gss_release_cred(&ctx->connNotif->connPool[ctx->connNotif->connToUse].gsiCred,&gss_stat); - ctx->connNotif->connPool[ctx->connNotif->connToUse].gsiCred = newcred; - newcred = NULL; - - // Credentials Acquired successfully. Storing file identification. - #ifdef EDG_WLL_CONNPOOL_DEBUG - printf("Cert file: %s\n", ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_cert_filename); - #endif - - if (ctx->p_proxy_filename || ctx->p_cert_filename) { - if (!ctx->connNotif->connPool[ctx->connNotif->connToUse].certfile) // Allocate space for certfile stats - ctx->connNotif->connPool[ctx->connNotif->connToUse].certfile = - (struct stat*)calloc(1, sizeof(struct stat)); - stat(ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_cert_filename, ctx->connNotif->connPool[ctx->connNotif->connToUse].certfile); - } - } - } - - assert(ctx->connNotif->connPool[ctx->connNotif->connToUse].gss.context == NULL); - - switch ( edg_wll_gss_accept(ctx->connNotif->connPool[ctx->connNotif->connToUse].gsiCred, recv_sock, - &ctx->p_tmp_timeout, &ctx->connNotif->connPool[ctx->connNotif->connToUse].gss,&gss_code)) { - - case EDG_WLL_GSS_OK: - break; - case EDG_WLL_GSS_ERROR_ERRNO: - edg_wll_SetError(ctx,errno,"failed to receive notification"); - goto err; - case EDG_WLL_GSS_ERROR_GSS: - edg_wll_SetErrorGss(ctx, "failed to authenticate sender", &gss_code); - goto err; - case EDG_WLL_GSS_ERROR_HERRNO: - { const char *msg1; - char *msg2; - msg1 = hstrerror(errno); - asprintf(&msg2, "edg_wll_gss_connect(): %s", msg1); - edg_wll_SetError(ctx,EDG_WLL_ERROR_DNS, msg2); - free(msg2); - } - break; - case EDG_WLL_GSS_ERROR_EOF: - edg_wll_SetError(ctx,ECONNREFUSED,"sender closed the connection"); - goto err; - case EDG_WLL_GSS_ERROR_TIMEOUT: - edg_wll_SetError(ctx,ETIMEDOUT,"accepting notification"); - goto err; - default: - edg_wll_SetError(ctx, ENOTCONN, "failed to accept notification"); - goto err; - } - - return edg_wll_Error(ctx,NULL,NULL); - - -err: - /* some error occured; close created connection - * and free all fields in connPool[ctx->connNotif->connToUse] */ - if (ctx->connNotif->connToUse >= 0) { - CloseConnectionNotif(ctx); - } - - - return edg_wll_Error(ctx,NULL,NULL); -} - diff --git a/org.glite.lb.client/src/consumer.c b/org.glite.lb.client/src/consumer.c deleted file mode 100644 index 8836d5c..0000000 --- a/org.glite.lb.client/src/consumer.c +++ /dev/null @@ -1,598 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#include "glite/lb/context-int.h" -#include "glite/lb/mini_http.h" -#include "glite/lb/xml_parse.h" -#include "glite/lb/xml_conversions.h" - -#include "consumer.h" -#include "connection.h" - -static const char* const request_headers[] = { - "Cache-Control: no-cache", - "Accept: application/x-dglb", - "User-Agent: edg_wll_Api/" PROTO_VERSION "/" COMP_PROTO, - "Content-Type: application/x-dglb", - NULL -}; - -int set_server_name_and_port(edg_wll_Context, const edg_wll_QueryRec **); - -int edg_wll_QueryEventsExt( - edg_wll_Context ctx, - const edg_wll_QueryRec **job_conditions, - const edg_wll_QueryRec **event_conditions, - edg_wll_Event **eventsOut) -{ - char *response = NULL, - *message = NULL, - *send_mess = NULL; - - edg_wll_ResetError(ctx); - - if ( edg_wll_QueryEventsRequestToXML(ctx, job_conditions, event_conditions, &send_mess) != 0 ) - { - edg_wll_SetError(ctx , (edg_wll_ErrorCode) EINVAL, "Invalid query record."); - goto err; - } - - ctx->p_tmp_timeout = ctx->p_query_timeout; - - if (ctx->isProxy) { - ctx->isProxy = 0; - if (edg_wll_http_send_recv_proxy(ctx, "POST /queryEvents HTTP/1.1", - request_headers,send_mess, &response,NULL,&message)) - goto err; - } - else { - if (set_server_name_and_port(ctx,job_conditions)) - goto err; // XXX is it fatal?? - - if (edg_wll_http_send_recv(ctx, "POST /queryEvents HTTP/1.1", - request_headers,send_mess, &response,NULL,&message)) - goto err; - } - - if (http_check_status(ctx,response)) - goto err; - - edg_wll_ParseQueryEvents(ctx,message,eventsOut); - -err: - free(response); - free(message); - free(send_mess); - return edg_wll_Error(ctx,NULL,NULL); -} - -int edg_wll_QueryEvents( - edg_wll_Context ctx, - const edg_wll_QueryRec *job_conditions, - const edg_wll_QueryRec *event_conditions, - edg_wll_Event **eventsOut) -{ - edg_wll_QueryRec **jconds = NULL, - **econds = NULL; - int i, - njconds, neconds, - ret; - - if ( job_conditions ) - { - for ( njconds = 0; job_conditions[njconds].attr != EDG_WLL_QUERY_ATTR_UNDEF ; njconds++ ) - ; - jconds = (edg_wll_QueryRec **) calloc(njconds+1, sizeof(edg_wll_QueryRec *)); - for ( i = 0; i < njconds; i++ ) - { - jconds[i] = (edg_wll_QueryRec *) calloc(2, sizeof(edg_wll_QueryRec)); - jconds[i][0] = job_conditions[i]; - } - } - - if ( event_conditions ) - { - for ( neconds = 0; event_conditions[neconds].attr != EDG_WLL_QUERY_ATTR_UNDEF ; neconds++ ) - ; - econds = (edg_wll_QueryRec **) calloc(neconds+1, sizeof(edg_wll_QueryRec *)); - for ( i = 0; i < neconds; i++ ) - { - econds[i] = (edg_wll_QueryRec *) calloc(2, sizeof(edg_wll_QueryRec)); - econds[i][0] = event_conditions[i]; - } - } - - if ( econds && jconds ) - ret = edg_wll_QueryEventsExt(ctx, (const edg_wll_QueryRec **) jconds, - (const edg_wll_QueryRec **) econds, eventsOut); - if ( econds && !jconds ) - ret = edg_wll_QueryEventsExt(ctx, NULL, (const edg_wll_QueryRec **) econds, eventsOut); - if ( !econds && jconds ) - ret = edg_wll_QueryEventsExt(ctx, (const edg_wll_QueryRec **) jconds, NULL, eventsOut); - if ( !econds && !jconds ) - ret = edg_wll_QueryEventsExt(ctx, NULL, NULL, eventsOut); - - if ( jconds ) - { - for ( i = 0; i < njconds ; i++ ) - free(jconds[i]); - free(jconds); - } - if ( econds ) - { - for ( i = 0; i < neconds ; i++ ) - free(econds[i]); - free(econds); - } - - return ret; -} - - -int edg_wll_QueryJobsExt( - edg_wll_Context ctx, - const edg_wll_QueryRec ** conditions, - int flags, - edg_wlc_JobId ** jobsOut, - edg_wll_JobStat ** statesOut) -{ - char *response = NULL, *message = NULL, *send_mess = NULL; - - edg_wll_ResetError(ctx); - - if (!jobsOut) flags |= EDG_WLL_STAT_NO_JOBS; - if (!statesOut) {flags = 0; flags |= EDG_WLL_STAT_NO_STATES;} - if (edg_wll_QueryJobsRequestToXML(ctx, conditions, flags, &send_mess) != 0) { - edg_wll_SetError(ctx , (edg_wll_ErrorCode) EINVAL, "Invalid query record."); - goto err; - } - - ctx->p_tmp_timeout = ctx->p_query_timeout; - - if (ctx->isProxy){ - ctx->isProxy = 0; - if (edg_wll_http_send_recv_proxy(ctx, "POST /queryJobs HTTP/1.1", - request_headers,send_mess,&response,NULL,&message)) - goto err; - } - else { - if (set_server_name_and_port(ctx, conditions)) - goto err; - - if (edg_wll_http_send_recv(ctx, "POST /queryJobs HTTP/1.1", - request_headers,send_mess,&response,NULL,&message)) - goto err; - } - - if (http_check_status(ctx,response)) - goto err; - - edg_wll_ParseQueryJobs(ctx,message,jobsOut,statesOut); - -err: - free(response); - free(message); - free(send_mess); - - return edg_wll_Error(ctx,NULL,NULL); -} - -int edg_wll_QueryJobs( - edg_wll_Context ctx, - const edg_wll_QueryRec * conditions, - int flags, - edg_wlc_JobId ** jobsOut, - edg_wll_JobStat ** statesOut) -{ - edg_wll_QueryRec **conds; - int i, nconds, ret; - - if ( !conditions ) - return edg_wll_QueryJobsExt(ctx, NULL, flags, jobsOut, statesOut); - - for ( nconds = 0; conditions[nconds].attr != EDG_WLL_QUERY_ATTR_UNDEF ; nconds++ ) - ; - conds = (edg_wll_QueryRec **) malloc((nconds+1) * sizeof(edg_wll_QueryRec *)); - conds[nconds] = NULL; - for ( i = 0; i < nconds ; i++ ) - { - conds[i] = (edg_wll_QueryRec *) malloc(2 * sizeof(edg_wll_QueryRec)); - conds[i][0] = conditions[i]; - conds[i][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - } - - ret = edg_wll_QueryJobsExt(ctx, (const edg_wll_QueryRec **) conds, flags, jobsOut, statesOut); - - for ( i = 0; i < nconds ; i++ ) - free(conds[i]); - free(conds); - - - return ret; -} - - - -int edg_wll_GetIndexedAttrs( - edg_wll_Context ctx, - edg_wll_QueryRec ***attrs) -{ - char *response = NULL, *send_mess = NULL, *message = NULL; - - edg_wll_ResetError(ctx); - - edg_wll_IndexedAttrsRequestToXML(ctx, &send_mess); - - if (set_server_name_and_port(ctx, NULL)) - goto err; - - ctx->p_tmp_timeout = ctx->p_query_timeout; - - if (edg_wll_http_send_recv(ctx, "POST /indexedAttrs HTTP/1.1",request_headers, send_mess, - &response,NULL,&message)) - goto err; - - if (http_check_status(ctx,response)) - goto err; - - edg_wll_ParseIndexedAttrs(ctx,message,attrs); - -err: - free(response); - free(message); - - return edg_wll_Error(ctx,NULL,NULL); -} - - -/* - * wrappers around edg_wll_Query() - */ - -int edg_wll_UserJobs( - edg_wll_Context ctx, - edg_wlc_JobId **jobsOut, - edg_wll_JobStat **statesOut) -{ - edg_wll_QueryRec j[2]; - - memset(j,0,sizeof j); - - j[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - j[0].op = EDG_WLL_QUERY_OP_EQUAL; - j[0].value.c = ctx->peerName; - - return edg_wll_QueryJobs(ctx,j,0,jobsOut,statesOut); -} - -int edg_wll_JobLog( - edg_wll_Context ctx, - glite_jobid_const_t job, - edg_wll_Event **eventsOut) -{ - edg_wll_QueryRec j[2], e[2]; - - memset(j,0,sizeof j); - memset(e,0,sizeof e); - - j[0].attr = EDG_WLL_QUERY_ATTR_JOBID; - j[0].op = EDG_WLL_QUERY_OP_EQUAL; - j[0].value.j = job; - - e[0].attr = EDG_WLL_QUERY_ATTR_LEVEL; - e[0].op = EDG_WLL_QUERY_OP_LESS; - e[0].value.i = ctx->p_level + 1; - - return edg_wll_QueryEvents(ctx,j,e,eventsOut); -} - -int edg_wll_JobStatus( - edg_wll_Context ctx, - glite_jobid_const_t job, - int flags, - edg_wll_JobStat *stat) -{ - edg_wll_QueryRec j[2]; - edg_wll_JobStat *statesOut = NULL; - int ret; - - memset(j,0,sizeof j); - - j[0].attr = EDG_WLL_QUERY_ATTR_JOBID; - j[0].op = EDG_WLL_QUERY_OP_EQUAL; - j[0].value.j = job; - j[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - ret = edg_wll_QueryJobs(ctx,j,flags,NULL,&statesOut); - - if (ret) return ret; - - if (statesOut) { - if (statesOut[0].state == EDG_WLL_JOB_UNDEF) { - memcpy(stat, statesOut, sizeof(edg_wll_JobStat)); - free(statesOut); - ret = edg_wll_SetError(ctx , (edg_wll_ErrorCode) ENOENT, "Query returned no result."); - } - else { - /* check wheter there is only one field in status reply */ - assert(statesOut[1].state == EDG_WLL_JOB_UNDEF); - /* copy only 1st status */ - memcpy(stat, statesOut, sizeof(edg_wll_JobStat)); - /* release only array of states, keep all links unfreed for the previous copy */ - free(statesOut); - } - } - - return ret; -} - - - -int edg_wll_QueryListener(edg_wll_Context ctx, glite_jobid_const_t job, const char *name, char** host, uint16_t *port) { - - int i; - edg_wll_Event *events = NULL; - int errCode = 0; - edg_wll_QueryRec jr[2],er[2]; - int found = 0; - - memset(jr,0,sizeof jr); - memset(er,0,sizeof er); - jr[0].attr = EDG_WLL_QUERY_ATTR_JOBID; - jr[0].op = EDG_WLL_QUERY_OP_EQUAL; - jr[0].value.j = job; - - er[0].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE; - er[0].op = EDG_WLL_QUERY_OP_EQUAL; - er[0].value.i = EDG_WLL_EVENT_LISTENER; - - if (edg_wll_QueryEvents(ctx, jr, er, &events)) { - return edg_wll_Error(ctx, NULL, NULL); - } - - for (i=0; events[i].type != EDG_WLL_EVENT_UNDEF; i++) { - if (!strcmp(name, events[i].listener.svc_name)) { - found = 1; - if (host != NULL) - *host = strdup(events[i].listener.svc_host); - if (port != NULL) - *port = events[i].listener.svc_port; - } - edg_wll_FreeEvent(&events[i]); - } - free(events); - - if (!found) - errCode = ENOENT; - - return edg_wll_SetError(ctx, errCode, NULL); -} - - -int set_server_name_and_port(edg_wll_Context ctx, const edg_wll_QueryRec **job_conditions) -{ - int i = 0, j, - found = 0, - error = 0; - unsigned int srvPort = 0, - srvPortTmp; - char *srvName = NULL, - *srvNameTmp; - - - if ( job_conditions ) for ( j = 0; job_conditions[j]; j++ ) - for ( i = 0; (job_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - if ( job_conditions[j][i].attr == EDG_WLL_QUERY_ATTR_JOBID) - { - edg_wlc_JobIdGetServerParts(job_conditions[j][i].value.j,&srvNameTmp,&srvPortTmp); - if ( found ) - { - if ( strcmp(srvName, srvNameTmp) || (srvPort != srvPortTmp) ) - { - free(srvNameTmp); free(srvName); - return edg_wll_SetError(ctx, EINVAL, "Two different servers specifieed in one query"); - } - free(srvNameTmp); - } - else - { - srvName = srvNameTmp; - srvPort = srvPortTmp; - found = 1; - } - } - - if ( found && !ctx->p_query_server_override) - { - if (!ctx->srvName) - { - ctx->srvName = strdup(srvName); - ctx->srvPort = srvPort; - free(srvName); - } - else if (strcmp(srvName, ctx->srvName) || (srvPort != ctx->srvPort)) - { - free(ctx->srvName); - ctx->srvName = strdup(srvName); - ctx->srvPort = srvPort; - free(srvName); - } - } - else if ( !ctx->srvName || !ctx->srvPort ) - { - if (!ctx->p_query_server) - return(edg_wll_SetError(ctx, (edg_wll_ErrorCode) EINVAL, "Hostname of server to query is not set")); - else ctx->srvName = strdup(ctx->p_query_server); - if (!ctx->p_query_server_port) - return(edg_wll_SetError(ctx, (edg_wll_ErrorCode) EINVAL, "Port of server to query is not set")); - else ctx->srvPort = ctx->p_query_server_port; - } - - return(error); -} - -int edg_wll_QuerySequenceCodeProxy(edg_wll_Context ctx, glite_jobid_const_t jobId, char **code) -{ - int error = 0; - char *response = NULL, - *message = NULL, - *send_mess = NULL; - - - ctx->isProxy = 1; - edg_wll_ResetError(ctx); - - if ( edg_wll_QuerySequenceCodeToXML(ctx, jobId, &send_mess) != 0 ) - { - edg_wll_SetError(ctx , (edg_wll_ErrorCode) EINVAL, "Invalid query record."); - goto err; - } - - ctx->p_tmp_timeout = ctx->p_query_timeout; - - error = edg_wll_http_send_recv_proxy(ctx, "POST /querySequenceCode HTTP/1.1", - request_headers, send_mess, &response, NULL, &message); - if ( error != 0 ) - goto err; - - if (http_check_status(ctx,response)) - goto err; - - edg_wll_ParseQuerySequenceCodeResult(ctx,message,code); - -err: - free(response); - free(message); - free(send_mess); - - return edg_wll_Error(ctx,NULL,NULL); -} - - -/****************************************************************** - * Proxy wrappers - */ - - -int edg_wll_QueryEventsExtProxy( - edg_wll_Context ctx, - const edg_wll_QueryRec **job_conditions, - const edg_wll_QueryRec **event_conditions, - edg_wll_Event **eventsOut) -{ - ctx->isProxy = 1; - - return edg_wll_QueryEventsExt(ctx, job_conditions, event_conditions, eventsOut); -} - - - -int edg_wll_QueryEventsProxy( - edg_wll_Context ctx, - const edg_wll_QueryRec *job_conditions, - const edg_wll_QueryRec *event_conditions, - edg_wll_Event **eventsOut) -{ - ctx->isProxy = 1; - - return edg_wll_QueryEvents(ctx, job_conditions, event_conditions, eventsOut); -} - - - -int edg_wll_QueryJobsExtProxy( - edg_wll_Context ctx, - const edg_wll_QueryRec ** conditions, - int flags, - edg_wlc_JobId ** jobsOut, - edg_wll_JobStat ** statesOut) -{ - ctx->isProxy = 1; - - return edg_wll_QueryJobsExt(ctx, conditions, flags, jobsOut, statesOut); -} - - - -int edg_wll_QueryJobsProxy( - edg_wll_Context ctx, - const edg_wll_QueryRec * conditions, - int flags, - edg_wlc_JobId ** jobsOut, - edg_wll_JobStat ** statesOut) -{ - ctx->isProxy = 1; - - return edg_wll_QueryJobs(ctx, conditions, flags, jobsOut, statesOut); -} - - -int edg_wll_UserJobsProxy( - edg_wll_Context ctx, - edg_wlc_JobId **jobsOut, - edg_wll_JobStat **statesOut) -{ - ctx->isProxy = 1; - if ( ctx->p_user_lbproxy ) ctx->peerName = strdup(ctx->p_user_lbproxy); - - return edg_wll_UserJobs(ctx, jobsOut, statesOut); -} - -int edg_wll_JobLogProxy( - edg_wll_Context ctx, - glite_jobid_const_t job, - edg_wll_Event **eventsOut) -{ - ctx->isProxy = 1; - - return edg_wll_JobLog(ctx, job, eventsOut); -} - -int edg_wll_JobStatusProxy( - edg_wll_Context ctx, - glite_jobid_const_t job, - int flags, - edg_wll_JobStat *stat) -{ - ctx->isProxy = 1; - - return edg_wll_JobStatus(ctx, job, flags, stat); -} - - - -int edg_wll_QueryListenerProxy( - edg_wll_Context ctx, - glite_jobid_const_t job, - const char *name, - char** host, - uint16_t *port) -{ - ctx->isProxy = 1; - - return edg_wll_QueryListener(ctx, job, name, host, port); -} diff --git a/org.glite.lb.client/src/export.sh b/org.glite.lb.client/src/export.sh deleted file mode 100644 index 45ff684..0000000 --- a/org.glite.lb.client/src/export.sh +++ /dev/null @@ -1,106 +0,0 @@ -#! /bin/bash -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# -# script for exporing jobs from bkserver which should be periodically run -# together with running jp-importer -# -# it uses configuration from enviroment ==> may require a configuration wrapper -# - -#autodetect the prefix -PREFIX=${GLITE_LOCATION:-`dirname $0`/..} - -if [ -n "$GLITE_HOST_CERT" -a -n "$GLITE_HOST_KEY" ] ;then - creds="-c '$GLITE_HOST_CERT' -k '$GLITE_HOST_KEY'" - X509_USER_CERT="$GLITE_HOST_CERT" - X509_USER_KEY="$GLITE_HOST_KEY" -fi -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="-c /etc/grid-security/hostcert.pem -k /etc/grid-security/hostkey.pem" - X509_USER_CERT=/etc/grid-security/hostcert.pem - X509_USER_KEY=/etc/grid-security/hostkey.pem - fi -fi - - -[ -z "$creds" ] && echo $0: WARNING: No credentials specified. Using default lookup which is dangerous. >&2 - - - -# dump directory of bkserver -GLITE_LB_EXPORT_PURGEDIR=${GLITE_LB_EXPORT_PURGEDIR:-$GLITE_LOCATION_VAR/purge} -GLITE_LB_EXPORT_DUMPDIR=${GLITE_LB_EXPORT_DUMPDIR:-$GLITE_LOCATION_VAR/dump} -GLITE_LB_EXPORT_PURGEDIR_KEEP=${GLITE_LB_EXPORT_PURGEDIR_KEEP:-""} -GLITE_LB_EXPORT_DUMPDIR_KEEP=${GLITE_LB_EXPORT_DUMPDIR_KEEP:-""} -# maildir dump directory for jp importer -GLITE_LB_EXPORT_JPDUMP_MAILDIR=${GLITE_LB_EXPORT_JPDUMP_MAILDIR:-$GLITE_LOCATION_VAR/jpdump} -# directory with exported data (file per job) -GLITE_LB_EXPORT_JOBSDIR=${GLITE_LB_EXPORT_JOBSDIR:-$GLITE_LOCATION_VAR/lbexport} -# purge args (timeouts) -GLITE_LB_EXPORT_PURGE_ARGS=${GLITE_LB_EXPORT_PURGE_ARGS:---cleared 2d --aborted 2w --cancelled 2w --other 60d} -# Book Keeping Server -GLITE_LB_SERVER_PORT=${GLITE_LB_SERVER_PORT:-9000} -GLITE_LB_EXPORT_BKSERVER=${GLITE_LB_EXPORT_BKSERVER:-localhost:$GLITE_LB_SERVER_PORT} -GLITE_LB_PURGE_ENABLED=${GLITE_LB_PURGE_ENABLED:-true} -GLITE_LB_EXPORT_ENABLED=${GLITE_LB_EXPORT_ENABLED:-false} - -[ -d $GLITE_LB_EXPORT_JPDUMP_MAILDIR ] || mkdir -p $GLITE_LB_EXPORT_JPDUMP_MAILDIR -[ -d $GLITE_LB_EXPORT_DUMPDIR ] || mkdir -p $GLITE_LB_EXPORT_DUMPDIR -[ -d $GLITE_LB_EXPORT_PURGEDIR ] || mkdir -p $GLITE_LB_EXPORT_PURGEDIR -[ -d $GLITE_LB_EXPORT_DUMPDIR_KEEP ] || mkdir -p $GLITE_LB_EXPORT_DUMPDIR_KEEP -[ -d $GLITE_LB_EXPORT_PURGEDIR_KEEP ] || mkdir -p $GLITE_LB_EXPORT_PURGEDIR_KEEP -[ -d $GLITE_LB_EXPORT_JOBSDIR ] || mkdir -p $GLITE_LB_EXPORT_JOBSDIR - -if [ x"$GLITE_LB_EXPORT_ENABLED" = x"true" -o -d "$GLITE_LB_EXPORT_PURGEDIR_KEEP" ] -then - GLITE_LB_EXPORT_PURGE_ARGS="$GLITE_LB_EXPORT_PURGE_ARGS -s" -fi -if [ ! -z "$GLITE_LB_PURGE_TARGET_RUNTIME" ]; then - GLITE_LB_EXPORT_PURGE_ARGS="$GLITE_LB_EXPORT_PURGE_ARGS --target-runtime $GLITE_LB_PURGE_TARGET_RUNTIME" -fi - -if [ x"$GLITE_LB_PURGE_ENABLED" = x"true" ]; then - X509_USER_CERT="$X509_USER_CERT" X509_USER_KEY="$X509_USER_KEY" $PREFIX/bin/glite-lb-purge $GLITE_LB_EXPORT_PURGE_ARGS -l -m $GLITE_LB_EXPORT_BKSERVER $GLITE_LB_PURGE_OTHER_OPTIONS -fi - - find $GLITE_LB_EXPORT_PURGEDIR/ -type f -name purge_\* 2>/dev/null | \ - while read file; do - if [ -s $file ]; then - if [ x"$GLITE_LB_EXPORT_ENABLED" = x"true" ]; then - $PREFIX/bin/glite-lb-dump_exporter -d $file -s $GLITE_LB_EXPORT_JOBSDIR -m $GLITE_LB_EXPORT_JPDUMP_MAILDIR $GLITE_LB_DUMP_EXPORTER_OTHER_OPTIONS - fi - if [ -n "$GLITE_LB_EXPORT_PURGEDIR_KEEP" ]; then - mv $file $GLITE_LB_EXPORT_PURGEDIR_KEEP - else - rm $file - fi - else - rm $file - fi - done - -if [ x"$GLITE_LB_EXPORT_ENABLED" = x"true" ]; then - if [ -n "$GLITE_LB_EXPORT_DUMPDIR_KEEP" ]; then - ls $GLITE_LB_EXPORT_DUMPDIR | xargs -i'{}' cp $GLITE_LB_EXPORT_DUMPDIR/'{}' $GLITE_LB_EXPORT_DUMPDIR_KEEP; - else - ls $GLITE_LB_EXPORT_DUMPDIR | xargs -i'{}' rm -f $GLITE_LB_EXPORT_DUMPDIR/'{}' - fi -fi diff --git a/org.glite.lb.client/src/logevent.c.T b/org.glite.lb.client/src/logevent.c.T deleted file mode 100644 index c5dbe41..0000000 --- a/org.glite.lb.client/src/logevent.c.T +++ /dev/null @@ -1,349 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -@@@LANG: C -/* -@@@AUTO -*/ - -#include -#include -#include -#include -#include -#include // log -#include // isspace - -#include "glite/security/glite_gss.h" -#include "glite/jobid/cjobid.h" -#include "glite/lb/notifid.h" -#include "glite/lb/events.h" -#include "glite/lb/context.h" -#include "glite/lb/context-int.h" - -#include "producer.h" -#include "args.h" - - //" %s -p -l 100000 -j https://localhost/First_JobIV?localhost:7771 -s UserInterface -e jobAbort DG.JOB.ABORT.REASON=\"oops\"\n\n", - -// undefine to disable support for -l option -#define ENABLE_REASON_LENGTH - -static int flesh_seq(int); -static const struct timeval null_timeval = {0,0}; - -int main(int argc, char *argv[]) -{ - char /* *fmt,*fname = NULL,*/ *fmt_arg=NULL; - char *server = NULL, *code = NULL; - char *ff = NULL, *jobid_s = NULL; - char *src_instance = NULL; - int err = 0/*,i,done = 0,fmtlen*/; - int pri = 0, noinc = 0; - int use_lbproxy = 0; - char *lbproxy_user = NULL; - char *lbproxy_store_sock = NULL; - int deb = 0; -#ifdef ENABLE_REASON_LENGTH - int elength = 0; -#endif - edg_wll_Context ctx; - edg_wll_Source source; - edg_wll_EventCode event = EDG_WLL_EVENT_UNDEF; - edg_wlc_JobId jobid = 0; - int seq = EDG_WLL_SEQ_NORMAL; - int (*logev)(edg_wll_Context context, - edg_wll_EventCode event, - char *fmt, ...); - - /* all possible variables */ -@@@{ - my %vars = (); - for my $t (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } - $event->getTypes) { - selectType $event $t; - for ($event->getFieldsOrdered) { - my $f = selectField $event $_; - my $fn = $f->getName; - my $type = { - "type" => $f->getType, - "defval" => $f->getDefaultNullValue - }; - - $type = { type=>'char *',defval=>'NULL' } if $f->{codes}; - warn "$fn: $vars{$fn}->{type} to $type->{type}\n" - if $vars{$fn} && ($vars{$fn}->{type} ne $type->{type} - || $vars{$fn}->{defval} ne $type->{defval}); - $vars{$fn} = $type; - } - } - foreach $name ( sort keys %vars ) { - gen qq{\t$vars{$name}->{"type"} $name = $vars{$name}->{"defval"};\n}; - } -@@@} - - /* all possible arguments */ - 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_BOOL, "x", "lbproxy", "send directly to L&B Proxy (not locallogger)", &use_lbproxy }, - { EDG_WLL_ARGS_STRING, "S", "lbproxy-store-sock", "L&B Proxy store socket path", &lbproxy_store_sock }, - { EDG_WLL_ARGS_STRING, "U", "lbproxy-user-dn", "User certificate DN L&B Proxy store socket path", &lbproxy_user }, - - { EDG_WLL_ARGS_STRING, "m", "machine", 0, &server }, - { EDG_WLL_ARGS_SOURCE, "s", "source", "event source (see -s help)", &source }, - { EDG_WLL_ARGS_STRING, "i", "source-instance", "event source instance", &src_instance }, - { EDG_WLL_ARGS_STRING, "j", "jobid", "JobId", &jobid_s }, - { EDG_WLL_ARGS_STRING, "c", "sequence", "event sequence code", &code }, - { EDG_WLL_ARGS_BOOL, "d", "debug mode", "enable debug mode", &deb }, -#ifdef ENABLE_REASON_LENGTH - { EDG_WLL_ARGS_INT, "l", "reason-length", "extend 'reason' string to length (debug only)", &elength, 0, 1000000000 }, - { EDG_WLL_ARGS_BOOL, "I", "dont-increment", "don't increment initial seqence code", &noinc }, -#endif -@@@{ - my %typetab = ( - "char *", "EDG_WLL_ARGS_STRING", - "int", "EDG_WLL_ARGS_INT", - "double", "EDG_WLL_ARGS_DOUBLE", - "glite_jobid_t", "EDG_WLL_ARGS_JOBID", - "edg_wll_NotifId", "EDG_WLL_ARGS_NOTIFID", - "edg_wll_Source", "EDG_WLL_ARGS_SOURCE", - "uint16_t", "EDG_WLL_ARGS_UINT16", - "struct timeval", "EDG_WLL_ARGS_TIMEVAL" - ); - my %vars = (); - for my $t (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } - $event->getTypes) { - selectType $event $t; - for ($event->getFieldsOrdered) { - my $f = selectField $event $_; - my $ft = $f->{codes} ? 'char *' : $f->getType; - my $fn = $f->getName; - my $fc = $f->getComment; - $namehelp = { "type" => $ft, "help" => $fc }; -# gen qq{ $fn $ft $fc \n}; - $vars{$fn} = $namehelp; - } - } - foreach $name ( sort keys %vars ) { -# gen qq{ $vars{$name} $name \n }; - gen qq{\t \{ $typetab{$vars{$name}->{"type"}}, 0, "$name", "$vars{$name}->{"help"}", &$name \},\n}; - } - -@@@} - { EDG_WLL_ARGS_HELP }, - { EDG_WLL_ARGS_NONE }, - }; - edg_wll_ParseArgs(&argc, argv, parray, - "Usage: %s [-d] [-p] [[-x] [-S sock] [-U user_dn]] [-l eventlen] [-j dg_jobid]" - "[-s source_id] -e event [key=value ...]"); - - - edg_wll_InitContext(&ctx); - - /* log the event - priority/normal/proxy */ - logev = (pri) ? edg_wll_LogEventSync : edg_wll_LogEvent; - logev = (use_lbproxy) ? edg_wll_LogEventProxy : logev; - - /* if no job given - generate some */ - if (jobid_s == 0) { - const char* s; - if (!server) { - s = "localhost"; - err = 1; // result fail if used normaly - } else - s = server; - edg_wlc_JobIdCreate(s, 0, &jobid); - jobid_s = edg_wlc_JobIdUnparse(jobid); - fprintf(stderr, "JobId not given: created %s (server: %s)\n",jobid_s, s); - } - else if ((errno = edg_wlc_JobIdParse(jobid_s,&jobid))) { - perror(jobid_s); - exit(1); - } - - if (event == EDG_WLL_EVENT_UNDEF) { - fprintf(stderr,"%s: unknown or unspecified event\n",argv[0]); - exit(1); - } - edg_wll_SetParam(ctx, EDG_WLL_PARAM_SOURCE, source); - if (src_instance) edg_wll_SetParam(ctx, EDG_WLL_PARAM_INSTANCE, src_instance); - edg_wll_SetParam(ctx, EDG_WLL_PARAM_LEVEL, - (deb) ? EDG_WLL_LEVEL_DEBUG : EDG_WLL_LEVEL_SYSTEM); - - seq = flesh_seq(event); - - if ( use_lbproxy ) { - if ( !lbproxy_user ) { - edg_wll_GssCred gss_cred = NULL; - edg_wll_GssStatus gss_stat; - if ( edg_wll_gss_acquire_cred_gsi(NULL, NULL, &gss_cred, &gss_stat) ) - lbproxy_user = "anonymous"; - else - lbproxy_user = strdup(gss_cred->name); - if ( gss_cred != NULL ) edg_wll_gss_release_cred(&gss_cred, NULL); - } - if ( lbproxy_store_sock ) - edg_wll_SetParam(ctx, EDG_WLL_PARAM_LBPROXY_STORE_SOCK, lbproxy_store_sock); - if (edg_wll_SetLoggingJobProxy(ctx,jobid,code,lbproxy_user,seq)) { - char *et,*ed; - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"SetLoggingJobProxy(%s,%s,%s): %s (%s)\n",jobid_s,code,lbproxy_user,et,ed); - exit(1); - } - } else { - if (edg_wll_SetLoggingJob(ctx,jobid,code,seq)) { - 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 (noinc) edg_wll_SetSequenceCode(ctx,code,seq); - -#ifdef ENABLE_REASON_LENGTH - if (elength > 200000000) { - fprintf(stderr,"%s: usupported reason message length: %d\n", argv[0], elength); - } else if (elength > 0) { - int d; - int i = 0; - reason = realloc(reason, elength + 1); - reason[elength] = 0; - while (i < (elength)) { - if ((i % 20) == 0 && (i + 14) < elength) - i += sprintf(reason + i, "%d", i); - reason[i++] = '.'; - } - // amount of decimal digits + "end=" - d = (int)ceil(log(i)/log(10)) + 5; - if (i > d) - sprintf(reason + i - (int)(d), "end=%d",i); - reason[i] = 0; - } -#endif -#if 0 - if (fname) { - FILE *f = fopen(fname,"r"); - long s; - size_t r; - - fmt = "%s FILE.CONTENT=\"%|Us\" "; - - if (!f) { perror(fname); return 1; } - fseek(f,0L,SEEK_END); - s = ftell(f); rewind(f); - ff = (char *) malloc(s+1); if (!ff) { perror(NULL); return 0; } - r = fread(ff,1,s,f); - printf("%s: read %d\n",fname,r); - ff[s] = 0; - fclose(f); - } - else - fmt = "%s "; -#endif - - //err = edg_wll_LogEvent(ctx, event, fmt, fmt_arg, ff); - - switch (event) - { -@@@{ -$indent = "\t"; - for my $t (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } - $event->getTypes) { - - my $tu = uc $t; - gen $indent."case EDG_WLL_EVENT_$tu :\n"; - - selectType $event $t; - my $argl = ""; - for ($event->getFieldsOrdered) { - my $f = selectField $event $_; - my $fn = $f->getName; - my $ft; - -# gen { $fn $f->{codes} }; - if ($f->{codes}) { -# $ft = "enum edg_wll\_$t" . ucfirst $fn; - $ft = "char *"; - } else { - $ft = $f->getType; - } - - $fn = $f->getType()."ToString($fn)" if $ULMasString{$f->{type}}; - - $argl = $argl . ", "; - $argl = $argl . $fn; - } -gen qq{\t //edg_wll_Log$t(); -\t err |= logev(ctx, EDG_WLL_EVENT_$tu, EDG_WLL_FORMAT_${tu}$argl); -\t break; -}; - } -@@@} - default: - fprintf(stderr, "unknown event\n"); - } - - edg_wlc_JobIdFree(jobid); - if (jobid_s) free(jobid_s); // add all strings - - 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); - - if (ff) free(ff); - if (fmt_arg) free(fmt_arg); -#ifdef ENABLE_REASON_LENGTH - if (reason) free(reason); -#endif - - return err; -} - -static int flesh_seq(int event) -{ - switch (event) { -@@@{ - %seq = ( CREAM => 'CREAM', 'PBS' => 'PBS', 'gLite' => 'NORMAL', Condor=>'CONDOR', Transfer=>'NORMAL' ); - for my $t (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } - $event->getTypes) - { - selectType $event $t; - - my $type = uc $t; - my $sf = $seq{$event->{flesh}->{$t}}; - - print "\t\tcase EDG_WLL_EVENT_$type: return EDG_WLL_SEQ_$sf;\n"; - } -@@@} - default: return -1; - } -} diff --git a/org.glite.lb.client/src/notification.c b/org.glite.lb.client/src/notification.c deleted file mode 100644 index d4d69f4..0000000 --- a/org.glite.lb.client/src/notification.c +++ /dev/null @@ -1,948 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "glite/security/glite_gss.h" -#include "glite/lbu/escape.h" -#include "glite/lb/events.h" -#include "glite/lb/log_proto.h" -#include "glite/lb/mini_http.h" -#include "glite/lb/context-int.h" -#include "glite/lb/xml_parse.h" -#include "glite/lb/events_parse.h" -#include "glite/lb/il_msg.h" - -#include "notification.h" -#include "connection.h" - -#define CON_QUEUE 10 /* listen() queue limit */ - -/* XXX: moving all request_headers to one file would be nice - */ -static const char* const request_headers[] = { - "Cache-Control: no-cache", - "Accept: application/x-dglb", - "User-Agent: edg_wll_Api/" PROTO_VERSION "/" COMP_PROTO, - "Content-Type: application/x-dglb", - NULL -}; - - - - -/* Decrement timeout - */ -static int decrement_timeout(struct timeval *timeout, struct timeval before, struct timeval after) -{ - if (!timeout) - return(0); // wait indefinitely - - (*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); -} - - - -/* Split address to name & port - */ -static void get_name_and_port(const char *address, char **name, int *port) -{ - char *n = NULL, *p; - - n = strdup(address); - p = strrchr(n, ':'); - if (p) - { - *port = atoi(p+1); - *p = 0; - } - *name = strdup(n); - free(n); -} - - -static int my_bind(edg_wll_Context ctx, const char *name, int port, int *fd) -{ - int sock; - int ret; - struct addrinfo *ai; - struct addrinfo hints; - char *portstr = NULL; - - asprintf(&portstr, "%d", port); - if (portstr == NULL) { - return edg_wll_SetError(ctx, ENOMEM, "my_bind(): ENOMEM converting port number"); - } - - memset (&hints, '\0', sizeof (hints)); - hints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV | AI_PASSIVE | AI_ADDRCONFIG; - hints.ai_socktype = SOCK_STREAM; - - ret = getaddrinfo (name, portstr, &hints, &ai); - free(portstr); - if (ret != 0) { - return edg_wll_SetError(ctx, EADDRNOTAVAIL, gai_strerror(ret)); - } - if (ai == NULL) { - return edg_wll_SetError(ctx, EADDRNOTAVAIL, "no result from getaddrinfo"); - } - - sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); - if (sock == -1) { - freeaddrinfo(ai); - return edg_wll_SetError(ctx, errno, "socket() failed"); - } - -// setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); - ret = bind(sock, ai->ai_addr, ai->ai_addrlen); - if (ret == -1) { - edg_wll_SetError(ctx, errno, "bind() failed"); - close(sock); - freeaddrinfo(ai); - return edg_wll_Error(ctx, NULL, NULL); - } - freeaddrinfo(ai); - - ret = listen(sock, CON_QUEUE); - if (ret == -1) { - edg_wll_SetError(ctx, errno, "listen() failed"); - close(sock); - return edg_wll_Error(ctx, NULL, NULL); - } - - *fd = sock; - - return edg_wll_Error(ctx,NULL,NULL); -} - - - -static int set_server_name_and_port(edg_wll_Context ctx) -{ - - if (!ctx->p_notif_server) - return(edg_wll_SetError(ctx, (edg_wll_ErrorCode) EINVAL, - "Hostname of server to notif is not set")); - else { - free(ctx->srvName); - ctx->srvName = strdup(ctx->p_notif_server); - } - if (!ctx->p_notif_server_port) - return(edg_wll_SetError(ctx, (edg_wll_ErrorCode) EINVAL, - "Port of server to notif is not set")); - else ctx->srvPort = ctx->p_notif_server_port; - - return edg_wll_Error(ctx,NULL,NULL); -} - - - -static int get_client_address( - edg_wll_Context ctx, - int fd, - const char *address_override, - char **address) - -{ - struct sockaddr_storage a; - socklen_t alen = sizeof(a); - int e; - char *name = NULL; - int port = 0; - struct addrinfo *ai; - struct addrinfo hints; - char hostnum[64], hostnum1[64], portnum[16]; - - memset (&hints, '\0', sizeof (hints)); - hints.ai_flags = AI_ADDRCONFIG; - hints.ai_socktype = SOCK_STREAM; - - if (address_override) { - - get_name_and_port(address_override, &name, &port); - - e = getaddrinfo((const char *) name, NULL, &hints, & ai); - if (e) { - edg_wll_SetError(ctx, EADDRNOTAVAIL, "getaddrinfo() failed"); - goto err; - } - - free(name); - - e = getnameinfo ((struct sockaddr *) ai->ai_addr, ai->ai_addrlen, - hostnum, sizeof(hostnum), NULL, 0, NI_NUMERICHOST ); - if (e) { - edg_wll_SetError(ctx, EADDRNOTAVAIL, "getnameinfo() failed"); - goto err; - } - freeaddrinfo(ai); - - e = getaddrinfo((const char *) hostnum, NULL, &hints, & ai); - if (e) { - edg_wll_SetError(ctx, EADDRNOTAVAIL, "getaddrinfo() failed"); - goto err; - } - - /* Test whether open sockket represents the same address as address_override - * if not, close ctx->notifSock and bind to new socket corresponding to - * address_override - */ - if (ctx->notifSock >= 0) { - if (getsockname(ctx->notifSock, (struct sockaddr *) &a, &alen)) - return edg_wll_SetError(ctx, errno, "getsockname() failed"); - - e = getnameinfo ((struct sockaddr *) &a, alen, - NULL, 0, portnum, sizeof(portnum), NI_NUMERICSERV ); - if (e) { - edg_wll_SetError(ctx, EADDRNOTAVAIL, "getnameinfo() failed"); - goto err; - } - e = getnameinfo ((struct sockaddr *) &a, alen, - hostnum1, sizeof(hostnum1), NULL, 0, NI_NUMERICHOST ); - if (e) { - edg_wll_SetError(ctx, EADDRNOTAVAIL, "getnameinfo() failed"); - goto err; - } - if ( (strcmp(hostnum1, hostnum)) || (atoi(portnum) != port) ) { - - if (close(ctx->notifSock)) { - edg_wll_SetError(ctx, errno, "close() failed"); - goto err; - } - ctx->notifSock = -1; - - if (my_bind(ctx, name, port, &(ctx->notifSock))) - goto err; - } - } - else { // create new socket - if (my_bind(ctx, name, port, &(ctx->notifSock))) - goto err; - } - - *address = strdup(address_override); - } - else { // address_override == NULL - - if (fd == -1) { - if (ctx->notifSock == -1) - // create new socket - if (my_bind(ctx, NULL, 0, &(ctx->notifSock))) - goto err; - // else: resue socket - } - - if (getsockname(fd == -1 ? ctx->notifSock : fd,(struct sockaddr *) &a, &alen)) - return edg_wll_SetError(ctx, errno, "getsockname() failed"); - - e = getnameinfo ((struct sockaddr *) &a, alen, - hostnum, sizeof(hostnum), portnum, sizeof(portnum), NI_NUMERICSERV ); - if (e) { - edg_wll_SetError(ctx, EADDRNOTAVAIL, "getnameinfo() failed"); - goto err; - } - asprintf(address,"%s:%s", hostnum, portnum); - } - -err: - free(name); - - return edg_wll_Error(ctx,NULL,NULL); -} - - - -int edg_wll_NotifNew( - edg_wll_Context ctx, - edg_wll_QueryRec const * const *conditions, - int flags, - int fd, - const char *address_override, - edg_wll_NotifId *id_out, - time_t *valid) -{ - edg_wll_NotifId notifId = NULL; - char *address = NULL, *send_mess = NULL, - *recv_mess = NULL, *response = NULL; - int ret; - - - edg_wll_ResetError(ctx); - - if ( (ret = set_server_name_and_port(ctx)) ) - goto err; - - if ( (ret = edg_wll_NotifIdCreate(ctx->srvName,ctx->srvPort,¬ifId)) ) - goto err; - - if ( (ret = get_client_address(ctx, fd, address_override, &address)) ) - goto err; - - if ( (ret = edg_wll_NotifRequestToXML(ctx, "New", notifId, address, - EDG_WLL_NOTIF_NOOP, *valid, conditions, flags, &send_mess)) ) - goto err; - - ctx->p_tmp_timeout = ctx->p_notif_timeout; - - if ( (ret = edg_wll_http_send_recv(ctx, "POST /notifRequest HTTP/1.1", - request_headers,send_mess, - &response,NULL,&recv_mess)) ) - goto err; - - if ( (ret = http_check_status(ctx,response)) ) - goto err; - - ret = edg_wll_ParseNotifResult(ctx, recv_mess, valid); - - -err: - if (ret != 0) { - if (notifId) edg_wll_NotifIdFree(notifId); - *id_out = NULL; - *valid = -1; - } - else - *id_out = notifId; - - free(address); - free(recv_mess); - free(send_mess); - free(response); - return edg_wll_Error(ctx,NULL,NULL); -} - - - -int edg_wll_NotifBind( - edg_wll_Context ctx, - const edg_wll_NotifId id, - int fd, - const char *address_override, - time_t *valid) -{ - char *address = NULL, *send_mess = NULL, - *recv_mess = NULL, *response = NULL; - - - edg_wll_ResetError(ctx); - - -/* XXX - ??? this should not be there - if fd = -1 then semantic is 'create new socket or _reuse_ old' - // if a local listening socket active, close it - if (ctx->notifSock >= 0) { - if (close(ctx->notifSock)) - return edg_wll_SetError(ctx, errno, "close() failed"); - else - ctx->notifSock = -1; - } -*/ - - if (set_server_name_and_port(ctx)) - goto err; - - if (get_client_address(ctx, fd, address_override, &address)) - goto err; - - if (edg_wll_NotifRequestToXML(ctx, "Bind", id, address, - EDG_WLL_NOTIF_NOOP, *valid, NULL, 0, &send_mess)) - goto err; - - ctx->p_tmp_timeout = ctx->p_notif_timeout; - - if (edg_wll_http_send_recv(ctx, "POST /notifRequest HTTP/1.1", - request_headers,send_mess, - &response,NULL,&recv_mess)) - goto err; - - if (http_check_status(ctx,response)) - goto err; - - edg_wll_ParseNotifResult(ctx, recv_mess, valid); - -err: - free(address); - free(recv_mess); - free(send_mess); - free(response); - return edg_wll_Error(ctx,NULL,NULL); -} - - - -int edg_wll_NotifChange( - edg_wll_Context ctx, - const edg_wll_NotifId id, - edg_wll_QueryRec const * const * conditions, - edg_wll_NotifChangeOp op) -{ - char *send_mess = NULL, *recv_mess = NULL, *response = NULL; - time_t not_used; - - - edg_wll_ResetError(ctx); - - - if (set_server_name_and_port(ctx)) - goto err; - - if (edg_wll_NotifRequestToXML(ctx, "Change", id, NULL, - op, -1, conditions, 0, &send_mess)) - goto err; - - ctx->p_tmp_timeout = ctx->p_notif_timeout; - - if (edg_wll_http_send_recv(ctx, "POST /notifRequest HTTP/1.1", - request_headers,send_mess, - &response,NULL,&recv_mess)) - goto err; - - if (http_check_status(ctx,response)) - goto err; - - edg_wll_ParseNotifResult(ctx, recv_mess, ¬_used); - -err: - free(recv_mess); - free(send_mess); - free(response); - return edg_wll_Error(ctx,NULL,NULL); -} - - - -int edg_wll_NotifRefresh( - edg_wll_Context ctx, - const edg_wll_NotifId id, - time_t *valid) -{ - char *send_mess = NULL, *recv_mess = NULL, *response = NULL; - - - edg_wll_ResetError(ctx); - - - if (set_server_name_and_port(ctx)) - goto err; - - if (edg_wll_NotifRequestToXML(ctx, "Refresh", id, NULL, - EDG_WLL_NOTIF_NOOP, *valid, NULL, 0, &send_mess)) - goto err; - - ctx->p_tmp_timeout = ctx->p_notif_timeout; - - if (edg_wll_http_send_recv(ctx, "POST /notifRequest HTTP/1.1", - request_headers,send_mess, - &response,NULL,&recv_mess)) - goto err; - - if (http_check_status(ctx,response)) - goto err; - - edg_wll_ParseNotifResult(ctx, recv_mess, valid); - -err: - free(recv_mess); - free(send_mess); - free(response); - return edg_wll_Error(ctx,NULL,NULL); -} - - - -int edg_wll_NotifDrop( - edg_wll_Context ctx, - edg_wll_NotifId id) -{ - char *send_mess = NULL, *recv_mess = NULL, *response = NULL; - time_t not_used; - - - edg_wll_ResetError(ctx); - - - if (set_server_name_and_port(ctx)) - goto err; - - if (edg_wll_NotifRequestToXML(ctx, "Drop", id, NULL, - EDG_WLL_NOTIF_NOOP, -1, NULL, 0, &send_mess)) - goto err; - - ctx->p_tmp_timeout = ctx->p_notif_timeout; - - if (edg_wll_http_send_recv(ctx, "POST /notifRequest HTTP/1.1", - request_headers,send_mess, - &response,NULL,&recv_mess)) - goto err; - - if (http_check_status(ctx,response)) - goto err; - - edg_wll_ParseNotifResult(ctx, recv_mess, ¬_used); - -err: - free(recv_mess); - free(send_mess); - free(response); - return edg_wll_Error(ctx,NULL,NULL); -} - - -/* read all data available on active notif connection */ -static int read_data(edg_wll_Context ctx) -{ - edg_wll_GssStatus gss_code; - int ret; - edg_wll_ConnPool *notif = &(ctx->connNotif->connPool[ctx->connNotif->connToUse]); - - - do { - if (notif->bufUse == notif->bufSize) { - notif->bufSize += NOTIF_POOL_BUFFER_BLOCK_SIZE; - notif->buf = realloc(notif->buf, notif->bufSize); - if (!notif->buf) - return edg_wll_SetError(ctx, ENOMEM, "read_data()"); - } - - ret = edg_wll_gss_read(&(notif->gss), notif->buf + notif->bufUse, - notif->bufSize - notif->bufUse, &ctx->p_tmp_timeout, &gss_code); - - if (ret < 0) { - switch(ret) { - case EDG_WLL_GSS_ERROR_TIMEOUT: - edg_wll_SetError(ctx, ETIMEDOUT, "read message"); - break; - case EDG_WLL_GSS_ERROR_EOF: - edg_wll_SetError(ctx, ENOTCONN, NULL); - break; - default: - edg_wll_SetError(ctx, EDG_WLL_ERROR_GSS, "read message"); - break; - } - goto err; - } - notif->bufUse += ret; - - } while (notif->bufSize == notif->bufUse); - -err: - return edg_wll_Error(ctx, NULL, NULL); -} - - -/* copies bytes_to_copy chars from pool buffer to given _allocated_ working buffer - */ -static int buffer_reader(void *user_data, char *buffer, const int bytes_to_copy) -{ - edg_wll_Context tmp_ctx = (edg_wll_Context)user_data; - - - if (tmp_ctx->connNotif->connPool[tmp_ctx->connNotif->connToUse].bufUse < bytes_to_copy) - return(-1); - - memcpy(buffer,tmp_ctx->connNotif->connPool[tmp_ctx->connNotif->connToUse].buf + - tmp_ctx->connNotif->connPool[tmp_ctx->connNotif->connToUse].bufPtr, bytes_to_copy); - tmp_ctx->connNotif->connPool[tmp_ctx->connNotif->connToUse].bufPtr += bytes_to_copy; - - return(bytes_to_copy); -} - - -static int recv_notif(edg_wll_Context ctx, char **message) -{ - int len; - - - len = read_il_data(ctx, message, buffer_reader); - if(len < 0) - return(len); - - return edg_wll_Error(ctx,NULL,NULL); -} - - -static int prepare_reply(const edg_wll_Context ctx) -{ - int len, err_code, err_code_min = 0; - char *err_msg = NULL; - - - err_code = edg_wll_Error(ctx,NULL,&err_msg); - - if (!err_msg) err_msg=strdup("OK"); - - len = encode_il_reply(&(ctx->connNotif->connPool[ctx->connNotif->connToUse].bufOut), - err_code, err_code_min, err_msg); - - if(len < 0) { - edg_wll_SetError(ctx,E2BIG,"create_reply()"); - goto err; - } - - ctx->connNotif->connPool[ctx->connNotif->connToUse].bufSizeOut = len; -err: - free(err_msg); - return edg_wll_Error(ctx,NULL,NULL); -} - - -// send pool output buffer nonblockingly -// XXX: missing partial-sent logic (gss_write does not return written bytes count) -static int send_reply(const edg_wll_Context ctx) -{ - int ret; - edg_wll_GssStatus gss_code; - - - ret = edg_wll_gss_write(&ctx->connNotif->connPool[ctx->connNotif->connToUse].gss, - ctx->connNotif->connPool[ctx->connNotif->connToUse].bufOut, - ctx->connNotif->connPool[ctx->connNotif->connToUse].bufSizeOut, &ctx->p_tmp_timeout, &gss_code); - - if (ret < 0) { - // edg_wll_gss_write does not return how many bytes were written, so - // any error is fatal for us and we can close connection - edg_wll_SetError(ctx, - ret == EDG_WLL_GSS_ERROR_TIMEOUT ? - ETIMEDOUT : EDG_WLL_ERROR_GSS, - "send_reply()"); - goto err; - } - -err: - return edg_wll_Error(ctx,NULL,NULL); -} - - - - -int edg_wll_NotifReceive( - edg_wll_Context ctx, - int fd, - const struct timeval *timeout, - edg_wll_JobStat *state_out, - edg_wll_NotifId *id_out) - -/* NotifReceive */ -{ - int i, j, ret, fd_num = ctx->connNotif->connOpened + 1; - struct _fd_map { - struct pollfd pollfds[fd_num]; - int index[fd_num]; - } fd_map; - edg_wll_Event *event = NULL; - struct timeval start_time,check_time; - char *event_char = NULL, *jobstat_char = NULL, *message = NULL; - struct timeval tv = *timeout; - - - edg_wll_ResetError(ctx); - - /* start timer */ - gettimeofday(&start_time,0); - - if (fd == -1) { - if (ctx->notifSock == -1) { - return edg_wll_SetError(ctx, EINVAL, "No client socket opened."); - } - else { - fd = ctx->notifSock; - } - } - -start: - fd_num = ctx->connNotif->connOpened + 1; - fd_map.pollfds[0].fd = fd; - fd_map.pollfds[0].events = POLLIN; - fd_map.index[0] = -1; - - j = 1; - for (i=0; i < ctx->connNotif->poolSize; i++) { - if (ctx->connNotif->connPool[i].gss.sock != -1) { - fd_map.pollfds[j].fd = ctx->connNotif->connPool[i].gss.sock; - fd_map.pollfds[j].events = POLLIN; - fd_map.index[j] = i; - j++; - } - } - assert(j == fd_num); - - /* XXX notif_send() & notif_receive() should then migrate to */ - /* client/connection.c and use connPool management f-cions */ - - /* XXX: long-lived contexts may have problems, TODO implement credential reload */ - - switch(poll(fd_map.pollfds, fd_num, tv.tv_sec*1000+tv.tv_usec/1000)) { - case -1: - edg_wll_SetError(ctx, errno, "edg_wll_NotifReceive: poll() failed"); - goto err; - case 0: - edg_wll_SetError(ctx, ETIMEDOUT, "edg_wll_NotifReceive: poll() timed out"); - goto err; - default: - for (i=0; i < fd_num; i++) { - if ((fd_map.pollfds[i].revents & POLLIN)) { - break; - } - } - if (fd_num == i) { - /* no events on any socket */ - edg_wll_SetError(ctx, errno, "edg_wll_NotifReceive: error on filedescriptor"); - goto err; - } - break; - } - - /* check time */ - gettimeofday(&check_time,0); - if (decrement_timeout(&tv, start_time, check_time)) { - edg_wll_SetError(ctx, ETIMEDOUT, "edg_wll_NotifReceive()"); - goto err; - } - ctx->p_tmp_timeout = tv; - - // there is some incomming connection(s) - // XXX: what has higher priority? new connection, or data on active connection ? - - if (fd_map.pollfds[0].revents & POLLIN) { /* new connection */ - start_time = check_time; - - if (edg_wll_accept(ctx,fd)) goto err; - - /* check time */ - gettimeofday(&check_time,0); - if (decrement_timeout(&tv, start_time, check_time)) { - edg_wll_SetError(ctx, ETIMEDOUT, "edg_wll_NotifReceive()"); - goto err; - } - ctx->p_tmp_timeout = tv; - } - else { /* data on some of active (NotifPool) connections */ - // XXX: if data arrives for more connections, which one serve first? - // poor-man solution - take first one on which data arrived - for (i=1; i < fd_num; i++) { - if (fd_map.pollfds[i].revents & POLLIN) { - ctx->connNotif->connToUse = fd_map.index[i]; - break; - } - } - assert(i < fd_num); - } - - /****************************************************************/ - /* Communication with notif-interlogger */ - /****************************************************************/ - - start_time = check_time; - - if ( (ret = read_data(ctx)) ) { - ctx->connNotif->connPool[ctx->connNotif->connToUse].bufPtr = 0; - - if ( ret == ENOTCONN ) { - int broken = (ctx->connNotif->connPool[ctx->connNotif->connToUse].bufUse != 0); - /* IL closed connection; remove this connection from pool and go to poll if timeout > 0 */ - - CloseConnectionNotif(ctx); - - /* check time */ - gettimeofday(&check_time,0); - if (decrement_timeout(&tv, start_time, check_time)) { - edg_wll_SetError(ctx, ETIMEDOUT, "edg_wll_NotifReceive()"); - goto err; - } - ctx->p_tmp_timeout = tv; - start_time = check_time; - - if (broken) { - edg_wll_SetError(ctx,ENOTCONN,"IL connection broken in middle of message"); - goto err; - } - - edg_wll_ResetError(ctx); - goto start; - } - - goto err; - } - - /* check time */ - gettimeofday(&check_time,0); - if (decrement_timeout(&tv, start_time, check_time)) { - edg_wll_SetError(ctx, ETIMEDOUT, "edg_wll_NotifReceive()"); - goto err; - } - ctx->p_tmp_timeout = tv; - start_time = check_time; - - if (recv_notif(ctx, &message) < 0) { - ctx->connNotif->connPool[ctx->connNotif->connToUse].bufPtr = 0; - goto err; - } - - /* receive message complete, free input buffer */ - free(ctx->connNotif->connPool[ctx->connNotif->connToUse].buf); - ctx->connNotif->connPool[ctx->connNotif->connToUse].buf = NULL; - ctx->connNotif->connPool[ctx->connNotif->connToUse].bufPtr = 0; - ctx->connNotif->connPool[ctx->connNotif->connToUse].bufUse = 0; - ctx->connNotif->connPool[ctx->connNotif->connToUse].bufSize = 0; - - - if (prepare_reply(ctx) || send_reply(ctx)) { - // fatal error - // XXX: output buffer not used between edg_wll_NotifReceive() calls - CloseConnectionNotif(ctx); - goto err; - } - - /* check time */ - gettimeofday(&check_time,0); - if (decrement_timeout(&tv, start_time, check_time)) { - edg_wll_SetError(ctx, ETIMEDOUT, "edg_wll_NotifReceive()"); - goto err; - } - ctx->p_tmp_timeout = tv; - start_time = check_time; - - /* response sent, free output buffer */ - free(ctx->connNotif->connPool[ctx->connNotif->connToUse].bufOut); - ctx->connNotif->connPool[ctx->connNotif->connToUse].bufOut = NULL; - ctx->connNotif->connPool[ctx->connNotif->connToUse].bufUseOut = 0; - ctx->connNotif->connPool[ctx->connNotif->connToUse].bufSizeOut = 0; - ctx->connNotif->connPool[ctx->connNotif->connToUse].bufPtrOut = 0; - - { - il_octet_string_t ev; - - if ( decode_il_msg(&ev, message) < 0 ) { - CloseConnectionNotif(ctx); - edg_wll_SetError(ctx, EDG_WLL_IL_PROTO, "decoding event string"); - goto err; - } - event_char = ev.data; - } - /****************************************************************/ - /* end of notif-interlogger message exchange */ - /****************************************************************/ - - /* check time */ - gettimeofday(&check_time,0); - if (decrement_timeout(&tv, start_time, check_time)) { - edg_wll_SetError(ctx, ETIMEDOUT, "edg_wll_NotifReceive()"); - goto err; - } - ctx->p_tmp_timeout = tv; - start_time = check_time; - - if (edg_wll_ParseNotifEvent(ctx, event_char, &event)) { - goto err; - } - - jobstat_char = glite_lbu_UnescapeXML((const char *) event->notification.jobstat); - if (jobstat_char == NULL) { - edg_wll_SetError(ctx, EINVAL, "glite_lbu_UnescapeXML()"); - goto err; - } - - /* fill in return values - */ - if ( edg_wll_ParseJobStat(ctx, jobstat_char, - strlen(jobstat_char), state_out)) { - goto err; - } - - if (id_out) { - *id_out = event->notification.notifId; - event->notification.notifId = NULL; - } - -err: - if (event) { - edg_wll_FreeEvent(event); - // XXX - konzultovat s honikem; podle meho by to free - // mel delat uz edg_wll_FreeEvent - free(event); - } - - free(event_char); - free(jobstat_char); - free(message); - - // XXX: decrement or not to decrement :) - //*timeout = tv; - - return edg_wll_Error(ctx,NULL,NULL); -} - - -int edg_wll_NotifGetFd( - edg_wll_Context ctx) -{ - if (ctx->notifSock == -1) { - edg_wll_SetError(ctx, EBADF, "Client socket is not opened."); - return -1; - } - - return ctx->notifSock; -} - - -int edg_wll_NotifCloseFd( - edg_wll_Context ctx) -{ - int err; - - if (ctx->notifSock >= 0) { - err = close(ctx->notifSock); - ctx->notifSock = -1; - - if (err) - return edg_wll_SetError(ctx, errno, "close() failed"); - } - - return edg_wll_Error(ctx,NULL,NULL); -} - -int edg_wll_NotifClosePool( - edg_wll_Context ctx) -{ - if (ctx->connNotif->connOpened) { - for (ctx->connNotif->connToUse=0; ctx->connNotif->connToUse < ctx->connNotif->poolSize; - ctx->connNotif->connToUse++) { - if (ctx->connNotif->connPool[ctx->connNotif->connToUse].gss.sock != -1) CloseConnectionNotif(ctx); - - } - } - - return edg_wll_Error(ctx,NULL,NULL); -} diff --git a/org.glite.lb.client/src/notify.c b/org.glite.lb.client/src/notify.c deleted file mode 100644 index 0d1856a..0000000 --- a/org.glite.lb.client/src/notify.c +++ /dev/null @@ -1,545 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "glite/security/glite_gss.h" -#include "glite/lb/context.h" -#include "notification.h" - -#include "stat_fields.h" - - -static char *me; - -static void usage(char *cmd) -{ - if ( !cmd ) - { - fprintf(stderr,"usage: %s command [options]\n" - " where commands are:\n" - " new Create new notification reg.\n" - " bind Binds an notification reg. to a client.\n" - " change Changes notification reg. params.\n" - " refresh Enlarge notification reg. validity.\n" - " receive Binds to an existing notif. registration and listen to server.\n" - " drop Drop the notification reg.\n" - " help Prints this message\n", - me); - } - if ( !cmd || !strcmp(cmd, "new") ) - fprintf(stderr,"\n'new' command usage: %s new [ { -s socket_fd | -a fake_addr } -t requested_validity -j jobid { -o owner | -O } -n network_server -v virtual_organization --states state1,state2,... -c -f flags]\n" - " jobid Job ID to connect notif. reg. with\n" - " owner Match this owner DN\n" - " requested_validity Validity of notification req. in seconds\n" - " flags 0 - return basic status, 1 - return also JDL in status\n" - " network_server Match only this network server (WMS entry point)\n" - " -O Match owner - credentials are retrieved from environment\n" - " -c Match only on state change\n" - " -S | --state Match on events resulting in listed (coma-delimited) states\n" - , me); - if ( !cmd || !strcmp(cmd, "bind") ) - fprintf(stderr,"\n'bind' command usage: %s bind [ { -s socket_fd | -a fake_addr } -t requested_validity ] notifids \n" - " requested_validity Validity of notification req. in seconds\n" - " notifids One or more notification ID's\n" - " fake_addr Fake the client address\n", me); - - if ( !cmd || !strcmp(cmd, "change") ) - fprintf(stderr,"\n'change' command usage: %s change notifid jobid\n" - " notifid Notification ID.\n" - " jobid Job ID to connect notif. reg. with.\n", me); - - if ( !cmd || !strcmp(cmd, "refresh") ) - fprintf(stderr,"\n'refresh' command usage: %s refresh [-t requested_validity ] notifid\n" - " requested_validity Validity of notification req. in seconds\n" - " notifid Notification ID.\n", me); - if ( !cmd || !strcmp(cmd, "receive") ) { - fprintf(stderr,"\n'receive' command usage: %s receive [ { -s socket_fd | -a fake_addr } ] [-t requested_validity ] [-i timeout] [-r ] [-f field1,field2,...] [notifid]\n" - " requested_validity Validity of notification req. in seconds (default 3600)\n" - " notifid Notification ID (not used if -s specified).\n" - " fake_addr Fake the client address.\n" - " field1,field2,... List of status fields to print (only owner by default)\n" - " timeout Timeout to receive operation in seconds.\n" - " -r Attempt to refresh the notification handle in 1/2 of current validity.\n" - "\n -a, -t, and -r are unusable with -s\n" - , me); - fprintf(stderr,"\navailable fields:\n\t"); - glite_lb_dump_stat_fields(); - putc(10,stderr); - } - if ( !cmd || !strcmp(cmd, "drop") ) - fprintf(stderr,"\n'drop' command usage: %s drop notifid\n" - " notifid Notification to remove.\n", me); -} - -int main(int argc,char **argv) -{ - edg_wll_Context ctx; - edg_wll_QueryRec **conditions = NULL; - time_t valid = time(NULL) + 999999999; - char *errt, *errd; - void *fields = NULL; - - int sock = -1, flags = 0; - char *fake_addr = NULL; - -// sleep(20); - - me = argv[0]; - edg_wll_InitContext(&ctx); - - if ( argc < 2 ) { - usage(NULL); goto cleanup; - } - if ( (argc < 2) || - !strcmp(argv[1], "help") || !strcmp(argv[1], "--help") || - !strcmp(argv[1], "-h") || !strcmp(argv[1], "-?")) - { - usage(NULL); goto cleanup; - } - else if ( !strcmp(argv[1], "new") ) - { - int c; - edg_wlc_JobId jid; - edg_wll_NotifId id_out; - int attr = 0, i = 0, excl = 0; - edg_wll_GssCred mycred; - edg_wll_GssStatus gss_code; - static struct option long_options[] = { - {"state", required_argument, 0, 'S'}, - {0, 0, 0, 0}}; - int option_index = 0; - char *single, *statelist, *notif_server; - edg_wll_JobStatCode single_code; - int statno, stdelims, sti; - unsigned int notif_server_port; - -#define MAX_NEW_CONDS 7 - conditions = (edg_wll_QueryRec **)calloc(MAX_NEW_CONDS + 1,sizeof(edg_wll_QueryRec *)); - conditions[0] = (edg_wll_QueryRec *)calloc(2,sizeof(edg_wll_QueryRec)); - - while ((c = getopt_long(argc-1,argv+1,"j:o:v:n:s:a:t:f:cOS:",long_options,&option_index)) > 0) { switch (c) { - case 'j': - conditions[i] = (edg_wll_QueryRec *)calloc(2,sizeof(edg_wll_QueryRec)); - conditions[i][0].attr = EDG_WLL_QUERY_ATTR_JOBID; - conditions[i][0].op = EDG_WLL_QUERY_OP_EQUAL; - if (edg_wlc_JobIdParse(optarg, &jid) ) { - fprintf(stderr,"Job ID parameter not set propperly!\n"); - usage("new"); - goto cleanup; - } - conditions[i][0].value.j = jid; - i++; - edg_wll_GetParam(ctx, EDG_WLL_PARAM_NOTIF_SERVER, ¬if_server); - if (!notif_server) { - glite_jobid_getServerParts(jid, ¬if_server, ¬if_server_port); - edg_wll_SetParam(ctx, EDG_WLL_PARAM_NOTIF_SERVER, notif_server); - edg_wll_SetParamInt(ctx, EDG_WLL_PARAM_NOTIF_SERVER_PORT, notif_server_port); - } - free(notif_server); - break; - case 'o': - if (excl) { usage("new"); return EX_USAGE; } else excl = 1; - conditions[i] = (edg_wll_QueryRec *)calloc(2,sizeof(edg_wll_QueryRec)); - conditions[i][0].attr = EDG_WLL_QUERY_ATTR_OWNER; - conditions[i][0].op = EDG_WLL_QUERY_OP_EQUAL; - conditions[i][0].value.c = optarg; - i++; - break; - case 'v': - conditions[i] = (edg_wll_QueryRec *)calloc(2,sizeof(edg_wll_QueryRec)); - conditions[i][0].attr = EDG_WLL_QUERY_ATTR_JDL_ATTR; - conditions[i][0].op = EDG_WLL_QUERY_OP_EQUAL; - conditions[i][0].value.c = optarg; - asprintf(&(conditions[i][0].attr_id.tag), "VirtualOrganisation"); - i++; - break; - case 'n': - conditions[i] = (edg_wll_QueryRec *)calloc(2,sizeof(edg_wll_QueryRec)); - conditions[i][0].attr = EDG_WLL_QUERY_ATTR_NETWORK_SERVER; - conditions[i][0].op = EDG_WLL_QUERY_OP_EQUAL; - conditions[i][0].value.c = optarg; - i++; - break; - case 's': - if (fake_addr) { usage("new"); return EX_USAGE; } - sock = atoi(optarg); break; - case 'a': - if (sock >= 0) { usage("new"); return EX_USAGE; } - fake_addr = optarg; break; - case 't': - valid = time(NULL) + atol(optarg); break; - case 'f': - flags = atoi(optarg); break; - case 'c': - conditions[i] = (edg_wll_QueryRec *)calloc(2,sizeof(edg_wll_QueryRec)); - conditions[i][0].attr = EDG_WLL_QUERY_ATTR_STATUS; - conditions[i][0].op = EDG_WLL_QUERY_OP_CHANGED; - i++; - break; - case 'O': - if (excl) { usage("new"); return EX_USAGE; } else excl = 1; - if ( !edg_wll_gss_acquire_cred_gsi(NULL, NULL, &mycred, &gss_code) ) - { - conditions[i] = (edg_wll_QueryRec *)calloc(2,sizeof(edg_wll_QueryRec)); - conditions[i][0].attr = EDG_WLL_QUERY_ATTR_OWNER; - conditions[i][0].op = EDG_WLL_QUERY_OP_EQUAL; - conditions[i][0].value.c = strdup(mycred->name); - edg_wll_gss_release_cred(&mycred, NULL); - i++; - } - else { - fprintf(stderr,"No credentials found! Exiting. \n"); - goto cleanup; - } - break; - case 'S': - statelist = optarg; - - statno = 0; - stdelims = 0; - for (sti = 0; sti < strlen(statelist); sti++) - if (statelist[sti] == ',') stdelims++; - conditions[i] = (edg_wll_QueryRec *)calloc(stdelims+2,sizeof(edg_wll_QueryRec)); - while((single = strtok(statelist, ","))) { - single_code = edg_wll_StringToStat(single); - if (single_code != -1) { - conditions[i][statno].attr = EDG_WLL_QUERY_ATTR_STATUS; - conditions[i][statno].op = EDG_WLL_QUERY_OP_EQUAL; - conditions[i][statno].value.i = single_code; - statelist = NULL; - statno++; - } - else { - fprintf(stderr,"'%s' is not a valid state name! Exitting.\n", single); - goto cleanup; - } - } - i++; - break; - default: - usage("new"); return EX_USAGE; - } - if (i > MAX_NEW_CONDS) { - usage("new"); return EX_USAGE; - } - } - - if ( !edg_wll_NotifNew(ctx, - (edg_wll_QueryRec const* const*)conditions, - flags, sock, fake_addr, &id_out, &valid)) - fprintf(stdout,"notification ID: %s\nvalid: %s (%ld)\n", - edg_wll_NotifIdUnparse(id_out), - TimeToStr(valid), - valid); - edg_wll_NotifIdFree(id_out); - if (attr == EDG_WLL_QUERY_ATTR_JOBID) edg_wlc_JobIdFree(jid); - if (edg_wll_Error(ctx,&errt,&errd)) { - fprintf(stderr, "%s: %s (%s)\n", me, errt, errd); - return EX_IOERR; - } - } - else if ( !strcmp(argv[1], "bind") ) - { - edg_wll_NotifId nid; - int c; - - while ((c = getopt(argc-1,argv+1,"s:a:t:")) > 0) switch (c) { - case 's': - if (fake_addr) { usage("bind"); return EX_USAGE; } - sock = atoi(optarg); break; - case 'a': - if (sock >= 0) { usage("bind"); return EX_USAGE; } - fake_addr = optarg; break; - case 't': - valid = time(NULL) + atol(optarg); break; - default: - usage("bind"); return EX_USAGE; - } - - if ( (optind+1 == argc) || edg_wll_NotifIdParse(argv[optind+1], &nid) ) - { - fprintf(stderr,"Notification ID parameter not set propperly!\n\n"); - usage("bind"); - return EX_USAGE; - } - if ( !edg_wll_NotifBind(ctx, nid, sock, fake_addr, &valid) ) - printf("valid until: %s (%ld)\n", TimeToStr(valid), valid); - edg_wll_NotifIdFree(nid); - if (edg_wll_Error(ctx,&errt,&errd)) { - fprintf(stderr, "%s: %s (%s)\n", me, errt, errd); - return EX_IOERR; - } - } - else if ( !strcmp(argv[1], "receive") ) - { - edg_wll_JobStat stat; - edg_wll_NotifId nid = NULL; - int c; - char *field_arg = "owner",*err; - time_t client_tout = time(NULL) + 600; - int refresh = 0; - struct timeval tout; - time_t opt_valid = 0,do_refresh = client_tout + 999999999,now; - - while ((c = getopt(argc-1,argv+1,"s:a:i:f:t:r")) > 0) switch (c) { - case 's': - if (fake_addr || refresh || opt_valid) { usage("receive"); return EX_USAGE; } - sock = atoi(optarg); break; - case 'a': - if (sock >= 0) { usage("receive"); return EX_USAGE; } - fake_addr = optarg; break; - case 'i': - client_tout = time(NULL) + atoi(optarg); break; - case 'f': - field_arg = optarg; break; - case 't': - if (sock >= 0) { usage("receive"); return EX_USAGE; } - opt_valid = atol(optarg); break; - case 'r': - if (sock >= 0) { usage("receive"); return EX_USAGE; } - refresh = 1; break; - default: - usage("receive"); return EX_USAGE; - } - - if (opt_valid == 0) opt_valid = 3600; - - if ((err = glite_lb_parse_stat_fields(field_arg,&fields))) { - fprintf(stderr,"%s: invalid argument\n",err); - return EX_USAGE; - } - - memset(&stat,0,sizeof stat); - - if (sock == -1) { - int param = optind+1; - - if (param == argc) - { - fprintf(stderr, "Notification ID parameter not set propperly!\n\n"); - usage("receive"); - return EX_USAGE; - } - - valid = time(NULL) + opt_valid; - - while (param < argc) { - if (edg_wll_NotifIdParse(argv[param], &nid)) { - fprintf(stderr, "Notification ID parameter not set propperly!\n\n"); - usage("receive"); - return EX_USAGE; - } - - if (edg_wll_NotifBind(ctx, nid, -1, fake_addr, &valid) ) - goto receive_err; - fprintf(stderr,"notification is valid until: %s (%ld)\n", TimeToStr(valid), valid); - - if (nid) edg_wll_NotifIdFree(nid); nid = NULL; - param++; - } - now = time(NULL); - do_refresh = now + (refresh ? (valid - now)/2 : 999999999); - if (refresh) fprintf(stderr,"next refresh %s (%ld)\n", - TimeToStr(do_refresh),do_refresh); - } - - do { - edg_wll_NotifId recv_nid = NULL; - int err; - - tout.tv_sec = (client_tout < do_refresh ? - client_tout : do_refresh) - - time(NULL); - if (tout.tv_sec < 0) tout.tv_sec = 0; - tout.tv_usec = 0; - - edg_wll_FreeStatus(&stat); - stat.state = EDG_WLL_JOB_UNDEF; - - if ( (err = edg_wll_NotifReceive(ctx, sock, &tout, &stat, &recv_nid)) ) { - edg_wll_NotifIdFree(recv_nid); - recv_nid = NULL; - - if (err != ETIMEDOUT) goto receive_err; - } - else glite_lb_print_stat_fields(fields,&stat); - - if ((now = time(NULL)) >= client_tout) return 0; - - if (refresh && now >= do_refresh) { - valid = now + opt_valid; - if (!edg_wll_NotifRefresh(ctx,nid,&valid)) { - do_refresh = now + (valid - now)/2; - fprintf(stderr,"notification is valid until: %s (%ld)\n",TimeToStr(valid), valid); - fprintf(stderr,"next refresh %s (%ld)\n", TimeToStr(do_refresh),do_refresh); - } - else { - char *et,*ed; - edg_wll_Error(ctx,&et,&ed); - do_refresh = now + (valid - now)/2; - fprintf(stderr,"warning: edg_wll_NotifRefresh failed (%s, %s)\n" - "next refresh %s (%ld)\n", - et,ed,TimeToStr(do_refresh),do_refresh); - } - } -/* original example */ -#if 0 - printf("\nnotification ID: %s\n", edg_wll_NotifIdUnparse(recv_nid)); - - if (stat.state != EDG_WLL_JOB_UNDEF) { - char *jobid_s; - - jobid_s = edg_wlc_JobIdUnparse(stat.jobId); - printf("Jobid:\t%s\nStatus:\t%s\n", - jobid_s, - edg_wll_StatToString(stat.state)); - edg_wll_FreeStatus(&stat); - free(jobid_s); - stat.state = EDG_WLL_JOB_UNDEF; - } -#endif - - if (recv_nid) { - edg_wll_NotifIdFree(recv_nid); - recv_nid = NULL; - } - } while (1); // till timeout.... - return 0; - -receive_err: - if (stat.state != EDG_WLL_JOB_UNDEF) edg_wll_FreeStatus(&stat); - if (nid) edg_wll_NotifIdFree(nid); - edg_wll_NotifCloseFd(ctx); - edg_wll_NotifClosePool(ctx); - - if (edg_wll_Error(ctx,&errt,&errd)) - fprintf(stderr, "%s: %s (%s)\n", me, errt, errd); - - return EX_IOERR; - } - else if ( !strcmp(argv[1], "change") ) - { - edg_wlc_JobId jid; - edg_wll_NotifId nid; - - if ( (argc < 3) || edg_wll_NotifIdParse(argv[2], &nid) ) - { - printf("Notification ID parameter not set propperly!\n"); - usage("bind"); - return 1; - } - if ( (argc < 4) || edg_wlc_JobIdParse(argv[3], &jid) ) - { - fprintf(stderr,"Job ID parameter not set propperly!\n"); - usage("change"); - goto cleanup; - } - - conditions = (edg_wll_QueryRec **)calloc(2,sizeof(edg_wll_QueryRec *)); - - conditions[0] = (edg_wll_QueryRec *)calloc(2,sizeof(edg_wll_QueryRec)); - conditions[0][0].attr = EDG_WLL_QUERY_ATTR_JOBID; - conditions[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - conditions[0][0].value.j = jid; - - conditions[1] = NULL; - - /*conditions[1] = (edg_wll_QueryRec *)calloc(3, sizeof(edg_wll_QueryRec)); - conditions[1][0].attr = EDG_WLL_QUERY_ATTR_STATUS; - conditions[1][0].op = EDG_WLL_QUERY_OP_EQUAL; - conditions[1][0].value.i = EDG_WLL_JOB_DONE; - - conditions[1][1].attr = EDG_WLL_QUERY_ATTR_STATUS; - conditions[1][1].op = EDG_WLL_QUERY_OP_EQUAL; - conditions[1][1].value.i = EDG_WLL_JOB_RUNNING;*/ - - edg_wll_NotifChange(ctx, nid, - (edg_wll_QueryRec const * const *) conditions, - EDG_WLL_NOTIF_REPLACE); - edg_wlc_JobIdFree(jid); - edg_wll_NotifIdFree(nid); - } - else if ( !strcmp(argv[1], "refresh") ) - { - edg_wll_NotifId nid; - int c; - - while ((c = getopt(argc-1,argv+1,"t:")) > 0) switch (c) { - case 't': - valid = time(NULL) + atol(optarg); break; - default: - usage("refresh"); return EX_USAGE; - } - - if ( (optind+1 == argc) || edg_wll_NotifIdParse(argv[optind+1], &nid) ) - { - fprintf(stderr,"Notification ID parameter not set propperly!\n\n"); - usage("refresh"); - return EX_USAGE; - } - - if ( !edg_wll_NotifRefresh(ctx, nid, &valid) ) - printf("valid until: %s (%ld)\n", TimeToStr(valid), valid); - edg_wll_NotifIdFree(nid); - } - else if ( !strcmp(argv[1], "drop") ) - { - edg_wll_NotifId nid; - - if ( (argc < 3) || edg_wll_NotifIdParse(argv[2], &nid) ) - { - fprintf(stderr,"Notification ID parameter not set propperly!\n"); - usage("drop"); - return EX_USAGE; - } - edg_wll_NotifDrop(ctx, nid); - edg_wll_NotifIdFree(nid); - } - else { - usage(NULL); - return EX_USAGE; - } - -cleanup: - - if ( conditions ) - { - /* - for ( i = 0; conditions[i][0].attr; i++ ) - free(conditions[1]); - */ - free(conditions); - } - - edg_wll_NotifCloseFd(ctx); - - if (edg_wll_Error(ctx,&errt,&errd)) - fprintf(stderr, "%s: %s (%s)\n", me, errt, errd); - - edg_wll_FreeContext(ctx); - - - return 0; -} diff --git a/org.glite.lb.client/src/perftest_jobreg.c b/org.glite.lb.client/src/perftest_jobreg.c deleted file mode 100644 index 6946ab4..0000000 --- a/org.glite.lb.client/src/perftest_jobreg.c +++ /dev/null @@ -1,235 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#include "producer.h" -#include "glite/lb/events.h" - -#define PROXY_SERVER "localhost:9000" - -#define tv_sub(a,b) {\ - (a).tv_usec -= (b).tv_usec;\ - (a).tv_sec -= (b).tv_sec;\ - if ((a).tv_usec < 0) {\ - (a).tv_sec--;\ - (a).tv_usec += 1000000;\ - }\ -} - -#define dprintf(x) { if (verbose) printf x; } - - -extern char *optarg; -extern int opterr,optind; - -static void usage(char *me) -{ - fprintf(stderr,"usage: %s [-m bkserver] [-x scenario] [-n num_subjobs [-S]] [-l jdl_file] [-N num_repeat]\n" - " -m address:port of bkserver\n" - " -x use LBProxy\n" - " 1 use one call (RegisterJobProxyOnly - register only with lbproxy) \n" - " 2 use one call (RegisterJobProxyOld - sequence registration) \n" - " 3 use one call (RegisterJobProxy - dual registration) \n" - " 0 (or anything else) do not register to lbproxy at all\n" - " -n number of subjobs of DAG\n" - " -S register subjobs\n" - " -l file with JDL\n" - " -N repeat whole registration N-times\n" - " -v verbose output\n", - me); -} - -int main(int argc, char *argv[]) -{ - char *server = NULL,*jdl = NULL; - int lbproxy = 0, N = 1, verbose = 0; - int done = 0,num_subjobs = 0,reg_subjobs = 0, i, j; - edg_wll_Context ctx; - edg_wlc_JobId *jobids,*subjobs; - struct timeval start, stop; - - - edg_wll_InitContext(&ctx); - opterr = 0; - - do { - switch (getopt(argc,argv,"x:m:n:Sl:N:v")) { - case 'x': lbproxy = optarg ? atoi(optarg):1; break; - case 'm': server = strdup(optarg); break; - case 'n': num_subjobs = atoi(optarg); break; - case 'S': if (num_subjobs>0) { reg_subjobs = 1; break; } - case 'l': jdl = (char *) strdup(optarg); break; - case 'N': N = atoi(optarg); break; - case 'v': verbose = 1; break; - case '?': usage(argv[0]); exit(EINVAL); - case -1: done = 1; break; - } - } while (!done); - - if ((lbproxy > 3) || (lbproxy < 0)) lbproxy = 1; - - if (!server && !lbproxy) { - fprintf(stderr,"%s: either -m server or -x has to be specified\n",argv[0]); - exit(1); - } - - /* prepare set of N jobid before starting timer */ - jobids = (edg_wlc_JobId *) malloc(N * sizeof(edg_wlc_JobId)); - dprintf(("generating jobids...")); - { - char *name=server?server:strdup(PROXY_SERVER); - char *p = strchr(name,':'); - int port; - - if (p) { *p=0; port = atoi(p+1); } - else port = 0; - for (i=0; i 0; p += c); - if (c<0) { - perror("read()"); - exit (1); - } - jdl[p] = 0; - } - - edg_wll_SetParam(ctx,EDG_WLL_PARAM_SOURCE,edg_wll_StringToSource("Application")); - - /* start measurement */ - gettimeofday(&start, NULL); - - for (i=0; i&2 -} - -my_echo() -{ - echo $1 1>&2 -} - - -start_bkserver() -{ - # production version - usable only when starting as root - # $GLITE_LOCATION/etc/init.d/glite-lb-bkserverd start - - # workaround - [ -n "$GLITE_LB_SERVER_PIDFILE" ] && pidfile=$GLITE_LB_SERVER_PIDFILE || - pidfile=$GLITE_LOCATION_VAR/glite-lb-bkserverd.pid - - [ -z "$GLITE_LB_EXPORT_JPREG_MAILDIR" ] && \ - GLITE_LB_EXPORT_JPREG_MAILDIR=/tmp/jpreg - maildir="--jpreg-dir $GLITE_LB_EXPORT_JPREG_MAILDIR" - [ -d "$GLITE_LB_EXPORT_JPREG_MAILDIR" ] || \ - mkdir -p "$GLITE_LB_EXPORT_JPREG_MAILDIR" - - [ -n "$GLITE_LB_SERVER_PORT" ] && port="-p $GLITE_LB_SERVER_PORT" - [ -n "$GLITE_LB_SERVER_WPORT" ] && wport="-w $GLITE_LB_SERVER_WPORT" - [ -n "$GLITE_LB_SERVER_TRANSACTION" ] && trans="-b $GLITE_LB_SERVER_TRANSACTION" - - if [ -n "$1" ]; then - sink="--perf-sink $1" - else - sink="" - fi - - echo -n "Starting glite-lb-bkserver ..." - $GLITE_LOCATION/bin/glite-lb-bkserverd \ - $creds -i $pidfile $port $wport $maildir $sink $trans\ - --purge-prefix /tmp/purge_new --dump-prefix /tmp/dump_new -s 1\ - && echo " done" || echo " FAILED" - echo -} - - -stop_bkserver() -{ - echo - if [ -f $pidfile ]; then - pid=`cat $pidfile` - kill $pid - echo -n Stopping glite-lb-bkserverd \($pid\) ... - try=0 - while ps p $pid >/dev/null 2>&1; do - sleep 1; - kill $pid 2>/dev/null - try=`expr $try + 1` - if [ $try = 19 ]; then - echo "bkserver jammed - sending kill -9" - kill -9 $pid 2>/dev/null - fi - if [ $try = 20 ]; then - echo " giving up after $try retries" - return 1 - fi - done - echo " done" - rm -f $pidfile - rm -rf $GLITE_LB_EXPORT_JPREG_MAILDIR - else - echo $pidfile does not exist - glite-lb-bkserverd not running? >&2 - return 1 - fi - -} - - -start_proxy() -{ - [ -n "$GLITE_LB_PROXY_PIDFILE" ] && proxy_pidfile=$GLITE_LB_PROXY_PIDFILE || - proxy_pidfile=$GLITE_LOCATION_VAR/glite-lb-proxy.pid - - [ -n "$GLITE_LB_PROXY_SOCK_PREFIX" ] && proxy_sock_prefix="-p $GLITE_LB_PROXY_SOCK_PREFIX" || - proxy_sock_prefix="" - - [ -n "$1" ] && sink="-K $1" || sink_mode= - - echo -n Starting glite-lb-proxy ... - $GLITE_LOCATION/bin/glite-lb-proxy \ - -i $proxy_pidfile $proxy_sock_prefix $sink \ - && echo " done" || echo " FAILED" - echo -} - -stop_proxy() -{ - echo - if [ -f $proxy_pidfile ]; then - pid=`cat $proxy_pidfile` - kill $pid - echo -n Stopping glite-lb-proxy \($pid\) ... - try=0 - while ps p $pid >/dev/null 2>&1; do - sleep 1; - kill $pid 2>/dev/null - try=`expr $try + 1` - if [ $try = 20 ]; then - echo " giving up after $try retries" - return 1 - fi - done - echo " done" - rm -f $proxy_pidfile - rm -rf $GLITE_LB_EXPORT_JPREG_MAILDIR - else - echo $proxy_pidfile does not exist - glite-lb-proxy not running? >&2 - return 1 - fi -} - -start_il() -{ - [ -n "$GLITE_LB_IL_SOCK" ] && il_sock="-s $GLITE_LB_PROXY_SOCK" || - il_sock="" - - [ -n "$GLITE_LB_IL_PREFIX" ] && il_prefix="-f $GLITE_LB_IL_PREFIX" || - il_prefix="" - - echo -n Starting glite-lb-interlogger ... - $GLITE_LOCATION/bin/glite-lb-interlogd \ - $creds $il_sock $il_prefix \ - && echo " done" || echo " FAILED" - echo - -} - -stop_il() -{ - killall glite-lb-interlogger -} - - -# - Test types - -# -# i) normally procesed by server & proxy -# ii) server replies immedia success -# iii) proxy replies immediate succes -# a) current implementation -# b) connection pool -# c) parallel communication - -test_ai() -{ - dest= - [ -z "$1" ] && echo "test_ai() - wrong params" && return - [ "$1" = "proxy" ] && dest="-x" - [ "$1" = "server" ] && dest="-m $BKSERVER_HOST" - [ -z "$dest" ] && echo "test_ai() - wrong params" && return - - my_echo "================================================================" - my_echo "Testing LB $1 with sink_mode ${sink_mode[$2]}" - - # single registration - # - my_echo "-n single registration ..." - ai_sr_lb=`$GLITE_LOCATION/sbin/glite-lb-perftest_jobreg $dest` - mega_actions_per_day=`echo "scale=6; 86400/$ai_sr_lb/1000000" | bc` - my_echo ". $ai_sr_lb seconds ($mega_actions_per_day GU)" - - # average single registration (100 samples) - # - my_echo "-n average single registration (100 samples) ..." - ai_100sr_lb=`$GLITE_LOCATION/sbin/glite-lb-perftest_jobreg $dest -N 100` - ai_avg_sr_lb=`echo "scale=6; $ai_100sr_lb/100" |bc` - mega_actions_per_day=`echo "scale=6; 86400/$ai_avg_sr_lb/1000000" | bc` - my_echo ". $ai_avg_sr_lb seconds ($mega_actions_per_day GU)" - - # 1000 nodes DAG registration - # - my_echo "-n 1000 nodes DAG registration ..." - ai_dag1000_lb=`$GLITE_LOCATION/sbin/glite-lb-perftest_jobreg $dest -n 1000` - mega_actions_per_day=`echo "scale=6; 86400/$ai_dag1000_lb/1000000*1001" | bc` - my_echo ". $ai_dag1000_lb seconds ($mega_actions_per_day GU)" - - # 5000 nodes DAG registration - # - my_echo "-n 5000 nodes DAG registration ..." - ai_dag5000_lb=`$GLITE_LOCATION/sbin/glite-lb-perftest_jobreg $dest -n 5000` - mega_actions_per_day=`echo "scale=6; 86400/$ai_dag5000_lb/1000000*5001" | bc` - my_echo ". $ai_dag5000_lb seconds ($mega_actions_per_day GU)" - - # 10000 nodes DAG registration - # - my_echo "-n 10000 nodes DAG registration ..." - ai_dag10000_lb=`$GLITE_LOCATION/sbin/glite-lb-perftest_jobreg $dest -n 10000` - mega_actions_per_day=`echo "scale=6; 86400/$ai_dag10000_lb/1000000*10001" | bc` - my_echo ". $ai_dag10000_lb seconds ($mega_actions_per_day GU)" - -} - -quick_test() -{ - dest= - [ -z "$1" ] && echo "test_ai() - wrong params" && return - [ "$1" = "proxy" ] && dest="-x" - [ "$1" = "server" ] && dest="-m $BKSERVER_HOST" - [ -z "$dest" ] && echo "test_ai() - wrong params" && return - - - # 1000 nodes DAG registration - # - my_echo "-n 1000 nodes DAG registration ..." - ai_dag1000_lb=`$GLITE_LOCATION/sbin/glite-lb-perftest_jobreg $dest -n 1000` - mega_actions_per_day=`echo "scale=6; 86400/$ai_dag1000_lb/1000000*1001" | bc` - my_echo ". $ai_dag1000_lb seconds ($mega_actions_per_day GU)" - -} - -proxy_test() -{ - my_echo "----------------------------------------------------------------" - my_echo "Scenarios:" - my_echo "0) registration only to bkserver (edg_wll_RegisterJobSync)" - my_echo "1) registration only to lbproxy (edg_wll_RegisterJobProxyOnly)" - my_echo "2) old (not dual) registration (edg_wll_RegisterJobProxyOld)" - my_echo "3) dual registration (edg_wll_RegisterJobProxy)" - my_echo "" - - if [ -n "$1" ]; then - repeat="-N $1" - repeated="repeated $1 times" - scale=$1 - else - repeat="" - repeated="" - scale=1 - fi - - # single registration - # - for i in 0 1 2 3; do - dest="-m $BKSERVER_HOST -x $i" - my_echo "-n single registration $repeated (scenario $i)..." - ai_sr_lb=`$GLITE_LOCATION/sbin/glite-lb-perftest_jobreg $dest $repeat` - mega_actions_per_day=`echo "scale=6; 86400/$ai_sr_lb/1000000*$scale" | bc` - my_echo ". $ai_sr_lb seconds ($mega_actions_per_day GU)" - sleep 3 - sync - sleep 3 - done - - # 1 node DAG registration - # - for i in 0 1 2 3; do - dest="-m $BKSERVER_HOST -x $i" - my_echo "-n 1 node DAG registration $repeated (scenario $i)..." - ai_dag1_lb=`$GLITE_LOCATION/sbin/glite-lb-perftest_jobreg $dest $repeat -n 1` - mega_actions_per_day=`echo "scale=6; 86400/$ai_dag1_lb/1000000*2*$scale" | bc` - my_echo ". $ai_dag1_lb seconds ($mega_actions_per_day GU)" - sleep 3 - sync - sleep 3 - done - - # 1000 nodes DAG registration - # - for i in 0 1 2 3; do - dest="-m $BKSERVER_HOST -x $i" - my_echo "-n 1000 nodes DAG registration $repeated (scenario $i)..." - ai_dag1000_lb=`$GLITE_LOCATION/sbin/glite-lb-perftest_jobreg $dest $repeat -n 1000` - mega_actions_per_day=`echo "scale=6; 86400/$ai_dag1000_lb/1000000*1001*$scale" | bc` - my_echo ". $ai_dag1000_lb seconds ($mega_actions_per_day GU)" - sleep 10 - sync - sleep 10 - done - - # 10000 nodes DAG registration - # - for i in 0 1 2 3; do - dest="-m $BKSERVER_HOST -x $i" - my_echo "-n 10000 nodes DAG registration $repeated (scenario $i)..." - ai_dag10000_lb=`$GLITE_LOCATION/sbin/glite-lb-perftest_jobreg $dest $repeat -n 10000` - mega_actions_per_day=`echo "scale=6; 86400/$ai_dag10000_lb/1000000*10001*$scale" | bc` - my_echo ". $ai_dag10000_lb seconds ($mega_actions_per_day GU)" - sleep 10 - sync - sleep 10 - done - - -} - - -################################################################################ - -unset creds port -if [ -z ${BKSERVER_HOST} ]; then - HOST=`hostname -f` - PORT=${GLITE_LB_SERVER_PORT:-9000}; - BKSERVER_HOST=$HOST:$PORT -fi -sink_mode[0]=GLITE_LB_SINK_NONE -sink_mode[1]=GLITE_LB_SINK_PARSE -sink_mode[2]=GLITE_LB_SINK_STORE -sink_mode[3]=GLITE_LB_SINK_STATE -sink_mode[4]=GLITE_LB_SINK_SEND - -test_glite_location; -test_credentials; - -# -# QUICK TEST -# -#start_bkserver 0; -#start_proxy 0; -#my_echo "================================================================" -#my_echo "Testing LB server with sink_mode ${sink_mode[0]}" -#my_echo "Testing LB proxy with sink_mode ${sink_mode[0]}" -#sleep 5 -#sync -#sleep 5 -#for i in `seq 1 10000`; do -# quick_test server 0; -## quick_test proxy 0; -#done -#stop_bkserver; -#stop_proxy; - -# -# SINK TEST -# -#for i in 1 2 3 4; do -# my_echo "================================================================" -# -# my_echo "Testing LB proxy with sink_mode ${sink_mode[$i]}" -# start_proxy $i -# test_ai proxy $i; -# stop_proxy -# -# my_echo "Testing LB server with sink_mode ${sink_mode[$i]}" -# start_bkserver $i; -# test_ai server $i; -# stop_bkserver; -#done - -# -# PROXY TEST -# -#start_proxy 0; -#start_il; -my_echo "================================================================" -my_echo "Testing registrations to bkserver ($BKSERVER_HOST) and to lbproxy" -#sleep 5 -for i in 1 10 100 1000; do - proxy_test $i; -done -#stop_proxy; -#stop_il; - -echo "__________" -echo "GU (goal units) are millons of registrations per day, where registration is" -echo "registration of job or subjob by client or server" -echo diff --git a/org.glite.lb.client/src/perftest_logjobs.c b/org.glite.lb.client/src/perftest_logjobs.c deleted file mode 100644 index 9c82680..0000000 --- a/org.glite.lb.client/src/perftest_logjobs.c +++ /dev/null @@ -1,364 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include "glite/lb/context-int.h" -#include "glite/lb/lb_perftest.h" -#include "glite/lb/log_proto.h" - -extern int edg_wll_DoLogEvent(edg_wll_Context context, edg_wll_LogLine logline); -extern int edg_wll_DoLogEventProxy(edg_wll_Context context, edg_wll_LogLine logline); -extern int edg_wll_DoLogEventDirect(edg_wll_Context context, edg_wll_LogLine logline); - -#define DEFAULT_SOCKET "/tmp/interlogger.sock" -#define DEFAULT_PREFIX EDG_WLL_LOG_PREFIX_DEFAULT - -#define EVENTS_USER_PRESENT - -/* -extern char *optarg; -extern int opterr,optind; - -Vzorem by mel byt examples/stresslog.c, ovsem s mirnymi upravami: - -1) nacte udalosti jednoho jobu z daneho souboru, rozparsuje a ulozi do pameti -2) je-li pozadan, zaregistruje dany pocet jobid -3) vypise timestamp -4) odesle rozparsovane udalosti pod ruznymi jobid (tolika, kolik ma - byt jobu - argument) na dany cil (localloger, interlogger, bkserver, proxy) -5) odesle specialni ukoncovaci udalost -6) exit - - read_job("small_job",&event_lines); - gettimeoday(&zacatek) - for (i=0; i<1000; i++) { - for (e=0; event_lines[e]; e++) - edg_wll_ParseEvent(event_lines[e],&event[e]); - } - gettimeofday(&konec); - - printf("parsovani",konec-zacatek/1000); - - gettimeofday(&zacatek); - switch (event[e].type) { - ... - edg_wll_LogBlaBla() - - -*/ - -static struct option const long_options[] = { - { "help", no_argument, 0, 'h' }, - { "dst", required_argument, NULL, 'd' }, - { "test", required_argument, NULL, 't' }, - { "file", required_argument, NULL, 'f'}, - { "num", required_argument, NULL, 'n'}, - { "machine", required_argument, NULL, 'm'}, - { "nofile", no_argument, NULL, 'N'}, - { "skip", optional_argument, NULL, 'P'}, - { "sock", required_argument, NULL, 's'}, - { "file-prefix", required_argument, NULL, 'p'}, - { NULL, 0, NULL, 0} -}; - - -int nofile = 0; -char *logfile_prefix = DEFAULT_PREFIX; -char *il_socket = NULL; - -void -usage(char *program_name) -{ - fprintf(stderr, "Usage: %s [-d destname] [-t testname] -f filename -n numjobs \n" - "-h, --help display this help and exit\n" - "-d, --dst destination component\n" - "-s, --sock socket name for IL\n" - "-m, --machine destination host\n" - "-t, --test name of the test\n" - "-f, --file name of the file with prototyped job events\n" - "-n, --num number of jobs to generate\n" - "-P, --skip [] number of events to skip when sending to IL by IPC\n" - "-p, --file-prefix file prefix of event files\n" - "-N, --nofile do not store events in file for interlogger (if dst==IL)\n", - program_name); -} - - -#define FCNTL_ATTEMPTS 5 -#define FCNTL_TIMEOUT 1 - - -int edg_wll_DoLogEventIl( - edg_wll_Context context, - edg_wll_LogLine logline, - const char *jobid, - int len, - int skip) -{ - static long filepos = 0; - int ret = 0; - edg_wlc_JobId jid; - char *unique, *event_file; - static int num_event = 0; - char *event; - -#if !defined(EVENTS_USER_PRESENT) - const char *user = " DG.USER=\"michal\"\n"; - - /* fill in DG.USER */ - /* we need room for user (=strlen(user)), terminating \0 (+1), - but we overwrite trailing \n (-1) */ - event = realloc(logline, len + strlen(user)); - if(event == NULL) { - return(edg_wll_SetError(context, ENOMEM, "realloc()")); - } - /* it really does not matter WHERE the key is, so append it at the end */ - memmove(event + len - 1, user, strlen(user) + 1); - len += strlen(user) - 1; -#else - event = logline; -#endif - - if(!nofile) { - ret = edg_wlc_JobIdParse(jobid, &jid); - if(ret != 0) { - fprintf(stderr, "error parsing jobid %s\n", jobid); - return(edg_wll_SetError(context, ret, "edg_wlc_JobIdParse()")); - } - unique = edg_wlc_JobIdGetUnique(jid); - if(unique == NULL) { - edg_wlc_JobIdFree(jid); - return(edg_wll_SetError(context, ENOMEM, "edg_wlc_JobIdGetUnique()")); - } - asprintf(&event_file, "%s.%s", logfile_prefix, unique); - if(!event_file) { - free(unique); - edg_wlc_JobIdFree(jid); - return(edg_wll_SetError(context, ENOMEM, "asprintf()")); - } - if(edg_wll_log_event_write(context, event_file, event, - context->p_tmp_timeout.tv_sec > FCNTL_ATTEMPTS ? context->p_tmp_timeout.tv_sec : FCNTL_ATTEMPTS, - FCNTL_TIMEOUT, - &filepos)) { - edg_wll_UpdateError(context, 0, "edg_wll_log_event_write()"); - free(unique); - edg_wlc_JobIdFree(jid); - free(event_file); - } - } - if(nofile || - (skip < 0) || - ((skip > 0) && (++num_event % skip == 0))) - ret = edg_wll_log_event_send(context, il_socket, filepos, - event, len, 1, - &context->p_tmp_timeout); - if(!nofile) { - free(unique); - edg_wlc_JobIdFree(jid); - free(event_file); - } else { - filepos += len; - } - - return(ret); -} - - -int -main(int argc, char *argv[]) -{ - - char *destname= NULL,*hostname=NULL,*testname = NULL,*filename = NULL; - char *event; - int num_jobs = 1; - int opt; - int skip = -1; - edg_wll_Context ctx; - enum { - DEST_UNDEF = 0, - DEST_LL, - DEST_IL, - DEST_PROXY, - DEST_BKSERVER, - DEST_DUMP, - } dest = 0; - - - edg_wll_InitContext(&ctx); - - opterr = 0; - - while ((opt = getopt_long(argc,argv,"hd:t:f:m:n:Ns:P::p:", - long_options, (int *) 0)) != EOF) { - - switch (opt) { - case 'd': destname = (char *) strdup(optarg); break; - case 't': testname = (char *) strdup(optarg); break; - case 'f': filename = (char *) strdup(optarg); break; - case 'm': hostname = (char *) strdup(optarg); break; - case 'p': logfile_prefix = (char*) strdup(optarg); break; - case 's': il_socket = (char*) strdup(optarg); break; - case 'n': num_jobs = atoi(optarg); break; - case 'N': nofile = 1; break; - case 'P': skip = optarg ? atoi(optarg) : 0; break; - case 'h': - default: - usage(argv[0]); exit(0); - } - } - - if(destname) { - if(!strncasecmp(destname, "pr", 2)) - dest=DEST_PROXY; - else if(!strncasecmp(destname, "lo", 2) || !strncasecmp(destname, "ll", 2)) - dest=DEST_LL; - else if(!strncasecmp(destname, "in", 2) || !strncasecmp(destname, "il", 2)) - dest=DEST_IL; - else if(!strncasecmp(destname, "bk", 2) || !strncasecmp(destname, "se", 2)) - dest=DEST_BKSERVER; - else if(!strncasecmp(destname, "du", 2)) - dest=DEST_DUMP; - else { - fprintf(stderr,"%s: wrong destination\n",argv[0]); - usage(argv[0]); - exit(1); - } - } - - if((dest == DEST_IL) && (il_socket == NULL)) - il_socket = DEFAULT_SOCKET; - if((dest == DEST_PROXY) && il_socket) { - char store_sock[256], serve_sock[256]; - sprintf(store_sock, "%s%s", il_socket, "store.sock"); - sprintf(serve_sock, "%s%s", il_socket, "serve.sock"); - edg_wll_SetParam(ctx, EDG_WLL_PARAM_LBPROXY_STORE_SOCK, store_sock); - edg_wll_SetParam(ctx, EDG_WLL_PARAM_LBPROXY_SERVE_SOCK, serve_sock); - } - - if (num_jobs <= 0) { - fprintf(stderr,"%s: wrong number of jobs\n",argv[0]); - usage(argv[0]); - exit(1); - } - - if (!filename && destname) { - fprintf(stderr,"%s: -f required\n",argv[0]); - usage(argv[0]); - exit(1); - } - - if (glite_wll_perftest_init(hostname, NULL, testname, filename, num_jobs) < 0) { - fprintf(stderr,"%s: glite_wll_perftest_init failed\n",argv[0]); - exit(1); - } - - if(dest) { - char *jobid; - int len; - while ((len=glite_wll_perftest_produceEventString(&event, &jobid)) > 0) { - switch(dest) { - case DEST_PROXY: - ctx->p_tmp_timeout = ctx->p_sync_timeout; - if (edg_wll_DoLogEventServer(ctx,EDG_WLL_LOGFLAG_PROXY,event)) { - char *et,*ed; - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_DoLogEventServer(): %s (%s)\n",et,ed); - fprintf(stderr,"Event:\n%s\n", event); - exit(1); - } - break; - - case DEST_LL: -#if defined(EVENTS_USER_PRESENT) - /* erase DG.USER, will be added by LL */ - do { - char *p = strstr(event, "DG.USER"); - - if(p != NULL) { - char *s = strchr(p+9, '"'); - if(s == NULL) { - s = strstr(p+7, "DG."); - if(s == NULL) { - s = event + len - 1; - } - } else { - while(*++s == ' ') ; - } - memmove(p, s, event + len + 1 - s); - } - } while(0); -#endif - ctx->p_tmp_timeout = ctx->p_log_timeout; - if (edg_wll_DoLogEvent(ctx,event)) { - char *et,*ed; - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_DoLogEvent(): %s (%s)\n",et,ed); - fprintf(stderr,"Event:\n%s\n", event); - exit(1); - } - break; - - case DEST_BKSERVER: - ctx->p_tmp_timeout = ctx->p_log_timeout; - edg_wlc_JobIdParse(jobid, &ctx->p_jobid); - if (edg_wll_DoLogEventServer(ctx,EDG_WLL_LOGFLAG_DIRECT,event)) { - char *et,*ed; - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_DoLogEventServer(): %s (%s)\n",et,ed); - fprintf(stderr,"Event:\n%s\n", event); - exit(1); - } - break; - - case DEST_IL: - ctx->p_tmp_timeout = ctx->p_log_timeout; - if (edg_wll_DoLogEventIl(ctx, event, jobid, len, skip)) { - char *et,*ed; - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_DoLogEventIl(): %s (%s)\n",et,ed); - fprintf(stderr,"Event:\n%s\n", event); - exit(1); - } - break; - - case DEST_DUMP: - printf("%s", event); - break; - - default: - break; - } - free(event); - } - } else { - /* no destination - only print jobid's that would be used */ - char *jobid; - - while(jobid = glite_wll_perftest_produceJobId()) { - fprintf(stdout, "%s\n", jobid); - } - } - edg_wll_FreeContext(ctx); - return 0; - -} diff --git a/org.glite.lb.client/src/perftest_query.sh b/org.glite.lb.client/src/perftest_query.sh deleted file mode 100644 index dbbd7f9..0000000 --- a/org.glite.lb.client/src/perftest_query.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -clients=${1:-3} - -jobs=${2:-/tmp/perftest_10.jobids} - -# XXX - there must be better way to find stage -if [ -z "${GLITE_LOCATION}" ]; then - STAGEDIR=/home/michal/shared/egee/jra1-head/stage -else - STAGEDIR=${GLITE_LOCATION} -fi -JOBSTAT=$STAGEDIR/examples/glite-lb-job_status - -ask() { - $JOBSTAT `cat $jobs` -} - -do_ask() { - while (true) - do - ask - sleep `expr 5 \* $RANDOM / 32767` - done -} - -for i in `seq 1 $clients` -do - do_ask & -done - diff --git a/org.glite.lb.client/src/prod_proto.c b/org.glite.lb.client/src/prod_proto.c deleted file mode 100644 index 3d1a2ff..0000000 --- a/org.glite.lb.client/src/prod_proto.c +++ /dev/null @@ -1,852 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "glite/lb/lb_plain_io.h" -#include "glite/lb/il_msg.h" -#include "glite/lb/il_string.h" -#include "glite/lb/connpool.h" - -#include "prod_proto.h" -#include "producer.h" -#include "connection.h" - -#if defined(FREEBSD) || defined(__FreeBSD__) && !defined(TCP_CORK) -#define TCP_CORK TCP_NOPUSH -#endif - -static const char* socket_path="/tmp/lb_proxy_store.sock"; - -/** - *---------------------------------------------------------------------- - * Handle GSS failures on the client side - *---------------------------------------------------------------------- - */ -/* TODO: restructuring - move handle_gss_failures to a separate file - and use it both in producer (here) and consumer (connection.c) -*/ -static -int handle_gss_failures(edg_wll_Context ctx, int code, edg_wll_GssStatus *gss_code, const char *text) -{ - static char err[256]; - int myerrno, ret; - - myerrno = errno; - ret = 0; - - edg_wll_ResetError(ctx); - - if(code>0) - return(0); - - switch(code) { - case EDG_WLL_GSS_ERROR_EOF: - snprintf(err, sizeof(err), "%s;; GSS Error: EOF occured;", text); - ret = edg_wll_SetError(ctx,ENOTCONN,err); - break; - case EDG_WLL_GSS_ERROR_TIMEOUT: - snprintf(err, sizeof(err), "%s;; GSS Error: timeout expired;", text); - ret = edg_wll_SetError(ctx,ENOTCONN,err); - break; - case EDG_WLL_GSS_ERROR_ERRNO: - { - const char *msg1; - char *msg2; - msg1 = strerror(myerrno); - asprintf(&msg2, "%s;; System Error: %s", text, msg1); - ret = edg_wll_SetError(ctx,ENOTCONN,msg2); - free(msg2); - } - break; - case EDG_WLL_GSS_ERROR_GSS: - snprintf(err, sizeof(err), "%s;; GSS Error: GSS failure occured", text); - ret = edg_wll_SetErrorGss(ctx,err,gss_code); - break; - case EDG_WLL_GSS_ERROR_HERRNO: - { - const char *msg1; - char *msg2; - msg1 = hstrerror(myerrno); - asprintf(&msg2, "%s;; GSS Error: %s", text, msg1); - ret = edg_wll_SetError(ctx,EDG_WLL_ERROR_DNS, msg2); - free(msg2); - } - break; - default: - snprintf(err, sizeof(err), "%s;; GSS Error: unknown failure", text); - ret = edg_wll_SetError(ctx,ECONNREFUSED,err); - break; - } - return ret; -} - -/* TODO: restructuring - start using the following to provide better error handling when communicating with proxy - and use it also both in producer and consumer -*/ -#if 0 /* unused */ -/** - *---------------------------------------------------------------------- - * Handle UNIX socket failures on the client side - *---------------------------------------------------------------------- - */ -static -int edg_wll_log_proto_handle_plain_failures(edg_wll_Context ctx, int code, const char *text) -{ - return 0; -} -#endif - -/* - *---------------------------------------------------------------------- - * get_reply_plain, get_reply_gss - read reply from server - * - * Returns: -1 - error reading message, - * code > 0 - error code from server - *---------------------------------------------------------------------- - */ -struct reader_data { - edg_wll_Context ctx; - void *conn; -}; - -static -int plain_reader(void *user_data, char *buffer, int max_len) -{ - struct reader_data *data = (struct reader_data *)user_data; - int len; - - len = edg_wll_plain_read_full(data->conn, buffer, max_len, &data->ctx->p_tmp_timeout); - if(len < 0) { - edg_wll_SetError(data->ctx, errno, "edg_wll_plain_read_full()"); - edg_wll_UpdateError(data->ctx, EDG_WLL_IL_PROTO, "plain_reader(): error reading message data"); - } - - return(len); -} - -static -int get_reply_plain(edg_wll_Context ctx, edg_wll_PlainConnection *conn, char **buf, int *code_maj, int *code_min) -{ - char *msg=NULL; - int len; - struct reader_data data; - - data.ctx = ctx; - data.conn = conn; - len = read_il_data(&data, &msg, plain_reader); - if(len < 0) { - edg_wll_SetError(ctx, EDG_WLL_IL_PROTO, "get_reply_plain(): error reading message"); - goto get_reply_plain_end; - } - - if(decode_il_reply(code_maj, code_min, buf, msg) < 0) { - edg_wll_SetError(ctx, EDG_WLL_IL_PROTO, "get_reply_plain(): error decoding message"); - goto get_reply_plain_end; - } - -get_reply_plain_end: - if(msg) free(msg); - return edg_wll_Error(ctx,NULL,NULL); -} - - -static -int gss_reader(void *user_data, char *buffer, int max_len) -{ - struct reader_data *data = (struct reader_data *)user_data; - int ret; - size_t len; - edg_wll_GssStatus gss_code; - - ret = edg_wll_gss_read_full(data->conn, buffer, max_len, &data->ctx->p_tmp_timeout, - &len, &gss_code); - if(ret < 0) { - handle_gss_failures(data->ctx, ret, &gss_code, "edg_wll_gss_read_full"); - edg_wll_UpdateError(data->ctx, EDG_WLL_IL_PROTO, "gss_reader(): error reading message"); - } - - return(ret); -} - - -static -int get_reply_gss(edg_wll_Context ctx, edg_wll_GssConnection *conn, char **buf, int *code_maj, int *code_min) -{ - char *msg = NULL; - int code; - struct reader_data data; - - data.ctx = ctx; - data.conn = conn; - code = read_il_data(&data, &msg, gss_reader); - if(code < 0) { - edg_wll_UpdateError(ctx, EDG_WLL_IL_PROTO, "get_reply_gss(): error reading reply"); - goto get_reply_gss_end; - } - - if(decode_il_reply(code_maj, code_min, buf, msg) < 0) { - char *et; - asprintf(&et,"get_reply_gss(): error decoding reply \"%s\"", msg); - edg_wll_UpdateError(ctx, EDG_WLL_IL_PROTO, et); - if (et) free(et); - goto get_reply_gss_end; - } - -get_reply_gss_end: - if(msg) free(msg); - return edg_wll_Error(ctx,NULL,NULL); -} - -/** - *---------------------------------------------------------------------- - * connect to locallogger - *---------------------------------------------------------------------- - */ -int edg_wll_log_connect(edg_wll_Context ctx, int *conn) -{ - int ret, answer=0, index; - char *my_subject_name = NULL; - edg_wll_GssStatus gss_stat; - - edg_wll_ResetError(ctx); - edg_wll_poolLock(); - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_connect: setting connection to local-logger %s:%d (remaining timeout %d.%06d sec)\n", - ctx->p_destination,ctx->p_dest_port, - (int) ctx->p_tmp_timeout.tv_sec, (int) ctx->p_tmp_timeout.tv_usec); -#endif - /* check if connection already in pool */ - if ( (index = ConnectionIndex(ctx, ctx->p_destination, ctx->p_dest_port)) == -1 ) { - if (ctx->connections->connOpened == ctx->connections->poolSize) - if (ReleaseConnection(ctx, NULL, 0)) { - answer = edg_wll_SetError(ctx,EAGAIN,"cannot release connection (pool size exceeded)"); - goto edg_wll_log_connect_end; - } - index = AddConnection(ctx, ctx->p_destination, ctx->p_dest_port); - if (index < 0) { - answer = edg_wll_SetError(ctx,EAGAIN,"cannot add connection to pool"); - goto edg_wll_log_connect_end; - } -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_connect: connection to local-logger %s:%d added as No. %d in the pool\n", - ctx->connections->connPool[index].peerName, - ctx->connections->connPool[index].peerPort,index); -#endif - } -#ifdef EDG_WLL_LOG_STUB - else fprintf(stderr,"edg_wll_log_connect: connection to %s:%d exists (No. %d in the pool) - reusing\n", - ctx->connections->connPool[index].peerName, - ctx->connections->connPool[index].peerPort,index); -#endif - - // Unlock the pool here but lock the connection in question - edg_wll_connectionTryLock(ctx, index); - edg_wll_poolUnlock(); - -#if 0 - /* acquire gss credentials */ - ret = edg_wll_gss_acquire_cred_gsi( - ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_cert_filename, - ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_key_filename, - &ctx->connections->connPool[index].gsiCred, &gss_stat); - /* give up if unable to acquire prescribed credentials, otherwise go on anonymously */ - if (ret && ctx->p_proxy_filename) { - answer = edg_wll_SetErrorGss(ctx, "edg_wll_gss_acquire_cred_gsi(): failed to load GSI credentials", &gss_stat); - goto edg_wll_log_connect_err; - } - if (ctx->connections->connPool[index].gsiCred) - my_subject_name = ctx->connections->connPool[index].gsiCred->name; - -#ifdef EDG_WLL_LOG_STUB - if (my_subject_name != NULL) { - fprintf(stderr,"edg_wll_log_connect: using certificate: %s\n",my_subject_name); - } else { - fprintf(stderr,"edg_wll_log_connect: going on anonymously!\n"); - } -#endif -#endif -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_connect: opening connection to local-logger %s:%d\n", - ctx->connections->connPool[index].peerName, - ctx->connections->connPool[index].peerPort); -#endif - /* gss_connect */ - if (ctx->connections->connPool[index].gss.context == NULL) { - int opt; - - /* acquire gss credentials */ - ret = edg_wll_gss_acquire_cred_gsi( - ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_cert_filename, - ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_key_filename, - &ctx->connections->connPool[index].gsiCred, &gss_stat); - /* give up if unable to acquire prescribed credentials, otherwise go on anonymously */ - if (ret && ctx->p_proxy_filename) { - answer = edg_wll_SetErrorGss(ctx, "edg_wll_gss_acquire_cred_gsi(): failed to load GSI credentials", &gss_stat); - goto edg_wll_log_connect_err; - } - if (ctx->connections->connPool[index].gsiCred) - my_subject_name = ctx->connections->connPool[index].gsiCred->name; - -#ifdef EDG_WLL_LOG_STUB - if (my_subject_name != NULL) { - fprintf(stderr,"edg_wll_log_connect: using certificate: %s\n",my_subject_name); - } else { - fprintf(stderr,"edg_wll_log_connect: going on anonymously!\n"); - } -#endif - if ((answer = edg_wll_gss_connect( - ctx->connections->connPool[index].gsiCred, - ctx->connections->connPool[index].peerName, - ctx->connections->connPool[index].peerPort, - &ctx->p_tmp_timeout, - &ctx->connections->connPool[index].gss, - &gss_stat)) < 0) { - answer = handle_gss_failures(ctx,answer,&gss_stat,"edg_wll_gss_connect()"); - goto edg_wll_log_connect_err; - } - opt = 0; - setsockopt(ctx->connections->connPool[index].gss.sock,IPPROTO_TCP,TCP_CORK,(const void *) &opt,sizeof opt); - opt = 1; - setsockopt(ctx->connections->connPool[index].gss.sock,IPPROTO_TCP,TCP_NODELAY,(const void *) &opt,sizeof opt); - goto edg_wll_log_connect_end; - } else goto edg_wll_log_connect_end; - -edg_wll_log_connect_err: - if (index >= 0) { - CloseConnection(ctx, index); - edg_wll_connectionUnlock(ctx, index); - } - index = -1; - -edg_wll_log_connect_end: - if (index >= 0) edg_wll_connectionTryLock(ctx, index); - -// edg_wll_poolUnlock(); -// ZS, 2 Feb 2010: Overall pool lock replaced with a connection-specific -// lock for the most part - - -#ifdef EDG_WLL_LOG_STUB - if (answer) { - fprintf(stderr,"edg_wll_log_connect: error (remaining timeout %d.%06d sec)\n", - (int) ctx->p_tmp_timeout.tv_sec, (int) ctx->p_tmp_timeout.tv_usec); - } else { - fprintf(stderr,"edg_wll_log_connect: done o.k. (remaining timeout %d.%06d sec)\n", - (int) ctx->p_tmp_timeout.tv_sec, (int) ctx->p_tmp_timeout.tv_usec); - } -#endif - *conn = index; - return answer; -} - -/** - *---------------------------------------------------------------------- - * close connection to locallogger - *---------------------------------------------------------------------- - */ -int edg_wll_log_close(edg_wll_Context ctx, int conn) -{ - int ret = 0; - - if (conn == -1) return 0; - ret = CloseConnection(ctx,conn); - edg_wll_connectionUnlock(ctx,conn); - return ret; -} - -/** - *---------------------------------------------------------------------- - * write/send to locallogger - *---------------------------------------------------------------------- - */ -int edg_wll_log_write(edg_wll_Context ctx, int conn, edg_wll_LogLine logline) -{ - char header[EDG_WLL_LOG_SOCKET_HEADER_LENGTH+1]; - int err; - int answer; - size_t count,sent; - int size; - u_int8_t size_end[4]; - edg_wll_GssStatus gss_code; - - errno = err = answer = count = sent = 0; - size = strlen(logline)+1; - size_end[0] = size & 0xff; size >>= 8; - size_end[1] = size & 0xff; size >>= 8; - size_end[2] = size & 0xff; size >>= 8; - size_end[3] = size; - size = strlen(logline)+1; - - edg_wll_ResetError(ctx); - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_write: sending header\n"); -#endif - sprintf(header,"%s",EDG_WLL_LOG_SOCKET_HEADER); - header[EDG_WLL_LOG_SOCKET_HEADER_LENGTH]='\0'; - if ((err = edg_wll_gss_write_full(&ctx->connections->connPool[conn].gss, header, EDG_WLL_LOG_SOCKET_HEADER_LENGTH, &ctx->p_tmp_timeout, &count, &gss_code)) < 0) { - answer = handle_gss_failures(ctx,err,&gss_code,"edg_wll_gss_write_full()"); - edg_wll_UpdateError(ctx,answer,"edg_wll_log_write(): error sending header"); - return -1; - } - sent += count; - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_write: sending message size\n"); -#endif - count = 0; - if ((err = edg_wll_gss_write_full(&ctx->connections->connPool[conn].gss, size_end, 4, &ctx->p_tmp_timeout, &count, &gss_code)) < 0) { - answer = handle_gss_failures(ctx,err,&gss_code,"edg_wll_gss_write_full()"); - edg_wll_UpdateError(ctx,answer,"edg_wll_log_write(): error sending message size"); - return -1; - } - sent += count; - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_write: sending message...\n"); -#endif - count = 0; - if (( err = edg_wll_gss_write_full(&ctx->connections->connPool[conn].gss, logline, size, &ctx->p_tmp_timeout, &count, &gss_code)) < 0) { - answer = handle_gss_failures(ctx,err,&gss_code,"edg_wll_gss_write_full()"); - edg_wll_UpdateError(ctx,answer,"edg_wll_log_write(): error sending message"); - return -1; - } - sent += count; - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_write: done (remaining timeout %d.%06d sec)\n", - (int) ctx->p_tmp_timeout.tv_sec, (int) ctx->p_tmp_timeout.tv_usec); -#endif - return sent; -} - -/** - *---------------------------------------------------------------------- - * read/receive from locallogger - *---------------------------------------------------------------------- - */ -int edg_wll_log_read(edg_wll_Context ctx, int conn) -{ - int err; - int answer; - u_int8_t answer_end[4]; - size_t count; - edg_wll_GssStatus gss_code; - - errno = err = answer = count = 0; - - edg_wll_ResetError(ctx); - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_read: reading answer from local-logger\n"); -#endif - count = 0; - if ((err = edg_wll_gss_read_full(&ctx->connections->connPool[conn].gss, answer_end, 4, &ctx->p_tmp_timeout, &count, &gss_code)) < 0 ) { - answer = handle_gss_failures(ctx,err,&gss_code,"edg_wll_gss_read_full()"); - edg_wll_UpdateError(ctx,answer,"edg_wll_log_read(): error reading answer from local-logger"); - return -1; - } else { - answer = answer_end[3]; answer <<=8; - answer |= answer_end[2]; answer <<=8; - answer |= answer_end[1]; answer <<=8; - answer |= answer_end[0]; -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_read: read answer \"%d\"\n",answer); -#endif - edg_wll_SetError(ctx,answer,"edg_wll_log_read(): answer read from locallogger"); - } - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_read: done (remaining timeout %d.%06d sec)\n", - (int) ctx->p_tmp_timeout.tv_sec, (int) ctx->p_tmp_timeout.tv_usec); -#endif - return count; -} - - -/** - *---------------------------------------------------------------------- - * connect to lbproxy - *---------------------------------------------------------------------- - */ -int edg_wll_log_proxy_connect(edg_wll_Context ctx, edg_wll_PlainConnection *conn) -{ - int answer = 0, retries; - int flags; - struct sockaddr_un saddr; - - edg_wll_ResetError(ctx); - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_proxy_connect: setting connection to lbroxy (remaining timeout %d.%06d sec)\n", - (int) ctx->p_tmp_timeout.tv_sec, (int) ctx->p_tmp_timeout.tv_usec); -#endif - conn->sock = socket(PF_UNIX, SOCK_STREAM, 0); - if (conn->sock < 0) { - edg_wll_SetError(ctx,answer = errno,"edg_wll_log_proxy_connect(): socket() error"); - goto edg_wll_log_proxy_connect_end; - } - memset(&saddr, 0, sizeof(saddr)); - saddr.sun_family = AF_UNIX; - strcpy(saddr.sun_path, ctx->p_lbproxy_store_sock? - ctx->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(ctx,answer = errno,"edg_wll_log_proxy_connect(): fcntl() error"); - close(conn->sock); conn->sock = -1; - goto edg_wll_log_proxy_connect_end; - } -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_proxy_connect: opening connection to lbproxy (socket '%s')\n", - ctx->p_lbproxy_store_sock? ctx->p_lbproxy_store_sock: socket_path); -#endif - retries = 0; - while ((answer = connect(conn->sock, (struct sockaddr *)&saddr, sizeof(saddr))) < 0 && - errno == EAGAIN && - ctx->p_tmp_timeout.tv_sec >= 0 && ctx->p_tmp_timeout.tv_usec >= 0 && - !(ctx->p_tmp_timeout.tv_sec == 0 && ctx->p_tmp_timeout.tv_usec == 0) - ) - { - struct timespec ns = { 0, PROXY_CONNECT_RETRY * 1000000 /* 10 ms */ },rem; - - nanosleep(&ns,&rem); - - ctx->p_tmp_timeout.tv_usec -= ns.tv_nsec/1000; - ctx->p_tmp_timeout.tv_usec += rem.tv_nsec/1000; - - ctx->p_tmp_timeout.tv_sec -= ns.tv_sec; - ctx->p_tmp_timeout.tv_sec += rem.tv_sec; - - if (ctx->p_tmp_timeout.tv_usec < 0) { - ctx->p_tmp_timeout.tv_usec += 1000000; - ctx->p_tmp_timeout.tv_sec--; - } - retries++; - } - - if (answer) { - edg_wll_SetError(ctx,answer = (errno == EAGAIN ? ETIMEDOUT : errno),"edg_wll_log_proxy_connect()"); - close(conn->sock); conn->sock = -1; - } - -#ifdef EDG_WLL_LOG_STUB - if (retries) fprintf(stderr,"edg_wll_log_proxy_connect: there were %d connect retries\n",retries); -#endif - -edg_wll_log_proxy_connect_end: -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_proxy_connect: done (remaining timeout %d.%06d sec)\n", - (int) ctx->p_tmp_timeout.tv_sec, (int) ctx->p_tmp_timeout.tv_usec); -#endif - return answer; -} - -/** - *---------------------------------------------------------------------- - * close connection to lbproxy - *---------------------------------------------------------------------- - */ -int edg_wll_log_proxy_close(edg_wll_Context ctx, edg_wll_PlainConnection *conn) -{ - return edg_wll_plain_close(conn); -} - -/** - *---------------------------------------------------------------------- - * write/send to lbproxy - *---------------------------------------------------------------------- - */ -int edg_wll_log_proxy_write(edg_wll_Context ctx, edg_wll_PlainConnection *conn, edg_wll_LogLine logline) -{ - int len,count = 0; - char *buffer; - - edg_wll_ResetError(ctx); - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_proxy_write: encoding message\n"); -#endif - { - il_octet_string_t ll; - - ll.len = strlen(logline); - ll.data = logline; - len = encode_il_msg(&buffer, &ll); - } - if(len < 0) { - edg_wll_SetError(ctx,errno,"encode_il_msg()"); - edg_wll_UpdateError(ctx,ENOMEM,"edg_wll_log_proto_client_proxy(): error encoding message"); - return -1; - } - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_proxy_write: sending message\n"); -#endif - if ((count = edg_wll_plain_write_full(conn, buffer, len, &ctx->p_tmp_timeout)) < 0) { - edg_wll_SetError(ctx, errno, "edg_wll_plain_write_full()"); - edg_wll_UpdateError(ctx, EDG_WLL_IL_PROTO,"edg_wll_log_proto_client_proxy(): error sending message to socket"); - return -1; - } - - if (buffer) free(buffer); - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_proxy_write: done (remaining timeout %d.%06d sec)\n", - (int) ctx->p_tmp_timeout.tv_sec, (int) ctx->p_tmp_timeout.tv_usec); -#endif - return count; -} - -/** - *---------------------------------------------------------------------- - * read/receive from lbproxy - *---------------------------------------------------------------------- - */ -int edg_wll_log_proxy_read(edg_wll_Context ctx, edg_wll_PlainConnection *conn) -{ - char *answer = NULL; - static char et[256]; - int err; - int code; - int lbproto_code; - int count; - - errno = err = code = count = 0; - lbproto_code = 0; - - edg_wll_ResetError(ctx); - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_proxy_read: reading answer from lbproxy\n"); -#endif - if ((err = get_reply_plain(ctx, conn, &answer, &lbproto_code, &code)) != 0 ) { - edg_wll_UpdateError(ctx, EDG_WLL_IL_PROTO,"edg_wll_log_proxy_read(): error reading answer from lbproxy"); - return -1; - } else { -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_proxy_read: read answer \"%d:%d: %s\"\n",lbproto_code,code,answer); -#endif - switch (lbproto_code) { - case LB_OK: break; - case LB_NOMEM: - edg_wll_SetError(ctx, ENOMEM, "edg_wll_log_proxy_read(): proxy out of memory"); - break; - case LB_PROTO: - edg_wll_SetError(ctx, EDG_WLL_IL_PROTO, "edg_wll_log_proxy_read(): received protocol error response"); - break; - case LB_DBERR: - snprintf(et, sizeof(et), "edg_wll_log_proxy_read(): error details from L&B Proxy server: %s", answer); - edg_wll_SetError(ctx, code, et); - break; - default: - edg_wll_SetError(ctx, EDG_WLL_IL_PROTO, "edg_wll_log_proxy_read(): received unknown protocol response"); - break; - } - } - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_proxy_read: done (remaining timeout %d.%06d sec)\n", - (int) ctx->p_tmp_timeout.tv_sec, (int) ctx->p_tmp_timeout.tv_usec); -#endif - return 0; -} - - -/** - *---------------------------------------------------------------------- - * connect to bkserver - *---------------------------------------------------------------------- - */ -int edg_wll_log_direct_connect(edg_wll_Context ctx, edg_wll_GssConnection *conn) -{ - int ret,answer; - edg_wll_GssStatus gss_stat; - edg_wll_GssCred cred = NULL; - char *host; - unsigned int port; - - ret = answer = 0; - - edg_wll_ResetError(ctx); - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_direct_connect: setting connection to bkserver (remaining timeout %d.%06d sec)\n", - (int) ctx->p_tmp_timeout.tv_sec, (int) ctx->p_tmp_timeout.tv_usec); -#endif - /* get bkserver location: */ - edg_wlc_JobIdGetServerParts(ctx->p_jobid,&host,&port); - port +=1; - /* acquire gss credentials */ - ret = edg_wll_gss_acquire_cred_gsi( - ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_cert_filename, - ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_key_filename, - &cred, &gss_stat); - /* give up if unable to acquire prescribed credentials, otherwise go on anonymously */ - if (ret && ctx->p_proxy_filename) { - answer = edg_wll_SetErrorGss(ctx, "edg_wll_gss_acquire_cred_gsi(): failed to load GSI credentials", &gss_stat); - goto edg_wll_log_direct_connect_end; - } -#ifdef EDG_WLL_LOG_STUB - if (cred && cred->name) { -/* TODO: merge - shouldn't be probably ctx->p_user_lbproxy but some new parameter, eg. ctx->p_user - related to the change in producer.c -*/ - edg_wll_SetParamString(ctx, EDG_WLL_PARAM_LBPROXY_USER, cred->name); - fprintf(stderr,"edg_wll_log_direct_connect: using certificate: %s\n", cred->name); - } else { - fprintf(stderr,"edg_wll_log_direct_connect: going on anonymously\n"); - } - fprintf(stderr,"edg_wll_log_direct_connect: opening connection to bkserver (host '%s', port '%d')\n", host, port); -#endif - if ((answer = edg_wll_gss_connect(cred,host,port, - &ctx->p_tmp_timeout, conn, &gss_stat)) < 0) { - answer = handle_gss_failures(ctx,answer,&gss_stat,"edg_wll_gss_connect()"); - goto edg_wll_log_direct_connect_end; - } - -edg_wll_log_direct_connect_end: -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_direct_connect: done (remaining timeout %d.%06d sec)\n", - (int) ctx->p_tmp_timeout.tv_sec, (int) ctx->p_tmp_timeout.tv_usec); -#endif - if (cred != NULL) - edg_wll_gss_release_cred(&cred, NULL); - if (host) free(host); - - return answer; -} - -/** - *---------------------------------------------------------------------- - * close connection to bkserver - *---------------------------------------------------------------------- - */ -int edg_wll_log_direct_close(edg_wll_Context ctx, edg_wll_GssConnection *conn) -{ - return edg_wll_gss_close(conn,&ctx->p_tmp_timeout); -} - -/** - *---------------------------------------------------------------------- - * write/send to bkserver - *---------------------------------------------------------------------- - */ -int edg_wll_log_direct_write(edg_wll_Context ctx, edg_wll_GssConnection *conn, edg_wll_LogLine logline) -{ - size_t len,count=0; - int err; - char *buffer; - edg_wll_GssStatus gss_code; - - edg_wll_ResetError(ctx); - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_direct_write: encoding message\n"); -#endif - { - il_octet_string_t ll; - - ll.len=strlen(logline); ll.data=logline; - len = encode_il_msg(&buffer, &ll); - } - if(len < 0) { - edg_wll_SetError(ctx, errno, "encode_il_msg()"); - edg_wll_UpdateError(ctx, ENOMEM, "edg_wll_log_proto_client_direct(): error encoding message"); - return -1; - } -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_direct_write: sending message\n"); -#endif - count = 0; - if (( err = edg_wll_gss_write_full(conn, buffer, len, &ctx->p_tmp_timeout, &count, &gss_code)) < 0) { - handle_gss_failures(ctx,err,&gss_code,"edg_wll_gss_write_full()"); - edg_wll_UpdateError(ctx, EDG_WLL_IL_PROTO,"edg_wll_log_direct_write(): error sending message"); - return -1; - } - if (buffer) free(buffer); -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_direct_write: done (remaining timeout %d.%06d sec)\n", - (int) ctx->p_tmp_timeout.tv_sec, (int) ctx->p_tmp_timeout.tv_usec); -#endif - return count; -} - -/** - *---------------------------------------------------------------------- - * read/receive from bkserver - *---------------------------------------------------------------------- - */ -int edg_wll_log_direct_read(edg_wll_Context ctx, edg_wll_GssConnection *con) -{ - char *answer = NULL; - static char et[256]; - int err; - int code, lbproto_code; - int count; - - errno = err = code = count = 0; - - edg_wll_ResetError(ctx); - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_direct_read: reading answer from bkserver\n"); -#endif - if ((err = get_reply_gss(ctx, con, &answer, &lbproto_code, &code)) != 0 ) { - edg_wll_UpdateError(ctx, EDG_WLL_IL_PROTO,"edg_wll_log_proto_client_direct(): error reading answer from L&B direct server"); - if (answer) free(answer); - return -1; - } else { -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_direct_read: read answer \"%d:%d: %s\"\n",lbproto_code,code,answer); -#endif - switch (lbproto_code) { - case LB_OK: break; - case LB_NOMEM: - edg_wll_SetError(ctx, ENOMEM, "edg_wll_log_direct_read(): server out of memory"); - break; - case LB_PROTO: - edg_wll_SetError(ctx, EDG_WLL_IL_PROTO, "edg_wll_log_direct_read(): received protocol error response"); - break; - case LB_DBERR: - snprintf(et, sizeof(et), "edg_wll_log_direct_read: error details from L&B server: %s", answer); - edg_wll_SetError(ctx, code, et); - break; - default: - edg_wll_SetError(ctx, EDG_WLL_IL_PROTO, "edg_wll_log_direct_read(): received unknown protocol response"); - break; - } - } -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_log_direct_read: done (remaining timeout %d.%06d sec)\n", - (int) ctx->p_tmp_timeout.tv_sec, (int) ctx->p_tmp_timeout.tv_usec); -#endif - return 0; -} diff --git a/org.glite.lb.client/src/producer.c b/org.glite.lb.client/src/producer.c deleted file mode 100644 index 1f6e74f..0000000 --- a/org.glite.lb.client/src/producer.c +++ /dev/null @@ -1,1126 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#include "glite/jobid/strmd5.h" -#include "glite/lbu/trio.h" -#include "glite/lb/ulm_parse.h" -#include "glite/lb/context-int.h" - -#include "producer.h" -#include "prod_proto.h" -#include "consumer.h" // for QuerySequenceCode - -#ifdef FAKE_VERSION -int edg_wll_DoLogEvent(edg_wll_Context ctx, edg_wll_LogLine logline); -int edg_wll_DoLogEventServer(edg_wll_Context ctx, int flags, edg_wll_LogLine logline); -#else - -/** - *---------------------------------------------------------------------- - * handle_errors - handle answers from logging functions - *---------------------------------------------------------------------- - */ -static -int handle_errors(edg_wll_Context ctx, int code, const char *text) -{ - static char err[256]; - - switch(code) { - 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: - case EPERM: - 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: - snprintf(err, sizeof(err), "%s: Error code mapped to EINVAL", text); - edg_wll_UpdateError(ctx,EINVAL,err); - break; - case EDG_WLL_IL_PROTO: - case EDG_WLL_IL_SYS: - case EDG_WLL_IL_EVENTS_WAITING: - snprintf(err, sizeof(err), "%s: Error code mapped to EAGAIN", text); - edg_wll_UpdateError(ctx,EAGAIN,err); - break; - default: - snprintf(err, sizeof(err), "%s: Error code mapped to EAGAIN", text); - edg_wll_UpdateError(ctx,EAGAIN,err); - break; - } - - return edg_wll_Error(ctx, NULL, NULL); -} - -/** - *---------------------------------------------------------------------- - * Open a GSS connection to local-logger, send already formatted ULM string - * and get answer back from local-logger - * \brief connect to local-logger, send message and get answer back - * \param[in,out] ctx context to work with, - * \param[in] logline formated ULM string - *---------------------------------------------------------------------- - */ -int edg_wll_DoLogEvent( - edg_wll_Context ctx, - edg_wll_LogLine logline) -{ - int ret = 0, answer = EAGAIN; - int conn = -1; - int attempt = 1; - - edg_wll_ResetError(ctx); - memset(&conn,0,sizeof(conn)); - - do { - /* connect to local-logger */ - if ((ret = edg_wll_log_connect(ctx,&conn))) { - edg_wll_UpdateError(ctx,EDG_WLL_IL_PROTO,"edg_wll_DoLogEvent(): edg_wll_log_connect error"); - goto edg_wll_DoLogEvent_end; - } - - /* send message */ - if ((ret = edg_wll_log_write(ctx,conn,logline)) == -1) { - answer = edg_wll_Error(ctx, NULL, NULL); - edg_wll_UpdateError(ctx,EDG_WLL_IL_PROTO,"edg_wll_DoLogEvent(): edg_wll_log_write error"); - goto edg_wll_DoLogEvent_end; - } - - /* get answer */ - ret = edg_wll_log_read(ctx,conn); - answer = edg_wll_Error(ctx, NULL, NULL); - if (ret == -1) - edg_wll_UpdateError(ctx,EDG_WLL_IL_PROTO,"edg_wll_DoLogEvent(): edg_wll_log_read error"); - - edg_wll_DoLogEvent_end: - if (ret == -1 && conn >= 0) edg_wll_log_close(ctx,conn); - - } while (++attempt <= 2 && (answer == ENOTCONN || answer == EPIPE)); - - return handle_errors(ctx,answer,"edg_wll_DoLogEvent()"); -} - -/** - *---------------------------------------------------------------------- - * Open a pseudo parallel L&B Proxy (UNIX socket) and L&B server (GSS), - * send already formatted ULM string and get answer back - * \brief connect to lbproxy, send message and get answer back - * \param[in,out] ctx context to work with, - * \param[in] flags as defined by EDG_WLL_LOGFLAG_* - * \param[in] logline formated ULM string - *---------------------------------------------------------------------- - */ -int edg_wll_DoLogEventServer( - edg_wll_Context ctx, - int flags, - edg_wll_LogLine logline) -{ - edg_wll_PlainConnection con_lbproxy; - edg_wll_GssConnection con_bkserver; - fd_set fdset; - int count,fd,fd_n; - int answer = EAGAIN, ret = 0; - - edg_wll_ResetError(ctx); - memset(&con_lbproxy, 0, sizeof(con_lbproxy)); - memset(&con_bkserver, 0, sizeof(con_bkserver)); - - FD_ZERO(&fdset); - - /* CONNECT */ - count=0; - if (flags & EDG_WLL_LOGFLAG_PROXY) { - /* connect to lbproxy */ - if ((ret = edg_wll_log_proxy_connect(ctx,&con_lbproxy))) { - edg_wll_UpdateError(ctx,EAGAIN,"edg_wll_DoLogEventServer(): edg_wll_log_proxy_connect error"); - goto edg_wll_DoLogEventServer_end; - } - count++; - } - if (flags & EDG_WLL_LOGFLAG_DIRECT) { - /* connect to bkserver */ - if ((ret = edg_wll_log_direct_connect(ctx,&con_bkserver))) { - edg_wll_UpdateError(ctx,EAGAIN,"edg_wll_DoLogEventServer(): edg_wll_log_direct_connect error"); - goto edg_wll_DoLogEventServer_end; - goto inc_seq_code; - } - count++; - } - - /* SEND MESSAGE */ - if (flags & EDG_WLL_LOGFLAG_PROXY) { - /* send to lbproxy */ - if ((ret = edg_wll_log_proxy_write(ctx,&con_lbproxy,logline)) == -1) { - answer = edg_wll_Error(ctx, NULL, NULL); - edg_wll_UpdateError(ctx,EDG_WLL_IL_PROTO,"edg_wll_DoLogEventServer(): edg_wll_log_proxy_write error"); - goto edg_wll_DoLogEventServer_end; - } - } - if (flags & EDG_WLL_LOGFLAG_DIRECT) { - /* send to bkserver */ - if ((ret = edg_wll_log_direct_write(ctx,&con_bkserver,logline)) == -1) { - answer = edg_wll_Error(ctx, NULL, NULL); - edg_wll_UpdateError(ctx,EAGAIN,"edg_wll_DoLogEventServer(): edg_wll_log_direct_write error"); - goto edg_wll_DoLogEventServer_end; - } - } - - /* READ ANSWER */ - while (count > 0) { - fd_n=0; - if (flags & EDG_WLL_LOGFLAG_DIRECT) { - FD_SET(con_bkserver.sock,&fdset); - if (con_bkserver.sock > fd_n) fd_n = con_bkserver.sock; - } - if (flags & EDG_WLL_LOGFLAG_PROXY) { - FD_SET(con_lbproxy.sock,&fdset); - if (con_lbproxy.sock > fd_n) fd_n = con_lbproxy.sock; - } - fd_n += 1; - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_DoLogEventServer(): calling select (remaining timeout %d.%06d sec)\n", - (int) ctx->p_tmp_timeout.tv_sec, (int) ctx->p_tmp_timeout.tv_usec); -#endif - fd = select(fd_n,&fdset,NULL,NULL,&ctx->p_tmp_timeout); - switch (fd) { - case 0: /* timeout */ - edg_wll_UpdateError(ctx,EAGAIN,"edg_wll_DoLogEventServer(): select() timeouted"); - count = 0; - goto inc_seq_code; - break; - case -1: /* error */ - switch(errno) { - case EINTR: - continue; - default: - edg_wll_UpdateError(ctx,errno,"edg_wll_DoLogEventServer(): select() error"); - goto inc_seq_code; - } - default: - break; - } - /* XXX: read only from an apropriate descriptor - FD_ISSET can't be true unless mathching bit in flags was set - */ - if (FD_ISSET(con_lbproxy.sock,&fdset)) { - /* read answer from lbproxy */ - if ((ret = edg_wll_log_proxy_read(ctx,&con_lbproxy)) == -1) { - edg_wll_UpdateError(ctx,EAGAIN,"edg_wll_DoLogEventServer(): edg_wll_log_proxy_read error"); - goto inc_seq_code; - } - count -= 1; - } - if (FD_ISSET(con_bkserver.sock,&fdset)) { - /* read answer from bkserver */ - if ((ret = edg_wll_log_direct_read(ctx,&con_bkserver)) == -1) { - edg_wll_UpdateError(ctx,EAGAIN,"edg_wll_DoLogEventServer(): edg_wll_log_direct_read error"); - goto inc_seq_code; - } - count -= 1; - } - } - -inc_seq_code: - edg_wll_IncSequenceCode(ctx); /* XXX: should not fail, called second time */ - -edg_wll_DoLogEventServer_end: - edg_wll_log_proxy_close(ctx,&con_lbproxy); - edg_wll_log_direct_close(ctx,&con_bkserver); - - return handle_errors(ctx,answer,"edg_wll_DoLogEventServer()"); - -} - -#endif /* FAKE_VERSION */ - -/** - *---------------------------------------------------------------------- - * Formats a logging message - * \brief formats a logging message - * \param[in,out] ctx context to work with, - * \param[in] flags as defined by EDG_WLL_LOGFLAG_* - * \param[in] event type of the event, - * \param[out] logline formated logging message - * \param[in] fmt printf()-like format string, - * \param[in] ... event specific values/data according to fmt. - *---------------------------------------------------------------------- - */ -static int edg_wll_FormatLogLine( - edg_wll_Context ctx, - int flags, - edg_wll_EventCode event, - edg_wll_LogLine *logline, - char *fmt, ...) -{ - va_list fmt_args; - int priority; - int ret; - char *fix,*var,*dguser; - char *source,*eventName,*lvl,*fullid,*seq; - struct timeval start_time; - char date[ULM_DATE_STRING_LENGTH+1]; - edg_wll_LogLine out; - size_t size; - int i; - - i = errno = size = ret = 0; - seq = fix = var = dguser = out = source = eventName = lvl = fullid = NULL; - priority = flags; - - edg_wll_ResetError(ctx); - - /* 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(ctx,ret = EINVAL,"edg_wll_FormatLogLine(): edg_wll_ULMTimevalToDate() error"); - goto edg_wll_formatlogline_end; - } - source = edg_wll_SourceToString(ctx->p_source); - lvl = edg_wll_LevelToString(ctx->p_level); - eventName = edg_wll_EventToString(event); - if (!eventName) { - edg_wll_SetError(ctx,ret = EINVAL,"edg_wll_FormatLogLine(): event name not specified"); - goto edg_wll_formatlogline_end; - } - if (!(fullid = edg_wlc_JobIdUnparse(ctx->p_jobid))) { - edg_wll_SetError(ctx,ret = EINVAL,"edg_wll_FormatLogLine(): edg_wlc_JobIdUnparse() error"); - goto edg_wll_formatlogline_end; - } - seq = edg_wll_GetSequenceCode(ctx); - - if (trio_asprintf(&fix,EDG_WLL_FORMAT_COMMON, - date,ctx->p_host,lvl,priority, - source,ctx->p_instance ? ctx->p_instance : "", - eventName,fullid,seq) == -1) { - edg_wll_SetError(ctx,ret = ENOMEM,"edg_wll_FormatLogLine(): trio_asprintf() error"); - goto edg_wll_formatlogline_end; - } -/* TODO: merge - add always, probably new ctx->p_user - has this already been agreed? */ - if ( ( (flags & EDG_WLL_LOGFLAG_PROXY) || (flags & EDG_WLL_LOGFLAG_DIRECT) ) && - (ctx->p_user_lbproxy) ) { - if (trio_asprintf(&dguser,EDG_WLL_FORMAT_USER,ctx->p_user_lbproxy) == -1) { - edg_wll_SetError(ctx,ret = ENOMEM,"edg_wll_FormatLogLine(): trio_asprintf() error"); - goto edg_wll_formatlogline_end; - } - } else { - dguser = strdup(""); - } - if (trio_vasprintf(&var,fmt,fmt_args) == -1) { - edg_wll_SetError(ctx,ret = ENOMEM,"edg_wll_FormatLogLine(): trio_vasprintf() error"); - goto edg_wll_formatlogline_end; - } - if (asprintf(&out,"%s%s%s\n",fix,dguser,var) == -1) { - edg_wll_SetError(ctx,ret = ENOMEM,"edg_wll_FormatLogLine(): asprintf() error"); - goto edg_wll_formatlogline_end; - } - size = strlen(out); - - if ((flags & (EDG_WLL_LOGFLAG_DIRECT|EDG_WLL_LOGFLAG_SYNC)) && (size > EDG_WLL_LOG_SYNC_MAXMSGSIZE)) { - edg_wll_SetError(ctx,ret = ENOSPC,"edg_wll_FormatLogLine(): Message size too large for synchronous transfer"); - goto edg_wll_formatlogline_end; - } - -#ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"edg_wll_FormatLogLine (%d chars): %s",size,out); -#endif - if (out) { - *logline = out; - } else { - *logline = NULL; - } - -edg_wll_formatlogline_end: - va_end(fmt_args); - if (seq) free(seq); - if (fix) free(fix); - if (dguser) free(dguser); - if (var) free(var); - if (source) free(source); - if (lvl) free(lvl); - if (eventName) free(eventName); - if (fullid) free(fullid); - - return edg_wll_Error(ctx,NULL,NULL); -} - -/** - *---------------------------------------------------------------------- - * Formats a logging message and sends it to a correct destination - * \brief master logging event function - * \param[in,out] ctx context to work with, - * \param[in] flags logging flags indicating the destination - * EDG_WLL_LOGFLAG_LOCAL - local-logger - * EDG_WLL_LOGFLAG_PROXY - lbproxy - * EDG_WLL_LOGFLAG_DIRECT - bkserver - * \param[in] event type of the event, - * \param[in] fmt printf()-like format string, - * \param[in] fmt_args event specific values/data according to fmt. - *---------------------------------------------------------------------- - */ -static int edg_wll_LogEventMasterVa( - edg_wll_Context ctx, - int flags, - edg_wll_EventCode event, - char *fmt, va_list fmt_args) -{ -// va_list fmt_args; - int ret = 0; - edg_wll_LogLine in = NULL, out = NULL; - - if ((flags & (EDG_WLL_LOGFLAG_LOCAL|EDG_WLL_LOGFLAG_PROXY|EDG_WLL_LOGFLAG_DIRECT)) == 0) { - return edg_wll_SetError(ctx,ret = EINVAL,"edg_wll_LogEventMaster(): no known flag specified"); - } - - /* format the message */ - //va_start(fmt_args,fmt); - - if (trio_vasprintf(&in,fmt,fmt_args) == -1) { - edg_wll_UpdateError(ctx,ret = ENOMEM,"edg_wll_LogEventMaster(): trio_vasprintf() error"); - goto edg_wll_logeventmaster_end; - } - - if (edg_wll_FormatLogLine(ctx,flags,event,&out,"%s",in) != 0 ) { - edg_wll_UpdateError(ctx,ret = EINVAL,"edg_wll_LogEventMaster(): edg_wll_FormatLogLine() error"); - goto edg_wll_logeventmaster_end; - } - -#ifdef EDG_WLL_LOG_STUB -// fprintf(stderr,"edg_wll_LogEventMaster (%d chars): %s",strlen(out),out); -#endif - -#ifndef LB_PERF_DROP - ctx->p_tmp_timeout = (flags & (EDG_WLL_LOGFLAG_DIRECT | EDG_WLL_LOGFLAG_SYNC)) - ? ctx->p_sync_timeout : ctx->p_log_timeout; - - /* send the message and read answer back */ - if (flags & EDG_WLL_LOGFLAG_LOCAL) { - ret = edg_wll_DoLogEvent(ctx, out); - if (ret) goto edg_wll_logeventmaster_end; - } - if (flags & (EDG_WLL_LOGFLAG_PROXY | EDG_WLL_LOGFLAG_DIRECT)) { - ret = edg_wll_DoLogEventServer(ctx, flags, out); - if (ret) goto edg_wll_logeventmaster_end; - } -#endif - -edg_wll_logeventmaster_end: -// va_end(fmt_args); - if (in) free(in); - if (out) free(out); - - if (!ret) if(edg_wll_IncSequenceCode(ctx)) { - edg_wll_SetError(ctx,ret = EINVAL,"edg_wll_LogEventMaster(): edg_wll_IncSequenceCode failed"); - } - - if (ret) edg_wll_UpdateError(ctx,0,"Logging library ERROR: "); - - return edg_wll_Error(ctx,NULL,NULL); -} - -/** - *---------------------------------------------------------------------- - * Formats a logging message and sends it to a correct destination - * \brief master logging event function - * \note simple wrapper around edg_wll_LogEventMasterVa() - * \brief master logging event function - * \param[in,out] ctx context to work with, - * \param[in] flags logging flags indicating the destination - * EDG_WLL_LOGFLAG_LOCAL - local-logger - * EDG_WLL_LOGFLAG_PROXY - lbproxy - * EDG_WLL_LOGFLAG_DIRECT - bkserver - * \param[in] event type of the event, - * \param[in] fmt printf()-like format string, - * \param[in] ... event specific values/data according to fmt. - *---------------------------------------------------------------------- - */ -static int edg_wll_LogEventMaster( - edg_wll_Context ctx, - int flags, - edg_wll_EventCode event, - char *fmt, ...) -{ - int ret; - va_list fmt_args; - va_start(fmt_args,fmt); - ret = edg_wll_LogEventMasterVa(ctx,flags,event,fmt,fmt_args); - va_end(fmt_args); - return ret; -} - -/** - *---------------------------------------------------------------------- - * Formats a logging message and sends it asynchronously to local-logger - * \brief generic asynchronous logging function - *---------------------------------------------------------------------- - */ -int edg_wll_LogEvent( - edg_wll_Context ctx, - edg_wll_EventCode event, - char *fmt, ...) -{ - int ret=0; - va_list fmt_args; - - edg_wll_ResetError(ctx); - - va_start(fmt_args,fmt); - ret=edg_wll_LogEventMasterVa(ctx,EDG_WLL_LOGFLAG_LOCAL, - event,fmt,fmt_args); - if (ret) edg_wll_UpdateError(ctx,0,"edg_wll_LogEvent(): "); - va_end(fmt_args); - - return edg_wll_Error(ctx,NULL,NULL); -} - -/** - *---------------------------------------------------------------------- - * Formats a logging message and sends it synchronously to local-logger - * \brief generic synchronous logging function - * \note simple wrapper around edg_wll_LogEventMaster() - *---------------------------------------------------------------------- - */ -int edg_wll_LogEventSync( - edg_wll_Context ctx, - edg_wll_EventCode event, - char *fmt, ...) -{ - int ret=0; - va_list fmt_args; - - edg_wll_ResetError(ctx); - - va_start(fmt_args,fmt); - ret=edg_wll_LogEventMasterVa(ctx,EDG_WLL_LOGFLAG_LOCAL | EDG_WLL_LOGFLAG_SYNC, - event,fmt,fmt_args); - if (ret) edg_wll_UpdateError(ctx,0,"edg_wll_LogEventSync(): "); - va_end(fmt_args); - - return edg_wll_Error(ctx,NULL,NULL); -} - -/** - *---------------------------------------------------------------------- - * Formats a logging message and sends it synchronously to L&B Proxy - * \brief generic synchronous logging function - * \note simple wrapper around edg_wll_LogEventMaster() - *---------------------------------------------------------------------- - */ -int edg_wll_LogEventProxy( - edg_wll_Context ctx, - edg_wll_EventCode event, - char *fmt, ...) -{ - int ret=0; - va_list fmt_args; - - edg_wll_ResetError(ctx); - - va_start(fmt_args,fmt); - ret=edg_wll_LogEventMasterVa(ctx,EDG_WLL_LOGFLAG_PROXY, - event,fmt,fmt_args); - if (ret) edg_wll_UpdateError(ctx,0,"edg_wll_LogEventProxy(): "); - va_end(fmt_args); - - return edg_wll_Error(ctx,NULL,NULL); -} - -/** - *----------------------------------------------------------------------- - * Instructs interlogger to to deliver all pending events related to current job - * \brief flush events from interlogger - * \note simple wrapper around edg_wll_LogEventMaster() - *----------------------------------------------------------------------- - */ -int edg_wll_LogFlush( - edg_wll_Context ctx, - struct timeval *timeout) -{ - int ret = 0; - edg_wll_LogLine out = NULL; - char *fullid; - char date[ULM_DATE_STRING_LENGTH+1]; - struct timeval start_time; - - fullid = NULL; - - edg_wll_ResetError(ctx); - - gettimeofday(&start_time, 0); - if (edg_wll_ULMTimevalToDate(start_time.tv_sec, start_time.tv_usec, date) != 0) { - edg_wll_SetError(ctx,ret = EINVAL,"edg_wll_LogFlush(): edg_wll_ULMTimevalToDate() error"); - goto edg_wll_logflush_end; - } - if (!(fullid = edg_wlc_JobIdUnparse(ctx->p_jobid))) { - ret = edg_wll_SetError(ctx,EINVAL,"edg_wll_LogFlush(): edg_wlc_JobIdUnparse() error"); - goto edg_wll_logflush_end; - } - - if (trio_asprintf(&out, "DATE=%s HOST=\"%|Us\" PROG=internal LVL=system DG.PRIORITY=1 DG.TYPE=\"command\" DG.COMMAND=\"flush\" DG.TIMEOUT=\"%d\" DG.JOBID=\"%s\"\n", - date, ctx->p_host, (timeout ? timeout->tv_sec : ctx->p_sync_timeout.tv_sec), fullid) == -1) { - edg_wll_SetError(ctx,ret = EINVAL,"edg_wll_LogFlush(): trio_asprintf() error"); - goto edg_wll_logflush_end; - } - - if (timeout) - ctx->p_tmp_timeout = *timeout; - else - ctx->p_tmp_timeout = ctx->p_sync_timeout; - - ret = edg_wll_DoLogEvent(ctx, out); - -edg_wll_logflush_end: - if(out) free(out); - if(fullid) free(fullid); - - if (ret) edg_wll_UpdateError(ctx,0,"edg_wll_LogFlush(): "); - - return edg_wll_Error(ctx,NULL,NULL); -} - -/** - *----------------------------------------------------------------------- - * Instructs interlogger to to deliver all pending events - * \brief flush all events from interlogger - * \note simple wrapper around edg_wll_LogEventMaster() - *----------------------------------------------------------------------- - */ -int edg_wll_LogFlushAll( - edg_wll_Context ctx, - struct timeval *timeout) -{ - int ret = 0; - edg_wll_LogLine out = NULL; - char date[ULM_DATE_STRING_LENGTH+1]; - struct timeval start_time; - - edg_wll_ResetError(ctx); - - gettimeofday(&start_time, 0); - if (edg_wll_ULMTimevalToDate(start_time.tv_sec, start_time.tv_usec, date) != 0) { - edg_wll_SetError(ctx,ret = EINVAL,"edg_wll_LogFlushAll(): edg_wll_ULMTimevalToDate() error"); - goto edg_wll_logflushall_end; - } - - if (trio_asprintf(&out, "DATE=%s HOST=\"%|Us\" PROG=internal LVL=system DG.PRIORITY=1 DG.TYPE=\"command\" DG.COMMAND=\"flush\" DG.TIMEOUT=\"%d\"\n", - date, ctx->p_host, (timeout ? timeout->tv_sec : ctx->p_sync_timeout.tv_sec)) == -1) { - edg_wll_SetError(ctx,ret = ENOMEM,"edg_wll_LogFlushAll(): trio_asprintf() error"); - goto edg_wll_logflushall_end; - } - - if (timeout) - ctx->p_tmp_timeout = *timeout; - else - ctx->p_tmp_timeout = ctx->p_sync_timeout; - - ret = edg_wll_DoLogEvent(ctx, out); - -edg_wll_logflushall_end: - if(out) free(out); - - if (ret) edg_wll_UpdateError(ctx,0,"edg_wll_LogFlushAll(): "); - - return edg_wll_Error(ctx,NULL,NULL); -} - -/** - *----------------------------------------------------------------------- - * Master function for setting a current job for given context. - * \note Should be called before any logging call. - * \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] user user credentials - * \param[in] seq_code_flags flags on code handling (\see API documentation) - * \param[in] logging flags as defined by EDG_WLL_LOGFLAG_* - *----------------------------------------------------------------------- - */ -static int edg_wll_SetLoggingJobMaster( - edg_wll_Context ctx, - glite_jobid_const_t job, - const char *code, - const char *user, - int seq_code_flags, - int logging_flags) -{ - int err; - char *code_loc = NULL; - - edg_wll_ResetError(ctx); - - if (!job) return edg_wll_SetError(ctx,EINVAL,"edg_wll_SetLoggingJobMaster(): jobid is null"); - - edg_wlc_JobIdFree(ctx->p_jobid); - if ((err = edg_wlc_JobIdDup(job,&ctx->p_jobid))) { - edg_wll_SetError(ctx,err,"edg_wll_SetLoggingJobMaster(): edg_wlc_JobIdDup() error"); - goto edg_wll_setloggingjobmaster_end; - } - - /* add user credentials to context */ - if ((logging_flags & EDG_WLL_LOGFLAG_PROXY) && user) { - edg_wll_SetParamString(ctx, EDG_WLL_PARAM_LBPROXY_USER, user); - } else { - edg_wll_GssStatus gss_stat; - edg_wll_GssCred cred = NULL; - - /* acquire gss credentials */ - err = edg_wll_gss_acquire_cred_gsi( - ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_cert_filename, - ctx->p_proxy_filename ? ctx->p_proxy_filename : ctx->p_key_filename, - &cred, &gss_stat); - /* give up if unable to acquire prescribed credentials */ - if (err) { - edg_wll_SetErrorGss(ctx, "failed to load GSI credentials", &gss_stat); - - // XXX: stop here - further changes need to be done in - // edg_wll_gss_connect() to support annonymous connetion - return edg_wll_SetError(ctx, ENOENT, "No credentials found."); - - edg_wll_SetParamString(ctx, EDG_WLL_PARAM_LBPROXY_USER, EDG_WLL_LOG_USER_DEFAULT); - } else { - edg_wll_SetParamString(ctx, EDG_WLL_PARAM_LBPROXY_USER, cred->name); - } - - if (cred != NULL) - edg_wll_gss_release_cred(&cred, NULL); - } - - /* query LBProxyServer for sequence code if not user-suplied */ - /* TODO: merge - check if it is really working properly after the unification of proxy and server */ - if (logging_flags & EDG_WLL_LOGFLAG_PROXY) { - if (!code) { - if (edg_wll_QuerySequenceCodeProxy(ctx, job, &code_loc)) - goto edg_wll_setloggingjobmaster_end; - } - } - - if (!edg_wll_SetSequenceCode(ctx, code ? code : code_loc, seq_code_flags)) { - edg_wll_IncSequenceCode(ctx); - } - -edg_wll_setloggingjobmaster_end: - if (code_loc) free(code_loc); - - return edg_wll_Error(ctx,NULL,NULL); -} - -/** - *----------------------------------------------------------------------- - * Set a current job for given context. - * \note simple wrappers around edg_wll_SetLoggingJobMaster() - *----------------------------------------------------------------------- - */ -int edg_wll_SetLoggingJob( - edg_wll_Context ctx, - glite_jobid_const_t job, - const char *code, - int seq_code_flags) -{ - return edg_wll_SetLoggingJobMaster(ctx,job,code,NULL,seq_code_flags,/* XXX */ 0); -} - -int edg_wll_SetLoggingJobProxy( - edg_wll_Context ctx, - glite_jobid_const_t job, - const char *code, - const char *user, - int seq_code_flags) -{ - return edg_wll_SetLoggingJobMaster(ctx,job,code,user,seq_code_flags,EDG_WLL_LOGFLAG_PROXY); -} - -/** - *----------------------------------------------------------------------- - * Master function for registering a job with L&B service. - * \brief generic job registration - * \param[in,out] context context to work with - * \param[in] flags as defined by EDG_WLL_LOGFLAG_* - * \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[out] subjobs returned subjob id's - * \param[in] wms_dn DN of WMS handling the job - * - *----------------------------------------------------------------------- - */ -static int edg_wll_RegisterJobMaster( - edg_wll_Context ctx, - int flags, - glite_jobid_const_t job, - enum edg_wll_RegJobJobtype type, - const char * jdl, - const char * ns, - glite_jobid_const_t parent, - int num_subjobs, - const char * seed, - edg_wlc_JobId ** subjobs, - char ** wms_dn) -{ - char *seq,*type_s,*parent_s,*wms_dn_s; - int err = 0,i; - struct timeval sync_to; - - seq = type_s = parent_s = wms_dn_s = NULL; - - edg_wll_ResetError(ctx); - memcpy(&sync_to, &ctx->p_sync_timeout, sizeof sync_to); - - if ( ((flags & (EDG_WLL_LOGFLAG_DIRECT | EDG_WLL_LOGFLAG_LOCAL)) == - (EDG_WLL_LOGFLAG_DIRECT | EDG_WLL_LOGFLAG_LOCAL)) || - ((flags & (EDG_WLL_LOGFLAG_PROXY | EDG_WLL_LOGFLAG_LOCAL)) == - (EDG_WLL_LOGFLAG_PROXY | EDG_WLL_LOGFLAG_LOCAL)) - ) { - edg_wll_SetError(ctx,EINVAL,"edg_wll_RegisterJobMaster(): wrong flag specified"); - goto edg_wll_registerjobmaster_end; - } - - type_s = edg_wll_RegJobJobtypeToString(type); - if (!type_s) { - edg_wll_SetError(ctx,EINVAL,"edg_wll_RegisterJobMaster(): no jobtype specified"); - goto edg_wll_registerjobmaster_end; - } - if ((type == EDG_WLL_REGJOB_DAG || - type == EDG_WLL_REGJOB_PARTITIONED || - type == EDG_WLL_REGJOB_COLLECTION) - && num_subjobs > 0) { - err = edg_wll_GenerateSubjobIds(ctx,job,num_subjobs,seed,subjobs); - edg_wll_SetSequenceCode(ctx, NULL, EDG_WLL_SEQ_NORMAL); - /* increase log timeout on client (the same as on BK server) */ - ctx->p_sync_timeout.tv_sec += num_subjobs; - if (ctx->p_sync_timeout.tv_sec > 86400) ctx->p_sync_timeout.tv_sec = 86400; - } - if (err) { - edg_wll_UpdateError(ctx,EINVAL,"edg_wll_RegisterJobMaster(): edg_wll_GenerateSubjobIds() error"); - goto edg_wll_registerjobmaster_end; - } - - parent_s = parent ? edg_wlc_JobIdUnparse(parent) : strdup(""); - if (wms_dn) { - char *aux,*aux2; - aux2 = strdup(""); - for (i=0; wms_dn[i]; i++) { - asprintf(&aux,"%s%s\n",aux2,wms_dn[i]); - free(aux2); aux2 = aux; aux = NULL; - } - wms_dn_s = strdup(aux2); - free(aux2); aux2 = NULL; - } - - if (flags & EDG_WLL_LOGFLAG_PROXY) { - edg_wll_SetSequenceCode(ctx, NULL, EDG_WLL_SEQ_NORMAL); - seq = edg_wll_GetSequenceCode(ctx); - } - err=edg_wll_SetLoggingJobMaster(ctx,job,seq,NULL,EDG_WLL_SEQ_NORMAL,flags); - - if (err != 0) { - edg_wll_UpdateError(ctx,EINVAL,"edg_wll_RegisterJobMaster(): unable to set logging job"); - goto edg_wll_registerjobmaster_end; - - } - - /* send the RegJob event message */ - if ((err = edg_wll_LogEventMaster(ctx,flags, - EDG_WLL_EVENT_REGJOB, EDG_WLL_FORMAT_REGJOB, - (char *)jdl,ns,parent,type_s,num_subjobs,seed,wms_dn_s)) != 0 ) { - edg_wll_UpdateError(ctx,EINVAL,"edg_wll_RegisterJobMaster(): unable to register job"); - goto edg_wll_registerjobmaster_end; - } - -edg_wll_registerjobmaster_end: - memcpy(&ctx->p_sync_timeout, &sync_to, sizeof sync_to); - if (seq) free(seq); - if (type_s) free(type_s); - if (parent_s) free(parent_s); - return edg_wll_Error(ctx,NULL,NULL); -} - -/** - *----------------------------------------------------------------------- - * Register (asynchronously) one job with L&B service - * \note simple wrapper around edg_wll_RegisterJobMaster() - *----------------------------------------------------------------------- - */ -int edg_wll_RegisterJob( - edg_wll_Context ctx, - glite_jobid_const_t job, - enum edg_wll_RegJobJobtype type, - const char * jdl, - const char * ns, - int num_subjobs, - const char * seed, - edg_wlc_JobId ** subjobs) -{ - return edg_wll_RegisterJobMaster(ctx,EDG_WLL_LOGFLAG_DIRECT,job,type,jdl,ns,NULL,num_subjobs,seed,subjobs,NULL); -} - -/** - *----------------------------------------------------------------------- - * Asynchronous job registration with an extra ACL specifying WMS to acces the job - * \note simple wrapper around edg_wll_RegisterJobMaster() - *----------------------------------------------------------------------- - */ -int edg_wll_RegisterJobExt( - edg_wll_Context ctx, - glite_jobid_const_t job, - enum edg_wll_RegJobJobtype type, - const char * jdl, - const char * ns, - int num_subjobs, - const char * seed, - edg_wlc_JobId ** subjobs, - char ** wms_dn, - int logging_flags) -{ - int flags; - flags = logging_flags & EDG_WLL_LOGLFLAG_EXCL; /* the only supported flag */ - flags |= EDG_WLL_LOGFLAG_DIRECT; - - return edg_wll_RegisterJobMaster(ctx,flags,job,type,jdl,ns,NULL,num_subjobs,seed,subjobs,wms_dn); -} - -/** - *----------------------------------------------------------------------- - * Register one job with L&B Proxy service - * \note simple wrapper around edg_wll_RegisterJobProxyMaster() - * this is new (!LB_SERIAL_REG) edg_wll_RegisterJobProxy - *----------------------------------------------------------------------- - */ -int edg_wll_RegisterJobProxy( - edg_wll_Context ctx, - glite_jobid_const_t job, - enum edg_wll_RegJobJobtype type, - const char * jdl, - const char * ns, - int num_subjobs, - const char * seed, - edg_wlc_JobId ** subjobs) -{ - return edg_wll_RegisterJobMaster(ctx,EDG_WLL_LOGFLAG_PROXY | EDG_WLL_LOGFLAG_DIRECT,job,type,jdl,ns,NULL,num_subjobs,seed,subjobs,NULL); -} - -/** - *----------------------------------------------------------------------- - * Proxy job registration with an extra ACL specifying WMS to acces the job - * \note simple wrapper around edg_wll_RegisterJobProxyMaster() - *----------------------------------------------------------------------- - */ -int edg_wll_RegisterJobProxyExt( - edg_wll_Context ctx, - glite_jobid_const_t job, - enum edg_wll_RegJobJobtype type, - const char * jdl, - const char * ns, - int num_subjobs, - const char * seed, - edg_wlc_JobId ** subjobs, - char ** wms_dn, - int logging_flags) -{ - int flags; - flags = logging_flags & EDG_WLL_LOGLFLAG_EXCL; /* the only supported flag */ - flags |= (EDG_WLL_LOGFLAG_PROXY | EDG_WLL_LOGFLAG_DIRECT); - - return edg_wll_RegisterJobMaster(ctx,flags,job,type,jdl,ns,NULL,num_subjobs,seed,subjobs,wms_dn); -} - -#ifdef LB_PERF -/** - *----------------------------------------------------------------------- - * Register one job with L&B Proxy service ONLY - * \note simple wrapper around edg_wll_RegisterJobMaster() - * useful for performace measuring - *----------------------------------------------------------------------- - */ -int edg_wll_RegisterJobProxyOnly( - edg_wll_Context ctx, - glite_jobid_const_t job, - enum edg_wll_RegJobJobtype type, - const char * jdl, - const char * ns, - int num_subjobs, - const char * seed, - edg_wlc_JobId ** subjobs) -{ - return edg_wll_RegisterJobMaster(ctx,EDG_WLL_LOGFLAG_PROXY,job,type,jdl,ns,NULL,num_subjobs,seed,subjobs,NULL); -} - -/** - *----------------------------------------------------------------------- - * Register one job with L&B Proxy service - * \note simple wrapper around edg_wll_RegisterJobMaster() - * this is original edg_wll_RegisterJobProxy, krept only for performance measuring - *----------------------------------------------------------------------- - */ -int edg_wll_RegisterJobProxyOld( - edg_wll_Context ctx, - glite_jobid_const_t job, - enum edg_wll_RegJobJobtype type, - const char * jdl, - const char * ns, - int num_subjobs, - const char * seed, - edg_wlc_JobId ** subjobs) -{ - int ret=0; - - /* first register with bkserver ... */ - ret=edg_wll_RegisterJobMaster(ctx,EDG_WLL_LOGFLAG_DIRECT, - job,type,jdl,ns,NULL,num_subjobs,seed,subjobs,NULL); - if (ret) return ret; - - /* ... and then with L&B Proxy */ - ret=edg_wll_RegisterJobMaster(ctx,EDG_WLL_LOGFLAG_PROXY, - job,type,jdl,ns,NULL,num_subjobs,seed,subjobs,NULL); - - return ret; -} - -#endif - -/** - *----------------------------------------------------------------------- - * Master function for registering batch of subjobs - * \note simple wrapper around edg_wll_RegisterJobMaster() - *----------------------------------------------------------------------- - */ -static int edg_wll_RegisterSubjobsMaster( - edg_wll_Context ctx, - int logging_flags, - glite_jobid_const_t parent, - char const * const * jdls, - const char * ns, - edg_wlc_JobId const * subjobs) -{ - char const * const *pjdl; - edg_wlc_JobId const *psubjob; - edg_wlc_JobId oldctxjob; - char * oldctxseq; - int errcode = 0; - char * errdesc = NULL; - - if (edg_wll_GetLoggingJob(ctx, &oldctxjob)) return edg_wll_Error(ctx, NULL, NULL); - oldctxseq = edg_wll_GetSequenceCode(ctx); - - pjdl = jdls; - psubjob = subjobs; - - while (*pjdl != NULL) { - if (edg_wll_RegisterJobMaster(ctx, logging_flags, - *psubjob, EDG_WLL_REGJOB_SIMPLE, *pjdl, - ns, parent, 0, NULL, NULL, NULL) != 0) { - errcode = edg_wll_Error(ctx, NULL, &errdesc); - goto edg_wll_registersubjobsmaster_end; - } - pjdl++; psubjob++; - } - -edg_wll_registersubjobsmaster_end: - edg_wll_SetLoggingJobMaster(ctx, oldctxjob, oldctxseq, NULL, EDG_WLL_SEQ_NORMAL,logging_flags); - - if (errcode) { - edg_wll_SetError(ctx, errcode, errdesc); - free(errdesc); - } - return edg_wll_Error(ctx, NULL, NULL); -} - -/** - *----------------------------------------------------------------------- - * Register batch of subjobs with L&B service - * \note simple wrapper around edg_wll_RegisterSubjobsMaster() - *----------------------------------------------------------------------- - */ -int edg_wll_RegisterSubjobs( - edg_wll_Context ctx, - glite_jobid_const_t parent, - char const * const * jdls, - const char * ns, - edg_wlc_JobId const * subjobs) -{ - return edg_wll_RegisterSubjobsMaster(ctx,EDG_WLL_LOGFLAG_LOCAL, - parent, jdls, ns, subjobs); -} - -/** - *----------------------------------------------------------------------- - * Register batch of subjobs with L&B Proxy service - * \note simple wrapper around edg_wll_RegisterSubjobsMaster() - *----------------------------------------------------------------------- - */ -int edg_wll_RegisterSubjobsProxy( - edg_wll_Context ctx, - glite_jobid_const_t parent, - char const * const * jdls, - const char * ns, - edg_wlc_JobId const * subjobs) -{ - return edg_wll_RegisterSubjobsMaster(ctx,EDG_WLL_LOGFLAG_PROXY, - parent, jdls, ns, subjobs); - -} - -/** - *----------------------------------------------------------------------- - * Change ACL for given job - *----------------------------------------------------------------------- - */ -int edg_wll_ChangeACL( - edg_wll_Context ctx, - glite_jobid_const_t jobid, - const char *user_id, - enum edg_wll_ChangeACLUser_id_type user_id_type, - enum edg_wll_ChangeACLPermission permission, - enum edg_wll_ChangeACLPermission_type permission_type, - enum edg_wll_ChangeACLOperation operation) -{ - if ( edg_wll_SetLoggingJob(ctx, jobid, NULL, EDG_WLL_SEQ_NORMAL) == 0 ) { - edg_wll_LogEventMaster(ctx, EDG_WLL_LOGFLAG_LOCAL | EDG_WLL_LOGFLAG_SYNC, - EDG_WLL_EVENT_CHANGEACL, EDG_WLL_FORMAT_CHANGEACL, - user_id, user_id_type, permission, permission_type, operation); - } - - return edg_wll_Error(ctx,NULL,NULL); -} diff --git a/org.glite.lb.client/src/register_sandbox.c b/org.glite.lb.client/src/register_sandbox.c deleted file mode 100644 index c674dbe..0000000 --- a/org.glite.lb.client/src/register_sandbox.c +++ /dev/null @@ -1,166 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif -#include - - -#include "glite/jobid/cjobid.h" -#ifdef BUILDING_LB_CLIENT -#include "producer.h" -#else -#include "glite/lb/producer.h" -#endif -#include "glite/lb/events.h" - -static void usage(char *me) -{ - fprintf(stderr,"usage %s: \n" - " -j,--jobid jobid\n" - " -i,--input or -o,--output (mutually exclusive)\n" - " -f,--from URI\n" - " -t,--to URI\n" - " [ -s,--source lb-source ] (default LRMS)\n" - " [ -c,--sequence lb-seqcode ]\n" - ,me); -} - -#define check_log(fun,_jobid,arg) \ - if (fun arg) { \ - char *et,*ed; \ - edg_wll_Error(ctx,&et,&ed); \ - fprintf(stderr,#fun "(%s): %s (%s)\n",_jobid,et,ed); \ - exit(1); \ - } - - -int main(int argc,char **argv) -{ - struct option opts[] = { - { "jobid",1,NULL,'j' }, - { "input",0,NULL,'i' }, - { "output",0,NULL,'o' }, - { "from",1,NULL,'f' }, - { "to",1,NULL,'t' }, - { "source",1,NULL,'s' }, - { "sequence",1,NULL,'c' }, - }; - - char *jobid_s = NULL, *ftjobid_s = NULL, *from = NULL, *to = NULL, *source_s = "LRMS", - *sequence = NULL, *srv, *uniq, type_c = 'x'; - - unsigned int port; - int o; - - glite_jobid_t jobid, ftjobid; - edg_wll_Source source; - - enum edg_wll_SandboxSandbox_type type = - EDG_WLL_SANDBOX_SANDBOX_TYPE_UNDEFINED; - - edg_wll_Context ctx; - - while ((o = getopt_long(argc,argv,"j:iof:t:s:c:",opts,NULL)) != EOF) switch(o) { - case 'j': jobid_s = optarg; break; - case 'i': if (type != EDG_WLL_SANDBOX_SANDBOX_TYPE_UNDEFINED) { usage(argv[0]); exit(1); } - type = EDG_WLL_SANDBOX_INPUT; - break; - case 'o': if (type != EDG_WLL_SANDBOX_SANDBOX_TYPE_UNDEFINED) { usage(argv[0]); exit(1); } - type = EDG_WLL_SANDBOX_OUTPUT; - break; - case 'f': from = optarg; break; - case 't': to = optarg; break; - case 's': source_s = optarg; break; - case 'c': sequence = optarg; break; - default: usage(argv[0]); exit(1); - } - - edg_wll_InitContext(&ctx); - - if (!jobid_s || type == EDG_WLL_SANDBOX_SANDBOX_TYPE_UNDEFINED - || !from || !to) - { - usage(argv[0]); - exit(1); - } - - type_c = type == EDG_WLL_SANDBOX_INPUT ? 'I' : 'O'; - - if (glite_jobid_parse(jobid_s,&jobid)) { - fprintf(stderr,"%s: can't parse\n",jobid_s); - exit(1); - } - - if ((source = edg_wll_StringToSource(source_s)) == EDG_WLL_SOURCE_NONE) { - fprintf(stderr,"%s: invalid source\n",source_s); - exit(1); -} -; - edg_wll_SetParam(ctx, EDG_WLL_PARAM_SOURCE, source); - - glite_jobid_getServerParts(jobid,&srv,&port); - glite_jobid_create(srv,port,&ftjobid); - uniq = glite_jobid_getUnique(ftjobid); - glite_jobid_free(ftjobid); - - asprintf(&ftjobid_s,"https://%s:%d/FT:%s",srv,port,uniq); - assert(glite_jobid_parse(ftjobid_s,&ftjobid) == 0); - - edg_wll_SetLoggingJob(ctx,ftjobid,NULL,EDG_WLL_SEQ_NORMAL); - - check_log(edg_wll_RegisterJob,ftjobid_s,( - ctx, - ftjobid, EDG_WLL_REGJOB_FILE_TRANSFER, - "n/a","n/a", - 0,NULL,NULL)); - - check_log(edg_wll_LogFileTransferRegister,ftjobid_s,(ctx,from,to)); - check_log(edg_wll_LogSandbox,ftjobid_s,( - ctx, - edg_wll_SandboxSandbox_typeToString(type), - NULL, - jobid_s)); - - printf("GLITE_LB_%cSB_JOBID=\"%s\"\nGLITE_LB_%cSB_SEQUENCE=\"%s\"\n", - type_c,ftjobid_s, - type_c,edg_wll_GetSequenceCode(ctx)); - - if (edg_wll_SetLoggingJob(ctx,jobid,sequence,EDG_WLL_SEQ_NORMAL)) { - char *et,*ed; - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"edg_wll_SetLoggingJob(%s,%s): %s (%s)\n", - jobid_s,sequence,et,ed); - exit(1); - } - - check_log(edg_wll_LogSandbox,jobid_s,( - ctx, - edg_wll_SandboxSandbox_typeToString(type), - ftjobid_s, - NULL)); - - printf("GLITE_WMS_SEQUENCE_CODE=\"%s\"\n",edg_wll_GetSequenceCode(ctx)); - - return 0; -} diff --git a/org.glite.lb.client/src/stat_fields.cpp b/org.glite.lb.client/src/stat_fields.cpp deleted file mode 100644 index 05565dd..0000000 --- a/org.glite.lb.client/src/stat_fields.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -//#include - -#include "glite/lb/LoggingExceptions.h" -#include "JobStatus.h" -#include "notification.h" - -#include "stat_fields.h" - -using namespace glite::lb; - -typedef std::pair FieldPair; - -char * glite_lb_parse_stat_fields(const char *arg,void **out) -{ - char *aux = strdup(arg),*p; - std::vector *fields = new std::vector; - - for (p = strtok(aux,","); p; p = strtok(NULL,",")) { - /*special treatment for JDL (and possibly other) two-valued fields with ':' used as a separator */ - if (strncasecmp("jdl:", p, 4)) { - try { fields->push_back(std::make_pair(JobStatus::attrByName(p), "")); } - catch (std::runtime_error &e) { delete fields; return p; }; - } - else { - try { fields->push_back(std::make_pair(JobStatus::attrByName("jdl"), p + 4)); } - catch (std::runtime_error &e) { delete fields; return p; }; - } - } - - *out = (void *) fields; - return NULL; -} - - -static std::string & escape(std::string &s) -{ - for (std::string::iterator p = s.begin(); p < s.end(); p++) switch (*p) { - case '\n': - s.insert(p-s.begin(),"\\"); *(++p) = 'n'; - break; - case '\t': - s.insert(p-s.begin(),"\\"); *(++p) = 't'; - break; - default: break; - } - return s; -} - -typedef std::vector > attrs_t; - -void glite_lb_dump_stat_fields(void) -{ - JobStatus s; - attrs_t a = s.getAttrs(); - for (attrs_t::iterator i=a.begin(); i != a.end(); i++) { - switch (i->second) { - case JobStatus::INT_T: - case JobStatus::STRING_T: - case JobStatus::TIMEVAL_T: - std::cerr << JobStatus::getAttrName(i->first) << ", "; - default: break; - } - } -} - -extern "C" { char * TimeToStr(time_t); } - -void glite_lb_print_stat_fields(void **ff,edg_wll_JobStat *s) -{ - std::vector *fields = (std::vector *) ff; - JobStatus stat(*s,0); - attrs_t attrs = stat.getAttrs(); - attrs_t::iterator a; - std::vector::iterator f; - std::string val; - struct timeval t; - JobStatus::Attr attr; - char *jdl_param = NULL,*jobid_s = NULL; - - std::cout << (jobid_s = glite_jobid_unparse(s->jobId)) << '\t' << stat.name() << '\t'; - free(jobid_s); - - for (f = fields->begin(); f != fields->end(); f++) { - for (a = attrs.begin(); a != attrs.end() && a->first != f->first; a++); - if (a != attrs.end() ) { - attr = (a->first); - switch (a->second) { - case (JobStatus::INT_T): - std::cout << stat.getValInt(attr) << '\t'; - break; - case (JobStatus::STRING_T): - if (attr != JobStatus::JDL) { - val = stat.getValString(attr); - std::cout << (val.empty() ? "(null)" : escape(val)) << '\t'; - } - else { - val = f->second; - if ((jdl_param = edg_wll_JDLField(s, val.c_str()))) { - std::string s_param(jdl_param); - - std::cout << escape(s_param); - free(jdl_param); jdl_param = NULL; - } else - std::cout << "(null)"; - std::cout << '\t'; - } - break; - case (JobStatus::TIMEVAL_T): - t = stat.getValTime(attr); - std::cout << TimeToStr(t.tv_sec) << '\t'; - break; - default: - std::cout << "(unsupported)"; - break; - } - } - } - std::cout << std::endl; -} diff --git a/org.glite.lb.client/src/statistics.c b/org.glite.lb.client/src/statistics.c deleted file mode 100644 index 3eec328..0000000 --- a/org.glite.lb.client/src/statistics.c +++ /dev/null @@ -1,203 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include - -#include "glite/lb/context.h" -#include "glite/lb/context-int.h" -#include "glite/lb/xml_parse.h" -#include "glite/lb/mini_http.h" - -#include "statistics.h" -#include "connection.h" - - - -static const char* const request_headers[] = { - "Cache-Control: no-cache", - "Accept: application/x-dglb", - "User-Agent: edg_wll_Api/" PROTO_VERSION "/" COMP_PROTO, - "Content-Type: application/x-dglb", - NULL -}; - -static int set_server_name_and_port(edg_wll_Context, const edg_wll_QueryRec **); - - - -/** Count the number of jobs which entered the specified state. - */ - -int edg_wll_StateRate( - edg_wll_Context ctx, - const edg_wll_QueryRec *group, - edg_wll_JobStatCode major, - int minor, - time_t *from, - time_t *to, - float *rate, - int *res_from, - int *res_to) - -{ - char *response = NULL, *send_mess = NULL, *message = NULL; - float not_returned; - - - edg_wll_ResetError(ctx); - - edg_wll_StatsRequestToXML(ctx, "Rate", group, major, minor, from, to, &send_mess); - - if (set_server_name_and_port(ctx, NULL)) - goto err; - - ctx->p_tmp_timeout = ctx->p_query_timeout; - - if (edg_wll_http_send_recv(ctx, "POST /statsRequest HTTP/1.1",request_headers, send_mess, - &response,NULL,&message)) - goto err; - - if (http_check_status(ctx,response)) - goto err; - - edg_wll_ParseStatsResult(ctx,message, from, to, rate, - ¬_returned, res_from, res_to); - -err: - free(response); - free(message); - - return edg_wll_Error(ctx,NULL,NULL); -} - - - -/** Compute average time for which jobs stay in the specified state. - */ - -int edg_wll_StateDuration( - edg_wll_Context ctx, - const edg_wll_QueryRec *group, - edg_wll_JobStatCode major, - int minor, - time_t *from, - time_t *to, - float *duration, - int *res_from, - int *res_to) -{ - char *response = NULL, *send_mess = NULL, *message = NULL; - float not_returned; - - - edg_wll_ResetError(ctx); - - edg_wll_StatsRequestToXML(ctx, "Duration", group, major, minor, from, to, &send_mess); - - if (set_server_name_and_port(ctx, NULL)) - goto err; - - ctx->p_tmp_timeout = ctx->p_query_timeout; - - if (edg_wll_http_send_recv(ctx, "POST /statsRequest HTTP/1.1",request_headers, send_mess, - &response,NULL,&message)) - goto err; - - if (http_check_status(ctx,response)) - goto err; - - edg_wll_ParseStatsResult(ctx,message, from, to, ¬_returned, - duration, res_from, res_to); - -err: - free(response); - free(message); - - return edg_wll_Error(ctx,NULL,NULL); -} - - - -static int set_server_name_and_port(edg_wll_Context ctx, const edg_wll_QueryRec **job_conditions) -{ - int i = 0, j, - found = 0, - error = 0; - unsigned int srvPort = 0, - srvPortTmp; - char *srvName = NULL, - *srvNameTmp; - - - if ( job_conditions ) for ( j = 0; job_conditions[j]; j++ ) - for ( i = 0; (job_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - if ( job_conditions[j][i].attr == EDG_WLL_QUERY_ATTR_JOBID) - { - edg_wlc_JobIdGetServerParts(job_conditions[j][i].value.j,&srvNameTmp,&srvPortTmp); - if ( found ) - { - if ( strcmp(srvName, srvNameTmp) || (srvPort != srvPortTmp) ) - { - free(srvNameTmp); free(srvName); - return edg_wll_SetError(ctx, EINVAL, "Two different servers specifieed in one query"); - } - free(srvNameTmp); - } - else - { - srvName = srvNameTmp; - srvPort = srvPortTmp; - found = 1; - } - } - - if ( found && !ctx->p_query_server_override) - { - if (!ctx->srvName) - { - ctx->srvName = strdup(srvName); - ctx->srvPort = srvPort; - free(srvName); - } - else if (strcmp(srvName, ctx->srvName) || (srvPort != ctx->srvPort)) - { - free(ctx->srvName); - ctx->srvName = strdup(srvName); - ctx->srvPort = srvPort; - free(srvName); - } - } - else if ( !ctx->srvName || !ctx->srvPort ) - { - if (!ctx->p_query_server) - return(edg_wll_SetError(ctx, (edg_wll_ErrorCode) EINVAL, "Hostname of server to query is not set")); - else ctx->srvName = strdup(ctx->p_query_server); - if (!ctx->p_query_server_port) - return(edg_wll_SetError(ctx, (edg_wll_ErrorCode) EINVAL, "Port of server to query is not set")); - else ctx->srvPort = ctx->p_query_server_port; - } - - return(error); -} - - diff --git a/org.glite.lb.client/src/uiwrap.T b/org.glite.lb.client/src/uiwrap.T deleted file mode 100644 index c6c85ca..0000000 --- a/org.glite.lb.client/src/uiwrap.T +++ /dev/null @@ -1,157 +0,0 @@ -# this file is common for producer.h and uiwrap.c -# it generates either protoypes (set $PRINTPROTOTYPESONLY to 1) or implementation - -for my $t (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } - $event->getTypes) { - my $tu = uc $t; - my $func = "edg_wll_Log$t"; # name of generated function - my $funcproxy = $func . "Proxy"; - my $funcc = $func . "CODETOREPLACE"; # name of generated CODE function - my $funccproxy = $funcc . "Proxy"; - my $p = "edg_wll_Context context"; # parameters of generated function - my $pc = $p; # parameters of generated CODE function - my $q = "context,EDG_WLL_EVENT_$tu,EDG_WLL_FORMAT_$tu"; # parameters for LogEvent called in generated function - my $qc = $q; # parameters for LogEvent called in generated CODE function - my $text = ""; # whole text for generated function - my $textproxy = ""; # whole text for generated CODE function - my $doc = " * \\param[in,out] context\tcontext to work with, \n"; # parameters description for generated function - my $docc = $doc; # parameters description for generated CODE function - - my $decl = "\tint ret;\n"; - my $free = ""; - - selectType $event $t; - for ($event->getFieldsOrdered) { - my $f = selectField $event $_; - my $fn = $f->getName; - my $sfn = $fn; - my $ft = "const "; - my $fc = $f->getComment; - if ($ULMasString{$f->{type}}) { - $decl .= "\tchar *s_$fn = ".$f->getType()."ToString($fn);\n"; - $free .= "\tif (s_$fn) free(s_$fn);\n"; - $sfn = "s_$fn"; - } - if ($f->{codes}) { -# XXX: obsolete $ft = "enum edg_wll\_$t" . ucfirst $fn; - $ft = $ft . "char *"; - $qc = $qc . ", CODETOREPLACE"; - } else { - $ft = $ft . $f->getType; - $pc = $pc . ", $ft $fn"; - $qc = $qc . ", $sfn"; - $docc = $docc . " * \\param[in] $fn\t$fc\n"; - } - $p = $p . ", $ft $fn"; - $q = $q . ", $sfn"; - $doc = $doc . " * \\param[in] $fn\t$fc\n"; - } - $text = qq{ -/** - * \\brief $func - * - * $func - simple wrapper around edg_wll_LogEvent for event $t - * -}; - $textproxy = qq{ -/** - * \\brief $funcproxy - * - * $funcproxy - simple wrapper around edg_wll_LogEventProxy for event $t - * -}; - if ($PRINTDOC) { - $text = $text . $doc . " * \\see edg_wll_LogEvent()\n"; - $textproxy = $textproxy . $doc . "* \\see edg_wll_LogEventProxy()\n" - } - $text = $text . " */\n"; - $textproxy = $textproxy . " */\n"; - if ($PRINTPROTOTYPESONLY) { - $text = $text . "\nextern int $func($p);\n"; - $textproxy = $textproxy . "\nextern int $funcproxy($p);\n"; - } else { - $text = $text . qq{ -int $func($p) -\{ -$decl - ret = edg_wll_LogEvent($q); -$free - return ret; -\} -}; - $textproxy = $textproxy . qq{ -int $funcproxy($p) -\{ -$decl - ret = edg_wll_LogEventProxy($q); -$free - return ret; -\} -}; - } - gen "$text"; - gen "$textproxy"; - - # - # generate also CODE functions: - # - for ($event->getFieldsOrdered) { - my $f = selectField $event $_; - my $fn = $f->getName; - if ($f->{codes}) { - for (@{$f->{codes}}) { - my $code = uc $_->{name}; - my $funccc = $funcc; $funccc =~ s/CODETOREPLACE/$code/g; - my $funcccproxy = $funccproxy; $funcccproxy =~ s/CODETOREPLACE/$code/g; - my $qcc = $qc; $qcc =~ s/CODETOREPLACE/"$code"/g; - my $textc = qq{ -/** - * \\brief $funccc - * - * $funccc - simple wrapper around edg_wll_LogEvent for event $t, $fn $code - * -}; - my $textcproxy = qq{ -/** - * \\brief $funcccproxy - * - * $funcccproxy - simple wrapper around edg_wll_LogEventProxy for event $t, $fn $code - * -}; - if ($PRINTDOC) { - $textc = $textc . $docc . " * \\see edg_wll_LogEvent()\n"; - $textcproxy = $textcproxy . $docc . " * \\see edg_wll_LogEventProxy()\n"; - } - $textc = $textc . " */\n"; - $textcproxy = $textcproxy . " */\n"; - if ($PRINTPROTOTYPESONLY) { - $textc = $textc . "\nextern int $funccc($pc);\n"; - $textcproxy = $textcproxy . "\nextern int $funcccproxy($pc);\n"; - } else { - $textc = $textc . qq{ -int $funccc($pc) -\{ -$decl - ret = edg_wll_LogEvent($qcc); -$free - return ret; -\} -}; - $textcproxy = $textcproxy . qq{ -int $funcccproxy($pc) -\{ -$decl - ret = edg_wll_LogEventProxy($qcc); -$free - return ret; -\} -}; - } - gen "$textc"; - gen "$textcproxy"; - } # for codes - } # if - } # for getFields -} - -1; diff --git a/org.glite.lb.client/src/uiwrap.c.T b/org.glite.lb.client/src/uiwrap.c.T deleted file mode 100644 index edf9da6..0000000 --- a/org.glite.lb.client/src/uiwrap.c.T +++ /dev/null @@ -1,34 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* -@@@AUTO -*/ -@@@LANG: C - -#include -#include "glite/jobid/cjobid.h" -#include "producer.h" - -@@@{ -$PRINTPROTOTYPESONLY = 0; -$PRINTDOC = 0; - -require '../src/uiwrap.T'; - -@@@} diff --git a/org.glite.lb.client/test/PLOT b/org.glite.lb.client/test/PLOT deleted file mode 100644 index b82683b..0000000 --- a/org.glite.lb.client/test/PLOT +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners/ for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -for i in /tmp/test_ORG /tmp/test_ORG.LB_BUF /tmp/test_ORG.LB_BUF_LB_DAG_EMBRIONIC /tmp/test_ORG.LB_DAG_EMBRIONIC /tmp/test_ORG.LB_BUF_LB_DAG_EMBRIONIC_*[0-9] /tmp/test_ORG.LB_BUF_LB_DAG_EMBRIONIC_10; -#for i in /tmp/test_ORG.LB_BUF_LB_DAG_EMBRIONIC_10; -do - - #cat $i | grep 1000| sed 's/(//'| awk 'BEGIN {a=8002}; // {print a " " $8 " " sqrt(500000/a); a=a+16004}' > $i.plot; - lines=`cat $i | wc -l| sed 's/ //g'` - cat $i | grep 1000| sed 's/(//'| awk -v lines=$lines 'BEGIN {a=500}; // {print a " " $8 " " lines*1000/a; a=a+1000}' > $i.plot; -# cat $i | grep 1000| sed 's/(//'| awk -v lines=$lines 'BEGIN {a=500}; // {print a " " $8 " " 1; a=a+1000}' > $i.plot; - - -cat </tmp/plot.gp -f(x) = a*log(x+b) + c -a=0 -b=1 -c=0 -fit f(x) '$i.plot' using 1:2:3 via a, b, c -print "f(100000) = ", f(100000) -EOF - -a=`gnuplot /tmp/plot.gp 2>&1| awk '/^a.*=.*%/ {print $3}'` -b=`gnuplot /tmp/plot.gp 2>&1| awk '/^b.*=.*%/ {print $3}'` -c=`gnuplot /tmp/plot.gp 2>&1| awk '/^c.*=.*%/ {print $3}'` -f100000=`gnuplot /tmp/plot.gp 2>&1| awk '/^f\(100000\)/ {print $3}'` - - -cat </tmp/plot_final.gp -f(x) = a*log(x+b) + c -a=0 -b=1 -c=0 -fit f(x) "$i.plot" using 1:2:3 via a, b, c -set xlabel "Number of jobs in DB" -set ylabel "Millions of registrations per day" -set title "Megajob challenge performance measurement" -set out "$i.ps" -set terminal postscript landscape "Helvetica" 14 -plot '$i.plot', f(x) title "f(x) = a * log(x+b) + c [a=$a b=$b c=$c] ",\ - f(100000) title "f(100000) = $f100000" -print f(100000) -print f(1000000) -print f(10000000) -EOF - -gnuplot /tmp/plot_final.gp - -done diff --git a/org.glite.lb.client/test/TEST b/org.glite.lb.client/test/TEST deleted file mode 100755 index f948383..0000000 --- a/org.glite.lb.client/test/TEST +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/bash -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners/ for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -TEST_SCRIPT=/home/mulac/src/ORG/org.glite.lb.client/src/perftest_jobreg.sh - -db_clean() { - mysql -u lbserver -e "delete from users;" lbserver20_test - mysql -u lbserver -e "delete from status_tags;" lbserver20_test - mysql -u lbserver -e "delete from states;" lbserver20_test - mysql -u lbserver -e "delete from short_fields;" lbserver20_test - mysql -u lbserver -e "delete from jobs;" lbserver20_test - mysql -u lbserver -e "delete from events;" lbserver20_test - mysql -u lbserver -e "delete from server_state;" lbserver20_test - mysql -u lbserver -e "delete from notif_registrations;" lbserver20_test - mysql -u lbserver -e "delete from notif_jobs;" lbserver20_test - mysql -u lbserver -e "delete from long_fields;" lbserver20_test - mysql -u lbserver -e "delete from acls;" lbserver20_test -} - - -#db_clean; -GLITE_LOCATION=/home/mulac/src/ORG.LB_BUF_LB_DAG_EMBRIONIC/stage -#killall -9 glite-lb-bkserverd -LB_BUF_BYTES=0 -LB_BUF_LINES=10 -$TEST_SCRIPT 1>>/tmp/test_ORG.LB_BUF_LB_DAG_EMBRIONIC_10 2>>/tmp/test_ORG.LB_BUF_LB_DAG_EMBRIONIC_10 - -exit(0); - -db_clean; -GLITE_LOCATION=/home/mulac/src/ORG/stage -#for i in `seq 1 30`; do $TEST_SCRIPT ; done 2>>/tmp/test_ORG 1>>/tmp/test_ORG -killall -9 glite-lb-bkserverd -$TEST_SCRIPT &>/tmp/test_ORG - -db_clean; -GLITE_LOCATION=/home/mulac/src/ORG.LB_BUF/stage -#for i in `seq 1 30`; do $TEST_SCRIPT ; done &>/tmp/test_ORG.LB_BUF -killall -9 glite-lb-bkserverd -$TEST_SCRIPT &>/tmp/test_ORG.LB_BUF - -db_clean; -GLITE_LOCATION=/home/mulac/src/ORG.LB_DAG_EMBRIONIC/stage -#for i in `seq 1 30`; do $TEST_SCRIPT ; done &>/tmp/test_ORG.LB_DAG_EMBRIONIC -killall -9 glite-lb-bkserverd -$TEST_SCRIPT &>/tmp/test_ORG.LB_DAG_EMBRIONIC - -db_clean; -GLITE_LOCATION=/home/mulac/src/ORG.LB_BUF_LB_DAG_EMBRIONIC/stage -#for i in `seq 1 30`; do $TEST_SCRIPT; done &>/tmp/test_ORG.LB_BUF_LB_DAG_EMBRIONIC -unset LB_BUF_BYTES -unset LB_BUF_LINES -killall -9 glite-lb-bkserverd -$TEST_SCRIPT &>/tmp/test_ORG.LB_BUF_LB_DAG_EMBRIONIC - -db_clean; -GLITE_LOCATION=/home/mulac/src/ORG.LB_BUF_LB_DAG_EMBRIONIC/stage -killall -9 glite-lb-bkserverd -LB_BUF_BYTES=0 -LB_BUF_LINES=5 -$TEST_SCRIPT &>/tmp/test_ORG.LB_BUF_LB_DAG_EMBRIONIC_5 - -db_clean; -GLITE_LOCATION=/home/mulac/src/ORG.LB_BUF_LB_DAG_EMBRIONIC/stage -killall -9 glite-lb-bkserverd -LB_BUF_BYTES=0 -LB_BUF_LINES=20 -$TEST_SCRIPT &>/tmp/test_ORG.LB_BUF_LB_DAG_EMBRIONIC_20 - - -db_clean; -GLITE_LOCATION=/home/mulac/src/ORG.LB_BUF_LB_DAG_EMBRIONIC/stage -killall -9 glite-lb-bkserverd -LB_BUF_BYTES=0 -LB_BUF_LINES=100 -$TEST_SCRIPT &>/tmp/test_ORG.LB_BUF_LB_DAG_EMBRIONIC_100 - - -db_clean; -GLITE_LOCATION=/home/mulac/src/ORG.LB_BUF_LB_DAG_EMBRIONIC/stage -killall -9 glite-lb-bkserverd -LB_BUF_BYTES=0 -LB_BUF_LINES=500 -$TEST_SCRIPT &>/tmp/test_ORG.LB_BUF_LB_DAG_EMBRIONIC_500 - - -db_clean; -GLITE_LOCATION=/home/mulac/src/ORG.LB_BUF_LB_DAG_EMBRIONIC/stage -killall -9 glite-lb-bkserverd -LB_BUF_BYTES=0 -LB_BUF_LINES=100 -$TEST_SCRIPT &>/tmp/test_ORG.LB_BUF_LB_DAG_EMBRIONIC_1000 - - -exit 0; - diff --git a/org.glite.lb.client/test/prod_proto_test.c b/org.glite.lb.client/test/prod_proto_test.c deleted file mode 100644 index 2470c76..0000000 --- a/org.glite.lb.client/test/prod_proto_test.c +++ /dev/null @@ -1,53 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#define edg_wll_gss_read_full(a,b,c,d,e,f) test_edg_wll_gss_read_full(a,b,c,d,e,f) -#define edg_wll_gss_write_full(a,b,c,d,e,f) test_edg_wll_gss_write_full(a,b,c,d,e,f) - -#include "glite/lb/prod_proto.h" -#include "glite/lb/producer.h" - -/* virtual read will return all zeroes (answer from logger always without error) */ -int -test_edg_wll_gss_read_full(edg_wll_GssConnection *con, - void *buf, - size_t bufsize, - struct timeval *timeout, - size_t *total, - edg_wll_GssStatus *code) -{ - code->major_status = 0; - code->minor_status = 0; - if (bufsize > 0) memset(buf, 0, bufsize); - return bufsize; -} - -int -test_edg_wll_gss_write_full(edg_wll_GssConnection *con, - const void *buf, - size_t bufsize, - struct timeval *timeout, - size_t *total, - edg_wll_GssStatus *code) -{ - *total = write(*(int *)con, buf, bufsize); - code->major_status = 0; - code->minor_status = *total < 0 ? *total : 0; - return *total < 0 ? *total : 0; -} - -#include "prod_proto.c" diff --git a/org.glite.lb.client/test/producer_test.cpp b/org.glite.lb.client/test/producer_test.cpp deleted file mode 100644 index 8af6786..0000000 --- a/org.glite.lb.client/test/producer_test.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "glite/lb/context-int.h" -#include "glite/lb/log_proto.h" - -extern "C" { -int edg_wll_log_write(edg_wll_Context, int *,char *); -int edg_wll_log_read(edg_wll_Context, int *); -int edg_wll_log_proxy_write(edg_wll_Context, int *,char *); -int edg_wll_log_proxy_read(edg_wll_Context, int *); -int edg_wll_log_direct_write(edg_wll_Context, int *,char *); -int edg_wll_log_direct_read(edg_wll_Context, int *); -} - -class ProducerTest: public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(ProducerTest); - CPPUNIT_TEST(testProtoClient); - CPPUNIT_TEST_SUITE_END(); - -public: - - void setUp() { - pipe(pd); - } - - void tearDown() { - close(pd[0]); - close(pd[1]); - } - - void testProtoClient() { - edg_wll_Context context; - int err; - static char *tst_msg = "DATE=20040831150159.702224 HOST=\"some.host\" PROG=edg-wms LVL=USAGE DG.PRIORITY=0 DG.SOURCE=\"UserInterface\" DG.SRC_INSTANCE=\"\" DG.EVNT=\"RegJob\" DG.JOBID=\"https://some.host:1234/x67qr549qc\" DG.SEQCODE=\"UI=2:NS=0:WM=0:BH=1:JSS=0:LM=0:LRMS=0:APP=0\" DG.REGJOB.JDL=\"\" DG.REGJOB.NS=\"ns address\" DG.REGJOB.PARENT=\"\" DG.REGJOB.JOBTYPE=\"SIMPLE\" DG.REGJOB.NSUBJOBS=\"0\" DG.REGJOB.SEED=\"\""; - int size = strlen(tst_msg)+1+EDG_WLL_LOG_SOCKET_HEADER_LENGTH+sizeof(size); - - err = edg_wll_InitContext(&context); - CPPUNIT_ASSERT(err == 0); - err = edg_wll_log_write(context, &pd[1], tst_msg); - CPPUNIT_ASSERT(err == size); - err = edg_wll_log_read(context, &pd[1]); - CPPUNIT_ASSERT(err == 0); - log_proto_server(pd[0], tst_msg); - edg_wll_FreeContext(context); - } - -private: - int pd[2]; - int sock; - - void log_proto_server(int con, char *logline) { - int i; - char b[5]; - char *buf; - ssize_t size, retsize; - - // read DGLOG - retsize = read(con, b, 5); - CPPUNIT_ASSERT(retsize == 5); - CPPUNIT_ASSERT(b[0] == 'D' && b[1] == 'G' && b[2] == 'L' && b[3] == 'O' && b[4] == 'G'); - - // read size (including '\0', little endian) - for (i = 0; i < 4; i++) - CPPUNIT_ASSERT(read(con, b + i, 1) == 1); - size = 0; - for (i = 0; i < 4; i++) - size = (size << 8) + b[3-i]; - - // read the message - buf = (char *)malloc(size); - retsize = read(con, buf, size); - CPPUNIT_ASSERT(size == retsize); - - CPPUNIT_ASSERT(strcmp(buf, logline) == 0); - free(buf); - } -}; - - -CPPUNIT_TEST_SUITE_REGISTRATION( ProducerTest ); - -int -main (int ac,const char *av[]) -{ - CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); - CppUnit::TextUi::TestRunner runner; - - runner.addTest(suite); - return runner.run() ? 0 : 1; -} diff --git a/org.glite.lb.doc/GGUS19469-reply.txt b/org.glite.lb.doc/GGUS19469-reply.txt deleted file mode 100644 index 4f66272..0000000 --- a/org.glite.lb.doc/GGUS19469-reply.txt +++ /dev/null @@ -1,158 +0,0 @@ -We are really sorry that it took us so long to reply to this GGUS -ticket, we thought that there must be a prize for the longest ticket one day. - -Seriously, we took all the comments and suggestions really -seriously and during the gLite restructuring we made all the required -changes and among others we now have a completely new documentation both -for Logging and Bookkeeping (LB) and Job Provenance (JP). - -We attach our comments inline to your initial review/request: - -> The available 'Logging and Bookkeeping User and Reference Guide' has -> several problems: -> -> General remarks : the link from the general glite doc page -> (http://glite.web.cern.ch/glite/documentation/default.asp) links to -> https://edms.cern.ch/file/571273/1/LB-guide.pdf while EDMS proposes -> https://edms.cern.ch/file/571273/2/LB-guide.pdf However both documents -> seem to be the same (even so says diff on the pdf files). Now the most -> surprising thing is that the proposed document is still a DRAFT dating -> almost 1.5 years now. Isn't that more than enough time to publish a -> final document? - -The LB documentation has been changed completely. It is now -part of the org.glite.lb.doc module and it contains four major -documents: - -- LB User's Guide (LBUG) -- LB Adminstrator's Guide (LBAG) -- LB Developer's Guide (LBDG) -- LB Test Plan (LBTP) - -The official web location for these documents is now -http://egee.cesnet.cz/en/JRA1/LB -and links to these documents were updated hopefully on all the following webs: - -http://glite.web.cern.ch/glite/documentation/default.asp -http://glite.web.cern.ch/glite/packages/R3.1/deployment/glite-LB/glite-LB.asp -http://egee-jra1-wm.mi.infn.it/egee-jra1-wm -https://twiki.cern.ch/twiki/bin/view/EGEE/Glite-LB -https://twiki.cern.ch/twiki/bin/view/EGEE/Egee3Jra1 - -The old LB User's Guide was removed from -https://edms.cern.ch/document/571273/2 - -The JP documentation is going to have a similar structure, it is now kept -in the org.glite.jp.doc module and it will be published soon. - - -> At last, the guide mentions example code (quote from p. 14 : "You can -> found this example in client module, file job_status.c."). I found an -> 'examples' dir in the glite-lb-client package, however it does not -> contain C source code but rather useless executable files!! - -The source code of all the examples is now also included in the -glite-lb-client (RPM) together with a simple Makefile so that users -can make the examples on their machines. - -> I skip the "Introduction" section. -> -> 2/ Quickstart Guide -> 2.1/ Command Line Tools -> quite OK but is missing the (C) type of the values that can be given -> to a user tag: only a string or is an integer value possible? This has -> it's importance in the following. - -LB keeps user tags only as strings, it is left on the -application level to give the values some semantics. It is now -mentioned in LBUG Section 2.3.1. - -> I think the documentation misses a description of the equivalent API. -> At least some part of the code of the CLI interface should be -> available, as in a job this duty is probably better done by the code -> itself than by some external command. - -glite-lb-logevent is now in details described in LBUG, Section -2.3, and the use-case of using this tool to log the user-tag is -described in the LBUG 2.3.1. The logging API is in details described in -LBDG together with the programming examples. - - -> 2.2/ L&B querying API -> General remarks: -> when compiling, of course header files and libraries are required. Why -> not indicate them ? what flavor of libglite_lb_client shall be used ? -> And to have some code querying an edg/lcg LB ? although stuff in this -> API is prefixed by edg_, it's not possible to query an edg/lcg LB with -> this API when linking against glite libs : error msg is 'Operation not -> supported (Protocol versions incompatible)'. I'm glad to know now but -> I would have preferred reading it in the docs. - -All this is now mentioned in LBDG Section 4. - -> Section 2.2.2, -> example 1 ("Job status", p. 13) -> It would be quite interesting to give some details about the -> edg_wll_JobStat data type and more generally about every data type -> used for returning results. Also I do not agree with "The code also -> shows a complete handling of returned errors": although it is claimed -> it uses errno values, errno variable is not used and the return codes -> do not always match the defined errno values. Hence the question : how -> to interpret these return codes, can't some details be given in the -> docs ? - -See LBDG Section 4.3.4 and above mentioned examples. - -> example 2 ("All user's jobs" p. 14) does not work: it misses the -> calling of -> edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER, my_lb_srv); -> edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, srv_port); -> for the soft to know which LB host to query. This is needed in also -> every following example where no explicit jobid is used. If there is a -> general/convenient way to set it through config files or environment -> vars, it is not mentioned. - -Please try the new examples provided. - - -> One more thing about this example : output can be HUGE! Better mention -> it... - -Mentioned :). - -> example "querying user tags", p. 17 -> I haven't managed to get it working and after quite a few tries I'm -> still unable to query user tags I did set myself (proved by the output -> of the 'glite-lb-logevent' command, which also shows that the tag -> could be capitalized by the m/w) from some successfully -> executing/executed job. -> -> Is this code really working ? Could it be a problem linked with the LB -> or VO I'm using (I tried under 'esr' and 'dteam' VOs)? - -Please try the new examples provided. - - -> I had no more chance with example "All jobs marked as red" p. 19 and -> the event query. Is there some available code somewhere that does -> successfully query some user tag? - -Please try the new examples provided. - - -> 3/ The reference -> Hey, is it really supposed to turn out as a reference? For now, it -> looks more like an index, except that an index helps locating -> occurrences. Has the function 'edg_wll_GetServerLimit' (mentioned on -> p. 97) disappeared from the library? No libglite_lb_whatever seems to -> contain it. - -The automatically generated documentation was really unreadable, so we removed -it almost completely from the LBDG. Only a list of header files and important -API functions can be found there. - -> I can provide the full source code I used if requested. - -We would really appreciate if you could look at the documentation now -and tell us if you find it suitable and if all examples are working for -you without problems. diff --git a/org.glite.lb.doc/LICENSE b/org.glite.lb.doc/LICENSE deleted file mode 100644 index 259a91f..0000000 --- a/org.glite.lb.doc/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -Copyright (c) 2004 on behalf of the EU EGEE Project: -The European Organization for Nuclear Research (CERN), -Istituto Nazionale di Fisica Nucleare (INFN), Italy -Datamat Spa, Italy -Centre National de la Recherche Scientifique (CNRS), France -CS Systeme d'Information (CSSI), France -Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden -Universiteit van Amsterdam (UvA), Netherlands -University of Helsinki (UH.HIP), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.lb.doc/Makefile b/org.glite.lb.doc/Makefile deleted file mode 100644 index 497761d..0000000 --- a/org.glite.lb.doc/Makefile +++ /dev/null @@ -1,126 +0,0 @@ -# Default values -top_srcdir=.. -stagedir=. -globalprefix=glite -lbprefix=lb -package=glite-lb-doc -version=0.0.0 -PREFIX=/opt/glite - --include Makefile.inc --include ../project/version.properties - -version=${module.version} - -VPATH = ${top_srcdir}/src -# example source code is part of the org.glite.lb.client -EXAMPLE_SOURCE_DIR=${top_srcdir}/examples -KPATH = TEXINPUTS=".:$(EXAMPLE_SOURCE_DIR):$(VPATH)//:" -KPATHBIB = BIBINPUTS=".:$(VPATH)//:" - -LATEX = $(KPATH) latex -PDFLATEX = $(KPATH) pdflatex -BIBTEX = $(KPATHBIB) bibtex -DVIPS = $(KPATH) dvips -AT3=${stagedir}/sbin/glite-lb-at3 -INSTALL=install - -default all: generate doc - -generate: events.tex status.tex ver.tex - -doc: LBUG.pdf LBAG.pdf LBDG.pdf LBTP.pdf - -# %.dvi: %.tex -# $(LATEX) $< -# $(BIBTEX) `basename $< .tex` -# $(LATEX) $< -# $(LATEX) $< -# -# %.ps: %.dvi -# $(DVIPS) -ta4 -o $@ $< - -%.pdf: %.tex - $(PDFLATEX) $< - $(BIBTEX) `basename $< .tex` - $(PDFLATEX) $< - $(PDFLATEX) $< - -%.tex: %.tex.T - rm -f $@ - ${AT3} $< >$@ || rm -f $@ - chmod -w $@ >/dev/null - -ver.tex: - @echo "\def\version{${version}}" > ver.tex - -stage: doc - $(MAKE) install PREFIX=${stagedir} - -check: - @echo "No test" - -install: - -mkdir -p ${PREFIX}/share/doc/${package}-${version}/examples - $(INSTALL) -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version} - ( cd ${top_srcdir}/project && ${INSTALL} -m 644 ChangeLog package.description package.summary ${PREFIX}/share/doc/${package}-${version} ) - $(INSTALL) -m 644 ${top_srcdir}/src/README ${PREFIX}/share/doc/${package}-${version} - $(INSTALL) -m 644 LBUG.pdf ${PREFIX}/share/doc/${package}-${version} - $(INSTALL) -m 644 LBAG.pdf ${PREFIX}/share/doc/${package}-${version} - $(INSTALL) -m 644 LBDG.pdf ${PREFIX}/share/doc/${package}-${version} -# install DG example sources - for p in ${top_srcdir}/examples/*; do \ - if [ "$$p" == "${top_srcdir}/examples/CVS" ]; then continue; fi; \ - ${INSTALL} -m 644 "$$p" "${PREFIX}/share/doc/${package}-${version}/examples"; \ - done - -clean: - rm -rvf LBUG* LBAG* LBDG* LBTP* events.tex status.tex ver.tex comment* - rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/ - - -# dependencies: - -COMMON:=copyright.tex \ - definitions.tex \ - egee.cls \ - frontmatter.tex \ - lbjp.bib \ - versions.tex \ - ver.tex - -LBUG.pdf: ${COMMON} \ - LBUG.tex \ - LBUG-Abstract.tex \ - LBUG-Introduction.tex components.tex \ - LBUG-Tools.tex logevent.tex notify.tex log_usertag.tex change_acl.tex \ - LBUG-Troubleshooting.tex \ - LBUG-Appendix.tex events.tex status.tex - -LBAG.pdf: ${COMMON} \ - LBAG.tex \ - LBAG-Abstract.tex \ - LBAG-Introduction.tex components.tex \ - LBAG-Installation.tex \ - LBAG-Running.tex \ - LBAG-Troubleshooting.tex - -LBDG.pdf: ${COMMON} \ - LBDG.tex \ - LBDG-Abstract.tex \ - LBDG-Introduction.tex \ - producer_api.tex \ - consumer_api.tex \ - notification_api.tex \ - web_services.tex - -LBTP.pdf: ${COMMON} \ - LBTP.tex \ - LBTP-Abstract.tex \ - LBTP-Introduction.tex \ - LBTP-IntegrationTests.tex \ - LBTP-Tests.tex \ - LBTP-PerfTests.tex \ - LBTP-InterTests.tex - -.PHONY: all clean doc diff --git a/org.glite.lb.doc/configure b/org.glite.lb.doc/configure deleted file mode 100755 index c82ed75..0000000 --- a/org.glite.lb.doc/configure +++ /dev/null @@ -1,843 +0,0 @@ -#!/usr/bin/perl - -# WARNING: Don't edit this file unless it is the master copy in org.glite.lb -# -# For the purpose of standalone builds of lb/jobid/lbjp-common components -# it is copied on tagging - -# $Header$ -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners/ for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use Getopt::Long; - -my $pwd = `pwd`; chomp $pwd; -my $prefix = $pwd.'/stage'; -my $stagedir; -my $staged; -my $module; -my $thrflavour = 'gcc64dbgpthr'; -my $nothrflavour = 'gcc64dbg'; -my $mode = 'build'; -my $help = 0; -my $listmodules; -my $version; -my $branch; -my $output; -my $lb_tag = ''; -my $lbjp_tag = ''; -my $jp_tag = ''; -my $sec_tag = ''; -my $jobid_tag = ''; -my $libdir = getlibdir(); - -my @nodes = qw/client server logger utils client-java doc ws-test db jpprimary jpindex jpclient harvester/; -my %enable_nodes; -my %disable_nodes; - -my %extern_prefix = ( - cares => '/opt/c-ares', - classads => '/opt/classads', - cppunit => '/usr', - expat => '/usr', - globus => '/opt/globus', - gsoap => '/usr', - mysql => '/usr', - 'mysql-devel' => '', - 'mysql-server' => '', - voms => '/opt/glite', - gridsite => '/opt/glite', - lcas => '/opt/glite', - trustmanager => '/opt/glite', - utiljava => '/opt/glite', - ant => '/usr', - jdk => '/usr', - libtar => '/usr', - axis => '/usr', - log4c => '/usr', - postgresql => '/usr' -); - -my %jar = ( - 'commons-codec' => '/usr/share/java/commons-codec.jar', - 'commons-lang' => '/usr/share/java/commons-lang.jar', -); - - -my %glite_prefix; -my %need_externs; -my %need_externs_type; -my %need_jars; -my %extrafull; -my %extranodmod; -my %deps; -my %deps_type; -my %topbuild; - -my %lbmodules = ( - 'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim glite-LB/], - 'security' => [qw/gss gsoap-plugin/], - 'lbjp-common' => [qw/db log maildir server-bones trio jp-interface/], - 'jobid' => [qw/api-c api-cpp api-java/], - 'jp' => [ qw/client doc index primary server-common ws-interface/ ], - ); - - -my @opts = ( - 'prefix=s' => \$prefix, - 'staged=s' => \$staged, - 'module=s' => \$module, - 'thrflavour=s' => \$thrflavour, - 'nothrflavour=s' => \$nothrflavour, - 'mode=s' => \$mode, - 'listmodules=s' => \$listmodules, - 'version=s' => \$version, - 'branch=s' => \$branch, - 'output=s' => \$output, - 'stage=s' => \$stagedir, - 'lb-tag=s' => \$lb_tag, - 'lbjp-common-tag=s' => \$lbjp_tag, - 'jp-tag=s' => \$jp_tag, - 'security-tag=s' => \$sec_tag, - 'jobid-tag=s' => \$jobid_tag, - 'help' => \$help, - 'libdir=s' => \$libdir, -); - -for (@nodes) { - $enable_nodes{$_} = 0; - $disable_nodes{$_} = 0; - - push @opts,"disable-$_",\$disable_nodes{$_}; - push @opts,"enable-$_",\$enable_nodes{$_}; -} - -push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix; -push @opts,"with-$_=s",\$jar{$_} for keys %jar; - -my @keeparg = @ARGV; - -GetOptions @opts or die "Errors parsing command line\n"; - -$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq ''; -$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq ''; - -if ($help) { usage(); exit 0; } - -if ($listmodules) { - my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}}; - print "@m\n"; - exit 0; -} - -warn "$0: --version, --branch and --output make sense only in --mode=etics\n" - if ($version || $output || $branch) && $mode ne 'etics'; - -my $en; -for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; } - -my $dis; -for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; } - -die "--enable-* and --disable-* are mutually exclusive\n" - if $en && $dis; - -die "--module cannot be used with --enable-* or --disable-*\n" - if $module && ($en || $dis); - -die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}}; - -if ($dis) { - for (@nodes) { - $enable_nodes{$_} = 1 unless $disable_nodes{$_}; - } -} - -if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ; - -for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; } - -$stagedir = $prefix unless $stagedir; - -if ($mode eq 'build') { - print "Writing config.status\n"; - open CONF,">config.status" or die "config.status: $!\n"; - print CONF "$0 @keeparg\n"; - close CONF; -} - - -my @modules; -my %aux; - -if ($module) { -# push @modules,split(/[,.]+/,$module); - push @modules,$module; -} -else { - @modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes)); - - my $n; - - do { - local $"="\n"; - $n = $#modules; - push @modules,(map @{$deps{$_}},@modules); - - undef %aux; @aux{@modules} = (1) x ($#modules+1); - @modules = keys %aux; - } while ($#modules > $n); -} - -@aux{@modules} = (1) x ($#modules+1); -delete $aux{$_} for (split /,/,$staged); -@modules = keys %aux; - -mode_build() if $mode eq 'build'; -mode_checkout() if $mode eq 'checkout'; -mode_etics($module) if $mode eq 'etics'; - -sub mode_build { - print "\nBuilding modules: @modules\n"; - - my @ext = map @{$need_externs{$_}},@modules; - my @myjars = map @{$need_jars{$_}},@modules; - undef %aux; @aux{@ext} = 1; - @ext = keys %aux; - undef %aux; @aux{@myjars} = (1) x ($#myjars+1); - @myjars = keys %aux; - - print "\nRequired externals:\n"; - print "\t$_: $extern_prefix{$_}\n" for @ext; - print "\t$_: $jar{$_}\n" for @myjars; - print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n"; - - mkinc($_) for @modules; - - print "Creating Makefile\n"; - - open MAK,">Makefile" or die "Makefile: $!\n"; - - print MAK "all: @modules\n\nclean:\n"; - - for (@modules) { - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - print MAK "\tcd $full$build && \${MAKE} clean\n" - } - - print MAK "\ndistclean:\n"; - - for (@modules) { - my $full = full($_); - print MAK $topbuild{$_} ? - "\tcd $full$build && \${MAKE} distclean\n" : - "\trm -rf $full$build\n" - } - - print MAK "\n"; - - for (@modules) { - my %ldeps; undef %ldeps; - @ldeps{@{$deps{$_}}} = 1; - for my $x (split /,/,$staged) { delete $ldeps{$x}; } - my @dnames = $module ? () : keys %ldeps; - - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - - print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n"; - } - - close MAK; -} - -sub mode_checkout() { - for (@modules) { - my $module = $_; - my $tag = ""; - if ($lb_tag){ - for (@{$lbmodules{lb}}){ - if ("lb.".$_ eq $module){ - $tag = '-r '.$lb_tag; - } - } - } - if ($lbjp_tag){ - for (@{$lbmodules{'lbjp-common'}}){ - if ("lbjp-common.".$_ eq $module){ - $tag = '-r '.$lbjp_tag; - } - } - } - if ($jp_tag){ - for (@{$lbmodules{'jp'}}){ - if ("jp.".$_ eq $module){ - $tag = '-r '.$jp_tag; - } - } - } - if ($sec_tag){ - for (@{$lbmodules{security}}){ - if ("security.".$_ eq $module){ - $tag = '-r '.$sec_tag; - } - } - } - if ($jobid_tag){ - for (@{$lbmodules{jobid}}){ - if ("jobid.".$_ eq $module){ - $tag = '-r '.$jobid_tag; - } - } - } - #if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){ - # print "found"; - #} - $_ = full($_); - print "\n*** Checking out $_\n"; - system("cvs checkout $tag $_") == 0 or die "cvs checkout $tag $_: $?\n"; - } -} - -BEGIN{ -%need_externs_aux = ( - 'lb.client' => [ qw/cppunit:B classads/ ], - 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava/ ], - 'lb.common' => [ qw/expat cares:B cppunit:B classads/ ], - 'lb.doc' => [], - 'lb.logger' => [ qw/cppunit:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ], - 'lb.state-machine' => [ qw/classads/ ], - 'lb.utils' => [ qw/cppunit:B/ ], - 'lb.ws-interface' => [], - 'lb.ws-test' => [ qw/gsoap:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw// ], - 'lb.yaim' => [ qw/yaim_core:R/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], - 'lbjp-common.db' => [ qw/mysql:B mysql-devel:B postgresql:B cppunit:B log4c:B/ ], - 'lbjp-common.log' => [ qw/log4c/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw// ], - 'lbjp-common.trio' => [ qw/cppunit:B/ ], - 'lbjp-common.jp-interface' => [ qw/cppunit:B log4c:B/ ], - 'security.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B/ ], - 'security.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap:B/ ], - 'jobid.api-c' => [ qw/cppunit:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], - 'jobid.api-java' => [ qw/ant:B jdk:B/ ], - 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], - 'jp.doc' => [], - 'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ], - 'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ], - 'jp.server-common' => [], - 'jp.ws-interface' => [], -); - -for my $ext (keys %need_externs_aux) { - for (@{$need_externs_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$need_externs{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $need_externs_type{$ext}->{$1} = $type; - } -} - -%need_jars = ( - 'jobid.api-java' => [ qw/commons-codec/ ], - 'lb.client-java' => [ qw/commons-lang/ ], -); - -for my $jar (keys %need_jars) { - for (@{$need_jars{$jar}}) { - $need_externs_type{$jar}->{$_} = 'BR'; # XXX - } -} - -%deps_aux = ( - 'lb.client' => [ qw/ - lb.types:B lb.common - lbjp-common.trio - jobid.api-cpp:B jobid.api-c - security.gss - / ], - 'lb.client-java' => [ qw/ - lb.types:B - lb.ws-interface:B - jobid.api-java - / ], - 'lb.common' => [ qw/ - jobid.api-cpp:B jobid.api-c - lb.types:B lbjp-common.trio security.gss - / ], - 'lb.doc' => [ qw/lb.types:B/ ], - 'lb.logger' => [ qw/ - lbjp-common.trio - lbjp-common.log - jobid.api-c - lb.common - security.gss - / ], - 'lb.server' => [ qw/ - lb.ws-interface lb.types:B lb.common lb.state-machine - lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log - jobid.api-c - security.gsoap-plugin security.gss - / ], - 'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ], - 'lb.utils' => [ qw/ - lbjp-common.jp-interface - jobid.api-c - lbjp-common.trio lbjp-common.maildir - lb.client lb.state-machine - / ], - 'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ], - 'lb.ws-interface' => [ qw/lb.types:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw/ - jobid.api-c lbjp-common.trio lbjp-common.db lb.common lb.client - security.gss lbjp-common.log - / ], - 'lb.yaim' => [ qw// ], - 'lb.glite-LB' => [ qw/ - lb.logger:R lb.server:R lb.utils:R lb.doc:R - lb.ws-test:R lb.harvester:R lb.yaim:R lb.client-java:R - / ], - 'lbjp-common.db' => [ qw/lbjp-common.trio lbjp-common.log/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw/lbjp-common.log/ ], - 'lbjp-common.trio' => [ qw// ], - 'security.gss' => [ qw// ], - 'security.gsoap-plugin' => [ qw/security.gss/ ], - 'jobid.api-c' => [ qw// ], - 'jobid.api-cpp' => [ qw/jobid.api-c/ ], - 'jobid.api-java' => [ qw// ], - - 'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ], - - 'jp.client' => [ qw/ - jp.ws-interface - lbjp-common.jp-interface lbjp-common.maildir - jobid.api-c - security.gsoap-plugin - / ], - 'jp.doc' => [ qw// ], - 'jp.index' => [ qw/ - jp.server-common jp.ws-interface - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.primary' => [ qw/ - jobid.api-c - jp.server-common jp.ws-interface - lb.state-machine - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.server-common' => [ qw/ - lbjp-common.jp-interface lbjp-common.db - / ], - 'jp.ws-interface' => [ qw// ], -); - -for my $ext (keys %deps_aux) { - for (@{$deps_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$deps{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $deps_type{$ext}->{$1} = $type; - } -} - - -%extrafull = ( gridsite=>'org.gridsite.core'); - -#( java => 'client-java' ); -%extranodmod = ( - db => 'lbjp-common.db', - jpprimary => 'jp.primary', - jpindex => 'jp.index', - jpclient => 'jp.client', -); - -%obsoletes = ( - 'lb.yaim' => [ qq/glite-yaim-lb/ ], -); - -my @t = qw/lb.client-java jobid.api-java lb.types/; -@topbuild{@t} = (1) x ($#t+1); -} - -sub full -{ - my $short = shift; - return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short; -} - -sub mkinc -{ - my %aux; - undef %aux; - my @m=qw/ -lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB -security.gss security.gsoap-plugin -jobid.api-c jobid.api-cpp jobid.api-java -lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface -jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface -/; - @aux{@m} = (1) x ($#m+1); - - my $short = shift; - my $full = full $short; - - unless ($aux{$short}) { - print "Makefile.inc not needed in $full\n"; - return; - } - - my $build = ''; - - unless ($topbuild{$_}) { - $build = '/build'; - unless (-d "$full/build") { - mkdir "$full/build" or die "mkdir $full/build: $!\n"; - } - unlink "$full/build/Makefile"; - symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n"; - } - - open MKINC,">$full$build/Makefile.inc" - or die "$full$build/Makefile.inc: $!\n"; - - print "Creating $full$build/Makefile.inc\n"; - - print MKINC qq{ -PREFIX = $prefix -stagedir = $stagedir -thrflavour = $thrflavour -nothrflavour = $nothrflavour -libdir = $libdir -}; - - for (@{$need_externs{$short}}) { - print MKINC "${_}_prefix = $extern_prefix{$_}\n" - } - - for (@{$need_jars{$short}}) { - print MKINC "${_}_jar = $jar{$_}\n" - } - - my $need_gsoap = 0; - for (@{$need_externs{$short}}) { $need_gsoap = 1 if $_ eq 'gsoap'; } - - print MKINC "gsoap_default_version=".gsoap_version()."\n" if $need_gsoap; - - close MKINC; -} - -my %etics_externs; -my %etics_projects; -BEGIN{ - %etics_externs = ( - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - gridsite=>'org.gridsite.shared', - lcas=>'org.glite.security.lcas', - trustmanager=>'org.glite.security.trustmanager', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - yaim_core=>'org.glite.yaim.core', - ); - %etics_projects = ( - vdt=>[qw/globus globus_essentials/], - 'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/], - ); -}; - -sub mode_etics { - $fmod = shift; - - die "$0: --module required with --etics\n" unless $fmod; - - my ($subsys,$module) = split /\./,$fmod; - - my ($major,$minor,$rev,$age); - - if ($version) { - $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/; - ($major,$minor,$rev,$age) = ($1,$2,$3,$4); - } - else { - open V,"org.glite.$subsys.$module/project/version.properties" - or die "org.glite.$subsys.$module/project/version.properties: $!\n"; - - while ($_ = ) { - chomp; - ($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/; - $age = $1 if /module\.age\s*=\s*([[:digit:]]+)/; - } - close V; - } - - my @copts = (); - my %ge; - @ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1); - - for (@{$need_externs{"$subsys.$module"}}) { - if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; - } - } - - for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - push @copts,"--with-$_ \${$eext.location}/$_*.jar"; - } - - my $conf; - my $conftag; - - if ($branch) { - $conf = "glite-${subsys}-${module}_$branch"; - $conftag = $branch; - $dwpath = ""; } - else { - $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - $conftag = $conf; - $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n"; } -# my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - my $file = $output ? $output : "$conf.ini"; - open C,">$file" or die "$file: $!\n"; - - my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build"; - - my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..'; - - my $package_description = ""; - my $package_summary = ""; - - if (-e "org.glite.$subsys.$module/project/package.description") { - open V, "org.glite.$subsys.$module/project/package.description"; - $package_description = join ("", ); - close V; - chomp $package_description; - $package_description =~ s/\n/\\n/g; - $package_description = "package.description = $package_description"; - } - else { - print STDERR "package.description not found for $subsys.$module!\n"; } - - if (-e "org.glite.$subsys.$module/project/package.summary") { - open V, "org.glite.$subsys.$module/project/package.summary"; - $package_summary = join ("", ); - close V; - chomp $package_summary; - $package_summary =~ s/\n/\\n/g; - $package_summary = "package.summary = $package_summary"; - } - else { - print STDERR "package.summary not found for $subsys.$module!\n"; } - - - print STDERR "Writing $file\n"; - print C qq{ -[Configuration-$conf] -profile = None -moduleName = org.glite.$subsys.$module -displayName = $conf -description = org.glite.$subsys.$module -projectName = org.glite -age = $age -deploymentType = None -tag = $conftag -version = $major.$minor.$rev -$dwpath -[Platform-default:VcsCommand] -displayName = None -description = None -tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName} -branch = None -commit = None -checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName} - -[Platform-default:BuildCommand] -postpublish = None -packaging = None -displayName = None -description = None -doc = None -prepublish = None -publish = None -compile = make -init = None -install = make install -clean = make clean -test = make check -configure = cd $confdir && /usr/bin/perl \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts -checkstyle = None - -[Platform-default:Property] -$buildroot -$package_description -$package_summary -}; - for (@{$obsoletes{"$subsys.$module"}}) { - print C "package.obsoletes = $_\n"; - print C "package.replaces = $_\n"; - } - - print C qq{ -[Platform-default:DynamicDependency] -}; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; - } - } - - my $type = $need_externs_type{"$subsys.$module"}->{$_}; - print C "$proj|$eext = $type\n"; - } - - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "org.glite|org.glite.$_ = $type\n"; - } - - close C; -} - -sub gsoap_version { - local $_; - my $gsoap_version; - open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n"; - - while ($_ = ) { - chomp; - - $gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/; - } - close S; - return $gsoap_version; -} - -sub getlibdir { - if ( -e "/etc/debian_version") { # We are on Debian - $lib64="lib"; - $lib32="lib32"; } - else { # Another distribution - $lib64="lib64"; - $lib32="lib"; } - $libdir=$lib32; - - open INP, "uname -s | "; # Check kernel name - $kname= ; - chomp($kname); - close INP; - - if ( $kname == "Linux") { - $arch = ("x86_64\npowerpc\nppc64\n"); - - open INP, "uname -p | "; # Check processor type - $procname= ; - chomp($procname); - close INP; - - if ($arch =~/^$procname\n/) { - return ($lib64); } - - open INP, "uname -m | "; # Check machine hardware - $machname= ; - chomp($machname); - close INP; - - if ($arch =~/^$machname\n/) { - return ($lib64); } - - # special cases (hyperlink lib64, Debian) - if (-l "/usr/lib64") { - $libdir=$lib32; } - - # if /usr/lib64 doesn't exist at all (AIX) - unless ( -e "/usr/lib64" ) { - $libdir=$lib32; } - } - - if ( $kname == "SunOS") { - if (-e "/usr/lib/64") { - $libdir="lib/64"; } - } - - return $libdir; -} - -sub usage { - my @ext = keys %extern_prefix; - my @myjars, keys %jar; - - print STDERR qq{ -usage: $0 options - -General options (defaults in []): - --prefix=PREFIX destination directory [./stage] - --staged=module,module,... what is already in PREFIX (specify without org.glite.) - --thrflavour=flavour - --nothrflavour=flavour threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg] - --listmodules=subsys list modules of a subsystem - --libdir=libdir typically [lib,lib64] postfix - -Mode of operation: - --mode={checkout|build|etics} what to do [build] - -What to build: - --module=module build this module only (mostly in-Etics operation) - --enable-NODE build this "node" (set of modules) only. Available nodes are - @{$lbmodules{lb}},@{$lbmodules{security}} - --disable-NODE don't build this node - --lb-tag=tag checkout LB modules with specific tag - --jp-tag=tag checkout JP modules with specific tag - --lbjp-common-tag=tag checkout lbjp-common modules with specific tag - --security-tag=tag checkout security modules with specific tag - --jobid-tag=tag checkout jobid modules with specific tag - -Dependencies: - --with-EXTERNAL=PATH where to look for an external. Required externals - (not all for all modules) are: - @ext - --with-JAR=JAR where to look for jars. Required jars are: - @myjars - Summary of what will be used is always printed - -}; - -} diff --git a/org.glite.lb.doc/examples/Makefile b/org.glite.lb.doc/examples/Makefile deleted file mode 100644 index fc99f0a..0000000 --- a/org.glite.lb.doc/examples/Makefile +++ /dev/null @@ -1,82 +0,0 @@ -glite_location:=${GLITE_LOCATION} -glite_prefix:=${glite_location} - -host_cpu:=${shell uname -m} -ifeq (${host_cpu},x86_64) - LDFLAGS:=-L${glite_prefix}/lib64 -L${glite_prefix}/lib - nothrflavour=gcc64dbg - thrflavour=gcc64dbgpthr -else - LDFLAGS:=-L${glite_prefix}/lib - nothrflavour=gcc32dbg - thrflavour=gcc32dbgpthr -endif - -CC:=gcc -CXX:=g++ - -COMMON_LIB:=-lglite_lb_common_${nothrflavour} -COMMON_LIB_THR:=-lglite_lb_common_${thrflavour} -CLIENT_LIB:=-lglite_lb_client_${nothrflavour} -CLIENT_LIB_THR:=-lglite_lb_client_${thrflavour} -JOBID_LIB:=-lglite_jobid - -LIB:=${COMMON_LIB} ${CLIENT_LIB} ${JOBID_LIB} -LIB_THR:=${COMMON_LIB_THR} ${CLIENT_LIB_THR} ${JOBID_LIB} -PLUSLIB:= -PLUSLIB_THR:= - -CFLAGS:=${DEBUG} \ - -I${glite_prefix}/include \ - -D_GNU_SOURCE - -CXXFLAGS:=${CFLAGS} - -COMPILE:=libtool --mode=compile ${CC} ${CFLAGS} -CXXCOMPILE:=libtool --mode=compile ${CXX} ${CXXFLAGS} -LINK:=libtool --mode=link ${CC} ${LDFLAGS} -LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS} -INSTALL:=libtool --mode=install install - -EXAMPLES_SRC:=example1.c prod_example1.c cons_example1.c cons_example2.c cons_example3.c notif_example.c -EXAMPLES:=${EXAMPLES_SRC:.c=} - -EXTRA_SRC:=util.c -EXTRA_OBJ:=${EXTRA_SRC:.c=.o} - -# TODO: migrate them here from branch_RC31_3 -# EXAMPLES_PLUS_SRC:= -# EXAMPLES_PLUS:=${EXAMPLES_PLUS_SRC:.cpp=} -# EXAMPLES_PLUS_THR_SRC:= -# EXAMPLES_PLUS_THR:=${EXAMPLES_PLUS_THR_SRC:.cpp=} - -EXAMPLES_THR_SRC:= -EXAMPLES_THR:=${EXAMPLES_CL_THR_SRC:.c=} - -default all: examples - -examples: ${EXAMPLES} ${EXAMPLES_THR} ${EXAMPLES_PLUS} ${EXAMPLES_PLUS_THR} - -${EXAMPLES}: %: %.o ${EXTRA_OBJ} - ${LINK} -o $@ $< ${EXTRA_OBJ} ${LIB} - -${EXAMPLES_THR}: %: %.o - ${LINK} -o $@ $< ${LIB_THR} - -${EXAMPLES_PLUS}: %: %.o - ${LINKXX} -o $@ $< ${PLUSLIB} - -${EXAMPLES_PLUS_THR}: %: %.o - ${LINKXX} -o $@ $< ${PLUSLIB_THR} - -# catches $TOOLS and logevent compilation -%.o: %.c - ${CC} ${CFLAGS} -c $< - -%.o: %.cpp - ${CXX} ${CXXFLAGS} -c $< - -clean: - rm -rvf ${EXAMPLES} ${EXAMPLES_CL} ${EXAMPLES_CL_THR} - rm -rvf *.o .libs/ - diff --git a/org.glite.lb.doc/examples/README b/org.glite.lb.doc/examples/README deleted file mode 100644 index 94e640a..0000000 --- a/org.glite.lb.doc/examples/README +++ /dev/null @@ -1,19 +0,0 @@ - -This directory contains source code of examples from LB Developer's Guide -To build these examples, set the GLITE_LOCATION variable and run make. - -Consumer examples: - -cons_example1 -------------- -Retrieves a list of jobs based on state and destination. - -cons_example2 -------------- -Retrieves a list of jobs based on state and ORed destination conditions. - - -cons_example3 -------------- -Retrieves a list of jobs based on ORed user tag conditions. - diff --git a/org.glite.lb.doc/examples/README.queries b/org.glite.lb.doc/examples/README.queries deleted file mode 100644 index 214063f..0000000 --- a/org.glite.lb.doc/examples/README.queries +++ /dev/null @@ -1,511 +0,0 @@ -In this file, you can find several examples how to set the query conditions. - -All user's jobs: ----------------- - - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[2]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); - ... - - -All user's jobs that are curently running: ------------------------------------------- - - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[3]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[1].op = EDG_WLL_QUERY_OP_EQUAL; - jc[1].value.i = EDG_WLL_JOB_RUNNING; - jc[2].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); - ... - - -All user's jobs running at CE XYZ: ----------------------------------- - - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[4]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[1].op = EDG_WLL_QUERY_OP_EQUAL; - jc[1].value.i = EDG_WLL_JOB_RUNNING; - jc[2].attr = EDG_WLL_QUERY_ATTR_DESTINATION; - jc[2].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2].value.c = "XYZ"; - jc[3].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); - ... - - -All user's jobs that have returned an exit code from 2 to 7: ------------------------------------------------------------- - - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[4]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[1].op = EDG_WLL_QUERY_OP_EQUAL; - jc[1].value.i = EDG_WLL_JOB_DONE; - jc[2].attr = EDG_WLL_QUERY_ATTR_EXITCODE; - jc[2].op = EDG_WLL_QUERY_OP_WITHIN; - jc[2].value.i = 2; - jc[2].value2.i = 7; - jc[3].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); - ... - - -All user's jobs running at CE XXX or YYY: ------------------------------------------ - - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec *jc[4]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0] = (edg_wll_QueryRec *) malloc(2*sizeof(edg_wll_QueryRec)); - jc[0][0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0][0].value.c = NULL; - jc[0][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - jc[1] = (edg_wll_QueryRec *) malloc(2*sizeof(edg_wll_QueryRec)); - jc[1][0].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[1][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[1][0].value.i = EDG_WLL_JOB_RUNNING; - jc[1][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - jc[2] = (edg_wll_QueryRec *) malloc(3*sizeof(edg_wll_QueryRec)); - jc[2][0].attr = EDG_WLL_QUERY_ATTR_DESTINATION; - jc[2][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2][0].value.c = "XXX"; - jc[2][1].attr = EDG_WLL_QUERY_ATTR_DESTINATION; - jc[2][1].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2][1].value.c = "YYY"; - jc[2][2].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - jc[3] = NULL; - edg_wll_QueryJobsExt(ctx, (const edg_wll_QueryRec **)jc, 0, &jobsOut, &statesOut); - free(jc[0]); free(jc[1]); free(jc[2]); - ... - - -All user's jobs marked with the user tag 'color' and with its value 'red': --------------------------------------------------------------------------- - - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[2]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].attr_id.tag = "color"; - jc[0].value.c = "red"; - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); - ... - - -All user's jobs marked with the user tag 'color' and with its value 'red' or 'green': -------------------------------------------------------------------------------------- - - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[1][3]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0][0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0][0].attr_id.tag = "color"; - jc[0][0].value.c = "red"; - jc[0][1].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc[0][1].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0][1].attr_id.tag = "color"; - jc[0][1].value.c = "green"; - jc[0][2].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobsExt(ctx, (const edg_wll_QueryRec **)jc, 0, &jobsOut, &statesOut); - ... - - -All user's jobs marked with red color and using the 'xyz' algorithm: --------------------------------------------------------------------- - - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[2]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].attr_id.tag = "color"; - jc[0].value.c = "red"; - jc[1].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc[1].op = EDG_WLL_QUERY_OP_EQUAL; - jc[1].attr_id.tag = "algorithm"; - jc[1].value.c = "xyz"; - jc[2].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); - ... - - -All jobs that were submitted in the last 24 hours: --------------------------------------------------- - - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[2]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_TIME; - jc[0].op = EDG_WLL_QUERY_OP_GREATER; - jc[0].attr_id.state = EDG_WLL_JOB_SUBMITTED; - jc[0].value.t.tv_sec = time_now - (24 * 60 * 60); - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); - ... - - -All jobs with a specified state within a particular time interval: ------------------------------------------------------------------- - - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[3]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_TIME; - jc[1].op = EDG_WLL_QUERY_OP_WITHIN; - jc[1].attr_id.state = EDG_WLL_JOB_SUBMITTED; - jc[1].value.t.tv_sec = time_now - (48 * 60 * 60); - jc[1].value2.t.tv_sec = time_now - (24 * 60 * 60); - jc[2].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); - ... - - -\label{ASQ} -Event queries and job queries are similar. -Obviously, the return type is different\Dash the \LB\ raw events. -There is one more input parameter -representing specific conditions on events (possibly empty) -in addition to conditions on jobs. -Some examples showing event queries -are considered in the following paragraph. - - -All events marking any user's job as 'red': -------------------------------------------- - - #include - ... - edg_wll_Context ctx; - edg_wll_Event *eventsOut; - edg_wll_QueryRec jc[2]; - edg_wll_QueryRec ec[2]; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec[0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - ec[0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[0].attr_id.tag = "color"; - ec[0].value.c = "red"; - ec[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryEvents(ctx, jc, ec, &eventsOut); - ... - - -All events marking red jobs as green: -------------------------------------- - - #include - ... - edg_wll_Context ctx; - edg_wll_Event *eventsOut; - edg_wll_QueryRec jc[2]; - edg_wll_QueryRec ec[2]; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].attr_id.tag = "color"; - jc[0].value.c = "red"; - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec[0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - ec[0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[0].attr_id.tag = "color"; - ec[0].value.c = "green"; - ec[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryEvents(ctx, jc, ec, &eventsOut); - ... - - -All user's jobs that were resubmitted: --------------------------------------- - - #include - ... - edg_wll_Context ctx; - edg_wll_Event *eventsOut; - edg_wll_QueryRec jc[2]; - edg_wll_QueryRec ec[2]; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec[0].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE; - ec[0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[0].value.i = EDG_WLL_EVENT_RESUBMISSION; - ec[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryEvents(ctx, jc, ec, &eventsOut); - ... - - -All user's jobs which were resubmitted in the last 2 hours: ------------------------------------------------------------ - - #include - ... - edg_wll_Context ctx; - edg_wll_Event *eventsOut; - edg_wll_QueryRec jc[2]; - edg_wll_QueryRec ec[3]; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec[0].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE; - ec[0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[0].value.i = EDG_WLL_EVENT_RESUBMISSION; - ec[1].attr = EDG_WLL_QUERY_ATTR_TIME; - ec[1].op = EDG_WLL_QUERY_OP_GREATER; - ec[1].value.t.tv_sec = time_now - (2 * 60 * 60); - ec[2].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryEvents(ctx, jc, ec, &eventsOut); - ... - - -Complex query: --------------- -Task: which of my red jobs are heading to a destination -that already encountered problems executing red jobs? - -1. First we retrieve the information of red jobs failures. - - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc1[3],ec1[3]; - edg_wll_Event *failures; - - jc1[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc1[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc1[0].value.c = NULL; - jc1[1].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc1[1].attr_id.tag = "color"; - jc1[1].op = EDG_WLL_QUERY_OP_EQUAL; - jc1[1].value.c = "red"; - jc1[2].attr = EDG_WLL_QUERY_ATTR_DONECODE; - jc1[2].op = EDG_WLL_QUERY_OP_EQUAL; - jc1[2].value.i = EDG_WLL_DONE_FAILED; - jc1[3].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - ec1[0].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE; - ec1[0].op = EDG_WLL_QUERY_OP_EQUAL; - ec1[0].value.i = EDG_WLL_EVENT_DONE; - ec1[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - edg_wll_QueryEvents(ctx,jc1,ec1,&failures); - ... -\end{verbatim} - - -2. We loop over the job ID's extracted from the events returned -in the previous step, and retrieve their `Match' and `Done' events. - -Note: it is desirable to avoid repeated queries on the same job. - - ... - edg_wll_QueryRec *jc2[2],*ec2[2]; - char *last_job = strdup(""),*this_job,**failed_sites = NULL; - edg_wll_Event *match_done; - char **failed_sites; - int n, i, j; - ... - jc2[0][0].attr = EDG_WLL_QUERY_ATTR_JOBID; - jc2[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc2[0][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - jc2[1] = NULL; - ec2[0][0].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE; - ec2[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - ec2[0][0].value.i = EDG_WLL_EVENT_MATCH; - ec2[0][1].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE; - ec2[0][1].op = EDG_WLL_QUERY_OP_EQUAL; - ec2[0][1].value.i = EDG_WLL_EVENT_DONE; - ec2[0][2].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec2[1] = NULL; - - n = 0; - for (i=0; failures[i].type; i++) { - this_job = edg_wlc_JobIdUnparse(failures[i].any.jobId); - if (strcmp(last_job,this_job)) { - free(last_job); - last_job = this_job; - jc2[0][0].value.j = failures[i].any.jobId; - edg_wll_QueryEventsExt(ctx,(const edg_wll_QueryRec **)jc2, - (const edg_wll_QueryRec **)ec2,&match_done); - for (j=0; match_done[j].type; j++) { - if (match_done[j].type == EDG_WLL_EVENT_MATCH && - match_done[j+1].type == EDG_WLL_EVENT_DONE && - match_done[j+1].done.status_code == EDG_WLL_DONE_FAILED) - { - failed_sites = realloc(failed_sites,(n+1)*sizeof *failed_sites); - failed_sites[n++] = strdup(match_done[j].match.dest_id); - } - edg_wll_FreeEvent(&match_done[j]); - } - } - else free(this_job); - edg_wll_FreeEvent(&failures[i]); - } - free(failures); - ... - - -3. Finally we can query the server for the jobs heading to one of the failing -sites. - - ... - edg_wll_QueryRec *jc3[3]; - edg_wlc_JobId *unlucky_jobs; - ... /* remove duplicates from failed_sites */ - - for (i=0; i - ... - edg_wll_Context ctx; - edg_wll_Event *eventsOut; - edg_wll_JobStat *statesOut; - edg_wlc_JobId *jobsOut; - edg_wll_QueryRec **jc; - edg_wll_QueryRec **ec; - ... - jc[0][0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0][0].attr_id.tag = "color"; - jc[0][0].value.c = "red"; - jc[0][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - jc[2][0].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[2][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2][0].value.i = EDG_WLL_JOB_SUBMITTED; - jc[2][1].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[2][1].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2][1].value.i = EDG_WLL_JOB_WAITING; - jc[2][2].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[2][2].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2][2].value.i = EDG_WLL_JOB_READY; - jc[2][3].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[2][3].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2][3].value.i = EDG_WLL_JOB_SCHEDULED; - jc[2][4].attr = EDG_WLL_QUERY_ATTR_UNDEF; - jc[3] = NULL; - edg_wll_QueryJobsExt(ctx, (const edg_wll_QueryRec **)jc, 0, &jobsOut, &statesOut); - ... - - ... - ec[0][0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - ec[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[0][0].attr_id.tag = "color"; - ec[0][0].value.c = "red"; - ec[0][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec[1][0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - ec[1][0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[1][0].attr_id.tag = "color"; - ec[1][0].value.c = "red"; - ec[1][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec[2][0].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE; - ec[2][0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[2][0].value.i = EDG_WLL_EVENT_DONE; - ec[2][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec[3] = NULL; - edg_wll_QueryEventsExt(ctx, (const edg_wll_QueryRec **)jc, (const edg_wll_QueryRec **)ec, &eventsOut); - ... - - diff --git a/org.glite.lb.doc/examples/cons_example1.c b/org.glite.lb.doc/examples/cons_example1.c deleted file mode 100644 index 08c474b..0000000 --- a/org.glite.lb.doc/examples/cons_example1.c +++ /dev/null @@ -1,137 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include - -/*headers*/ -#include "glite/jobid/cjobid.h" -#include "glite/lb/events.h" -#include "glite/lb/consumer.h" -/*end headers*/ - - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"server", 1, NULL, 's'}, - {"port", 1, NULL, 'p'}, - {"jobid", 1, NULL, 'j'}, - {"user", 1, NULL, 'u'}, -}; - -static void usage(char *me) -{ - fprintf(stderr, "usage: %s [option]\n" - "\t-h, --help Shows this screen.\n" - "\t-s, --server Server address.\n" - "\t-p, --port Query server port.\n" - "\t-j, --jobid ID of requested job.\n" - "\t-u, --user User DN.\n" - , me); -} - - -int main(int argc, char *argv[]) -{ - char *server, *jobid_s, *user; - int opt, err = 0; - edg_wlc_JobId jobid = NULL; - long i; - int port = 0; - - server = jobid_s = user = NULL; - while ( (opt = getopt_long(argc, argv, "hs:p:j:u:c:n:v:", opts, NULL)) != EOF) - switch (opt) { - case 'h': usage(argv[0]); return 0; - case 's': server = strdup(optarg); break; - case 'p': port = atoi(optarg); break; - case 'j': jobid_s = strdup(optarg); break; - case 'u': user = strdup(optarg); break; - case '?': usage(argv[0]); return 1; - } - - if ( !jobid_s ) { fprintf(stderr, "JobId not given\n"); return 1; } - //if ( !server ) { fprintf(stderr, "LB proxy socket not given\n"); return 1; } - - /*variables*/ - edg_wll_Context ctx; - edg_wll_QueryRec jc[4]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - /*end variables*/ - - if ( (errno = edg_wlc_JobIdParse(jobid_s, &jobid)) ) { perror(jobid_s); return 1; } - - /*context*/ - edg_wll_InitContext(&ctx); - - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER, server); - if (port) edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, port); - /*end context*/ - - /*queryrec*/ - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[1].op = EDG_WLL_QUERY_OP_EQUAL; - jc[1].value.i = EDG_WLL_JOB_RUNNING; - jc[2].attr = EDG_WLL_QUERY_ATTR_DESTINATION; - jc[2].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2].value.c = "XYZ"; - jc[3].attr = EDG_WLL_QUERY_ATTR_UNDEF; - /*end queryrec*/ - - /*query*/ - err = edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); //* \label{l:queryjobs} - if ( err == E2BIG ) { - fprintf(stderr,"Warning: only limited result returned!\n"); - return 0; - } else if (err) { - char *et,*ed; - - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"%s: edg_wll_QueryJobs(): %s (%s)\n",argv[0],et,ed); - - free(et); free(ed); - } - /*end query*/ - - /*printstates*/ - for (i = 0; statesOut[i].state; i++ ) { - printf("jobId : %s\n", edg_wlc_JobIdUnparse(statesOut[i].jobId)); - printf("state : %s\n\n", edg_wll_StatToString(statesOut[i].state)); - } - /*end printstates*/ - - 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); - - return err; -} diff --git a/org.glite.lb.doc/examples/cons_example1.cpp b/org.glite.lb.doc/examples/cons_example1.cpp deleted file mode 100644 index 3b82a0a..0000000 --- a/org.glite.lb.doc/examples/cons_example1.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include - -/*headers*/ -#include "glite/jobid/JobId.h" -#include "glite/lb/ServerConnection.h" -#include "glite/lb/Job.h" -/*end headers*/ - -#include "iostream" - -using namespace glite::lb; -using namespace std; - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"server", 1, NULL, 's'}, - {"port", 1, NULL, 'p'}, - {"jobid", 1, NULL, 'j'}, - {"user", 1, NULL, 'u'}, -}; - -static void usage(char *me) -{ - cerr << "usage: " << me << " [option]\n" - "\t-h, --help Shows this screen.\n" - "\t-s, --server Server address.\n" - "\t-p, --port Query server port.\n" - "\t-j, --jobid ID of requested job.\n" - "\t-u, --user User DN.\n"; -} - - -int main(int argc, char *argv[]) -{ - char *server, *jobid_s, *user; - int opt, err = 0; - long i; - int port = 0; - - server = jobid_s = user = NULL; - while ( (opt = getopt_long(argc, argv, "hs:p:j:u:c:n:v:", opts, NULL)) != EOF) - switch (opt) { - case 'h': usage(argv[0]); return 0; - case 's': server = strdup(optarg); break; - case 'p': port = atoi(optarg); break; - case 'j': jobid_s = strdup(optarg); break; - case 'u': user = strdup(optarg); break; - case '?': usage(argv[0]); return 1; - } - - if ( !jobid_s ) { fprintf(stderr, "JobId not given\n"); return 1; } - //if ( !server ) { fprintf(stderr, "LB proxy socket not given\n"); return 1; } - - /*variables*/ - ServerConnection lb_server; - glite::jobid::JobId jobid; - std::vector job_cond; - std::vector statesOut; - /*end variables*/ - - try { - /*queryserver*/ - jobid = glite::jobid::JobId(jobid_s); - - lb_server.setQueryServer(jobid.host(), jobid.port()); - /*end queryserver*/ - - /*querycond*/ - job_cond.push_back(QueryRecord(QueryRecord::OWNER, QueryRecord::EQUAL, std::string(user))); - job_cond.push_back(QueryRecord(QueryRecord::STATUS, QueryRecord::EQUAL, JobStatus::RUNNING)); - job_cond.push_back(QueryRecord(QueryRecord::DESTINATION, QueryRecord::EQUAL, std::string("xyz"))); - /*end querycond*/ - - /*query*/ - statesOut = lb_server.queryJobStates(job_cond, 0); //* \label{l:cppqueryjobs} - /*end query*/ - - /*printstates*/ - for (i = 0; i< statesOut.size(); i++ ) { - cout << "jobId : " << statesOut[i].getValJobId(JobStatus::JOB_ID).toString() << endl; - cout << "state : " << statesOut[i].name() << endl << endl; - } - /*end printstates*/ - - } catch(std::exception e) { - cerr << e.what() << endl; - } - return 0; -} diff --git a/org.glite.lb.doc/examples/cons_example2.c b/org.glite.lb.doc/examples/cons_example2.c deleted file mode 100644 index 47d2786..0000000 --- a/org.glite.lb.doc/examples/cons_example2.c +++ /dev/null @@ -1,151 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include - -/*headers*/ -#include "glite/jobid/cjobid.h" -#include "glite/lb/events.h" -#include "glite/lb/consumer.h" -/*end headers*/ - - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"server", 1, NULL, 's'}, - {"port", 1, NULL, 'p'}, - {"jobid", 1, NULL, 'j'}, - {"user", 1, NULL, 'u'}, -}; - -static void usage(char *me) -{ - fprintf(stderr, "usage: %s [option]\n" - "\t-h, --help Shows this screen.\n" - "\t-s, --server LB server.\n" - "\t-p, --port LB server port.\n" - "\t-j, --jobid ID of requested job.\n" - "\t-u, --user User DN.\n" - , me); -} - - -int main(int argc, char *argv[]) -{ - char *server, *jobid_s, *user; - edg_wlc_JobId jobid = NULL; - int opt, err = 0; - long i; - int port = 0; - - server = jobid_s = user = NULL; - while ( (opt = getopt_long(argc, argv, "hs:p:j:u:c:n:v:", opts, NULL)) != EOF) - switch (opt) { - case 'h': usage(argv[0]); return 0; - case 's': server = strdup(optarg); break; - case 'p': port = atoi(optarg); break; - case 'j': jobid_s = strdup(optarg); break; - case 'u': user = strdup(optarg); break; - case '?': usage(argv[0]); return 1; - } - - if ( !jobid_s ) { fprintf(stderr, "JobId not given\n"); return 1; } - - /*variables*/ - edg_wll_Context ctx; - edg_wll_QueryRec *jc[4]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - /*end variables*/ - - if ( (errno = edg_wlc_JobIdParse(jobid_s, &jobid)) ) { perror(jobid_s); return 1; } - - /*context*/ - edg_wll_InitContext(&ctx); - - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER, server); - if (port) edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, port); - /*end context*/ - - /*queryrec*/ - jc[0] = (edg_wll_QueryRec *) malloc(2*sizeof(edg_wll_QueryRec)); - jc[0][0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0][0].value.c = NULL; - jc[0][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - jc[1] = (edg_wll_QueryRec *) malloc(2*sizeof(edg_wll_QueryRec)); - jc[1][0].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[1][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[1][0].value.i = EDG_WLL_JOB_RUNNING; - jc[1][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - jc[2] = (edg_wll_QueryRec *) malloc(3*sizeof(edg_wll_QueryRec)); - jc[2][0].attr = EDG_WLL_QUERY_ATTR_DESTINATION; - jc[2][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2][0].value.c = "XXX"; - jc[2][1].attr = EDG_WLL_QUERY_ATTR_DESTINATION; - jc[2][1].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2][1].value.c = "YYY"; - jc[2][2].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - jc[3] = NULL; - /*end queryrec*/ - - /*query*/ - err = edg_wll_QueryJobsExt(ctx, (const edg_wll_QueryRec **)jc, - 0, &jobsOut, &statesOut); - /*end query*/ - - if ( err == E2BIG ) { - fprintf(stderr,"Warning: only limited result returned!\n"); - return 0; - } else if (err) { - char *et,*ed; - - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"%s: edg_wll_QueryJobs(): %s (%s)\n",argv[0],et,ed); - - free(et); free(ed); - } - - /*printstates*/ - for (i = 0; statesOut[i].state; i++ ) { - printf("jobId : %s\n", edg_wlc_JobIdUnparse(statesOut[i].jobId)); - printf("state : %s\n\n", edg_wll_StatToString(statesOut[i].state)); - } - /*end printstates*/ - - 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); - } - free(jc[0]); free(jc[1]); free(jc[2]); - - edg_wll_FreeContext(ctx); - - return err; -} diff --git a/org.glite.lb.doc/examples/cons_example2.cpp b/org.glite.lb.doc/examples/cons_example2.cpp deleted file mode 100644 index 09aa9ae..0000000 --- a/org.glite.lb.doc/examples/cons_example2.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include - -/*headers*/ -#include "glite/jobid/JobId.h" -#include "glite/lb/Event.h" -#include "glite/lb/ServerConnection.h" -/*end headers*/ - -#include - -using namespace glite::lb; -using namespace std; - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"server", 1, NULL, 's'}, - {"port", 1, NULL, 'p'}, - {"jobid", 1, NULL, 'j'}, - {"user", 1, NULL, 'u'}, -}; - -static void usage(char *me) -{ - cerr << "usage: " << me << "[option]\n" - "\t-h, --help Shows this screen.\n" - "\t-s, --server LB server.\n" - "\t-p, --port LB server port.\n" - "\t-j, --jobid ID of requested job.\n" - "\t-u, --user User DN.\n"; -} - - -int main(int argc, char *argv[]) -{ - char *server, *jobid_s, *user; - glite::jobid::JobId jobid; - int opt, err = 0; - long i; - int port = 0; - - server = jobid_s = user = NULL; - while ( (opt = getopt_long(argc, argv, "hs:p:j:u:c:n:v:", opts, NULL)) != EOF) - switch (opt) { - case 'h': usage(argv[0]); return 0; - case 's': server = strdup(optarg); break; - case 'p': port = atoi(optarg); break; - case 'j': jobid_s = strdup(optarg); break; - case 'u': user = strdup(optarg); break; - case '?': usage(argv[0]); return 1; - } - - if ( !jobid_s ) { cerr << "JobId not given\n"; return 1; } - - /*variables*/ - ServerConnection lb_server; - std::vector> jc; - std::vector jc_part; - std::vector statesOut; - /*end variables*/ - - try { - jobid = glite::jobid::JobId(jobid_s); - - /*context*/ - lb_server.setQueryServer(jobid.host(), jobid.port()); - /*end context*/ - - /*queryrec*/ - jc_part.push_back(QueryRecord(QueryRecord::OWNER, QueryRecord::EQUAL, "")); - jc.push_back(jc_part); - - jc_part.clear(); - jc_part.push_back(QueryRecord(QueryRecord::STATUS, QueryRecord::EQUAL, JobStatus::RUNNING)); - jc.push_back(jc_part); - - jc_part.clear(); - jc_part.push_back(QueryRecord(QueryRecord::DESTINATION, QueryRecord::EQUAL, "XXX")); - jc_part.push_back(QueryRecord(QueryRecord::DESTINATION, QueryRecord::EQUAL, "YYY")); - jc.push_back(jc_part); - /*end queryrec*/ - - /*query*/ - statesOut = lb_server.queryJobStates(jc, 0); - /*end query*/ - - /*printstates*/ - for (i = 0; i< statesOut.size(); i++ ) { - cout << "jobId : " << statesOut[i].getValJobId(JobStatus::JOB_ID).toString() << endl; - cout << "state : " << statesOut[i].name() << endl << endl; - } - /*end printstates*/ - - } catch(std::exception e) { - cerr << e.what() << endl; - } - return 0; -} diff --git a/org.glite.lb.doc/examples/cons_example3.c b/org.glite.lb.doc/examples/cons_example3.c deleted file mode 100644 index c014049..0000000 --- a/org.glite.lb.doc/examples/cons_example3.c +++ /dev/null @@ -1,136 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include - -/*headers*/ -#include "glite/jobid/cjobid.h" -#include "glite/lb/events.h" -#include "glite/lb/consumer.h" -/*end headers*/ - - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"server", 1, NULL, 's'}, - {"port", 1, NULL, 'p'}, - {"jobid", 1, NULL, 'j'}, - {"user", 1, NULL, 'u'}, -}; - -static void usage(char *me) -{ - fprintf(stderr, "usage: %s [option]\n" - "\t-h, --help Shows this screen.\n" - "\t-s, --server LB server.\n" - "\t-p, --port LB server port.\n" - "\t-j, --jobid ID of requested job.\n" - "\t-u, --user User DN.\n" - , me); -} - - -int main(int argc, char *argv[]) -{ - char *server, *jobid_s, *user; - int opt, err = 0; - edg_wlc_JobId jobid = NULL; - long i; - int port = 0; - - - server = jobid_s = NULL; - while ( (opt = getopt_long(argc, argv, "hs:p:j:u:c:n:v:", opts, NULL)) != EOF) - switch (opt) { - case 'h': usage(argv[0]); return 0; - case 's': server = strdup(optarg); break; - case 'p': port = atoi(optarg); break; - case 'j': jobid_s = strdup(optarg); break; - case 'u': user = strdup(optarg); break; - case '?': usage(argv[0]); return 1; - } - - if ( !jobid_s ) { fprintf(stderr, "JobId not given\n"); return 1; } - - /*variables*/ - edg_wll_Context ctx; - edg_wll_Event *eventsOut; - edg_wll_QueryRec jc[2]; - edg_wll_QueryRec ec[2]; - /*end variables*/ - - if ( (errno = edg_wlc_JobIdParse(jobid_s, &jobid)) ) { perror(jobid_s); return 1; } - - /*context*/ - edg_wll_InitContext(&ctx); - - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER, server); - if (port) edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, port); - /*end context*/ - - /*queryrec*/ - jc[0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].attr_id.tag = "color"; - jc[0].value.c = "red"; - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec[0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - ec[0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[0].attr_id.tag = "color"; - ec[0].value.c = "green"; - ec[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - /*end queryrec*/ - - /*query*/ - err = edg_wll_QueryEvents(ctx, jc, ec, &eventsOut); - /*end query*/ - - if ( err == E2BIG ) { - fprintf(stderr,"Warning: only limited result returned!\n"); - return 0; - } else if (err) { - char *et,*ed; - - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"%s: edg_wll_QueryEvents(): %s (%s)\n",argv[0],et,ed); - - free(et); free(ed); - } - - if ( err == ENOENT ) return err; - - /*printevents*/ - for (i = 0; eventsOut && (eventsOut[i].type); i++ ) { - //printf("jobId : %s\n", edg_wlc_JobIdUnparse(eventsOut[i].jobId)); - printf("event : %s\n\n", edg_wll_EventToString(eventsOut[i].type)); - } - /*end printevents*/ - - if ( eventsOut ) { - for (i=0; &(eventsOut[i]); i++) edg_wll_FreeEvent(&(eventsOut[i])); - free(eventsOut); - } - - edg_wll_FreeContext(ctx); - - return err; -} diff --git a/org.glite.lb.doc/examples/cons_example3.cpp b/org.glite.lb.doc/examples/cons_example3.cpp deleted file mode 100644 index fe109b7..0000000 --- a/org.glite.lb.doc/examples/cons_example3.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -extern "C" { -#include -#include -} - -#include -#include - -/*headers*/ -#include "glite/jobid/JobId.h" -#include "glite/lb/Event.h" -#include "glite/lb/ServerConnection.h" -/*end headers*/ - -using namespace std; - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"server", 1, NULL, 's'}, - {"port", 1, NULL, 'p'}, - {"jobid", 1, NULL, 'j'}, - {"user", 1, NULL, 'u'}, -}; - -static void usage(char *me) -{ - cerr << "usage: %s [option]\n" - << "\t-h, --help Shows this screen.\n" - << "\t-s, --server LB server.\n" - << "\t-p, --port LB server port.\n" - << "\t-j, --jobid ID of requested job.\n" - << "\t-u, --user User DN.\n" - << me << endl; -} - - -int main(int argc, char *argv[]) -{ - string server_s, jobid_s, user; - int opt, err = 0; - glite_jobid_t jobid = NULL; - long i; - int port = 0; - - - server = jobid_s = NULL; - while ( (opt = getopt_long(argc, argv, "hs:p:j:u:c:n:v:", opts, NULL)) != EOF) - switch (opt) { - case 'h': usage(argv[0]); return 0; - case 's': server_s = optarg; break; - case 'p': port = atoi(optarg); break; - case 'j': jobid_s = optarg; break; - case 'u': user = optarg; break; - case '?': usage(argv[0]); return 1; - } - - if ( jobid_s.empty() ) { - cerr << "JobId not given\n"; return 1; - } - - /*variables*/ - ServerConnection server; - Event *eventsOut; - vector jc; - vector ec; - /*end variables*/ - - if ( (errno = edg_wlc_JobIdParse(jobid_s, &jobid)) ) { perror(jobid_s); return 1; } - - /*context*/ - edg_wll_InitContext(&ctx); - - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER, server); - if (port) edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, port); - /*end context*/ - - /*queryrec*/ - jc[0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].attr_id.tag = "color"; - jc[0].value.c = "red"; - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec[0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - ec[0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[0].attr_id.tag = "color"; - ec[0].value.c = "green"; - ec[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - /*end queryrec*/ - - /*query*/ - err = edg_wll_QueryEvents(ctx, jc, ec, &eventsOut); - /*end query*/ - - if ( err == E2BIG ) { - fprintf(stderr,"Warning: only limited result returned!\n"); - return 0; - } else if (err) { - char *et,*ed; - - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"%s: edg_wll_QueryEvents(): %s (%s)\n",argv[0],et,ed); - - free(et); free(ed); - } - - if ( err == ENOENT ) return err; - - /*printevents*/ - for (i = 0; eventsOut && (eventsOut[i].type); i++ ) { - //printf("jobId : %s\n", edg_wlc_JobIdUnparse(eventsOut[i].jobId)); - printf("event : %s\n\n", edg_wll_EventToString(eventsOut[i].type)); - } - /*end printevents*/ - - if ( eventsOut ) { - for (i=0; &(eventsOut[i]); i++) edg_wll_FreeEvent(&(eventsOut[i])); - free(eventsOut); - } - - edg_wll_FreeContext(ctx); - - return err; -} diff --git a/org.glite.lb.doc/examples/example1.c b/org.glite.lb.doc/examples/example1.c deleted file mode 100644 index 6d60cc9..0000000 --- a/org.glite.lb.doc/examples/example1.c +++ /dev/null @@ -1,66 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include - -#include "glite/lb/context.h" -#include "glite/lb/xml_conversions.h" -#include "glite/lb/consumer.h" - -extern void print_jobs(edg_wll_JobStat *); - -int main(int argc,char **argv) -{ - - edg_wll_Context ctx; - edg_wll_JobStat *statesOut = NULL; - edg_wll_QueryRec jc[2]; - - edg_wll_InitContext(&ctx); - - jc[0].attr = EDG_WLL_QUERY_ATTR_JOBID; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - if ( edg_wlc_JobIdParse( - argv[1], - &jc[0].value.j) ) - { - edg_wll_FreeContext(ctx); - exit(1); - } - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - if (edg_wll_QueryJobs(ctx, jc, 0, NULL, &statesOut)) { - char *err_text,*err_desc; - - edg_wll_Error(ctx,&err_text,&err_desc); - fprintf(stderr,"QueryJobs: %s (%s)\n",err_text,err_desc); - free(err_text); - free(err_desc); - } - else { - print_jobs(statesOut); /* process the returned data */ - edg_wll_FreeStatus(statesOut); - free(statesOut); - } - edg_wlc_JobIdFree(jc[0].value.j); - edg_wll_FreeContext(ctx); - return 0; -} diff --git a/org.glite.lb.doc/examples/notif_example.c b/org.glite.lb.doc/examples/notif_example.c deleted file mode 100644 index ab986bb..0000000 --- a/org.glite.lb.doc/examples/notif_example.c +++ /dev/null @@ -1,144 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include - -/*headers*/ -#include "glite/security/glite_gss.h" -#include "glite/lb/context.h" -#include "glite/lb/notification.h" -/*end headers*/ - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"user", 1, NULL, 'u'}, - {"timeout", 1, NULL, 't'}, -}; - -static void usage(char *me) -{ - fprintf(stderr, "usage: %s [option]\n" - "\t-h, --help Shows this screen.\n" - "\t-u, --user User DN.\n" - "\t-t, --timeout Timeout for receiving.\n" - "GLITE_WMS_NOTIF_SERVER must be set.\n" - , me); -} - - -int main(int argc, char *argv[]) -{ - char *user; - int i, opt, err = 0; - time_t valid; - struct timeval timeout = {220, 0}; - - user = NULL; - while ( (opt = getopt_long(argc, argv, "h:u:t:", opts, NULL)) != EOF) - switch (opt) { - case 'h': usage(argv[0]); return 0; - case 'u': user = strdup(optarg); break; - case 't': timeout.tv_sec = atoi(optarg); break; - case '?': usage(argv[0]); return 1; - } - - /*variables*/ - edg_wll_Context ctx; - edg_wll_QueryRec **conditions; - edg_wll_NotifId notif_id = NULL, recv_notif_id = NULL; - edg_wll_JobStat stat; - /*end variables*/ - - /*context*/ - edg_wll_InitContext(&ctx); - /*end context*/ - - /* set server:port if don't want to depend on GLITE_WMS_NOTIF_SERVER */ - /* edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER, server); */ - /* if (port) edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, port); */ - - conditions = (edg_wll_QueryRec **)calloc(2,sizeof(edg_wll_QueryRec *)); - conditions[0] = (edg_wll_QueryRec *)calloc(2,sizeof(edg_wll_QueryRec)); - - - /* set notification conditions to Owner=xxx */ - /*queryrec*/ - conditions[0][0].attr = EDG_WLL_QUERY_ATTR_OWNER; - conditions[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - conditions[0][0].value.c = user; - /*end queryrec*/ - - /*register*/ - if (edg_wll_NotifNew(ctx, (edg_wll_QueryRec const* const*)conditions, - 0, -1, NULL, ¬if_id, &valid)) { - char *et,*ed; - - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"%s: edg_wll_NotifNew(): %s (%s)\n",argv[0],et,ed); - - free(et); free(ed); - goto register_err; - } - fprintf(stdout,"Registration OK, notification ID: %s\nvalid: (%ld)\n", - edg_wll_NotifIdUnparse(notif_id), - valid); - /*end register*/ - - fprintf(stdout,"Waiting for a notification for %d seconds\n", timeout.tv_sec); - - /*receive*/ - if ( (err = edg_wll_NotifReceive(ctx, -1, &timeout, &stat, &recv_notif_id)) ) { - if (err != ETIMEDOUT) { - char *et,*ed; - - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"%s: edg_wll_NotifReceive(): %s (%s)\n",argv[0],et,ed); - - free(et); free(ed); - goto receive_err; - } - fprintf(stdout,"No job state change recived in given timeout\n"); - } - else - { - /* Check recv_notif_id if you have registered more notifications */ - /* Print received state change */ - printf("jobId : %s\n", edg_wlc_JobIdUnparse(stat.jobId)); - printf("state : %s\n\n", edg_wll_StatToString(stat.state)); - edg_wll_FreeStatus(&stat); - } - /*end receive*/ - -receive_err: - - /* Drop registration if not used anymore edg_wll_NotifDrop() */ - - edg_wll_NotifIdFree(recv_notif_id); - edg_wll_NotifCloseFd(ctx); - /* edg_wll_NotifClosePool(ctx); */ - -register_err: - - edg_wll_FreeContext(ctx); - - return err; -} diff --git a/org.glite.lb.doc/examples/prod_example1.c b/org.glite.lb.doc/examples/prod_example1.c deleted file mode 100644 index 2281af6..0000000 --- a/org.glite.lb.doc/examples/prod_example1.c +++ /dev/null @@ -1,125 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include - -/*headers*/ -#include "glite/jobid/cjobid.h" -#include "glite/lb/events.h" -#include "glite/lb/producer.h" -/*end headers*/ - - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"sock", 1, NULL, 's'}, - {"jobid", 1, NULL, 'j'}, - {"user", 1, NULL, 'u'}, - {"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-u, --user User DN.\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[]) -{ - char *server, *seq_code, *jobid_s, *user, *name, *value; - int opt, err = 0; - - - server = seq_code = jobid_s = name = value = NULL; - while ( (opt = getopt_long(argc, argv, "hs:j:u:c:n:v:", opts, NULL)) != EOF) - switch (opt) { - case 'h': usage(argv[0]); return 0; - case 's': server = strdup(optarg); break; - case 'j': jobid_s = strdup(optarg); break; - case 'u': user = strdup(optarg); break; - case 'c': seq_code = strdup(optarg); break; - case 'n': name = strdup(optarg); break; - case 'v': value = strdup(optarg); break; - case '?': usage(argv[0]); return 1; - } - - if ( !jobid_s ) { fprintf(stderr, "JobId 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; } - - - edg_wll_Context ctx; - edg_wlc_JobId jobid = NULL; - - if ( (errno = edg_wlc_JobIdParse(jobid_s, &jobid)) ) { perror(jobid_s); return 1; } - - /*context*/ - edg_wll_InitContext(&ctx); - - edg_wll_SetParam(ctx, EDG_WLL_PARAM_SOURCE, EDG_WLL_SOURCE_USER_INTERFACE); - edg_wll_SetParam(ctx, EDG_WLL_PARAM_HOST, server); - //edg_wll_SetParam(ctx, EDG_WLL_PARAM_PORT, port); - /*end context*/ - - /*sequence*/ - if (edg_wll_SetLoggingJob(ctx, jobid, seq_code, EDG_WLL_SEQ_NORMAL)) { - char *et,*ed; - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"SetLoggingJob(%s,%s): %s (%s)\n",jobid_s,seq_code,et,ed); - exit(1); - } - /*end sequence*/ - - /*log*/ - err = edg_wll_LogEvent(ctx, //* \label{l:logevent} - 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); - } - /*end log*/ - - seq_code = edg_wll_GetSequenceCode(ctx); - puts(seq_code); - free(seq_code); - - edg_wll_FreeContext(ctx); - - return err; -} diff --git a/org.glite.lb.doc/examples/util.C b/org.glite.lb.doc/examples/util.C deleted file mode 100644 index eabb98f..0000000 --- a/org.glite.lb.doc/examples/util.C +++ /dev/null @@ -1,160 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners/ for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include "glite/lb/Event.h" -#include "glite/lb/JobStatus.h" - -#include - -using namespace glite::lb; -using namespace std; - -/*event*/ -void -dumpEvent(Event *event) -{ -// list of attribute names and types - typedef vector> AttrListType; - - cout << "Event name: " << event->name() << endl; - AttrListType attr_list = event->getAttrs(); //* \label{l:getattrs} - for(AttrListType::iterator i = attr_list.begin(); - i != attr_list.end(); - i++) { - Event::Attr attr = attr_list[i].first; - - cout << Event::getAttrName(attr) << " = "; - switch(attr_list[i].second) { - case Event::INT_T: - case Event::PORT_T: - case Event::LOGSRC_T: - cout << event->getValInt(attr) << endl; - break; - - case Event::STRING_T: - cout << event->getValString(attr) << endl; - break; - - case Event::TIMEVAL_T: - cout << event->getValTime(attr).tv_sec << endl; - break; - - case Event::FLOAT_T: - cout << event->getValFloat(attr) << endl; - break; - - case Event::DOUBLE_T: - cout << event->getValDouble(attr) << endl; - break; - - case Event::JOBID_T: - cout << event->getValJobId(attr).toString() << endl; - break; - - default: - cout << "attribute type not supported" << endl; - break; - } - } -} -/*end event*/ - - -/*status*/ -void dumpState(JobStatus *status) -{ - typedef vector> AttrListType; - - cout << "Job status: " << status->name << endl; - - AttrListType attr_list = status->getAttrs(); //* \label{l:jgetattrs} - for(AttrListType::iterator i = attr_list.begin(); - i != attr_list.end(); - i++) { - JobStatus::Attr attr = attr_list[i].first; - cout << JobStatus::getAttrName(attr) << " = "; - switch(attr_list[i].second) { - - case INT_T: - cout << status->getValInt(attr) << endl; - break; - - case STRING_T: - cout << status->getValInt(attr) << endl; - break; - - case TIMEVAL_T: - cout << status->getValTime(attr).tv_sec << endl; - break; - - case BOOL_T: - cout << status->getValBool(attr).tv_sec << endl; - break; - - case JOBID_T: - cout << status->getValJobid(attr).toString() << endl; - break; - - case INTLIST_T: - vector list = status->getValIntList(attr); - for(vector::iterator i = list.begin(); - i != list.end(); - i++) { - cout << list[i] << " "; - } - cout << endl; - break; - - case STRLIST_T: - vector list = status->getValStringList(attr); - for(vector::iterator i = list.begin(); - i != list.end(); - i++) { - cout << list[i] << " "; - } - cout << endl; - break; - - case TAGLIST_T: /**< List of user tags. */ - vector> list = status->getValTagList(attr); - for(vector>::iterator i = list.begin(); - i != list.end(); - i++) { - cout << list[i].first << "=" << list[i].second << " "; - } - cout << endl; - break; - - case STSLIST_T: /**< List of states. */ - vector list = status->getValJobStatusList(attr); - for(vector::iterator i = list.begin(); - i != list.end(); - i++) { - // recursion - dumpState(&list[i]); - } - cout << endl; - break; - - default: - cout << "attribute type not supported" << endl; - break; - - } - } -} -/*end status*/ diff --git a/org.glite.lb.doc/examples/util.c b/org.glite.lb.doc/examples/util.c deleted file mode 100644 index 22d99b9..0000000 --- a/org.glite.lb.doc/examples/util.c +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include - -#include -#include - -int use_proxy = 0; - -void -print_jobs(edg_wll_JobStat *states) -{ - int i,j; - - for (i=0; states[i].state != EDG_WLL_JOB_UNDEF; i++) { - char *id = edg_wlc_JobIdUnparse(states[i].jobId); - char *st = edg_wll_StatToString(states[i].state); - - if (!states[i].parent_job) { - if (states[i].jobtype == EDG_WLL_STAT_SIMPLE) { - printf(" %s .... %s %s\n", id, st, (states[i].state==EDG_WLL_JOB_DONE) ? edg_wll_done_codeToString(states[i].done_code) : "" ); - } - else if ((states[i].jobtype == EDG_WLL_STAT_DAG) || - (states[i].jobtype == EDG_WLL_STAT_COLLECTION)) { - printf("%s %s .... %s %s\n", (states[i].jobtype==EDG_WLL_STAT_DAG)?"DAG ":"COLL",id, st, (states[i].state==EDG_WLL_JOB_DONE) ? edg_wll_done_codeToString(states[i].done_code) : ""); - for (j=0; states[j].state != EDG_WLL_JOB_UNDEF; j++) { - if (states[j].parent_job) { - char *par_id = edg_wlc_JobIdUnparse(states[j].parent_job); - - if (!strcmp(id,par_id)) { - char *sub_id = edg_wlc_JobIdUnparse(states[j].jobId), - *sub_st = edg_wll_StatToString(states[j].state); - - printf(" `- %s .... %s %s\n", sub_id, sub_st, (states[j].state==EDG_WLL_JOB_DONE) ? edg_wll_done_codeToString(states[j].done_code) : ""); - free(sub_id); - free(sub_st); - } - free(par_id); - } - } - } - } - - free(id); - free(st); - } - - printf("\nFound %d jobs\n",i); -} - - - diff --git a/org.glite.lb.doc/project/ChangeLog b/org.glite.lb.doc/project/ChangeLog deleted file mode 100644 index 8f03583..0000000 --- a/org.glite.lb.doc/project/ChangeLog +++ /dev/null @@ -1,49 +0,0 @@ -1.0.0-1 -- LB 2.0 release - -1.0.0-2 -- fixed configure to work in etics - -1.0.0-3 -- Added the dummy 'check' rule to the Makefile - -1.0.1-1 -- Notification section - new example, comments incorporated - -1.0.2-1 -- Notificaton API -- TestPlan updates -- Updates in other sections - -1.0.3-1 -- Updates to the User Guide, Admin Guide and Test Plan Test Suite Documentation - -1.0.4-1 -- Admin Guide updates - installation and migration -- Test Plan updates - -1.1.0-1 -- Documentation updated to follow development - -1.1.1-1 -- Testplan documentation extended. - -1.1.2-1 -- Short reference to CRAM job logging functionality added - -1.1.3-1 -- Extended documentation for C++ API - -1.1.4-1 -- C++ examples -- Extended C++ consumer API documentation - -1.1.5-1 -- L&B version overview updated - -1.1.6-1 -- Documented new authorization functions - -1.1.7-1 -- More docs for authorization functions - diff --git a/org.glite.lb.doc/project/package.description b/org.glite.lb.doc/project/package.description deleted file mode 100644 index 5b72d81..0000000 --- a/org.glite.lb.doc/project/package.description +++ /dev/null @@ -1 +0,0 @@ -glite-lb-doc is a package containing the complete LB documentation. This package contains the LB User's Guide (LBUG.pdf), LB Administrator's Guide (LBAG.pdf), LB Developer's Guide (LBDG.pdf) and LB Test Plan (LBTP.pdf). diff --git a/org.glite.lb.doc/project/package.summary b/org.glite.lb.doc/project/package.summary deleted file mode 100644 index 9668489..0000000 --- a/org.glite.lb.doc/project/package.summary +++ /dev/null @@ -1 +0,0 @@ -gLite Logging and Bookkeeping documentation diff --git a/org.glite.lb.doc/project/version.properties b/org.glite.lb.doc/project/version.properties deleted file mode 100644 index 03a30da..0000000 --- a/org.glite.lb.doc/project/version.properties +++ /dev/null @@ -1,3 +0,0 @@ -# $Header$ -module.version=1.1.7 -module.age=1 diff --git a/org.glite.lb.doc/src/LBAG-Abstract.tex b/org.glite.lb.doc/src/LBAG-Abstract.tex deleted file mode 100644 index a3346a9..0000000 --- a/org.glite.lb.doc/src/LBAG-Abstract.tex +++ /dev/null @@ -1,21 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -% when changed, update also http://egee.cesnet.cz/en/JRA1/LB/lb.html -% (in CVSROOT=:gserver:lindir.ics.muni.cz:/cvs/edg, cvsweb/lb.html) -This administrator's guide explains how to administer the Logging and -Bookkeeping (\LB) service. Several deployment scenarios are described together -with the installation, configuration, running and troubleshooting steps. diff --git a/org.glite.lb.doc/src/LBAG-Installation.tex b/org.glite.lb.doc/src/LBAG-Installation.tex deleted file mode 100644 index 80afaed..0000000 --- a/org.glite.lb.doc/src/LBAG-Installation.tex +++ /dev/null @@ -1,638 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -\section{Installation and Configuration} - -\subsection{Complete list of packages} - -\LB is currently distributed mainly in RPMs packages. It is available also in -binary form packed as .tar.gz. Recent attempts to multiplatform porting and -recent ETICS building system development promise a future possibility to -distribute the software in other distribution formats, e.g. DEB packages. - -In \LBver{1.x}, the list of all LB packages was the following: - -\begin{tabularx}{\textwidth}{>{\tt}lX} -glite-lb-common & common files \\ -glite-lb-client & client library and CLI tools\\ -glite-lb-client-interface & client library interface (header files) \\ -glite-lb-harvester & enhanced \LB notification client (since \LBver{1.10}) \\ -glite-lb-logger & local-logger and inter-logger \\ -glite-lb-proxy & proxy (restricted server used by WMS)\\ -glite-lb-server & server \\ -glite-lb-server-bones & multi-process server building library \\ -glite-lb-utils & auxiliary utilities \\ -glite-lb-ws-interface & web service interface \\ -glite-security-gsoap-plugin & GSS wrapper and GSS plugin for gSoap -\end{tabularx} - -In \LBver{2.0}, the code has been restructured quite a lot, especially the dependencies were lightened, -and the new list of packages is now the following: - -\begin{tabularx}{\textwidth}{>{\tt}lX} -glite-lb-doc & documentation \\ -glite-lb-common & common files \\ -glite-lb-client & client library and CLI tools\\ -glite-lb-harvester & enhanced \LB notification client \\ -glite-lb-logger & local-logger and inter-logger \\ -glite-lb-server & server, including merged proxy functionality \\ -glite-lb-state-machine & state machine and LB plugin for Job Provenance \\ -glite-lb-utils & auxiliary utilities \\ -glite-lb-ws-interface & web service interface \\ -\end{tabularx} - -More detailed description together with the dependencies can be read directly from each package, -for example by issuing the command -\begin{verbatim} - rpm -qiR -\end{verbatim} - -Some of the LB packages depend also on other gLite packages, different -due to the restructuring since \LBver{2.0}. -For \LBver{1.x} they are: - - -\begin{tabularx}{\textwidth}{>{\tt}lX} -glite-wms-utils-jobid & gLite jobId management library \\ -glite-jp-common & Job Provenance auxiliary library \\ -\end{tabularx} - -\noindent -And for \LBver{2.x}: - -\begin{tabularx}{\textwidth}{>{\tt}lX} -glite-jobid-api-c & gLite jobId C API library \\ -% pro beh LB neni triba -% glite-jp-common & JP common files \\ -glite-lbjp-common-db & database access layer \\ -glite-lbjp-common-log & glite common logging format implementation \\ -glite-lbjp-common-maildir & persistent request spool management \\ -glite-lbjp-common-server-bones & multi-process server building library \\ -glite-lbjp-common-trio & extended printf implementation \\ -glite-security-gss & GSS wrapper \\ -glite-security-gsoap-plugin & GSS plugin for gSoap \\ -\end{tabularx} - -where all \verb'glite-lbjp-common-*' packages are common both to \LB and -Job Provenance (\JP). - -\subsection{Common logging format} -Since \LBver{2.1} \LB service follows the \textbf{gLite common logging recommendations v1.1}: -\begin{center} -\url{https://twiki.cern.ch/twiki/pub/EGEE/EGEEgLite/logging.html}. -\end{center} - -The implementation is done in the \texttt{glite-lbjp-common-log} package and it -uses \texttt{log4c} (\url{http://log4c.sourceforge.net}) -and its configuration file \texttt{log4crc}. - -There is one configuration file \texttt{\$GLITE\_LOCATION/etc/glite-lb/log4crc} -that startup scripts use by setting the \texttt{LOG4C\_RCPATH} environment -variable. - -A file \texttt{log4crc.example-debugging} may be useful to copy to -\texttt{\$HOME/.log4crc} (or by setting the \texttt{LOG4C\_RCPATH} environment variable -to a directory containing the \texttt{log4crc} file) to obtain detailed debugging output. -One can debug only specific parts of the LB system, for example -by uncommenting \texttt{LB.SERVER.DB} cathegory in the \texttt{log4crc} file, -one gets only the debugging info related to the underlying database subsystem calls. - - -\subsection{\LB server} - -\subsubsection{Hardware requirements} -\label{inst:hw_req} - -Hardware requirements depend on performance and storage time requirements. -Disk space used by LB server consists of database space and working space -for backup dumps and temporary files used by exports to Job Provenance and -R-GMA tables. Necessary database space can be calculated by multiplying -job retention length (job purge timeout), job submission rate, and -per-job space requirements (120\,KB per job is recommended for current common -EGEE usage pattern; jobs can consume more than that with use of very long -JDL descriptions, user tags, or very high number of resubmissions). -For temporary files, approximately 10\,GB is sufficient for LB server setups -working normally, more can be needed when backlog forms in data export -to any external service. For example, typical setup processing 40\,000 jobs per -day where all jobs are purged after 10 days needs about 58 gigabytes -($10 \cdot 40000 \cdot 120 \mbox{KB (per job)} + 10$) not accounting for operating -system and system logs. - -For smooth handling of 40\,000 jobs/day, this or better machine configuration -is necessary: -\begin{itemize} -\item 1GB RAM -\item CPU equivalent of single Xeon/Opteron 1.5GHz -\item single 7200 rpm SATA disk. -\end{itemize} -In order to achieve higher performace, following changes are recommended: -\begin{itemize} -\item Faster disks. Disk access speed is crucial for LB server, couple of 15k rpm -SCSI or SAS disks (one for MySQL database data file, the second for DB logs, LB server's -working directories, and operating system files) or RAID with battery backed -write-back cache is preferable. -\item More memory. Large RAM improves performance through memory caching, -relative speed gain is likely to be rougly proportional to memory/database size ratio. -To use 3\,GB or more efficiently, 64bit OS and MySQL server versions are recommended. -\item Faster or more processors. CPU requirements scale approximately linearly with -offered load. -\end{itemize} - -\subsubsection{Standard installation} - -Install and configure OS and basic services (certificates, CAs, time synchronization, software repositories) according to the \htmladdnormallink{https://twiki.cern.ch/twiki/bin/view/LCG/GenericInstallGuide320}{https://twiki.cern.ch/twiki/bin/view/LCG/GenericInstallGuide320}. Then glite-LB metapackage from appropriate gLite software repository should be installed. - -YAIM configuration for \emph{glite-LB} node type -(\texttt{/opt/glite/yaim/bin/yaim -c -s site-info.def -n glite-LB}) -can be done then. Available parameters specific to LB server are: - -%variable&meaning&default value &further details\\ -\begin{itemize} -\item \texttt{MYSQL\_PASSWORD} -- root password of MySQL server (mandatory) -\item \texttt{GLITE\_WMS\_LCGMON\_FILE} -- pathname of file where job state -export data are written for use by lgcmon/R-GMA -(default: \texttt{/var/glite/logging/status.log} -\item \texttt{GLITE\_LB\_EXPORT\_PURGE\_ARGS} -- purge timeouts (default: \texttt{--cleared 2d --aborted 15d --cancelled 15d --other 60d}) - -According to local retention policy you may want to use different purge timeouts (for example WLCG would need \texttt{--cleared 90d --aborted 90d --cancelled 90d --other 90d}). -\item \texttt{GLITE\_LB\_EXPORT\_ENABLED} -- set to \texttt{true} for export to JP, installed glite-lb-client and glite-jp-client are needed (default: \texttt{false}) -\item \texttt{GLITE\_LB\_EXPORT\_JPPS} -- Job Provenance Primary Storage where to export purged jobs, required if export to JP is enabled -\item \texttt{GLITE\_JP\_LOCATION} -- optional parameter for combining LB and JP subsystems on the different locations -\item \texttt{GLITE\_LB\_RTM\_ENABLED} -- enable settings for Real Time Monitor - indexes and additional access (default: false) -\item \texttt{GLITE\_LB\_RTM\_DN} -- DNs using to get notifications from \LB server\\ -(default: \texttt{heppc24.hep.ph.ic.ac.uk} machine certificate) -\item \texttt{GLITE\_LB\_SUPER\_USERS} -- additional super-users (default: empty) -\item \texttt{GLITE\_LB\_TYPE} -- type of the \LB service: server, proxy, both (default: autodetect, \LB node only: 'server', WMS node only: proxy, \LB and WMS: 'both') -\item \texttt{GLITE\_LB\_HARVESTER\_ENABLED} -- set to \texttt{true} for sending notification, used mainly for export to MSG publish system (default: \texttt{false}) -\item \texttt{GLITE\_LB\_HARVESTER\_MSG\_OPTIONS} -- additional options for MSG publish (default: \texttt{--wlcg}) -\item \texttt{GLITE\_LB\_INDEX\_OWNER} -- when specified, add (\texttt{true}) or drop (\texttt{false}) 'owner' index (default: 'owner' index not created or dropped) -\end{itemize} - -In addition to those, YAIM LB module uses following parameters: -\texttt{INSTALL\_ROOT}, \texttt{GLITE\_LOCATION\_VAR}, \texttt{GLITE\_USER}, \texttt{SITE\_EMAIL}. - -Lists separated by comma (\texttt{GLITE\_LB\_RTM\_DN} and \texttt{GLITE\_LB\_SUPER\_USERS}). - -\subsubsection{Migration to a different OS version} -\label{inst:OSmigration} -Migration of a LB server to different machine is possible using -following simple procedure (just file copy of the MySQL database). We -tested the migration from SL4 32bit (mysql 4.1.22-2) to SL5 64bit -(mysql 5.0.45-7). - -Steps: -\begin{itemize} -\item \emph{Prepare a new machine.} The new machine must get the same hostname - as the old machine had. It is a part of job ids stored in the database. -\item \emph{Move data.} Just stop the MySQL server and move - \verb'/var/lib/mysql' data directory directly to the target machine. -\item \emph{(optional) Restore file contexts.} You may need to restore file - contexts in case of enabled SELinux. For example, commands on the target - machine: - \begin{verbatim} - service mysqld stop - cd /var/lib - tar xf /tmp/lb.tar - restorecond -R mysql - service mysqld start - \end{verbatim} -\end{itemize} - -\subsubsection{Migration of database to support transactions} -Started from version 1.4.3 of the \texttt{glite-lb-server} -package, the \LB server introduced optional use of database -transactions for \LB database updates in order to improve their -performace. This feature is switched on by default when underlying -MySQL database uses transactional InnoDB tables. For new -installations, YAIM configuration process will create transactional -database automatically. For existing LB server database the migration -process is not automatically handled. - -Note: If you want to add transaction when migrating to \LB 2.0 skip -this section and use \LB 2.0 migration procedure. The migration of -database to support transactions is included in \LB 2.0 migration procedure. - -Steps: -\begin{itemize} - \item \emph{Stop the server.} Stop both a \LB server and a MySQL - server. Making a fresh backup copy of database is a good idea. - \item \emph{Database conversion.} Use provided SQL script: - \begin{quote} - \begin{verbatim} -mysql -u lbserver lbserver20 \ - zmeny offline, konfigurace -% olizovana z DB -Technically, job indices are implemented via dedicated columns -in a~database table. -These columns and their indices are scanned by the \LB server on startup, -therefore there is no specific configuration file. -Changing the index configuration is rather heavyweight operation -(depending on the number of jobs in the database), it performs -updates of all tuples in general, and it should be done when the server is not -running. - -% utilitka bkindex -- pouziti -Indices are manipulated with a~standalone utility \verb'glite-lb-bkindex' -(see its man page for complete usage reference). -A~general sequence of changing the indices is: -\begin{enumerate} -\item stop the running server -\item retrieve current index configuration -\begin{quote} -\verb'glite-lb-bkindex -d >index_file' -\end{quote} -\item edit \verb'index_file' appropriately -\item re-index the database (it may take long time) -\begin{quote} -\verb'glite-lb-bkindex -r -v index_file' -\end{quote} -\verb'-r' stands for ``really do it'', \verb'-v' is ``be verbose'' -\item start the server again -\end{enumerate} - -% format vstupniho souboru -The index description file follows the classad format, having the following grammar: -\begin{quote} -\emph{IndexFile} ::= [ JobIndices = \{ \emph{IndexList} \} ] \\ -\emph{IndexList} ::= \emph{IndexDef} $|$ \emph{IndexDef}, \emph{IndexList} \\ -\emph{IndexDef} ::= \emph{IndexColumn} $|$ \emph{ComplexIndex} \\ -\emph{IndexColumn} ::= [ type = "\emph{IndexType}"; name = "\emph{IndexName}" ]\\ -\emph{ComplexIndex} ::= \{ \emph{ColumnList} \} \\ -\emph{ColumnList} ::= \emph{IndexColumn} $|$ \emph{IndexColumn}, \emph{ColumnList} -\end{quote} - -where eligible \emph{IndexType}, \emph{IndexName} combinations are given -in Tab.~\ref{t:indexcols}. -A~template index configuration, containing indices on the most frequently -used attributes, can be found in /opt/glite/etc/glite-lb-index.conf.template. - - -\begin{table} -\begin{center} -\begin{tabularx}{.9\hsize}{|l|l|X|} -\hline -\emph{IndexType} & \emph{IndexName} & description \\ -\hline -system & owner & job owner \\ - & destination & where the job is heading to (computing element name) \\ - & location & where is the job being processed \\ - & network\_server & endpoint of WMS \\ - & stateEnterTime & time when current status was entered \\ - & lastUpdateTime & last time when the job status was updated \\ -\hline -time & \emph{state name} & when the job entered given state (Waiting, Ready, \dots) \\ -\hline -user & \emph{arbitrary} & arbitrary user tag \\ -\hline -\end{tabularx} -\end{center} -\caption{Available index column types and names} -\label{t:indexcols} -\end{table} - -% super user muze vsechno - -\subsubsection{Multiple instances} - -% lze to, i nad jednou databazi, zadna automaticka podpora - -Specific conditions (\eg debugging, different authorization setup, \dots) -may require running multiple \LB server instances -on the same machine. -Such setup is available, however, there is no specific support in automated -configuration, the additional non-default server instances must be run manually. - -The other server instance must use different ports (changed with \verb'-p' -and \verb'-w' options), as well as use different pid file (\verb'-i' option). - -The servers may or may not share the database (non-default is specified -with \verb'-m')% -\footnote{Even when sharing the database, the servers are still -partially isolated from -one another, \eg a~job \url{https://my.machine:9000/xyz} cannot be queried -as \url{https://my.machine:8000/xyz}. -However, due to implementation internals, the second job cannot be registered.}. - -Though it may have little sense to run multiple \LB proxy instances, it is possible too. -Non-default listening socket have to be specified via \verb'-p' option then. - - - -\subsubsection{Backup dumps} -\label{run:dump} - -\LB server only, not supported by proxy. - -(This functionality should not be confused with per-job dumps, Sect.~\ref{inst:purge} and \ref{run:purge}.) - -Besides setting up \LB server database on a~reliable storage or -backing it up directly (Sect.~\ref{inst:backup}) -\LB server supports backing up only incremental changes in the data. -Advantages of this approach are lower volume of data to be backed up, -and possibility to load them to another instance (\eg for heavyweight -queries which should not disturb normal operation), disadvantage is -a~more complex and more fragile setup. - -Using an external utility \verb'glite-lb-dump' (typical invocation is with -a~single option \verb'-m' \emph{server\_name:port}, see man page for -details) the server is triggered to dump events, which arrived in -a~specified time interval, into a~text file. (Default interval is from last -dump till the current time.) - -\verb'glite-lb-dump' is a~standalone client program, however, -the events are stored at server side (\ie not transferred to the client, -due to performance reasons), -in a~uniquely named text -file prefixed with the value of \verb'-D' server option. This kind of dump -contains events according to their arrival time, regardless of jobs they belong -to. - -It is sufficient to run the dump regularly (from a~cron job), with a~frequency -matching an acceptable risk of loosing data (several hours typically), and back -up the resulting dump files. - -In the event of server crash, its database should be recreated empty, -and the server started up. -Then the dump files can be loaded back with complementary -\verb'glite-lb-load' utility. - -Server privileges granting \verb'ADMIN_ACCESS' (see section~\ref{inst:authz}) are required to run \verb'glite-lb-dump' and \verb'glite-lb-load'. -Dumping the events does not interfere with normal server operation. - -This backup strategy can interfere with too aggressive setting of old -data purging (Sect.~\ref{run:purge}), -If the purging grace period is shorter than the dump interval, -events may get purged before they are captured by the backup dump. -However, this interference is unlikely (reasonable purge grace period -is several times longer than dump period), -and it is not fatal in general (data were purged on purpose either). - -\subsubsection{Purging and processing old data} -\label{run:purge} - -Primary purpose of the LB purge operation is removal of aged data from LB database. This is necessary in -production in order to prevent ever-increasing database and sustain reasonable -performance of the server. Therefore the purge should be invoked periodically. - -The purge operation has additional important ``side effect'' -- dumping the -purged data into a plain text file. These dumps can be archived ``as is'' or -uploaded to Job Provenance. - -\paragraph{Purge setup} - -The purge operation itself is performed by a~running \LB server -(there is no need to shut it down, then). -However, it is triggered with \verb'glite-lb-purge' client command -(complete usage reference is given in its man page). -A~typical invocation specifies \LB server to purge (\verb'-m' option), -and purge timeouts (grace periods) for several job states -- options -\verb'-a' (aborted), \verb'-n' (canceled), \verb'-c' (cleared), and -\verb'-o' (other). \LB versions 2.0 supports also \verb'-e' (done) option. -A~job falling in one of the four categories is purged when it has not been -touched (\ie an event arrived) for time longer than the specified category -timeout. -Suggested values are several days for aborted and canceled jobs, -and one day for cleared jobs, however, the values may strongly vary -with \LB server policy. - -Optionally, \verb'-s' purge command option instructs the server to -dump the purged data into a~file at the server side. -It's location (prefix) is given by \verb'-S' server option, -the purge command reports a~specific file name on its output. - -It is recommended (and the default YAIM setup does so, via -the \verb'glite-lb-export.sh' wrapper) to run the purge -command periodically from cron. - -Server privileges granting \verb'ADMIN_ACCESS' (see section~\ref{inst:authz}) are required to run \verb'glite-lb-purge'. - -If the server database has already grown huge, the purge operation can take -rather long and hit the \LB server operation timeout. At client side, \ie the -glite-lb-purge command, it can be increased by setting GLITE\_WMS\_QUERY\_TIMEOUT -environment variable. -Sometimes hardcoded server-side timeout can be still reached. In either case the -server fails to return a correct response to the client but the purge is done anyway. - -\LB proxy purges jobs automatically when they reach a~state ensuring that WMS will -neither query nor log events to them anymore. -Therefore routine purging is not required theoretically. -However, frozen jobs which never reach such a~state may occur in an unstable environment, -and they may cumulate in \LB proxy database for ever. -Therefore occasional purging is recommended too. -\LBver{2.x} supports \verb'-x' option of \verb'glite-lb-purge', allowing -to purge \LB proxy database too. -With \LBver{1.x} the emergency purge procedure described bellow is the only option. - -\paragraph{Emergency purge} - -When regular purge was not invoked for some time, it may happen that -the database grows huge and the regular (on-line) purge fails. -In order to work around such situation we provide an off-line emergency -purge script \verb'glite-lb-bkpurge-offline.sh' - -The script accepts the same \verb'-acno' options, and adds \verb'-d' for ``done'' jobs. -Via \verb'-p' also \LB proxy database can be purged (all \LB versions). - -On startup, a~warning message is printed and interactive confirmation -requested. -Re-check that \LB server (proxy) is not running, and carry on only when you -know what you are doing. - -\paragraph{Post-mortem statistics} - -Once a job is purged from the database, all important data about the job can be -processed offline from the corresponding dump file. The idea of post-mortem -statistics is the following: - -\begin{itemize} -\item LB server produces dump files (during each purge on regular basis), -see LB server startup script; option \verb'-D / --dump-prefix' of \verb'glite-lb-bkserverd', -\item these dumps are exported for the purposes of JP also on regular basis, -see LB/JP deplyment module; option \verb'-s/ --store' of \verb'glite-lb-lb_dump_exporter', -\item it depends on the LB server policy if dumps in this directory are used for -the statistics purposes or all files are hardlinked for example to a different -directory -\item general idea is such that data are available for statistics server that downloads -and removes dumps after download! Dump files are then processed on the statistics -server. -\end{itemize} - -What needs to be done on the LB server: -\begin{itemize} -\item \verb'glite-lb-bkserverd' and \verb'glite-lb-lb_dump_exporter' running -\item \verb'gridftp' running (allowing statistics server to download and remove files from -a given directory -\end{itemize} - - -What needs to be done on the statistics server: -\begin{itemize} -\item \verb'glite-lb-utils' package installed -\item download and remove files from the LB server -see \verb'glite-lb-statistics-gsi.sh' (shell script in the examples directory) -\item process dump files using the \verb'glite-lb-statistics' tool -see \verb'glite-lb-statistics.sh' (shell script in the examples directory) -\end{itemize} -all scripts are supposed to be run from a crontab. - - -\paragraph{Export to Job Provenance} - -An important, though currently optional, processing of \LB dumps -is their upload to the Job Provenance service for permanent preservation -of the data. - - -When enabled (via configuration environment variables, see bellow), -the export is done in two steps: -\begin{itemize} -\item \verb'glite-lb-export.sh' wrapper script, after calling \verb'glite-lb-purge', breaks up the resulting dump file on a~per-job basis. -The individual job dump files are stored in a~dedicated spool directory. -\item \verb'glite-jp-importer' daemon (installed optionally in glite-jp-client.rpm) checks the spool directory periodically, -and tries to upload the files into JP. -\end{itemize} - -Details, including the configuration variables, are covered at the following -wiki page: -\url{http://egee.cesnet.cz/mediawiki/index.php/LB_purge_and_export_to_JP}. - -\subsubsection{On-line monitoring and statistics} -\label{maintain:statistics} - -\paragraph{CE reputability rank} - -Rather frequent problem in the grid production are ``black hole'' sites (Computing Elements). -Such a~site declares itself to have an empty queue, therefore schedulers usually prefer sending -jobs there. The site accepts the job but it fails there immediately. -In this way large number of jobs can be swallowed, affecting the overall success rate -(namely for non-resubmittable jobs). - -\LB data as a~whole contain enough information to detect such sites. -However, due to the primary per-job structure certain reorganization is required. - -A~job is always assigned to a~\emph{group} according to -the CE where it is executed (cf.\ ``destination'' job state attribute). -Similarly to RRDtool\footnote{\url{http://oss.oetiker.ch/rrdtool/}} -for each recently active group (CE), -and for each job state (Ready, Scheduled, Running, Done/OK, Done/Failed), -a~fixed sized series of counters is maintained. -At time $t$, the counters cover intervals $[t-T,t]$, $[t-2T,t-T]$, \dots -where $T$ a~fixed interval size. -Whenever a~job state changes, the series matching the group and new state -is shifted eventually (dropping its expired tail), and the current counter -is incremented. -In addition, multiple series for different $T$ values (\ie covering different -total times) are available. - -% API -The data are available via statistics calls of the client API, -see \verb'statistics.h' for details (coming with glite-lb-client in \LBver{2.x}, -glite-lb-client-interface in \LBver{1.x}). -The call specifies the group and job state of interest, as well as queried -time interval. -The interval is fitted to the running counter series as accurately as possible, -and the average number of jobs per second which entered the specific state for -the given group is computed. The resolution ($T$) of the used counters is also -returned. - -\begin{sloppypar} -% successFraction(CEId) classad gLite 3.1 WMS, nedokumentovana, netestovana -In gLite 3.1 WMS the calls can be accessed from inside of the matchmaking process -via \verb'successFraction(CEId)' -JDL function. -The function computes the ratio of successful vs.\ all jobs for a~given CE, -and it can be directly used to penalize detected black hole CEs in the ranking -JDL expression. -\end{sloppypar} - - -% zapnuti na serveru, volatilita, privilegia -The functionality is enabled with \verb'--count-statistics' \LB server option -(disabled by default). - -The gathered information is currently not persistent, it is lost when the server is stopped. -Despite the statistics call API is defined in a~general way, the implementation is -restricted to a~hardcoded configuration of a~single grouping criterion (the destination), -and a~fixed set of counter series (60 counters of $T=10s$, 30 of 1 minute, and 12 of 15 minutes). -The functionality has not been very thoroughly tested yet. - -% omezeni implementace: hardcoded konfigurace, jen Rate, neprilis dukladne testovane - - - -\paragraph{glite-lb-mon} is a program for monitoring the number of jobs on the -LB server and their several statistics. It is part of the -\verb'glite-lb-utils' package, so the monitoring can be done from remote machine -where this package is installed and the enironment variable -\verb'GLITE_WMS_QUERY_SERVER' properly set. Values like minimum, average and -maximum time spent in the system are calulated for jobs that entered the -final state (Aborted, Cleared, Cancelled) in specific time (default last -hour). Also number of jobs that entered the system during this time is -calculated. - -A special bkindex configuration is needed. -The following time indices must be defined: -\begin{verbatim} - [ type = "time"; name = "submitted" ], - [ type = "time"; name = "cleared" ], - [ type = "time"; name = "aborted" ], - [ type = "time"; name = "cancelled" ], -\end{verbatim} -For more details se man page glite-lb-mon(1). - - -\paragraph{glite-lb-mon-db} is a low-level program for monitoring the the -number of jobs in the LB system. Using the LB internals, it connects directly -to the underlying MySQL database and reads the number of jobs in each state. -The tool is distributed itogether with the server in the \verb'glite-lb-server' package. -It can be used to read data also from the database of LB Proxy. -For more details se man page glite-lb-mon-db(1). - - -\paragraph{Subjob states in a collection} can be calculated on demand on the server and -returned as a histogram using standard job status query. There are two ways how to obtain the -histogram: -\begin{itemize} -\item fast histograms, the last known states are returned, see e.g. -\begin{verbatim} - glite-lb-job_status -fasthist -\end{verbatim} -\item full histograms. the states of all collection subjobs are recalculated, see o.g. -\begin{verbatim} - glite-lb-job_status -fullhist -\end{verbatim} -\end{itemize} -The command \verb'glite-lb-job_status' is a low level query program that can be -found in the package \verb'glite-lb-client' among examples. - - -%\subsection{\LB proxy} - -%\TODO{ljocha} -%Purge zamrzlych jobu (overit v kodu, na ktere verzi to mame ) - - -\subsection{\LB logger} - -\iffalse -\TODO{ljocha} - -Karantena (od ktere verze to mame?) -- kdyz se nepodari rozparsovat soubor -- client/examples -- parse-logevent-file??, lze pouzit - -Cistky pri zaseknuti, nesmyslna jobid apod. - -Debugovaci rezim - -Notifikacni IL -\fi - -The logger component (implemented by \verb'glite-lb-interlogd' daemon fed by -either \verb'glite-lb-logd' or \LB proxy) -is responsible for the store-and-forward event delivery in \LB -(Sect~\ref{comp:logger}). -Therefore eventual operational problems are related mostly to -cumulating undelivered events. - -\subsubsection{Event files} - -\LB logger stores events in one file per job, named -\verb'$GLITE_LOCATION_VAR/log/dglogd.log.JOBID' by default -(JOBID is only the part after the \LB server address prefix). -The format is text (ULM~\cite{ulm}), one event per line. -In addition, control information on delivery status is stored in additional -file with \verb'.ctl' suffix. - -\begin{sloppypar} -In case of emergency (\eg corrupted file) the files can be examined -with \verb'glite-lb-parse_eventsfile' % -\footnote{Not fully supported tool, installed by \texttt{glite-lb-client} package among examples.}. -It is possible to hand-edit the event files in emergency (remove corrupted lines). -However, glite-lb-interlogd must not be running, and the corresponding .ctl file -must be removed. -\end{sloppypar} - -\subsubsection{Backlog reasons} - -\paragraph{Undeliverable jobid.} -In normal gLite job processing, jobids are verified on job submission -(via synchronous job registration, see~\cite{lbug}), hence occurrence of -undeliverable jobid (\ie its prefix does not point to -a~working \LB server) is unlikely. -On the other hand, if it happens, -and an event with such a~jobid is logged, -\eg due to a~third-party job processing software bug, -glite-lb-interlogd keeps trying to deliver it indefinitely% -\footnote{Unless event expiration is set, though it is not done for normal events.}. -The unsuccessful attempts are reported via syslog. -The only solution is manual -removal of the corresponding files -and restart of the service. - -\paragraph{Corrupted event file.} -For various reasons the files may get corrupted. -In general, corrupted file is detected by glite-lb-interlogd, and it is moved -to \emph{quarantine} (by renaming the file to contain ``quarantine'' in its name). -The action is reported in syslog. -The renamed files can be removed or repaired by hand and renamed back -for glite-lb-interlogd to pick them up again -(in this case, the service needn't be stopped). - -\paragraph{Slow delivery.} -Either glite-lb-interlogd or the target \LB server(s) may not keep pace -with the incoming stream of events. -Amount of such backlog can be quickly assessed by looking at timestamps of the oldest -event files (with \verb'ls -lt $GLITE_LOCATION_VAR/log/', for example). -Fully processed event files are deleted in approx. one minute intervals, -so files last modified one minute ago or newer do not constitute backlog at all. -Unless the backlog situation is permanent, no specific action is required---the -event backlog decreases once the source is drained. -Otherwise hardware bottlenecks (CPU, disk, network) have to be identified -(with standard OS monitoring) and removed, see sections~\ref{inst:hw_req} and -\ref{inst:db_tuning} for \LB server tuning tips. In order to maximize -performance of \verb'glite-lb-interlogd', it is recommended to distribute -jobs to multiple \LB servers that can be shared by multiple WMS setups in turn. - -\subsubsection{Notification delivery} -\begin{sloppypar} -When \verb'glite-lb-logger' package is optionally installed with \LB server, -a~modified \verb'glite-lb-notif-interlogd' is run by the server startup -script. -This version of the daemon is specialized for \LB notifications delivery; -it uses the same mechanism, however, the events (notifications) are routed -by \emph{notification id} rather than jobid, and targeted to user's listeners, -not \LB servers. -See~\cite{lbug, lbdg} for details. -\end{sloppypar} - -On the contrary to normal events, it is more likely that the event destination -disappears permanently. -Therefore the notification events have their expiration time set, -and glite-lb-interlogd purges expired undelivered notifications by default. -Therefore the need for manual purge is even less likely. - -The event files have different prefix (\verb'/var/tmp/glite-lb-notif' by default). - -\subsubsection{Debug mode} - -All the logger daemons, \ie glite-lb-logd, glite-lb-interlogd, and -glite-lb-notif-interlogd, can be started with \verb'-d' -to avoid detaching control terminal, and \verb'-v' to increase -debug message verbosity. -See manual pages for details. - -\subsection{Used resources} -\label{run:resources} - -\subsubsection{Server and proxy} - -\begin{description} -\item[Processes and threads.] -By default \LB server runs as one master process, -and 10 slave processes. -Threads are not used. - -Master pid is stored in the file \verb'$HOME/edg-bkserverd.pid' (\LBver{1.x}) -or in the file \verb'$HOME/glite-lb-bkserverd.pid' (\LBver{2.x}) respectively. -Number of slaves can be set with \verb'-s, --slaves' option, -pid file location with~\verb'-i, --pidfile'. - -Slave server processes are restarted regularly in order to prevent -memory leakage. - -\item[Network and UNIX ports.] -\LB server listens on port 9000 for incoming queries, -9001 for incoming events, and 9003 for WS interface queries. -The former two can be changed with \verb'-p, --port' option -(incoming events are always one port higher than queries), -the latter with~\verb'-w, --wsport'. - -When \LB notifications are enabled (automatically in server startup script when -glite-lb-logger is also installed with the server), -\verb'/tmp/glite-lb-notif.sock' is used for communication with notification interlogger. -It can be changed with \verb'--notif-il-sock'. - -\LB proxy communicates on two UNIX sockets: -\verb'/tmp/lb_proxy_server.sock' (queries) and -\verb'/tmp/lb_proxy_store.sock' (incoming events). - -\LBver{2.x}: as proxy and server are merged, the mode of operation determines -the actual server ports (network or UNIX). -Notifications are not delivered from proxy-only mode. - -\item[IPC.] \LBver{1.x} only: mutual exclusion of server slaves is done -via SYSV semaphores. The semset key is obtained by calling ftok(3) on -the pid file. - -\LBver{2.x} does not use semaphores anymore. - -\item[Database.] -Server data are stored in MySQL database. Normal setup assumes ``server scenario'', -\ie the database IS NOT protected with password and it is not accessible over network. -Option \verb'-m user/password@machine:database' can be used to change -the default connect string \verb'lbserver/@localhost:lbserver20'. - -\item[Dump files.] -Backup dump (Sect.~\ref{run:dump}) files are stored in -\verb'/tmp/dump' by default, however, gLite startup script uses -\verb'--dump-prefix' option to relocate them into \verb'$GLITE_LOCATION_VAR/dump'. -Similarly dumps resulting from purge operation (Sect.~\ref{run:purge}) -go to \verb'/tmp/purge' by default, and startup script uses \verb'--purge-prefix' -to set \verb'$GLITE_LOCATION_VAR/purge'. - -When export to Job Provenance is enabled (Sect.~\ref{run:purge}) -job registrations are exported to directory \verb'/tmp/jpreg' -overridden in startup script with \verb'--jpreg-dir' to \verb'$GLITE_LOCATION_VAR/jpreg'. -In addition, dump files are further processed in \verb'GLITE_LOCATION_VAR/jpdump'. - -Normal operation of JP export should not leave any files behind, -however, abnormal situations (JP unavailable for longer time etc.) -may start filling the disk space. Therefore periodic checks are -recommended. - -Also when purge and dump operations are invoked resulting files are left in their -directories and it is the responsibility of the operation caller to clean them up. - -\item[Notifications] -(see above with Network ports) are stored in files with \verb'/var/tmp/glite-lb-notif' -prefix. It can be changed with \verb'--notif-il-fprefix'. - -Normal operation of notification interlogger purges these files when -they are either delivered or expire. - -\end{description} - -\subsubsection{Logger} - -\begin{description} -\item[Processes and threads.] -glite-lb-logd uses one permanent process and forks a~child to serve -each incoming connection. - -glite-lb-interlogd (and derived glite-lb-notif-interlogd) is multithreaded: -one thread for handling input, another for recovery, and a~dynamic pool of others -to deliver events to their destinations. - -\item[Network and UNIX ports.] -glite-lb-logd listens on 9002 (can be changed with \verb'-p' option). -The daemons communicate over UNIX socket \verb'/tmp/interlogger.sock', -can be changed with \verb'-s' (for both daemons simultaneously). - -\item[Event files] are stored -with prefix \verb'/var/glite/log/dglogd.log' (changed with \verb'-f'). - - -\end{description} - diff --git a/org.glite.lb.doc/src/LBAG-Troubleshooting.tex b/org.glite.lb.doc/src/LBAG-Troubleshooting.tex deleted file mode 100644 index 9057846..0000000 --- a/org.glite.lb.doc/src/LBAG-Troubleshooting.tex +++ /dev/null @@ -1,32 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -\section{Troubleshooting} - -\TODO{gather information and finish the section} - -\iffalse -\TODO{ljocha, salvet} - -\begin{verbatim} -- is it documented what information is useful to debug the problem? - -- co muze administrator udelat sam (vystup z jakych prikazu, logu, gdb bt, ...), -co s nasi pomoci (dat Zdenkovi pristup a pod. :-) - -- kam poslat email, kde submitnout bug a pod. -\end{verbatim} -\fi diff --git a/org.glite.lb.doc/src/LBAG.tex b/org.glite.lb.doc/src/LBAG.tex deleted file mode 100644 index 8748379..0000000 --- a/org.glite.lb.doc/src/LBAG.tex +++ /dev/null @@ -1,62 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -\documentclass{egee} -\def\insideAG{} - -\input{definitions} - -\title{Logging and Bookkeeping} -\Subtitle{Administrator's Guide} -\author{CESNET EGEE III JRA1 and SA3 team} -\DocIdentifier{glite-lb-doc-ag-\version} -\DeliverableId{} -\Date{\today} -\Activity{JRA1: Middleware Engineering} -\DocStatus{FINAL, version \version} -\Dissemination{PUBLIC} -\DocumentLink{\url{http://egee.cesnet.cz/cvsweb/LB/LBAG.pdf}} -\Abstract{\input{LBAG-Abstract}} - -\begin{document} - -\input{frontmatter} -\newpage -\tableofcontents - -\newpage -\input{versions} - -\newpage -\input{LBAG-Introduction} - -\newpage -\input{LBAG-Installation} - -%\newpage -%\input{LBAG-Configuration} - -\newpage -\input{LBAG-Running} - -\newpage -\input{LBAG-Troubleshooting} - -\nocite{jgc} -\bibliographystyle{unsrt} -\bibliography{lbjp} - -\end{document} diff --git a/org.glite.lb.doc/src/LBDG-Abstract.tex b/org.glite.lb.doc/src/LBDG-Abstract.tex deleted file mode 100644 index 6c4fdb2..0000000 --- a/org.glite.lb.doc/src/LBDG-Abstract.tex +++ /dev/null @@ -1,22 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -% when changed, update also http://egee.cesnet.cz/en/JRA1/LB/lb.html -% (in CVSROOT=:gserver:lindir.ics.muni.cz:/cvs/edg, cvsweb/lb.html) -This developer's guide explains how to use the Logging and Bookkeeping (\LB) -service API. Logging (producer), querying (consumer) and notification API as -well as the Web Services Interface is described in details together with -programing examples. diff --git a/org.glite.lb.doc/src/LBDG-Introduction.tex b/org.glite.lb.doc/src/LBDG-Introduction.tex deleted file mode 100644 index 80248d0..0000000 --- a/org.glite.lb.doc/src/LBDG-Introduction.tex +++ /dev/null @@ -1,623 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -% -*- mode: latex -*- - -\section{Introduction} - -This document is intented to guide the reader through basic steps -of writing, compiling and running programs communicating with the \LB -service using the \LB library. It is not intended as a complete API -reference; for this, the reader is referred to the C or C++ header -files, which are thoroughly documented using the doxygen--style -comments. - -The \LB API can be divided by functionality into two independent -parts: -\begin{itemize} -\item \textit{\LB Producer API} (section \ref{s:Producer-API}) is used -to create and send events to the \LB server (proxy), -\item \textit{\LB Consumer API} (section \ref{s:Consumer-API}) and \textit{\LB -Notification API} (section \ref{s:Notification-API}) are used to obtain -information from the \LB server (proxy). -\end{itemize} -These two parts (and in fact the whole \LB service implementation) -share a number of common concepts, design principles, data types and -functions which we will describe first. Most of common data types and -functions are separated in its own SW module called -\verb'org.glite.lb.common' and are described in section~\ref{s:common} - -\marginpar{Example code}% -Source code for examples shown in this guide is distributed together -with the document. The examples contain excerpts from the actual files -with reference to the file name and line numbers. All the examples can -be compiled using attached Makefile. - -\marginpar{Recommended reading}% -Before you start reading this guide, it is recommended to accomodate -yourself with the \LB architecture described in the first part of the -\LB user's guide (\cite{lbug}). - - -\subsection{Language Bindings} -The \LB library itself is developed in C language, the C API covers -all the \LB services. There are bindings for other languages (C++, -Java) as well as web-service (WS) based interface, but these cover only -subsets of \LB functionality and internally they use the C API -themselves (in the C++ case the C API is also exported). - -We describe the C API first and then the differences between C and the -other languages, as the C constructs often reflect directly. - -As for the \LB\ WS interface, it reflects only the functionality of -\LB\ Querying API (see Sect.~\ref{s:Consumer-API-WS}). - -There exist also HTML and plain text interfaces to \LB. We do not expect anybody using them -in a programming language (though it is possible), they might be useful rather in -scripts. Their usage is rather straightforward as it is described in the User's Guide \cite{lbug}. - - -\subsection{Getting and Building Client Libraries} - -All C and C++ \LB\ API's are implemented in \LB\ client library -(\verb'glite-lb-client' package of standard gLite distribution), -and \LB common library (\verb'glite-lb-common'). -These bring in other gLite dependencies: -\begin{itemize} -\item \verb'glite-lb-client-interface' (\LBver{1.x} only) -\item \verb'glite-security-gsoap-plugin' (\LBver{1.x} only) -\item \verb'glite-security-gss' (\LBver{2.x} only) -\end{itemize} -and external dependencies: -\begin{itemize} -\item globus -- only GSS library is needed, we use -\verb'vdt_globus_essentials' package from VDT if available. -\item expat -- XML parser, available in most operating systems -\item c-ares -- asynchronous resolver library -\item cppunit -- unit tests library, required for build only -\item classads -- ClassAd parser and matchmaking library from Condor -\end{itemize} - -For platforms supported by gLite officially all the required packages -can be downloaded from \url{http://www.glite.org}. -However, \LB\ is fairly portable and it can be built on other -platforms fairly smoothly. - -Detailed instructions on getting the sources, including the required -dependencies, are available at -\url{https://erebor.ics.muni.cz/wiki/lb_build.html} -\footnote{The location may change -but we will keep it linked from -official \LB\ pages -\url{http://egee.cesnet.cz/en/JRA1/LB/}.}. - - -\subsection{General Guidelines} - -\marginpar{Naming conventions}% -All names exported by the \LB library (function names, symbolic -constants) are prefixed to avoid name clashes. The prefix is -\verb'edg_wll_' for function names and \verb'EDG_WLL_' for -symbolic constants\footnote{The EDG\_WLL\_ stands for European -DataGrid, the original EU project, and Workload Logging, the subsystem -identification.}. In C++ the namespace \verb'glite::lb' is used -instead. - -\marginpar{Symbolic constants}% -Symbolic constants (\ie enumerated types) are used at various places in the \LB -API. There is a user--friendly string representation of each -constant and for each enumerated type there are two functions that -convert strings to enum values and vice versa. Example is given in -section~\ref{s:edg_wll_Event} - -\marginpar{Input and output arguments}% -All input arguments in \LB API are designated \verb'const' (for simple -types) or have \verb'const' in type name (for structures). - -If pointers are passed in output of function call (either as a return -value, output argument or part of structure), the corresponding -objects are \emph{always} allocated dynamically and have to be freed -when not used anymore. Structures defined in \LB API can be -deallocated by calling convenience -\verb'edg_wll_Free'\textit{Type}\verb'()' functions. {\it This -deallocates members of the structure, but not the structure itself. It -has to be \verb'free()''d explicitly.} - -\marginpar{Opaque and transparent types}% -Types used in \LB API are either opaque or transparent. \textit{Opaque -types} are considered internal to the library, their structure is not -exposed to users and is subject to change without notice. The only way -to modify opaque objects is to use API calls. Example of opaque type -is \verb'edg_wll_Context'. - -Structure of \textit{transparent types} is completely visible to -user, is well documented and no incompatible changes will be done -without notice. Example of transparent type is -\verb'edg_wll_Event'. - -\marginpar{Return values}% -The return type of most of the API functions is \verb'int'. -Unless specified otherwise, zero return value means success, non-zero -failure. Standard error codes from \verb'errno.h' are used as -much as possible. In a few cases the error can not be intuitively -mapped into standard code and \LB specific error value greater than -\verb'EDG_WLL_ERROR_BASE' is returned. - -Few API function return \verb'char *'. In such a~case -\verb'NULL' indicates an error, non-null value means success. - -\subsection{Context and Parameter Settings} -\label{s:context} - -The \LB library does not maintain internal state (apart of network -connections, see \ref{s:pool}), all the API -functions refer to a~\emph{context} argument instead. -Context object preserves state information among the various API -calls, the state including \LB library parameters (\eg security -context, server addresses, timeouts), reference to open connections -(connection pool), error state etc. - -The API caller can create many context objects which are guaranteed -to be independent on one another. In this way thread--safety of the -library is achieved as long as the context is not used by more threads -at the same time. One thread may use more than one context, though. -w -Upon context initialization, all the parameters are assigned default -values. If not set explicitly, many of the parameters take their -value from environment variables. If the corresponding environment -variable is set, the parameter is initialized to its value instead of -the default. Note that a~few parameters cannot be assigned default -value; consequently setting them either in environment or with an -explicit API call is mandatory before using the appropriate part of -the API. - -The context also stores details on errors of the recent API call. - -For use with the \emph{producer} calls (see section~\ref{s:Producer-API}) -the context has to be assigned a~single \jobid (with the -\verb'edg_wll_SetLoggingJob()' call), and keeps track of an event -\emph{sequence code} for the job (see also \LB Architecture described in \cite{lbug}). - -The context object and its API functions are described more thoroughly -in section~\ref{s:edg_wll_context} - -\subsection{Connection Pool} -\label{s:pool} -The \LB library maintains pool of client--server connections to -improve performance (creating SSL connection is heavy--weight -operation). The connections are transparently shared and reused by all -contexts/threads to eliminate the overhead of secure channel -establishment. This behaviour is completely hidden by the library. - - - -\section{\LB Common Components} -\label{s:common} - -\subsection{C Language Binding} - -\subsubsection{Header Files} - -Header files for the common structures and functions are summarized in -table~\ref{t:cheaders}. If you use the producer and/or consumer API -described further in this document, you do not have to include them -explicitly. - -\begin{table}[h] -\begin{tabularx}{\textwidth}{>{\tt}lX} -glite/jobid/cjobid.h & Definition of job identifier. \\ -glite/lb/context.h & Definition of context structure and parameters. \\ -glite/lb/events.h & \LB event data structure.\\ -glite/lb/jobstat.h & Job status structure returned by consumer API.\\ -\end{tabularx} -\caption{Header files for common structures} -\label{t:cheaders} -\end{table} - -\subsubsection{Building Client Programs} -The easiest way to build programs using the \LB library in C is to use -GNU's libtool to take care of all the dependencies: -\begin{verbatim} -flavour=gcc32dbg -libtool --mode=compile gcc -c example1.c util.c \ - -I\$GLITE_LOCATION/include -D_GNU_SOURCE -libtool --mode=link gcc -o example1 example1.o util.o \ - -L$GLITE_LOCATION/lib -lglite_lb_client_$flavour -\end{verbatim} -The library comes in different flavours (with/without debugging -symbols, with/without thread support) which are in turn linked with -(and depend on) the correct Globus library flavours. When linking -threaded programs you have to use the library flavour with thread -support. - -The RPM package needed is \texttt{glite-lb-client} and its dependencies -which contain all necessary libraries. - -\subsubsection{Context} -\label{s:edg_wll_context} -\marginpar{Context initialization}% -Opaque data structure representing \LB API context (see -section~\ref{s:context}) is named \verb'edg_wll_Context'. -The context must be initialized before the first \LB API call: -\begin{lstlisting} -#include - -edg_wll_Context ctx; -edg_wll_InitContext(&ctx); -\end{lstlisting} - -\marginpar{Parameter setting}% -The context parameters can be set explicitly by calling -\begin{lstlisting} -int edg_wll_SetParam(edg_wll_Context *, edg_wll_ContextParam, ...); -\end{lstlisting} -function. The second argument is symbolic name of the context -parameter; parameters specific for producer and consumer API are -described in respective API sections, the common parameters are: - -\begin{table}[h] -\begin{tabularx}{\textwidth}{lX} -{\bf C name} & {\bf Description} \\ -\hline -\lstinline'EDG_WLL_PARAM_X509_KEY' & -Key file to use for authentication. -\par {\it Type: } \lstinline'char *' -\par {\it Environment: } \lstinline'X509_USER_KEY' -\\ -\lstinline'EDG_WLL_PARAM_X509_CERT' & -Certificate file to use for authentication. -\par {\it Type: } \lstinline'char *' -\par {\it Environment: } \lstinline'X509_USER_CERT' -\\ -\lstinline'EDG_WLL_PARAM_CONNPOOL_SIZE' & -Maximum number of open connections maintained by the library. -\par {\it Type: } \lstinline'int' -\par {\it Environment: } \\ -\end{tabularx} -\caption{Common context parameters} -\label{t:cparam} -\end{table} - -The third argument is parameter value, which can be of type -\verb'int', \verb'char *' or \verb'struct timeval *'. -If the parameter value is set to \verb'NULL' (or 0), the -parameter is reset to the default value. - -If you want to obtain current value of some context parameter, call -\begin{lstlisting} -int edg_wll_GetParam(edg_wll_Context, edg_wll_ContextParam, ...); -\end{lstlisting} -function: -\begin{lstlisting} -char *cert_file; - -edg_wll_GetParam(ctx, EDG_WLL_PARAM_X509_CERT, &cert_file); -printf("Certificate used: %s\n", cert_file); -free(cert_file); -\end{lstlisting} -The third argument points at variable with type corresponding to the -requested parameter. Do not forget to free the result. - -\TODO{sitera: Mame odkaz kde jsou popsany defaulty a vazby na promenne environmentu (ty jsou v LBUG Appendix C)} - -\marginpar{Obtaining error details}% -When \LB API call returns error, additional details can be obtained -from the context: -\begin{lstlisting} -char *err_text,*err_desc; - -edg_wll_Error(ctx, &err_text, &err_desc); -fprintf(stderr, "LB library error: %s (%s)\n", err_text, err_desc); -free(err_text); -free(err_desc); -\end{lstlisting} - -\marginpar{Context deallocation}% -If the context is needed no more, deallocate it: -\begin{lstlisting} -edg_wll_FreeContext(ctx); -\end{lstlisting} - -For more information see file \verb'glite/lb/context.h' - -\subsubsection{JobId} -The primary entity of \LB is a job, identified by JobId -- a unique -identifier of the job (see also \cite{lbug}). The type representing -the JobId is opaque \verb'glite_jobid_t'. The JobId is in fact -just URL with \verb'https' protocol, path component being unique string -with no further structure and host and port designating the \LB server -holding the job information. The JobId can be: -\begin{itemize} -\item created new for given \LB server (the unique part will be -generated by the \LB library): -\begin{lstlisting} -glite_jobid_t jobid; -int ret; -if(ret = glite_jobid_create("some.host", 0, &jobid)) { - fprintf(stderr, "error creating jobid: %s\n", strerror(ret)); -} -\end{lstlisting} -\item parsed from string (\eg when given as an program argument or -read from file): -\begin{lstlisting}[firstnumber=3] -if(ret = glite_jobid_parse("https://some.host:9000/OirOgeWh_F9sfMZjnIPYhQ", &jobid)) { - fprintf(stderr, "error parsing jobid: %s\n", strerror(ret)); -} -\end{lstlisting} -\item or obtained as part of \LB server query result. -\end{itemize} -In either case the jobid must be freed when no longer in use: -\begin{lstlisting} -glite_jobid_free(jobid); -\end{lstlisting} - -For more information see file \verb'glite/jobid/cjobid.h' - -\marginpar{\textbf{\LB 1.x}}% -{\it In the older \LB versions (1.x) the -structure was named \verb'edg_wlc_JobId' and the functions had prefix -\verb'edg_wlc_JobId', \eg\verb'edg_wlc_JobIdFree()'. Exact description -can be found in the header file \verb'glite/wmsutils/cjobid.h'} - - -\subsubsection{Event} - -\label{s:edg_wll_Event} -The transparent data structure \verb'edg_wll_Event' represents \LB -event, atomic data unit received and processed by \LB. It is a union of -common structure and structures for all event types: -\begin{lstlisting} -union _edg_wll_Event { - edg_wll_EventCode type; - edg_wll_AnyEvent any; - edg_wll_TransferEvent transfer; - edg_wll_AcceptedEvent accepted; - //* \dots {\it more follows} \dots -} -typedef union _edg_wll_Event edg_wll_Event; -\end{lstlisting} - -The most important common event attributes are listed in -table~\ref{t:cevent}, the following example shows access: -\begin{lstlisting} -edg_wll_Event event; - -event.type = 0; -event.any.user = "me"; -\end{lstlisting} - -\begin{table}[h] -\begin{tabularx}{\textwidth}{llX} -\bf Attribute name & \bf Attribute type & \bf Description \\ -\hline -\verb'type' & \verb'edg_wll_EventCode' & Event type. Values are -symbolic constants \eg \verb'EDG_WLL_EVENT_DONE' \\ -\verb'jobId' & \verb'glite_jobid_t' & Jobid of the job the event -belongs to. \\ -\verb'user' & \verb'char*' & Identity (certificate subject) of the -event sender. \\ -\verb'host' & \verb'char*' & Hostname of the machine the event was -sent from. \\ -\verb'source' & \verb'edg_wll_Source' & Designation of the WMS component -the event was sent from, \eg \verb'EDG_WLL_SOURCE_USER_INTERFACE' \\ -\verb'timestamp' & \verb'struct timeval' & Time when the event was -generated. \\ -\verb'seqcode' & \verb'char*' & Sequence code assigned to the event. \\ -\end{tabularx} -\caption{Common event attributes} -\label{t:cevent} -\end{table} - -The \verb'edg_wll_Event' is returned by consumer \LB -API job event related calls. The only important operation defined on -\verb'edg_wll_Event' itself is -\begin{lstlisting} -edg_wll_FreeEvent(edg_wll_Event *event) -\end{lstlisting} -to free the event structure. - -\marginpar{List of event types}% -The event structure makes use of enumerated types extensively, -starting with the \verb'type' atribute. The following example -demonstrates how to convert enumerated values into more -user--friendly strings; it will print out the event names known to the -\LB library: -\begin{lstlisting} -edg_wll_EventCode ev_type; - -for(ev_type = 1; ev_type < EDG_WLL_EVENT__LAST; ev_type++) { - char *ev_string = edg_wll_EventToString(ev_type); - if(ev_string) { - /* there may be holes */ - printf("%s\n", ev_string); - free(ev_string); - } -} -\end{lstlisting} - -For more information see file \verb'include/glite/lb/events.h' - -\subsubsection{JobStatus} -The transparent data type \verb'edg_wll_JobStat' represents status of -a job as computed by the \LB from received events. Much like the -\verb'edg_wll_Event' structure it can be viewed as a set of -attributes, where some attributes are common and some specific -for a given job state (but unlike the \verb'edg_wll_Event' it is not -implemented as union of structs but rather as one big struct). -Generally speaking, when the attribute value is set, it is a valid -part of job state description. Most important common attributes are -summarized in table~\ref{t:cstatus}. - - - -\begin{table}[h] -\begin{tabularx}{\linewidth}{llX} -\bf Attribute name & \bf Attribute type & \bf Description \\ -\hline -\verb'jobId' & \verb'glite_jobid_t' & Job identifier of this job. \\ -\verb'state' & \verb'edg_wll_JobStatCode' & Numeric code of the status, \eg -\verb'EDG_WLL_JOB_SUBMITTED'. \\ -\verb'type' & \verb'enum edg_wll_StatJobtype' & Type of the job, \eg -\verb'EDG_WLL_JOB_SIMPLE'. \\ -\verb'children' & \verb'char**' & List of subjob \jobid's \\ -\verb'owner' & \verb'char*' & Owner (certificate subject) of the -job. \\ -\end{tabularx} -\caption{Common job status attributes}\label{t:cstatus} - -\end{table} - -Job status structure is returned by the \LB consumer API job status -queries. When no longer used, it has to be freed by calling -\begin{lstlisting} -void edg_wll_FreeStatus(edg_wll_JobStat *); -\end{lstlisting} - -The following example prints out the states of jobs given in the input -list; the job states are printed together with their subjobs on the -same input list: -\lstinputlisting[title={\bf File: }\lstname,firstline=12,numbers=left]{util.c} - -For more information see file \verb'include/glite/lb/jobstat.h' - -\subsection{C++ Language Binding} -The C++ languague binding now only supports the consumer (querying) -API. It is not the (re)implementation of the library in C++; instead -it is just a thin adaptation layer on top of the C API, which means -all the structures and functions of the C API can be used in C++. The -C++ classes wrap up the concepts and structures of C API and provide -convenient access to the functionality. The namespace used for -\LB C++ API is \verb'glite::lb'. - -\marginpar{Exceptions}% -While the C++ API closely follows the C API functionality, there are -also two important differences: error handling and memory management. - -When the \LB method call fails, the exception of class -\verb'glite::lb::Exception' (derived from \verb'std::runtime_error') -is raised that holds the error description and information about the -source file, line and method the exception was thrown from (possibly -accumulating information from other exception). - -\marginpar{Reference counting}% -When the C \LB library calls return allocated structures, they are -encapsulated within C++ accessor objects. Copying the C++ object does -not copy the underlying structure, it increases the reference count -instead, making use of the same allocated data. The reference count is -decremented with destruction of the wrapper object, when it drops to -zero, the allocated memory is freed. - -Using this scheme all the data allocated by the \LB library are held -in memory only once. - -\marginpar{Context}% -The context in C API is part of common components, the C++ API on the -other hand differentiates between query context -(see Section~\ref{s:ServerConnection}) and logging context; the description is -therefore part of the respective chapters. - -\subsubsection{Header Files} -Header files for the C++ version of common definitions are summarized -in table~\ref{t:cppheaders}. - -\begin{table}[h] -\begin{tabularx}{\textwidth}{>{\tt}lX} -glite/jobid/JobId.h & Definition of job identifier. \\ -glite/lb/LoggingExceptions.h & Exception class for \LB--specific errors.\\ -\end{tabularx} -\caption{Header file for common C++ classes} -\label{t:cppheaders} - -\end{table} - -\subsubsection{Building Programs} -The recommended way to build programs using the C++ \LB library is, -like in the C case, to use the \verb'libtool' utility: -\begin{verbatim} -flavour=gcc32dbg -libtool --mode=compile gcc -c example1.c util.c \ - -I\$GLITE_LOCATION/include -D_GNU_SOURCE -libtool --mode=link gcc -o example1 example1.o util.o \ - -L$GLITE_LOCATION/lib -lglite_lb_clientpp_$flavour -\end{verbatim} -The only difference is the library name, the RPM package required is -again \verb'glite-lb-client'. - -\subsubsection{JobId} -The \verb'glite::jobid::JobId' class represents job identification and -provides convenient methods for manipulating the data. The -\verb'JobId' object can be created: -\begin{itemize} -\item from the C structure (this is used mainly internally within the -library): -\begin{lstlisting} -using namespace glite::jobid; -glite_jobid_t cjobid; - -JobId jobid(cjobid); -\end{lstlisting} -\emph{Note:} This creates copy of the structure, the original structure has to be -deallocated as usual. -\item parsed from the string: -\begin{lstlisting} -JobId jobid("https://some.host:9000/OirOgeWh_F9sfMZjnIPYhQ"); -\end{lstlisting} -\item from the components: -\begin{lstlisting} -JobId jobid(Hostname("some.host"), 9000, "OirOgeWh_F9sfMZjnIPYhQ"); -\end{lstlisting} -The last two arguments are optional, so you have to specify only -name of the \LB server machine (the \verb'Hostname' class is used to -disambiguate the constructors): -\begin{lstlisting} -JobId jobid(Hostname("some.host")); -\end{lstlisting} -In that case new unique part is generated automatically. -\end{itemize} -Apart from that there are the usual copy constructor and assignment -operator that make deep copy of the object, and the destructor that -deallocates the memory. - -\marginpar{Data access}% -The \verb'JobId' class provides methods for obtaining the host, port -and unique part of the \jobid\ as well as conversion into C -\verb'glite_jobid_t' type and into string representation. There is -also a defined ordering (\verb'operator<') on the \jobid's, which is just the -lexicographical ordering of corresponding string -representations. The following example illustrates these features: - -\begin{lstlisting} -JobId a(Hostname("me")); -JobId b(Hostname("me")); - -cout << "jobid host and port: " << a.host() << ", " << -a.port() << endl; -cout << (a < b) ? a.unique() : b.unique() << " comes first" << endl; -cout << "Complete jobid: " << a.toString() << endl; -\end{lstlisting} - -\subsubsection{Exception} -The \verb'glite::lb::Exception' is a base class for all exceptions -thrown by the \LB library. It inherits from \verb'std::runtime_error' -and adds no additional members or methods except constructors. The -typical usage is this: -\begin{lstlisting} -try { - // some code with LB calls -} catch (glite::lb::Exception &e) { - cerr << "LB library exception: " << e.what() << endl; -} -\end{lstlisting} diff --git a/org.glite.lb.doc/src/LBDG.tex b/org.glite.lb.doc/src/LBDG.tex deleted file mode 100644 index 4120810..0000000 --- a/org.glite.lb.doc/src/LBDG.tex +++ /dev/null @@ -1,110 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -% -*- mode: latex -*- -\documentclass{egee} -\def\insideDG{} - -\input{definitions} -%\def\LB{LB\xspace} - -\title{Logging and Bookkeeping} -\Subtitle{Developer's Guide} -\author{CESNET EGEE III JRA1 and SA3 team} -\DocIdentifier{glite-lb-doc-dg-\version} -\DeliverableId{} -\Date{\today} -\Activity{JRA1: Middleware Engineering} -\DocStatus{DRAFT, version \version} -\Dissemination{PUBLIC} -\DocumentLink{\url{http://egee.cesnet.cz/cvsweb/LB/LBDG.pdf}} -\Abstract{\input{LBDG-Abstract}} - -\usepackage{listings} -\usepackage{amsmath} - -%\setlength{\marginparwidth}{1.2in} -\let\oldmarginpar\marginpar -\renewcommand\marginpar[1]{\-\oldmarginpar[\raggedleft\footnotesize #1]% -{\raggedright\footnotesize #1}} - -\begin{document} -\reversemarginpar -\lstset{language=C,basicstyle=\footnotesize,numbers=none,breaklines=true} -%\lstset{title={\bf File: }\lstname} -\lstset{rangeprefix=/*,rangesuffix=*/,includerangemarker=false} -\lstset{escapeinside={//*}{\^^M}} - -% ----- BEGIN COPY ----- -% copied from org.glite.lb.client/doc/api/api.tex in hope it could be useful - -%\parindent=0pt -%\parskip=\smallskipamount - -\makeatletter -\def\jobid{\textit{JobId}\xspace} -\def\@tti[#1]{\item[{\normalfont\texttt{#1}}]\catcode`\_=8} -\def\tti{\catcode`\_=11\noexpand\@tti} -\newlength{\tw} - -\def\synopsis{\catcode`\_=11\noexpand\@synopsis} -\def\@synopsis#1#2{ -\tw=\linewidth -\advance\tw-2em -\texttt{#1(}\\ -\strut\hskip2em\begin{tabularx}\tw{>{\begingroup\tt}l<{\endgroup}lX} -#2 -\end{tabularx}\\ -\texttt) -\catcode`\_=8 -} - -\def\Synopsis{\subsubsection*{Synopsis}} -\def\Description{\subsubsection*{Description}} -\def\Return{\subsubsection*{Return values}} - -% ----- END COPY ----- - -\input{frontmatter} -\tableofcontents - -\newpage -\input{versions} - -\newpage -\input{LBDG-Introduction} - -\newpage -\input{producer_api} - -\newpage -\input{consumer_api} - -\newpage -\input{notification_api} - -% \newpage -% \input{web_services} - -\TODO{zminit http interface - podporujeme ho jeste? tusim ze fila -to nejak resuscitoval} - -\newpage -\bibliographystyle{unsrt} -\bibliography{lbjp} - -\end{document} - diff --git a/org.glite.lb.doc/src/LBTP-Abstract.tex b/org.glite.lb.doc/src/LBTP-Abstract.tex deleted file mode 100644 index 4025c1b..0000000 --- a/org.glite.lb.doc/src/LBTP-Abstract.tex +++ /dev/null @@ -1,23 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -% when changed, update also http://egee.cesnet.cz/en/JRA1/LB/lb.html -% (in CVSROOT=:gserver:lindir.ics.muni.cz:/cvs/edg, cvsweb/lb.html) -This test plan document explains how to test the Logging and Bookkeeping (\LB) -service. Two major categories of tests are described: integration tests -(include installation, configuration and basic service ping tests) and -system tests (basic functionality tests, performance and stress tests, -interoperability tests and security tests). diff --git a/org.glite.lb.doc/src/LBTP-IntegrationTests.tex b/org.glite.lb.doc/src/LBTP-IntegrationTests.tex deleted file mode 100644 index a18c0e2..0000000 --- a/org.glite.lb.doc/src/LBTP-IntegrationTests.tex +++ /dev/null @@ -1,116 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -% Integration tests - -% Installation and configuration tests are done manually by the certification team, -% there is no need to specify them here at the moment, they can be added later - -% \section{Installation tests} -% \label{s:installation} -% \TODO{salvet: list installed packages, check all dependencies, ...} -% \begin{center} -% \url{https://twiki.cern.ch/twiki/bin/view/EGEE/Glite-LB} -% \end{center} - - -% \newpage -% \section{Configuration tests} -% \label{s:configuration} -% \TODO{salvet: check all config files, ...} -% \begin{center} -% \url{https://twiki.cern.ch/twiki/bin/view/EGEE/Glite-LB} -% \end{center} - - -% \newpage -\section{Service ping tests} -\label{s:ping} - -In this section we describe basic tests of \LB if the services are up and running. -% Local tests are meant to be run on the install node (where the appropriate daemon is running) -% whereas remote tests are meant to be run via another node. - -\subsection{Test Suite Overview} - -This subsection gives a comprehensive overview of all service ping tests. - -\begin{tabularx}{\textwidth}{|l|l|X|} -\hline - {\bf Executable} & {\bf Status} & {\bf Use} \\ -\hline -{\tt lb-test-logger-local.sh} & Implemented & Test job logging facilities on a local machine (processes running, ports listening, etc.). \\ -\hline -{\tt lb-test-logger-remote.sh} & Implemented & Test the local logger availability remotely (open ports). \\ -\hline -{\tt lb-test-server-local.sh} & Implemented & Test for LB server running on a local machine (processes running, ports listening, etc.). \\ -\hline -{\tt lb-test-server-remote.sh} & Implemented & Test the LB server availability remotely (open ports). \\ -\hline -\end{tabularx} - -\subsection{Logger (local \& inter)} - -\subsubsection{Local tests} -\what\ check if both \texttt{glite-lb-logd} and \texttt{glite-lb-interlogd} are running, -check if \texttt{glite-lb-logd} is listening on which port (9002 by default), -socket-connect to \texttt{glite-lb-logd}, -check if enough disk capacity is free for \code{dglog*} files, -socket-connect to \texttt{glite-lb-interlogd}. - -\how\ \ctblb{lb-test-logger-local.sh} - - -\subsubsection{Remote tests} -\req\ environment variable \texttt{GLITE\_WMS\_LOG\_DESTINATION} set, GSI credentials set - -\what\ network ping, -check GSI credentials, -socket-connect, -gsi-connect - -\how\ \ctblb{lb-test-logger-remote.sh} - - -\subsection{Server} - -\subsubsection{Local tests} -\req\ environment variables \texttt{GLITE\_WMS\_LBPROXY\_STORE\_SOCK}, -and \texttt{GLITE\_WMS\_LBPROXY\_SERVE\_SOCK} set - -\what\ check MySQL (running, accessible, enough disk capacity, ...), -check if both daemons \texttt{glite-lb-bkserverd} and \texttt{glite-lb-notif-interlogd} are running, -check if \texttt{glite-lb-bkserverd} is listening on which ports (9000, 9001 and 9003 by default), -socket-connect to all \texttt{glite-lb-bkserverd} ports and sockets, -check if enough disk capacity is free for dumps, -socket-connect to \texttt{glite-lb-notif-interlogd}. - -\how\ \ctblb{lb-test-server-local.sh} - - -\subsubsection{Remote tests} -\req\ environment variable \texttt{GLITE\_WMS\_QUERY\_SERVER} set, GSI credentials set - -\what\ network ping, -check GSI credentials, -socket-connect to all server ports, -gsi-connect to all server ports, -WS getVersion. - -\how\ \ctblb{lb-test-server-remote.sh} - - - diff --git a/org.glite.lb.doc/src/LBTP-InterTests.tex b/org.glite.lb.doc/src/LBTP-InterTests.tex deleted file mode 100644 index c25eb6c..0000000 --- a/org.glite.lb.doc/src/LBTP-InterTests.tex +++ /dev/null @@ -1,26 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -% \section{Interoperability tests} -% \label{s:interoperability} -% \TODO{salvet, ljocha: Test of interoperability with other grids} - - -% \newpage -% \section{Security tests} -% \label{s:security} -% \TODO{kouril: complete security audit} - diff --git a/org.glite.lb.doc/src/LBTP-Introduction.tex b/org.glite.lb.doc/src/LBTP-Introduction.tex deleted file mode 100644 index 7fd0278..0000000 --- a/org.glite.lb.doc/src/LBTP-Introduction.tex +++ /dev/null @@ -1,148 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -\section{Introduction} - -This document explains how to test the Logging and Bookkeeping (\LB) service. - -As part of the EGEE-III project, Specific Service Activity SA3: Integration, -testing and certification\footnote{\url{https://twiki.cern.ch/twiki/bin/view/EGEE/SA3}}, -testing is an essential activity and all important information about gLite software -testing should be available from the web page - -\begin{center} -\url{https://twiki.cern.ch/twiki/bin/view/EGEE/EGEECertification#Test_writing}. -\end{center} - -This document describes test plan for the \LB service. - - -\subsection{Test categories} - -% Obsolete, not used anymore: -% -% Several layers of tests are considered: -% \begin{description} -% \item[Layer 1 - service ping tests:] Basic test if a service is up and running. -% \item[Layer 2 - service functionality tests:] Test the fully supported functionality of a service. This includes also service interface tests. -% \item[Layer 3 - system tests:] Test a complete system that traverses multiple services. -% \item[Layer 4 - stress tests:] Stress test services and systems (including long running jobs to check for resource leaks). -% \item[Layer 5 - performance tests:] Test performance of the service (including the MegaJob results). -% \item[Layer 6 - interoperability tests:] Test for interoperability with other grids (might be interactive). -% \end{description} - -According to the gLite Test Writing Guidelines -\footnote{\url{https://twiki.cern.ch/twiki/bin/view/LCG/LCGgliteTestWritingGuidelines}}, -we consider two test categories with the following test types: - -\begin{description} -\item[Integration tests] verify if the software is installable and configurable. -They also check for basic, not depending on other grid services, functionality -of the component (e.g. daemon is up and running). -\begin{itemize} -\item Installation tests %, see Section~\ref{s:installation} -\item Configuration tests %, see Section~\ref{s:configuration} -\item Service ping tests: basic tests if service is up and running, see Section~\ref{s:ping} -\end{itemize} -% -\item[System tests] verify if the component works within the grid in -interaction with other grid services. -\begin{itemize} -\item Functionality tests of fully supported functionality (including APIs and CLI), see Section~\ref{s:functionality} -\item Performance and stress tests, see Section~\ref{s:perftests} -\item Interoperability tests %, see Section~\ref{s:interoperability} -\item Security tests %, see Section~\ref{s:security} -\end{itemize} -\end{description} - -The tests could be run either locally (on the install node = where the service -is installed, configured and running) or remotely (via another node, where some -parts of the software also must be installed). - -Apart from these tests, there exist also tests of the individual components run -for example during the build process (especially unit tests). They are not -described in this document. - - -\subsection{Certification tests} - -EGEE Certification team collects tests for \LB in a gLite module -\verb'org.glite.testsuites.ctb' in the \verb'LB' directory. All \LB tests are -described at -\url{https://twiki.cern.ch/twiki/bin/view/LCG/AvailableTests#Logging_and_Bookkeeping_LB} -as well as next to each test case in the following sections. - -The tests can be used as sensors in different monitoring frameworks -(see also below). - - - - -\subsection{Integration into other frameworks} - -\subsubsection{Service Availability Monitoring} - -Service Availability Monitoring -(SAM)\footnote{\url{http://sam-docs.web.cern.ch/sam-docs}} is a framework for -the monitoring of production and pre-production grid sites. It provides a set -of probes which are submitted at regular intervals, and a database that stores -test results. In effect, SAM provides monitoring of grid services from a user -perspective. - -%\TODO{ljocha: More about SAM. How LB is integrated - LB sensors for SAM} - - -\subsubsection{Nagios} - -Nagios\footnote{\url{http://www.nagios.org}} is a host and service monitor -designed to inform you of network problems before your clients, end-users or -managers do. - -%\TODO{ruda: More about Nagios. How LB is integrated - LB sensors for Nagios} - - -\subsubsection{ETICS} - -ETICS\footnote{\url{http://etics.web.cern.ch/etics/}} stands for -"eInfrastructure for Testing, Integration and Configuration of Software". It -provides a service to help software developers, managers and users to better -manage complexity and improve the quality of their software. Using cutting -edge Grid software and best practices, ETICS allows to fully automate -the way your software is built and tested. - -Please see the ETICS User Manual \cite{etics_manual} for the description -of the ETICS service and basic ETICS commands. The command to be issued to -test the whole \LB subsystem is: - -\begin{verbatim} - etics-test org.glite.lb -\end{verbatim} - -It can be issued locally or using the remote build and test system. -%\TODO{More about ETICS testing?} - -General ideas of \LB tests using ETICS are the following - -\begin{itemize} -\item tests are in CVS together with the code - -\item tests run the service themselves on some non-default ports and perform a set of -elementary actions similar to those from \ctblb{}\ -to test the basic functionality of the service which is stopped again at the -end of the test - -\end{itemize} -%\TODO{More about LB tests for individual modules} diff --git a/org.glite.lb.doc/src/LBTP-PerfTests.tex b/org.glite.lb.doc/src/LBTP-PerfTests.tex deleted file mode 100644 index a403e35..0000000 --- a/org.glite.lb.doc/src/LBTP-PerfTests.tex +++ /dev/null @@ -1,552 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -\section{Performance and stress tests} -\label{s:perftests} - -%\TODO{Michal: nejak sesynchronizovat s webem} -In this section we describe only the general idea of performance and stress tests of \LB components. -This work is in progress and all necessary information is updated at the wiki page: - -\begin{center} -\url{http://egee.cesnet.cz/mediawiki/index.php/LB_and_JP_Performance_Testing} -\end{center} - -The general idea is thus the following: - -\begin{itemize} - -\item All source modifications for tests are in CVS, conditionally compiled only -with appropriate symbol. - -\item To compile LB with performance testing enabled, set environment variable -\verb'LB_PERF' to 1 prior to LB build: -\begin{verbatim} - export LB_PERF=1 - etics-build org.glite.lb -\end{verbatim} - -\item Component tests are run by shell scripts located under component -directories, these tests may require binaries from other components, though. - -\item All tests use sequence of events for typical jobs (small job, big job, -small DAG, big DAG) prepared beforehand. These events are stored in files in -ULM format in CVS (see \texttt{org.glite.lb.common/examples}). -%\TODO{new strategy? use real jobs...} - -\item Events are generated by \verb'glite-lb-stresslog' program, which reads -ULM text of events for particular test job and logs the event sequence directly -by calling \verb'*_DoLogEvent'. The number of test jobs is -configurable. Stresslog inserts into every event timestamp when the event was -generated and sent. - -\item Events are consumed by breaking normal event processing either in the -component being tested or the next component in chain, that is instrumented to -read and discard events immediately. The consumption itself is done by calling -special function which takes current time, extracts timestamp from event and -prints the difference (ie.. the event processing time)\footnote{the only -exception is test of the logging library itself}. These "break points" are -chosen to measure throughput of the various component parts and to identify -possible bottlenecks within the components. - -\item Test jobs are preregistered within the LB if the test includes -bookkeeping server and/or proxy by the test script program and their id's are -stored in separate file to enable re-use by other load-generating tools (status -queries, for example). - -\item Test results: - \begin{itemize} - \item Some numbers must be reported by component themselves, not by - the event generator (due to the asynchronous LB nature). The - test script collects those numbers and presents them as the test - result at the end of testing. - - \item After completion test scripts print the table described for the - respective tests filled in with measured values (ie.. the table - is not filled in manually by human tester). - - \item Measure event throughput by - \[ \mbox{event\_throughput} = \frac{1}{\mbox{time\_delivered} - \mbox{time\_arrived}} \] -%\TODO{measure job throughput for event patterns of typical jobs or deduce -%job throughput from throughput of selected types of events?} - - \item Publish the results on the web. - -% \item \TODO{ETICS test framework is used to run performance and stress tests automatically.} - \end{itemize} - -% vztahuje se k cemu? -% * only if next event is sent after previous was delivered -% -\end{itemize} - - - -\endinput - - -In the following subsections we describe performance and stress tests for -individual LB components. They include both tests of the isolated components -on one node (may require binaries from other components to produce/consume -events) as well as tests of LB components among more nodes. - - -%-------------------- -\subsection{Logging library test} -%-------------------- - -\begin{verbatim} -* component: - org.glite.lb.client - -* binaries required: - logevent_libtest - -* test shell script: - perftest_loglib - -* input required: - - events - -* test description: - - measures time required to format given events into ULM. Events - are read from file, parsed into components, timestamped and - produced. - - - events produced: - - by calling logging function edg_wll_LogEvent*() - - - events consumed: - - discarded by logging function instead of sending via - appropriate protocol (LogEventMaster) - -* results: - - job type (size) throughput (100k jobs) - ----------------------------------------- - small job - big job - small DAG - big DAG - -\end{verbatim} - - -% ---------------- -\subsection{Local logger test} -% ---------------- - -\begin{verbatim} -* component: - org.glite.lb.logger - -* binaries required: - stresslog - glite_lb_logd_perf - glite_lb_logd_perf_nofile - - does not store events in file - glite_lb_interlogd_perf_empty - - consumes immediately after reading event - -* test shell script: - perftest_logd - -* input required: - - client and host certificates - - events - -* test description: - - measures time required for event to be sent from client to - local logger and processed by local logger. Local logger is - either instructed (by option) or instrumented to skip some - parts of event processing: - a) no parse, no file, no ipc - glite_lb_logd_perf_nofile --noParse --noIPC - b) no file, no ipc - glite_lb_logd_perf_nofile --noIPC - c) no ipc - glite_lb_logd_perf --noIPC - d) normal operation - glite_lb_logd_perf - - no parse - LL does not parse events - no file - LL does not store events into files - no ipc - LL does not send events through socket to IL - - - events produced: - - stresslog sends events to logd using client->logd - protocol (*_DoLogEvent()) - - - events consumed: - i) after storing into files - ii) by "empty" IL - -* results: - - - -i) events stored in files - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - a) - b) - c) - d) - -ii) events sent to IL - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - a) - b) - c) - d) - - -\end{verbatim} - -% ---------------- -\subsection{Interlogger test} -% ---------------- - -\begin{verbatim} -* component: - org.glite.lb.logger - -* binaries required: - stresslog - glite_lb_interlogd_perf - glite_lb_interlogd_perf_noparse - - does not parse events, server address is hard-coded - glite_lb_interlogd_perf_nosync - - does not call event_store_sync() - glite_lb_interlogd_perf_norecover - - recovery thread disabled - glite_lb_interlogd_perf_nosend - - events are consumed instead of sending - glite_lb_interlogd_perf_lazy - - lazy closing connection to bkserver - glite_lb_bkserverd_perf_empty - - consumes event immediately after receiving - -* test shell script: - perftest_interlogd - -* input required: - - host certificate - - events - -* test description: - - measures time the event travels through interlogger. - Interlogger is instrumented to skip some parts of event - processing for particular test, specifically tests include - these variants: - a) disabled event parsing. The server address - (eg. jobid) is hard-coded. - b) disabled event synchronization from files - c) disabled recovery thread - d) lazy bkserver connection close - e) normal operation - - - events produced: - 1) stresslog sends events to interlogger using the UNIX - domain socket and logd->interlogger protocol, events are - stored in files (stresslog behaves like logd) -% TODO: pro toto neni funkce v producerske knihovne - 2) interlogger reads events from event files created by - stresslog (by recovery thread) - 3) stresslog stores events to files and every n-th - (optional argument) is sent also through the UNIX socket - - - events consumed: - i) discarded instead of being sent - ii) by "empty" bkserver - -* results: - - -i) events discarded -1) events received on socket -(options 2 and 3 are not tested) - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - a) - b) - c) - e) - - -ii) events sent to empty bkserver -1) events received on socket - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - a) - b) - c) - d) - e) - - -2) events recovered from files - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - d) - e) - - -3) events synced from files, every 10th event sent on socket - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - a) - b) - c) - d) - e) - -\end{verbatim} - -% ------------ -\subsection{LBProxy test} -% ------------ - -\begin{verbatim} -* component: - org.glite.lb.proxy - -* binaries required: - stresslog - glite_lb_proxy_perf_noparse - - consumes events before parsing - glite_lb_proxy_perf_nostore - - consumes events before storing into database - glite_lb_proxy_perf_nostate - - consumes events before computing job status - glite_lb_proxy_perf_nosend - - consumes events before sending to interlogger - glite_lb_interlogd_perf_empty - - consumes immediately after reading event - -* test shell script: - perftest_proxy - -* input required: - - events - -* test description: - - measures time required for processing event by LB proxy. Test - is performed with (a)) and without (b)) checking for duplicate - events. - - - events produced: - - stresslog sends events using the IL protocol on local - socket (using DoLogEventProxy()) - - - events consumed: - i) before parsing - ii) before storing into database - iii) after storing into database - iv) after job status computation - v) normal operation - - - - -* results: - -a) with duplicity check: - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - i) - ii) - iii) - iv) - v) - - -b) without duplicity check: - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - i) - ii) - iii) - iv) - v) -\end{verbatim} - -%-------------- -\subsection{LB server test} -% -------------- - - -\begin{verbatim} -* component: - org.glite.lb.server - -* binaries required: - stresslog - glite_lb_server_perf_noparse - - consumes events before parsing - glite_lb_server_perf_nostore - - consumes events before storing into database - glite_lb_server_perf_nostate - - consumes events before computing job status - -* test shell script: - perftest_server - -* input required: - - host certificates - - events - -* test description: - - measures time required for processing event by LB server. Test - is performed with (a)) and without (b)) checking for duplicate - events. - - - events produced: - - stresslog sends events using the IL protocol (using DoLogEventDirect()) - - - events consumed: - i) before parsing - ii) before storing into database - iii) after storing into database - iv) normal operation - -* results: - -a) with duplicity check: - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - i) - ii) - iii) - iv) - - -b) without duplicity check: - - throughput: small big small big - job job DAG DAG - ------------------------------------------------- - i) - ii) - iii) - iv) - -\end{verbatim} - -% --------------------- -\subsection{Job registration test} -% --------------------- - -\begin{verbatim} -* component: - org.glite.lb.server - org.glite.lb.proxy - -* binaries required: - stressreg - - generates registration events - glite_lb_bkserverd - glite_lb_proxy - glite_lb_bkserverd_perf_empty - glite_lb_proxy_perf_empty - -* test shell script: - perftest_jobreg - -* input required: - - host & user certificates - -* test description: - - measures time required to register given number of jobs (time - to process registration event). The registration event is - synchronous in principle, so it is possible to get results just - from the client (stressreg). Test variants include: - a) current implementation - b) implementation of connection pool at the client - c) parallel communication with server and proxy - - - - events produced: - - stressreg sends registration events by calling - edg_wll_RegisterJob*() - - - events consumed: - i) normally processed by server & proxy - ii) server replies immediate success - iii) proxy replies immediate success - -* results: - -a) current implementation - - throughput: one DAG DAG DAG - job (1000 nodes) (5000 nodes) (10000 nodes) - ----------------------------------------------------------------- - i) - ii) - iii) - - -b) connection pool - - throughput: one DAG DAG DAG - job (1000 nodes) (5000 nodes) (10000 nodes) - ----------------------------------------------------------------- - i) - ii) - iii) - - -c) parallel communication - - throughput: one DAG DAG DAG - job (1000 nodes) (5000 nodes) (10000 nodes) - ----------------------------------------------------------------- - i) - - -\end{verbatim} - -% --------------------- -\subsection{"Real world" tests} -% --------------------- - -Aim of these tests is to simulate real environment of the LB operation as -closely as possible. We simulate the environment on WMS node as this is the -most performance critical point. Events are sent through proxy and interlogger -on one machine (WMS node) to the server on another machine (LB node), we also -create some background noise by simultaneously polling the server and/or proxy -for job status by several clients in parallel. - diff --git a/org.glite.lb.doc/src/LBTP-Tests.tex b/org.glite.lb.doc/src/LBTP-Tests.tex deleted file mode 100644 index 5b860f0..0000000 --- a/org.glite.lb.doc/src/LBTP-Tests.tex +++ /dev/null @@ -1,515 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -% System tests - -\section{System functionality tests} -\label{s:functionality} - -\subsection{Test Suite Overview} - -This subsection gives a comprehensive overview of all system functionality tests. - -\subsubsection{Test Scripts} - -Besides pure System Functionality Tests, this list also includes In-the-Wild tests and Regression Tests discussed in a few following chapters. They are used in the same manner and, typically, on the same occasions, which is why they are all listed in the same place. - -\begin{tabularx}{\textwidth}{|l|l|X|} -\hline - {\bf Executable} & {\bf Status} & {\bf Use} \\ -\hline -{\tt lb-test-job-registration.sh} & Implemented & Tries to register a job and checks if the registration worked. \\ -\hline -{\tt lb-test-event-delivery.sh} & Implemented & Tries to register a job and log events. Checks if the registration worked and events resulted in state change accordingly. \\ -\hline -{\tt lb-test-https.sh} & Implemented & Test the HTTPs interface. \\ -\hline -{\tt lb-test-logevent.sh} & Implemented & Test if local logger accepts events correctly (i.e. returns 0). \\ -\hline -{\tt lb-test-il-recovery.sh} & Implemented & Tests if iterlogger recovers correctly and processes events logged in between when restarted. \\ -\hline -{\tt lb-test-job-states.sh} & Implemented & Test that job state queries return correctly and that testing jobs are in expected states. \\ -\hline -{\tt lb-test-proxy-delivery.sh} & Implemented & Test correct event delivery through \LB proxy. \\ -\hline -{\tt lb-test-ws.sh} & Implemented & Query events and job states through the Web-Service interface. \\ -\hline -{\tt lb-test-notif.sh} & Implemented & Test if notifications are delivered correctly for testing jobs. \\ -\hline -%{\tt lb-test-notif-additional.sh} & Proposed & Test notification delivery with additional options. \\ -%\hline -{\tt lb-test-notif-switch.sh} & Implemented & Test the correct behavior of a notification once its target jobid changes. \\ -\hline -{\tt lb-test-notif-recovery.sh} & Implemented & Test if notification client receives notifications correctly upon restart. \\ -\hline -{\tt lb-test-purge.pl} & Implemented & Test that \LB server purge works correctly. \\ -\hline -{\tt lb-test-wild.pl} & Implemented & Test \LB ``in the wild'' (test with real-life WMS). \\ -\hline -{\tt lb-test-bdii.sh} & Implemented & Test \LB server is published correctly over BDII. \\ -\hline -{\tt lb-test-sandbox-transfer.sh} & Implemented & Test \LB's support for logging sandbox transfers. \\ -\hline -{\tt lb-test-changeacl.sh} & Implemented & Test proper parsing of \code{ChangeACL} events. \\ -\hline -\end{tabularx} - -\subsubsection{Event logging examples} - -There is an {\tt examples} subdirectory in {\tt GLITE\_LOCATION}. It holds various example files---both binaries and scripts. There is---among others---a suite of scripts aimed at testing event delivery and the proper operation of the \LB state machine. Scripts named {\tt glite-lb-.sh}---where {\tt } corresponds with a job state---can be used to generate sequences of events that will always get an existing job into that state. (For example the {\tt glite-lb-running.sh} script logs a series of 12 events resulting in the job state turning to running.) Some of these scripts are used by system functionality tests detailed bellow but all of them can also be used for manual testing. - -\subsection{Event delivery} - -\subsubsection{Normal event delivery} -\label{normal} -% event delivery -% poslat .sh, job log vrati to, co bylo ve fajlech - -\req\ all \LB\ daemons running (\path{glite-lb-logd}, \path{glite-lb-interlogd}, -\path{glite-lb-bkserverd}) - -\what\ -\begin{enumerate} -\item Register jobs with \code{edg\_wll\_RegisterJob} -\item Log reasonable sequences of events with \code{edg\_wll\_Log*}, both through logger and/or proxy -\item Check with \code{edg\_wll\_JobLog} that the events got delivered afterwards (approx. 10s). -\end{enumerate} - -\how\ \ctblb{lb-test-event-delivery.sh} -% org.glite.testsuites.ctb/LB/lb-l2.sh now does the following: -% - array_job_reg: registeres $JOBS_ARRAY_SIZE jobs -% - logEvents: logs events by glite-lb-$state.sh example scripts -% - logTags: logs user tags -% - testLB: calls glite-lb-job_log for all jobs -% - testLB2: calls glite-lb-job_status for all jobs -% -% What needs to be done: -% - rename the script, tidy it -% - create some meaningful sequence of events for logEvents - -\note\ The test includes artificial delays. Takes approx. 25\,s to finish. - -\result\ All sub tests (API calls) should return 0. The same events that were logged must be returned. - -\begin{hints} -There is approx. 1 min time window in which the local logger files exist. -They can be grabbed and used for comparing the events later in~\ref{recover}. -\end{hints} - - - -\subsubsection{Job registration only} -\label{reg} -\req\ running \path{glite-lb-bkserverd} - -\what\ call \code{edg\_wll\_RegisterJob}. Jobids should preferably point -to a~remote \LB\ server. Try re-registration using flag \code{EDG\_WLL\_LOGLFLAG\_EXCL} in various scenarios. - -\how\ \ctblb{lb-test-job-registration.sh} - -\result\ All sub tests (API calls) return 0. - -\begin{hints} -\path{glite-lb-regjob} example can be used. It generates a~unique jobid, -prints it and calls \LB\ API appropriately. -\end{hints} - - - -\subsubsection{Standalone local logger -- log event} -\label{log} -% async -- prida do fajlu, OK -% logevent - -\req\ running \path{glite-lb-logd} only, jobs registered in test~\ref{reg}. - -\what\ call \code{edg\_wll\_Log*} for various event types in a~sequence -resembling real \LB\ usage, using the same jobids as in test~\ref{reg} - -\how\ \ctblb{lb-test-logevent.sh [event-file-prefix]} - -\result\ All sub tests (API calls) return 0, events are added one per line to the local logger files. - - - -\subsubsection{Interlogger recovery} -\label{recover} -% recover interloggeru -% il & server (remote) -% spustit, protlaci soubory na server, soubory zmizi, lze se dotazat na stav - -\req\ running \path{glite-lb-bkserverd} on the machine and port where -jobids from \ref{reg} point to; files generated in~\ref{log}; -\path{glite-lb-interlogd} is stopped. - -\what\ Make a~copy of the files created in~\ref{log}, then start -\path{glite-lb-interlogd}. After approx. 10\,s check the jobs -with \code{edg\_wll\_JobLog} call. - -\how\ \ctblb{lb-test-il-recovery.sh} - -\note\ The test includes artificial delays. Takes approx. 15 to 75\,s to finish. - -\result \code{edg\_wll\_JobLog} should return the same events that were -contained in the local logger files. The files should be removed by -interlogger after approx. 1 min. - -\begin{hints} -\path{glite-lb-joblog} example outputs the events in (almost) the same -format as the local logger files. -\end{hints} - - - - -\subsection{Job state computation} - -\subsubsection{Normal job states} -\label{state} -% normal event delivery & job state machine -% .sh, dotaz na stav - -\req\ \path{glite-lb-bkserverd} running, events from \ref{normal} logged. - -\what\ Check state of the jobs with \code{edg\_wll\_JobStatus}. Check all possible job states -(if necessary, log relevant events). Query both server and/or proxy. - -\how\ \ctblb{lb-test-job-states.sh} - -\note\ The test includes artificial delays. Takes approx. 150\,s to finish. - -\result\ The API call should return 0, the jobs should be in the expected -states. Thorough tests may also cross check the values supplied in the -events (e.g. destination computing element) wrt. the values reported in the job states. - - - - -%\subsubsection{Non-simple job states} -%\TODO{dags, collections, their states and states (and histogram) of their children/subjobs, ...} - - - -%\subsection{Query tests} -%\TODO{query all my jobs, query one job, query with some structured conditions, some other queries that caused problems in the past, ...} - - -\subsection{\LB server and proxy combined test} - -\req\ running \path{glite-lb-proxy}, \path{glite-lb-interlogd} and -\path{glite-lb-bkserverd} - -\what\ Register jobs with \code{edg\_wll\_RegisterJobProxy}, log events -using \code{edg\_wll\_LogEventProxy} and check the job states against -both lbproxy (using \code{edg\_wll\_JobStatusProxy}) and bkserver -(using \code{edg\_wll\_JobStatus}). Pay special attention to job reaching final -job status and to the automatic purge from proxy. - -% - check the timeouts. - ??tam byly nejaky timeouty??? - -\how\ \ctblb{lb-test-proxy-delivery.sh} - -%\TODO{mozna to ma prijit do nejakeho testsuitu, netusim} -{\tt glite-lb-running.sh -x -m LB\_HOST:PORT} \\ -- logs sequence of events and returns JOBID \\ - -{\tt Q1: glite-lb-job\_status -x JOBID } \\ -{\tt Q2: glite-lb-job\_status JOBID } \\ -- Q1 queries LB proxy, Q2 queries LB server - both should return status of the job \\ - -{\tt glite-lb-cleared.sh -x -m JOBID} \\ -- logs sequence of events to JOBID pushing it to terminal state \\ - -{\tt Q1: glite-lb-job\_status -x JOBID } \\ -{\tt Q2: glite-lb-job\_status JOBID } \\ -- Q1 returns {\em error: edg\_wll\_JobStatusProxy: No such file or directory (no matching jobs found)} while Q2 returns state of the job until it is purged \\ - -\result\ A new job state should be available immediately at the -lbproxy and probably with a small delay also at the bkserver. Jobs that reach the final job state -are really purged from the proxy. - - - -\subsection{WS interface} -%\TODO{fila, valtri: tests using Java example} -\req\ \path{glite-lb-bkserverd} running, events from \ref{normal} logged - -\what\ retrieve both events and job states with the \LB\ WS interface -(operations \code{JobStatus}, \code{QueryEvents}). - -\how\ \ctblb{lb-test-ws.sh} - -\note\ The test includes artificial delays. Takes approx. 10\,s to finish. - -\result\ the returned data should match those returned by the legacy API calls. - - - - -%\subsection{HTML interface} -%\TODO{fila: query tests using wget/curl} - - - -%\subsection{Change ACL} -%\TODO{kouril: to be added later with new authz schema} - - - - -\subsection{Notifications} -% notifikace -% regjob, reg notifikace na vsechno, poslat udalosti, hlidat notif - -All notification tests require the \LB server to be run with notifications enabled, -i.e. to be run for example with options -\texttt{--notif-il-sock /tmp/sock.test\_notif --notif-il-fprefix /tmp/test\_notif}, -where \texttt{/tmp/sock.test\_notif} is a socket of notification interlogger. - -Please see also \cite{lbug}, Section 2.4, for other possible scenarios how to test the notification delivery. - - -\subsubsection{Single job, any state change} -\label{notif1} -\req\ All \LB\ services running - -\what -\begin{enumerate} -\item Register a job. -\item Start a~notification client (preferably on another machine), -register with \code{edg\_wll\_NotifNew} for any state changes of the job, -and repeatedly invoke \code{edg\_wll\_NotifReceive}. -\item One by one send events triggering job state change. -\end{enumerate} - -\how\ \ctblb{lb-test-notif.sh} - -\note\ The test includes artificial delays. Takes approx. 12\,s to finish. - -\result\ All the events should trigger notification reported by the running -notification client. - -\begin{hints} -\path{glite-lb-notify} example can be used with its commands \path{new} and \path{receive}. -\end{hints} - - - -%\subsubsection{Additional notification criteria} -%\label{notif-complex} -%\req\ All \LB\ services running -% -%\what\ Like~\ref{notif1} but include additional criteria, -%e.g. job is scheduled for a~specific destination. -% -%\how\ \ctblb{lb-test-notif-additional.sh} -% -%\result\ Only notifications matching the criteria should be delivered. -% -% rozsireni dotazu o dalsi job - - - -\subsubsection{Include another job} -\label{notif2} -\req\ All \LB\ services running, notification from \ref{notif1} still active - -\how\ -\begin{enumerate} -\item Register another job. -\item Augment the notification registration with the new jobid using -\code{edg\_wll\_NotifChange}. -\item Start notification client, bind to the registration with -\code{edg\_wll\_NotifBind}. -\item Send events for the new job. -\end{enumerate} - -\how\ \ctblb{lb-test-notif-switch.sh} - -\note\ The test includes artificial delays. Takes approx. 25\,s to finish. Also note that this test will not work with \LB versions older than 2.0. - -\result\ Notifications should be received by the client. - -\begin{hints} -Commands \path{change} and \path{receive} of \path{glite-lb-notify} -can be used. -\end{hints} - -% notifikace -- zmena adresy/portu -% pak poslat udalost, musi dojit -% uz je v predchozim implicitne - - - -\subsubsection{Delayed delivery} -% notifikace -- zpozdene doruceni -% registrovat, odpojit, poslat udalosti, pripojit se - -\req\ All \LB\ services running - -\what\ -\begin{enumerate} -\item Register another job. -\item Register a~notification as in~\ref{notif1} but terminate the client -immediately. -\item Log events for the job. -\item Restart the client, binding to the notification and call -\code{edg\_wll\_NotifReceive} repeatedly. -\end{enumerate} - -\how\ \ctblb{lb-test-notif-recovery.sh} - -\note\ The test includes artificial delays. Takes approx. 25\,s to finish. - -\result\ Delayed notifications should be received by the client almost -immediately. - - - - -\subsection{Server purge} - -\textbf{WARNING: This test is destructive, it destroys ALL data in an -existing \LB\ database.} - -The test is fairly complex but it does not make too much sense to split it -artificially. - -\req\ All \LB services running, preferably a~dedicated server for this test. - -\what -\begin{enumerate} -\item Purge all data on the server with \path{glite-lb-purge} -\item Log two sets of jobs, separated with delay of at least 60s so -that the sets can be distinguished from each other. -\item \label{purgel} -Using \code{edg\_wll\_JobLog} retrieve events of all the jobs -\item \label{purge1} -Purge the first set of jobs (by specifying appropriate timestamp), -letting the server dump the purged events. -\item \label{purge2} Purge the other set of jobs, also dumping the events. -\item \label{purge3} Run purge once more. -\end{enumerate} - -\how\ \ctblb{lb-test-purge.pl} - -\note\ The test includes artificial delays. Takes approx. 2\,minutes to finish. - -\note\ This test is destructive to your data. You need to run it with the \texttt{--i-want-to-purge} option to confirm your intention. Also, you need to provide the \LB server \texttt{address:port} explicitly as an argument to rule out any confusion. - -\result\ The data dumped in steps \ref{purge1}, \ref{purge2} should be the -same as retrieved in~\ref{purgel}. The final purge invocation should -do nothing (i.e. nothing was left in the database). - -% test_purge -\begin{hints} -The example \path{org.glite.lb.client/examples/purge\_test} does exactly this sequence of steps, -including the checks. -\end{hints} - -\subsubsection{Sandbox Transfers} - -\req\ All \LB\ services running - -\what\ -\begin{enumerate} -\item Register a compute job. -\item Register input sandbox trasfer. -\item Register output sandbox transfer. -\item Generate events to trigger job state changes in one of the sandbox transfer jobs. - \begin{enumerate} - \item Start the transfer and check that state has changed appropriately. - \item Finish the transfer and check that state has changed appropriately. - \end{enumerate} -\item Use another sandbox transfer job registered above to start, then fail the transfer and check that this is reflected by the resulting transfer job status. -\item Check that the compute job and its sandbox transfer jobs link up correctly. - -\end{enumerate} - -\how\ \ctblb{lb-test-sandbox-transfer.sh} - -\note\ The test includes artificial delays. Takes approx. 50\,s to finish. - -\result\ Job states should change on event delivery as expect, related jobs should ``know'' their IDs. - -\subsubsection{ACL Parsing} - -\req\ All \LB\ services running - -\what\ -\begin{enumerate} -\item Register a job. -\item Send a \code{CahngeACL} event to add authorized user. -\item Check job status to see if the event was processed correctly. -\end{enumerate} - -\how\ \ctblb{lb-test-changeacl.sh} - -\note\ The test includes artificial delays. Takes approx. 15\,s to finish. - -\note\ This test does not check if the setting actually takes effect. Implementing that functionality -- relying on the use of at least two different identities -- in an automated test is rather challenging. - -\result\ The \emph{test~DN} should be listed in the job's ACL. - - -\section{LB ``In the Wild''---Real-World WMS Test} -\req\ All \LB services running, working grid infrastructure accessible (including permissions). - -\what -\begin{enumerate} -\item Submit a simple \emph{hello-world}-type job. -\item Submit a simple job and cancel it. -\item Submit a collection of simple jobs. -\item Submit a collection and cancel it. -\item Submit a simple job that is sure to fail. -\item Submit a collection of jobs, one of which is sure to fail. -\end{enumerate} - -In all above cases: Watch the life cycle. Check the resulting state (\emph{Cleared}, \emph{Cancelled} or \emph{Aborted}). Check events received in the course of job execution; events from all relevant components must be present (NS, WM, JC, LM, and LRMS). - -\how\ \ctblb{lb-test-wild.pl} - -\result\ Jobs were submitted. Cancel operation worked where applicable. Resulting state was as expected (\emph{Cleared}, \emph{Cancelled} or \emph{Aborted}). Events were received from all components as expected. - -\note\ The test runs automatically. Bear in mind that in a real-life grid, even valid jobs may not always finish succesf -ully. Analyze failures and re-run if necessary. - -\note\ The number of jobs to generate may be specified using the \texttt{-n} argument - -\note\ Job submissions are limited to VOCE CEs in normal circumstances. Use the \texttt{-w} argument to override. - -\note\ Due to the nature of grid computing, this test may take hours to complete! - - - -\section{Regression testing} - -\subsection{Publishing Correct Service Version over BDII} -\req\ All \LB and BDII services running. - -\what -\begin{enumerate} -\item Regression test for bug 55482 (\texttt{http://savannah.cern.ch/bugs/?55482}) -\item Query for information on the server. -\item Check version returned by the query. -\end{enumerate} - -\how\ \ctblb{lb-test-bdii.sh} - -\result\ Query returns proper service status. Proper LB Server version is returned. - -\note\ The test will also ask the \LB server for a version number through its WS interface, and compare the two values. This, however, will not be done if the machine you use to run the tests does not have the proper binaries installed (\texttt{glite-lb-ws\_getversion}), or if you do not make a proxy certificate available. Should that be the case, the test only checks if a version is returned and prints it out, without comparing. - diff --git a/org.glite.lb.doc/src/LBTP.tex b/org.glite.lb.doc/src/LBTP.tex deleted file mode 100644 index 4ddd707..0000000 --- a/org.glite.lb.doc/src/LBTP.tex +++ /dev/null @@ -1,66 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -\documentclass{egee} -\def\insideTP{} - -\input{definitions} - -\title{Logging and Bookkeeping} -\Subtitle{Test Plan Test Suite Documentation} -\author{CESNET EGEE III JRA1 and SA3 team} -\DocIdentifier{glite-lb-doc-tp-\version} -\DeliverableId{} -\Date{\today} -\Activity{SA3: Integration, Testing and Certification} -\DocStatus{FINAL, version \version} -\Dissemination{PUBLIC} -\DocumentLink{\url{http://egee.cesnet.cz/cvsweb/LB/LBTP.pdf}} -\Abstract{\input{LBTP-Abstract}} - -\begin{document} - -\input{frontmatter} -\tableofcontents - -\newpage -\input{versions} - -\newpage -\input{LBTP-Introduction} - -\newpage -\input{LBTP-IntegrationTests} - -\newpage -\input{LBTP-Tests} - -\newpage -\input{LBTP-PerfTests} - -\newpage -\input{LBTP-InterTests} - -%\appendix -%\newpage -%\input{LBTP-Appendix} - -\newpage -\bibliographystyle{unsrt} -\bibliography{lbjp} - -\end{document} - diff --git a/org.glite.lb.doc/src/LBUG-Abstract.tex b/org.glite.lb.doc/src/LBUG-Abstract.tex deleted file mode 100644 index b3adf4c..0000000 --- a/org.glite.lb.doc/src/LBUG-Abstract.tex +++ /dev/null @@ -1,22 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -% when changed, update also http://egee.cesnet.cz/en/JRA1/LB/lb.html -% (in CVSROOT=:gserver:lindir.ics.muni.cz:/cvs/edg, cvsweb/lb.html) -This user's guide explains how to use the Logging and Bookkeeping (\LB) service -from the user's point of view. The service architecture is described -thoroughly. Examples on using \LB\ event logging command to log a~user tag and -change job ACL are given, as well as \LB\ query and notification use cases. diff --git a/org.glite.lb.doc/src/LBUG-Appendix.tex b/org.glite.lb.doc/src/LBUG-Appendix.tex deleted file mode 100644 index 0abc1b8..0000000 --- a/org.glite.lb.doc/src/LBUG-Appendix.tex +++ /dev/null @@ -1,142 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -\section*{Appendix} - -\section{\LB Event Types} -\label{a:events} -Complete list of all events' names together with their description follows. -% see events.tex.T -\input{events} - -\newpage -\section{\LB Job States} -\label{a:jobstat} -Complete list of all job' states together with their description follows. -% see status.tex.T -\input{status} - -\begin{figure}[h] -\centering -\includegraphics[width=.6\hsize]{images/wms2-jobstat} -\caption{\LB\ job state diagram} -\end{figure} - -\newpage -\subsection{CREAM Job States Mapping} -Support of CREAM jobs is available since \LBver{2.1}. This is the implemented -mapping of job states between CREAM and \LB: -\label{a:creammapping} - -\begin{tabularx}{\textwidth}{>{\bfseries}lX} -CREAM state & \LB state \\ -Registered & Submited \\ -Pending & Waiting \\ -Idle & Scheduled \\ -Running & Running \\ -Really Running & Running \\ -% Held -Done OK & Done \\ -Done Failed & Done \\ -Aborted & Aborted \\ -Cancelled & Cancelled \\ -\end{tabularx} - -\newpage -\section{Environment variables} -\label{a:environment} - -Complete list of all environment variables affecting LB behaviour follows with -their description and default values (if applicable). - -% default values can be read especially from org.glite.lb.common/src/param.c -% and apropriate header files - -\begin{tabularx}{\textwidth}{l>{\raggedright\arraybackslash}X} -GLITE\_WMS\_LOG\_DESTINATION & - % see also glite/lb/log_proto.h (org.glite.lb.common/interface/log_proto.h) - address of the \texttt{glite-lb-logd} daemon (for logging events), - in form \texttt{hostname:port}, - default value is \texttt{localhost:9002}\\ -GLITE\_WMS\_LOG\_TIMEOUT & - % see also glite/lb/timeouts.h (org.glite.lb.common/interface/timeouts.h) - timeout (in seconds) for asynchronous logging, - default value is \texttt{120} seconds, - maximum value is \texttt{300} seconds \\ -GLITE\_WMS\_LOG\_SYNC\_TIMEOUT & - % see also glite/lb/timeouts.h (org.glite.lb.common/interface/timeouts.h) - timeout (in seconds) for synchronous logging, - default value is \texttt{120} seconds, - maximum value is \texttt{600} seconds \\ -GLITE\_WMS\_NOTIF\_SERVER & - address of the \texttt{glite-lb-bkserver} daemon (for receiving notifications) - in form \texttt{hostname:port}, for receiving notifications, - there is no default value, - mandatory for \texttt{glite-lb-notify} \\ -GLITE\_WMS\_NOTIF\_TIMEOUT & - % see also glite/lb/timeouts.h (org.glite.lb.common/interface/timeouts.h) - timeout (in seconds) for notification registration, - default value is \texttt{120} seconds, - maximum value is \texttt{1800} seconds \\ -GLITE\_WMS\_QUERY\_SERVER & - address of the \texttt{glite-lb-bkserver} daemon (for queries), - in form \texttt{hostname:port}, - there is no default value \\ -GLITE\_WMS\_QUERY\_TIMEOUT & - % see also glite/lb/timeouts.h (org.glite.lb.common/interface/timeouts.h) - timeout (in seconds) for queries, - default value is \texttt{120} seconds, - maximum value is \texttt{1800} seconds \\ -GLITE\_WMS\_LBPROXY\_STORE\_SOCK & - UNIX socket location for logging to LB Proxy, - default value is \texttt{/tmp/lb\_proxy\_store.sock} \\ -GLITE\_WMS\_LBPROXY\_SERVE\_SOCK & - UNIX socket location for queries to LB Proxy, - default value is \texttt{/tmp/lb\_proxy\_serve.sock} \\ -GLITE\_WMS\_LBPROXY\_USER & - user credentials (DN) when communicating with LB Proxy, - there is no default value \\ -X509\_USER\_CERT, X509\_USER\_KEY & - location of user credentials (certificate and private key), - default values are \texttt{~/.globus/user{cert,key}.pem} \\ -GLOBUS\_HOSTNAME & - hostname to appear as event origin, useful only for debugging, - default value is hostname \\ -QUERY\_SERVER\_OVERRIDE & - values defined in QUERY\_SERVER will override also values in jobid in queries, - useful for debugging only, - default value \texttt{no} \\ -QUERY\_JOBS\_LIMIT & - maximal size of results for query on jobs, - default value is \texttt{0} (unlimited) \\ -QUERY\_EVENTS\_LIMIT & - maximal size of results for query on events, - default value is \texttt{0} (unlimited) \\ -QUERY\_RESULTS & - specifies behavior of query functions when size limit is reached, - value can be \texttt{None} (no results are returned), - \texttt{All} (all results are returned, even if over specified limit), - \texttt{Limited} (size of results is limited to size specified by QUERY\_JOBS\_LIMIT - or QUERY\_EVENTS\_LIMIT) \\ -CONNPOOL\_SIZE & - maximal number of open connections in logging library, - for developers only, - default value is \texttt{50} \\ -\end{tabularx} - -For backward compatibility, all \verb'GLITE_WMS_*' variables can be prefixed by -\verb'EDG_WL_' instead, for example \verb'EDG_WL_LOG_DESTINATION'. - diff --git a/org.glite.lb.doc/src/LBUG-Introduction.tex b/org.glite.lb.doc/src/LBUG-Introduction.tex deleted file mode 100644 index dfc001a..0000000 --- a/org.glite.lb.doc/src/LBUG-Introduction.tex +++ /dev/null @@ -1,930 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -\section{\LB Architecture} - -%historie: vyrobeno pro WMS v EDG, 1. a 2. verze (seq. èísla, -%cache a dotazy na stavy), v EGEE gLite---ustabilnìní, proxy - -\LB's primary purpose is tracking WMS jobs as they are processed by -individual Grid components, not counting on the WMS to provide this data. -The information gathered from individual sources is collected, stored in -a database and made available at a single contact point. The user gets a -complete view on her job without the need to inspect several service logs -(which she may not be authorized to see in the entirety or she may not be -even aware of their existence). - -While \LB keeps track of submitted and running jobs, the information is -kept by the \LB service also after the job has been finished (successfully -completed its execution, failed, or has been canceled for any reason). The -information is usually available several days after the last event -related to the job arrived, to give user an opportunity to check the job's -final state and eventually evaluate failure reasons. - -As \LB collects also information provided by the WMS, the WMS services are -no longer required to provide a job-state querying interface. Most of the -WMS services can be even designed as stateless---they process a~job and -pass it over to another service, not keeping state information about the job -anymore. During development and deployment of the first WMS version this -approach turned to be essential in order to scale the services to the -required extent~\cite{jgc}. - -\LB must collect information about all important events in the Grid job -life. These include transitions between components or services, results -of matching and brokerage, waiting in queue systems or start and end of -actual execution. -We decided to achieve this -goal through provision of an API (and the associated library) and -instrumenting individual WMS services and other Grid components with direct -calls to this API. But as \LB is a centralized service (there exists -a single point where all information about a particular job must -eventually arrive), direct synchronous transfer of data could have -prohibiting impact on the WMS operation. -The temporary unavailability or overload of the remote \LB service -must not prevent (nor block) the instrumented service to perform as usual. -An asynchronous model with a clear \emph{asynchronous delivery -semantics}, see Sect.~\ref{gathering}, is used to address this issue. - -As individual Grid components have only local and transient view of a -job, they are able to send only information about individual events. This -raw, fairly complex information is not -a~suitable form to be presented to the user for frequent queries. It must -be processed at the central service and users must be presented primarily with this -processed form. This form is derived from the \emph{job state} and its -transition, not from the job events themselves. The raw information is -still available, in case more detailed insight is necessary. - -While the removal of state information from (some of) the WMS services -helped to achieve the high scalability of the whole WMS, the state -information is still essential for the decisions made within the resource -broker or during the matchmaking process. -\Eg decision on job resubmission is usually affected by the number of -previous resubmission attempts. This kind of information is currently -available in the \LB only, so the next ``natural'' requirement has been -to provide an interface for WMS (and other) services to the \LB to query -for the state information. However, this requirement contains two -contradictions: (i)~due to the asynchronous event delivery model, the \LB -information may not be up to date and remote queries may lead to unexpected -results -(or even inconsistent ones---some older information may not be available for -one query but may arrive before a subsequent query is issued), -and (ii)~the dependence on a~remote service to provide vital state information -may block the local service if the remote one is not responding. -These problems are addressed by providing \emph{local view} on the \LB data, -see Sect.~\ref{local}. - - - - -\subsection{Concepts} - - -\subsubsection{Jobs and events} -To keep track of user jobs on the Grid, we first need some reliable -way to identify them. This is accomplished by assigning a unique -identifier, which we call \emph{jobid} (``Grid jobid''), to every job -before it enters the Grid. A~unique jobid is assigned, making it the -primary index to unambiguously identify any Grid job. This jobid is then -passed between Grid -components together with the job description as the job flows through -the Grid; the components themselves may have (and usually do) their -own job identifiers, which are unique only within these components. - -Every Grid component dealing with the job during its lifetime -may be a source of information about the job. The \LB gathers information -from all the -relevant components. This information is obtained in the form of -\LB events, pieces of data generated by Grid components, which mark -important points in the job lifetime (\eg passing of job control -between the Grid components are important milestones in job lifetime -independently on the actual Grid architecture); see Appendix~\ref{a:events} -for a~complete list. We collect those -events, store them into a database and simultaneously process them to -provide higher level view on the job's state. The \LB collects redundant -information---the event scheme has been designed to be as redundant as -possible---and this redundancy is used to improve resiliency in a -presence of component or network failures, which are omnipresent on any -Grid. - -The \LB events themselves are structured into \emph{attribute}~= -\emph{value} pairs, the set of required and optional attributes is defined by the -event \emph{type} (or scheme). For the purpose of tracking job status on -the Grid and with the knowledge of WMS Grid middleware structure we -defined an \LB schema with specific \LB event -types (see Appendix\ref{a:events}). -The schema contains a common base, the attributes that must be assigned -to every single event. The primary key is the jobid, which is also one of -the required attributes. Among other common attributes belong currently the -timestamps of the event origin and of the event arrival to LB, -generating component name, the event type, its priority and sequence code -(see Sect.~\ref{evprocess}) and so on. For a complete list of attributes -see \cite{lbdg}. - -While the necessary and sufficient condition for a global jobid is -to be Grid-wide unique, additional desired property relates to the -transport of events through the network: All events belonging to the same -job must be sent to the same \LB database. This must be done on a~per -message basis, as each message may be generated by a different component. -The same problem is encountered -by users when they look for information about their job---they need -to know where to find the appropriate \LB database too. -While it is possible to devise a global service where each job registers -its jobid together with the address of the appropriate database, such a -service could easily become a bottleneck. We opted for another solution, -to keep the address of the \LB database within the jobid. This way, -finding appropriate \LB database address becomes a local operation -(at most parsing the jobid) and users can use the same mechanism when -connecting to the \LB database to retrieve information about a particular -job (users know its jobid). To simplify the situation even further, -the jobid has the form of an URL, where the protocol part is -``https'', server and port identify the machine running the appropriate -\LB server -(database) and the path contains base64 encoded MD5 hash of random -number, timestamp, PID of the generating process and IP address of the -machine, where the jobid was generated. Jobid in this form can be -used even in the web browser to obtain information about the job, -provided the \LB database runs a web server interface. This jobid is -reasonably unique---while in theory two different job identifications can -have the same MD5 hash, the probability is low enough for this jobid to -represent a globally unique job identification. - -%zajímá nás job, globální id, v¹echna data vzta¾ena k~nìmu, syrové události -% -%více zdrojù dat pro jeden job, redundance, shromá¾dìní na jednom místì - -\subsubsection{Event gathering} -\label{gathering} -%zdroje událostí, lokální semantika logování, store-and-forward - -As described in the previous section, information about jobs are -gathered from all the Grid components processing the job in the form -of \LB events. The gathering is based on the \emph{push} model where -the components are actively producing and sending events. The push model -offers higher performance and scalability than the pull model, where the -components are to be queried by the server. In the push model, the \LB -server does not even have to know the event sources, it is sufficient -to listen for and accept events on defined interface. - -The event delivery to the destination \LB server is asynchronous and -based on the store--and--forward model to minimize the performance -impact on component processing. Only the local processing is synchronous, -the \LB event is sent synchronously only to the nearest \LB component -responsible for event delivery. This component -is at the worst located in the same local area network (LAN) and usually -it runs on the same host as -the producing component. The event is stored there (using persistent -storage -- disk file) and confirmation is sent back to the -producing component. From the component's point of view, the -send event operation is fast and reliable, but its success only means -the event was accepted for later delivery. The \LB delivery components -then handle the event asynchronously and ensure its delivery to the -\LB server even in the presence of network failures and host reloads. - -It is important to note that this transport system does not guarantee -ordered delivery of events to the \LB server; it \emph{does} guarantee -reliable and secure delivery, however. The guarantees are statistical -only, as the protocol is not resilient to permanent disk or node crashes -nor to the complete purge of the data from local disk. Being part of the -trusted infrastructure, even the local \LB components should run on -a trusted and maintained machine, where additional reliability may be -obtained \eg by a RAID disk subsystem. - -\subsubsection{Event processing}% -\label{evprocess} - -%diagram stavù, mapování událostí na hrany - -%uspoøádání událostí -- seq. èísla, vèetnì shallow vìtví - -% ! abstraktne, nemame jeste komponenty - -% prichazeji udalosti, vice zdroju, zmenene poradi (az ztraty) -% redundantni informace -% motivace: usetrit uzivatele, hlasit agregovany stav jobu -As described in the previous section, \LB gathers raw events from various -Grid middleware components and aggregates them on a~single server -on a per-job basis. -The events contain a very low level detailed information about the job -processing at individual Grid components. This level of detail is -valuable for tracking various problems with the job and/or the -components, and as complementary events are gathered (\eg each job control -transfer is logged independently by two components), the information is -highly redundant. Moreover, the events could arrive in wrong order, -making the interpretation of raw information difficult and not -straightforward. -Users, on the other hand, are interested in a much higher view, the -overall state of their job. - -For these reasons the raw events undergo complex processing, yielding -a~high level view, the \emph{job state}, that is the primary type of data -presented to the user. -Various job states form nodes of the job state diagram (Fig.~\ref{f:jobstat}). -See Appendix~\ref{a:jobstat} for a list of the individual states. - -% stavovy automat -% obrazek: stavovy diagram - -\begin{figure}[ht] -\centering -\includegraphics[width=.6\hsize]{images/wms2-jobstat} -\caption{\LB\ job state diagram} -\label{f:jobstat} -\end{figure} - -% typ udalosti -> zmeny typu stavu -\LB\ defines a~\emph{job state machine} that is responsible for updating -the job state on receiving a~new event. -The logic of this algorithm is non-trivial; the rest of this section deals -with its main features. - -Transitions between the job states happen on receiving events of particular -type coming from particular sources. -There may be more distinct events assigned to a~single edge of the state diagram. -For instance, the job becomes \emph{Scheduled} when it enters batch system -queue of a~Grid computing element. -The fact is witnessed by either \emph{Transfer/OK} event reported by -the job submission service or by \emph{Accept} event reported by the computing -element. Receiving any one of these events (in any order) triggers the -state change. - -% fault tolerance -This way, the state machine is highly fault-tolerant---it can cope with -delayed, reordered or even lost events. -For example, when a~job is in the \emph{Waiting} state and the \emph{Done} -event arrives, it is not treated as inconsistency but it is assumed that -the intermediate events are delayed or lost and the job state is switched -to the \emph{Done} state directly. - -% udalosti nesou atributy, promitaji se do stavu -The \LB events carry various common and event-type specific attributes, -\eg \emph{timestamp} (common) or \emph{destination} (\emph{Transfer} type). -The job state record contains, besides the major state identification, -similar attributes, \eg -an array of timestamps indicating when the job entered each state, -or \emph{location}---identification of the Grid component which is currently -handling the job. -Updating the job state attributes is also the task of the state machine, -employing the above mentioned fault tolerance---despite a~delayed event -cannot switch -the major job state back -it still may carry valuable information to update the job state attributes. - -% typy jobu -Jobs monitored by \LB service may have different type. For gLite jobs, \LB supports -simple jobs and jobs representing \emph{set of jobs} -- \emph{DAGs} (with dependencies between -subjobs described by direct acyclic graph) and \emph{collections} (without dependencies -between subjobs). -In these cases, subjobs are monitored in standard way, with one extensions - when job -status is changed, information is propagated also to the job representing corresponding -collection or DAG. -Job representing collection or DAG can be used to monitor status of the set, including -information like how many subjobs is already finished etc. -Support for non-gLite jobs, namely for PBS or Condor systems, is described in section -\ref{sec:nonglite}. - - -\subsubsection{Event ordering}% -\label{evorder} - -As described above, the ability to correctly order arriving events is -essential for the job state computation. -As long as the job state diagram was acyclic (which was true for the -initial WMS release), each event had its unique place in the expected sequence -hence event ordering could always be done implicitly from the -context. -However, this approach is not applicable once job resubmission -yielding cycles in the job state diagram was introduced. - -Event ordering that would rely on timestamps assigned to events upon -their generation, assuming strict clock synchronization over the Grid, -turned to be a~naive approach. -Clocks on real machines are not precisely synchronized and there are no reliable -ways to enforce synchronization across administrative domains. - -To demonstrate a problem with desynchronized clocks, that may lead to -wrong event interpretation, let us consider a~simplified example -in Tab.~\ref{t:cefail}. -% -\iffalse %stare -% usporadani udalosti -- seq. cisla -% priklad problemu -So far we assumed that the state machine is able to detect a~delayed event. -As the state diagram contains cycles, delay cannot be detected from the type -of the event only. -The simplest approach is relying on the event timestamps. -However, in the Grid environment one cannot assume strictly synchronized clocks. -Table~\ref{t:cefail} shows a~simplified example of the problem caused by delayed -clocks. -\fi -% -\begin{table}[ht] -\begin{center} -\begin{tabular}{rlrl} -1.&WM: Accept& -6.&WM: Accept\\ -2.&WM: Match $A$& -7.&WM: Match $B$\\ -3.&WM: Transfer to $A$& -8.&WM: Transfer to $B$\\ -4.&CE~$A$: Accept & -9.&CE~$B$: Accept \\ -5.&CE~$A$: Run & -10.&CE~$B$: Run \\ -\dots & $A$ dies\\ -\end{tabular} -\end{center} -\caption{Simplified \LB events in the CE failure scenario} -\label{t:cefail} -\end{table} -% -We assume that the workload manager (WM) sends the job to a~computing element -(CE)~A, where it starts running but the job dies in the middle. -The failure is detected and the job is resubmitted back to the WM which sends it to CE~B then. -However, if A's clock is ahead in time and B's clock is correct (which -means behind the A's clock), the events in the right column are treated -as delayed. The state machine will interpret events incorrectly, assuming -the job has been run on B before sending it to A. -The job would always (assuming the A's events arrive before B's events to -the \LB) be reported as ``\emph{Running} at A'' despite -the real state should follow the \emph{Waiting} \dots \emph{Running} sequence. -Even the \emph{Done} event can be sent by B with a timestamp that says -this happened before the job has been submitted to A and the job state -will end with a discrepancy---it has been reported to finish on B while -still reported to run on A. - -Therefore we are looking for a~more robust and general solution. We can -discover severe clock bias if the timestamp on an event is in a future -with respect to the time on an \LB server, but this is generally a dangerous -approach (the \LB server clock could be severely behind the real time). -We decided not to rely on absolute time as reported by timestamps, but to -introduce a kind of \emph{logical time} that is associated with the logic -of event generation. -The principal idea is arranging the pass through the job state -diagram (corresponding to a~particular job life), that may include -loops, into an execution tree that represents the job history. -Closing a~loop in the pass through the state diagram corresponds -to forking a~branch in the execution tree. -The scenario in Tab.~\ref{t:cefail} is mapped to the tree in -Fig.~\ref{f:seqtree}. -The approach is quite general---any finite pass through any state -diagram (finite directed graph) can be encoded in this way. - -\begin{figure}[ht] -\centering -\includegraphics[scale=.833]{images/seqtree} -\caption{Job state sequence in the CE failure scenario, arranged into a~tree. -Solid lines form the tree, arrows show state transitions.} -\label{f:seqtree} -\end{figure} - -Our goal is augmenting \LB events with sufficient information that -\begin{itemize} - \item identifies uniquely a~branch on the execution tree, - \item determines the sequence of events on the branch, - \item orders the branches themselves, which means that it determines - which one is more recent. -\end{itemize} -If such information is available, the execution tree can be -reconstructed on the fly as the events arrive, and even delayed events -are sorted into the tree correctly. An incoming event is considered -for job state computation only if it belongs to the most recent -branch. - -The situation becomes even more complicated when -the \emph{shallow resubmission} WM advanced feature is enabled. -In this mode WM may resubmit the job before being sure the previous attempt -is really unsuccessful, potentially creating multiple parallel instances -of the job. -The situation maps to several branches of the execution tree that -evolve really in parallel. -However, only one of the job instances becomes active (really running) finally; -the others are aborted. -Because the choice of active instance is done later, -it may not correspond to the most recent execution branch. -Therefore, when an event indicating the choice of active instance arrives, -the job state must be recomputed, using the corresponding active branch -instead the most recent one. - -Section~\ref{seqcode} describes the current implementation of event -ordering mechanism based on ideas presented here. - -\subsubsection{Queries and notifications}\label{retrieve} - -According to the GMA classification the user retrieves data from -the infrastructure in two modes, called -\emph{queries} and \emph{notifications} in~\LB. - -Querying \LB is fairly straightforward---the user specifies query -conditions, connects to the querying infrastructure endpoint, and -receives the results. -For ``single job'' queries, where jobid is known, the endpoint (the -appropriate \LB server) is inhered from the jobid. -More general queries must specify the \LB server explicitely, -and their semantics is intentionally restricted -to ``all such jobs known here''. -We trade off generality for performance and reliability, -leaving the problem of finding the right query endpoint(s), the right -\LB servers, to higher level information and service-discovery services. - -If the user is interested in one or more jobs, frequent polling of the -\LB server may be cumbersome for the user and creates unnecessary overload -on the sever. A notification subscription is therefore available, -allowing users to subscribe to receive notification whenever a~job -starts matching user specified conditions. -Every subscription contains also the location of the user's -listener; -successful subscription returns time-limited \emph{notification handle}. -During the validity period of the subscription, the \LB infrastructure -is responsible for queuing and reliable delivery of the notifications. -The user may even re-subscribe (providing the original handle) with different -listener location (\eg moving from office to home), and \LB re-routes -the notifications generated in the meantime to the new destination. -The \LB event delivery infrastructure is reused for the notification -transport. - -\subsubsection{Local views}\label{local} -% motivace proxy - -%As outlined in Sect.~\ref{reqs} -WMS components are, besides logging -information into \LB, interested in querying this information back in order -to avoid the need of keeping per-job state information. -However, despite the required information is present in \LB, -the standard mode of \LB operation is not suitable for this purpose due -to the following reasons: -\begin{itemize} -\item Query interface is provided on the \LB component which gathers -events belonging to the same job but coming from different sources. -Typically, this is a~remote service with respect to the event sources (WMS components). -Therefore the query operation is sensitive to any network failure that may -occur, blocking the operation of the querying service for indefinite time. -\item Due to the asynchronous logging semantics, there is a~non-zero time -window between successful completion of the logging call and the point in -time when the logged event starts affecting the query result. -This semantics may yield unexpected, seemingly inconsistent outcome. -\end{itemize} - -The problem can be overcome by introducing \emph{local view} on job data. -Besides forwarding events to -the server where events belonging to a~job are gathered from multiple sources, -\LB infrastructure can store the logged events temporarily -on the event source, and perform the processing described -in Sect.~\ref{evprocess}. -In this setup, the logging vs.\ query semantics can be synchronous---it is -guaranteed that a~successfully logged event is reflected in the result of -an immediately following query, -because no network operations are involved. -Only events coming from this particular physical node (but potentially -from all services running there) are considered, thus the locality of the view. -On the other hand, certain \LB events are designed to contain redundant -information, therefore the local view on processed data (job state) -becomes virtually complete on a~reasonably rich \LB data source like -the Resource Broker node. - - -\subsection{Current \LB implementation} -The principal components of the \LB service and their interactions -are shown in Figures~\ref{f:comp-gather} (gathering and transferring -\LB events) and~\ref{f:comp-query} (\LB query and notification services). - -\begin{figure}[ht] -\centering -\includegraphics[scale=.5]{images/LB-components-gather} -\caption{\LB components involved in gathering and transferring the events} -\label{f:comp-gather} -\end{figure} - -\input components - -\subsubsection{Sequence codes for event ordering}% -\label{seqcode} - -As discussed in Sect.~\ref{evorder}, sequence codes are used as logical -timestamps to ensure proper event ordering on the \LB server. The sequence code -counter is incremented whenever an event is logged and the sequence code must -be passed between individual Grid components together with the job control. -However, a single valued counter is not sufficient to support detection of -branch forks within the execution tree. When considering again the Computing -Element failure scenario described in Sect.~\ref{evorder}, there is no way to -know that the counter value of the last event logged by the failed CE A is 5 -(see Table~\ref{t:cefail} on page~\pageref{t:cefail}). - -Therefore we define a~hierarchical \emph{sequence code}---an array of -counters, each corresponding to a~single Grid component class handling the job% -\footnote{Currently the following gLite components: Network Server, Workload -Manager, Job Controller, Log Monitor, Job Wrapper, and the application itself.}. -Table~\ref{t:cefail2} below shows the same scenario with a~simplified two-counter -sequence code. The counters correspond to the WM and CE component classes -and they are incremented when each of the components logs an event. -When WM receives the job back for resubmission, -the CE counter becomes irrelevant (as the job control is on WM now), -and the WM counter is incremented again. - -\begin{table}[ht] -\begin{center} -\begin{tabular}{rlrl} -1:x&WM: Accept& -4:x&WM: Accept\\ -2:x&WM: Match $A$& -5:x&WM: Match $B$\\ -3:x&WM: Transfer to $A$& -6:x&WM: Transfer to $B$\\ -3:1&CE~$A$: Accept & -6:1&CE~$B$: Accept \\ -3:2&CE~$A$: Run & -6:2&CE~$B$: Run \\ -\dots & $A$ dies\\ -\end{tabular} -\end{center} -\caption{The same CE failure scenario: hierarchical sequence codes. -``x'' denotes an undefined and unused value.} -\label{t:cefail2} -\end{table} - -%Events on a~branch are ordered following the lexicographical order -%of the sequence codes. -%Branches are identified according to the WM counter as WM is -%currently the only component where branching can occur. - -The state machine keeps the current (highest seen) code for the job, -being able to detect a~delayed event by simple lexicographic comparison -of the sequence codes. -Delayed events are not used for major state computation, then. -Using another two assumptions (that are true for the current -implementation): -\begin{itemize} - \item events coming from a~single component arrive in order, - \item the only branching point is WM, -\end{itemize} -it is safe to qualify events with lower WM counter (than the already -received one) to belong to inactive -branches, hence ignore them even for update of job state attributes. - -\subsubsection{\LB data protection} -Events passed between the \LB components as well as the results of their -processing provide detailed information about the corresponding job and its -life and users obviously expect the job data provided by the \LB server to -be credible, reflecting the real jobs' operation on the Grid. Therefore, the -data must be based solely on authentic information generated by legitimate -grid components. The job data also provides information about user's -activities, which many users want to keep private. In order to provide a -sufficient level of security, the \LB infrastructure implements a security -mechanism that provides data protection and access control to the data. - -All the \LB components communicate solely over secure channels whenever they -send data over a network. The TLS protocol~\cite{tls} is used for both mutual -authentication of the client and server and also encryption of the -communication. All the \LB components as well as the clients must possess a -digital certificate that they use to prove their identity. The \LB -infrastructure supports both standard X.509 certificates or proxy -certificates~\cite{proxycert} that are standard authentication mechanism in -the gLite environment. Depending on the server configuration and action -requested, the users may be required to present VOMS attributes in their -proxy certificates. - -By default, access to information about a job is only allowed to the user -who submitted the job (\ie the job owner). The job owner can also assign an -access control list to his or job in the \LB specifying other users who are -allowed to read the data from \LB. The ACLs are represented in -the GridSite GACL format~\cite{gacl2} and are stored in the \LB database -along with the job information. The stored ACL are checked on each query -requesting the data. The ACLs are under control of the job owner, who can -add and remove entries in the ACL arbitrarily using the \LB API or -command-line tools (see~\ref{e:change-acl}). Each entry of an ACL can -specify either a user subject name, a name of a VOMS group, or an attribute -specified in the Full qualified attribute name format (the FQAN support is -available since \LBver{2.0}). An ACL assigned to a job is returned as part of -job status information. - -Besides of using the ACLs, the \LB administrator can also specify a~set of -privileged users with access to all job records on a particular \LB server -(\emph{super-users}). These privileged users can \eg collect information on -usage and produce monitoring data based on the \LB information. - -%Data trustworthiness - the events aren't signed, no real non-reputability or -%traceability of the event sources. - - -\subsection{User interaction} -\begin{figure}[ht] -\centering -\includegraphics[scale=.5]{images/LB-components-query} -\caption{\LB queries and notifications} -\label{f:comp-query} -\end{figure} - -So far we focused on the \LB internals and the interaction between its -components. -In this section we describe the interaction of users with the service. - -\subsubsection{Event submission} -%implicitní -- registrace jobu, systémové události na middlewarových komponentách -The event submission is mostly implicit, -\ie it is done transparently by the Grid middleware components -on behalf of the user. -Typically, whenever an important point in the job life is reached, -the involved middleware component logs an appropriate \LB event. -This process is not directly visible to the user. - -A specific case is the initial registration of the job. -This must be done synchronously, as otherwise subsequent events logged for -the same job may be refused with a ``no such job'' error report. -Therefore submission of a job to the WMS is the only synchronous event -logging that does not return until the job is successfully registered with -the \LB server. -Moreover, the initial registration is sent by the \LB client library in -parallel to \LB proxy (Sect.~\ref{s:proxy}) and \LB server. - -On the other hand, even the registration event may carry large data -(e.g. JDL of huge job collection). Therefore -also an additional asychronous variant is used, causing two job registration -events appear typically. - -% explicitní -- user tagy, ACL -However, the user may also store information into the \LB explicitly -by logging user events---\emph{tags} (or annotations) of the -form ``name = value''. -Authorization information is also manipulated in this way. - -Description of tools for event submission and ACL manipulation -can be found in Section \ref{s:lb-tools}. - - -\subsubsection{Querying information} -%\TODO{prejmenovat, aby v nazvy byly Queries} - -From the user point of view, the information retrieval (\emph{query}) is the -most important interaction with the \LB service. - -%dotazy na stav -The typical \LB usage are queries on the high-level job state information. -\LB supports not only single job queries, it is also possible to -retrieve information about jobs matching a specific condition. -The conditions may refer to both the \LB system attributes -and the user annotations. Rather complex query semantics can be -supported, \eg -\emph{Which of my jobs annotated as ``apple'' or ``pear'' are already -scheduled for execution and are heading to the ``garden'' computing element?} -The \LB Developer's -Guide\cite{lbdg} provides a~series of similar examples of -complex queries. - -%dotazy na události -As another option, the user may retrieve raw \LB events. -Such queries are mostly used for debugging, identification of repeating -problems, and similar purposes. -The query construction refers to event attributes rather -than job state. - -The query language supports common comparison operators, and it allows -two-level nesting of conditions (logically \emph{and}-ed and \emph{or}-ed). -Our experience shows that it is sufficiently strong to cover most user -requirements while being simple enough to keep the query cost reasonable. -Complete reference of the query language can be found in~\LB Developer's Guide -\cite{lbdg}. - -\subsubsection{Notifications} -The other mode of user interactions are the \LB notifications. - -\LB infrastructure enables its users to be notified when something interesting happens on a \LB server -(typically job status change). It enables the user not to poll \LB server periodically to find changed -information, but confortably wait for server to inform the user. - -User registers for notifications via notification client \verb'glite-lb-notify', described in Section -\ref{s:lb-notify}. -Conditions under which the notification is sent can be specified. For example - job XY reaches status -DONE. In \LBver{1.x}, one or more JOBID's are required in the condition and only a single occurence -of a specific attribute is allowed among ANDed conditions. In \LBver{2.x}, more complex conditions are allowed. - -The registration is then delivered to \LB server where it is stored. -At the same time, server generates a unique notification ID for the registration and returns it to the -user. - -The registration exists only for limited amount of time. The validity is returned by \LB server together with -the notification ID when registering. During this period user can attach to server and receive notifications, -change conditions which triger notification, prolong validity of the registration, or remove the registration -from \LB server. - -While the registration is valid, user is able repeatably connect to \LB server from different places in the -network and continue receiving notifications associated with given notification ID. Notifications generated -during the time when user is connected are stored and waiting when user reconnects. - -\subsubsection{Caveats} -\LB is designed to perform well in the unreliable distributed Grid -environment. -An unwelcome but inevitable consequence of this design -are certain contra-intuitive features in the system behavior, -namely: -\begin{itemize} -\item -Asynchronous, possibly delayed event delivery may yield seemingly -inconsistent view on the job state \wrt\ information that is available -to the user via different channels. -\Eg the user may know that her job terminated because of monitoring the -application progress directly, but the \LB \emph{Done} events indicating -job termination are delayed so that \LB reports the job to be still -in the \emph{Running} state. - -\item -% sekvenèní èísla -- ¹patnì øazené události jsou ignorovány pro výpoèet stavu -Due to the reasons described in Sect.~\ref{evorder} \LB is rather sensitive -to event ordering based on sequence codes. -The situation becomes particularly complicated when there are multiple -branches of job execution. -Consequently the user may see an \LB event that is easily interpreted that -it should switch the job state, however, it has no effect in fact -because of being (correctly) sorted to an already inactive branch. - -\item -% purge -- data z~\LB\ zmizí -\LB is not a~permanent job data storage. The data get purged from the -server on timeout, unrelated to any user's action. -Therefore, the \LB query may return ``no such job'' error message (or not -include the job in a list of retrieved jobs) even if the same previous -\LB query had no such problems. - -\end{itemize} - -\ludek{\subsection{Performance and scalability} -The \LB service was designed with performance and -scalability issues in mind. We have developed a series of tests of the -individual \LB components to measure the actual behavior under -stress conditions. These tests give us a good performance estimate of -the \LB service and help us identify and remove possible bottlenecks. - -The testing itself is done by feeding the \LB components with events -prepared beforehand, using whatever protocol appropriate for the given -component. The feeding program uses a set of predefined events of a -typical job which we have chosen from the production \LB server -database. Timestamp is taken before the first event is sent, then the -feeding program begins sending events of individual jobs (the jobs are -all the same, the only difference is the jobid; the number of jobs used is -configurable). The tested component is instrumented in the source code -to break normal event processing at selected points (\eg discard -events immediately after being read to measure the input channel -performance, or discard events instead of sending them to the next -component, etc.). This segmentation of event processing enables to -identify places in the code which may slow down the event transfer. -Optionally the events may be discarded by the next component in the -logical path. The last event of the last job is special termination -event, which is recognized when being discarded; then the second -timestamp is taken and the difference between the two gives us total -time necessary to pass given number of jobs through. - -Note that due to the asynchronous nature of the \LB service measuring for -example the time it takes to send given number of jobs does not give -us the required result, thus event (or job) throughput---when the -producer receives acknowledgment about successful send operation, it -is not guaranteed that the event passed through the component. - -The results shown in table~\ref{perf:results} give the overall -throughput components (events are discarded by the next component -on the path), with the exception of proxy, where the throughput to the -database is measured. It can be seen that the majority of code is fast -enough to handle even high event rates and that most components are up -to our goal to handle one million of jobs per day. The first line -indicates how fast we are able to ``generate'' events in the feeding -program. - -\begin{table}[ht] -\begin{tabular}{l|r} -{\bf Component} & {\bf Job throughput (jobs/day)} \\ -\hline -Test producer & 153,600,000 \\ -Locallogger & 101,700 \\ -Interlogger & 5,335,100 \\ -Proxy & 1,267,110 \\ -\end{tabular} -\caption{Performance testing results} -\label{perf:results} -\end{table} - -During the performance testing we have identified two possible -bottlenecks: -\begin{itemize} -\item Opening connections and establishing SSL sessions is very -expensive operation. It hinders mainly the performance of locallogger, -because the current implementation uses one SSL session for -event. -\item Database operations. Storing events into database is expensive, -but inevitable; however we were able to optimize for example the -code checking for duplicated events. -\end{itemize} - -In the current work we are addressing the issue of SSL operations by -introducing concept of SSL connection pools, which enables components -to reuse existing connections transparently without need to tear-down -and setup new SSL contexts. } - -\subsection{Advanced use} - -The usability of the \LB service is not limited to the simple tasks -described earlier. It can be easily extended to support real-time job -monitoring (not only the notifications) and the aggregate information -collected in the \LB servers is a valuable source of data used for post-mortem -statistical analysis of jobs and also the Grid infrastructure behavior. -Moreover, \LB data can be used to improve scheduling decisions. - -\subsubsection{\LB and real time monitoring} -The \LB server is extended to provide quickly and without any substantial -load on the database engine the following data: -\begin{enumerate} -\item number of jobs in the system grouped by internal status -(\emph{Submitted}, \emph{Running}, \emph{Done},~\ldots), -\item number of jobs that reached final state in the last -hour, -\item associated statistics like average, maximum, and minimum time spent -by jobs in the system, -\item number of jobs that entered the WMS system in the last hour. -\end{enumerate} -\LB server can be regularly queried to provide this data to give an -overview about both jobs running on the Grid and also the behavior of the -Grid infrastructure as seen from the job (or end user) perspective. -Thus \LB\ becomes a~data source for various real-tim Grid monitoring tools. - -\subsubsection{R-GMA feed} -The \LB server also supports streaming the most important data---the job -state changes---to another monitoring system. It works as the -notification service, sending information about job state changes to -a~specific listener that is the interface to a monitoring interface. -As a~particular example of such a generic service, the R-GMA feed component -has been developed. It supports sending job state changes to -the R-GMA infrastructure that is part of the Grid monitoring -infrastructure used in the EGEE Grid. - -Currently, only basic information about job state changes is provided -this way, taking into account the security limitation of the R-GMA. - -\subsubsection{\LB Job Statistics} -Data collected within the \LB servers are regularly purged, complicating -thus any long term post-mortem statistical analysis. Without a Job -Provenance, the data from the \LB must be copied in a controlled way and -made available in an environment where even non-indexed queries can be -asked. - -Using the \LB Job Statistics tools, one dump file per job is created -when the job reaches a~terminal state. These dump files can be -further processed to provide and XML encoded Job History Record% -\footnote{\url{http://egee.cesnet.cz/en/Schema/LB/JobRecord}} that -contains all the relevant information from the job life. The Job History -Records are fed into a statistical tools to reveal interesting information -about the job behavior within the Grid. - -This functionality is being replaced by the direct download of all the -relevant data from the Job Provenance. - -\subsubsection{Computing Element reputability rank} -\label{s:ce-rank} -Production operation of the EGEE middleware showed -that misbehaving computing elements may have significant impact on -the overall Grid performance. -The most serious problem is the ``black hole'' effect---a~CE that -accepts jobs at a~high rate but they all fail there. -Such CE usually appears to be free in Grid information services -so the resource brokers keep to assign further jobs to it. - -\LB data contain sufficient information to identify similar problems. -By processing the incoming data the information -was made available as on-line auxiliary statistics like -rate of incoming jobs per CE, rate of job failure, average duration of job etc. -The implementation is lightweight, allowing very high query rate. -On the RB the statistics are available as ClassAd -functions, allowing the user to specify that similarly misbehaving -CE's should be penalized or completely avoided -when RB decides where jobs get submitted. - - -\subsubsection{CREAM jobs} -\LB 2.1 implements basic support for CREAM jobs. \LB gathers events from CREAM, performing both the mapping of CREAM attributes to WMS attributes (if possible) and storing CREAM-specific atributes. Thus, the jobs submitted directly to computing elements can be tracked by \LB as well as extended data from WMS. The CREAM job states are mapped to \LB ones according to Appendix \ref{a:creammapping}. - -CREAM events are generated by thee CREAM executor and LRMS, the generic \emph{CREAMStatus} event is generated when CREAM notifies that the job status has been changed. - -\subsubsection{Non-gLite event sources} -\label{sec:nonglite} - -\LB has been enhanced to support also non-gLite events, namely events from PBS -or Condor batch systems \cite{hpdc07}. These events are handeled differently from gLite events, -for a complete list of the PBS and Condor events see Appendix \ref{a:events}. -Since job states in the batch system slightly differ from the states of a job -defined in \LB (see also Appendix \ref{a:jobstat}), events are processed separately -from gLite events. Both PBS and Condor events has its own state machine that processes the -events and determines the now state of the job. - -Recently, there were also attempts to use \LB system to transport different types of events: -Certificate Revocation Lists or syslog messages. For a detailed description see -\cite{LB4CRL}. - - diff --git a/org.glite.lb.doc/src/LBUG-Tools.tex b/org.glite.lb.doc/src/LBUG-Tools.tex deleted file mode 100644 index 1136501..0000000 --- a/org.glite.lb.doc/src/LBUG-Tools.tex +++ /dev/null @@ -1,132 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -\section{User tools} -\label{s:lb-tools} - -In this section we give a description of the CLI tools that a regular grid user -might want to use. If not stated otherwise, the tools are distributed in the -\verb'glite-lb-client' package. - -\subsection{Environment variables} - -Behaviour of the commands can be changed by setting enviroment variables, specifing mostly -location of servers or setting timeouts for various operations. -For a complete list of environment variables, their form and default value -description, see Appendix~\ref{a:environment}. Setting the environment variable -is for some commands mandatory, so reading the documentaion below and -appropriate manpages is highly recommended. - - -\subsection{glite-wms-job-status and glite-wms-job-logging-info} - -We start with tools that are distributed in \verb'glite-wms-ui-cli-python' package -and that can be found probably on all UI machines. Description of all user -commands that are used during the job submission process (generating proxy, -creating a JDL describing the job, submitting a job, retrieving output, -cancelling a job, etc.) is beoynd this document and it can be found for example -in \cite{wmsug}. We mention here only the commands that are related to -job monitoring. - -Once job has been submitted to WMS (by \verb'glite-wms-job-submit'), -a user can retrieve the job status by -\begin{verbatim} - glite-wms-job-status -\end{verbatim} -or if job ID is saved in the file -\begin{verbatim} - glite-wms-job-status -i -\end{verbatim} -or if user wants to see status of all his/her jobs -\begin{verbatim} - glite-wms-job-status --all -\end{verbatim} -List of all possible job states is summarised in Appendix \ref{a:jobstat}. - -Logging details on submitted job can be accessed via -\begin{verbatim} - glite-wms-job-logging-info -v -\end{verbatim} -or if job ID is saved in the file -\begin{verbatim} - glite-wms-job-logging-info -v -i -\end{verbatim} -where verbosity level can be from 0 to 3. - - -\input{logevent} - -\input{notify} - - -\subsection{HTML and plain text interface} -\label{simple} -Since the gLite jobId has the form of a unique URL, it is possible to cut and paste it directly -to the web browser to view the information about the job (esp. its status), e.g. -\begin{verbatim} - firefox https://pelargir.ics.muni.cz:9000/1234567890 -\end{verbatim} -To list all user's jobs, it is possible to query only the \LB server address, e.g. -\begin{verbatim} - firefox https://pelargir.ics.muni.cz:9000 -\end{verbatim} -To list all user's notification registration curently valid on a given \LB server, use a URL constructed as in folowing example: -\begin{verbatim} - firefox https://pelargir.ics.muni.cz:9000/NOTIF -\end{verbatim} -A notification ID also have a form of URL. If you direct your browser to a particular notification ID, the \LB server will provide the notification details for it. -\begin{verbatim} - firefox https://pelargir.ics.muni.cz:9000/NOTIF:1234567890 -\end{verbatim} -In all cases it is necessary to have the user certificate installed in the browser. - - -Since \LBver{2.0}, it is also possible to obtain the above results in a machine readable -\verb'key=value' form by adding a suffix \verb'text' to the above URLs. For example -\begin{verbatim} - curl -3 --key $X509_USER_KEY --cert $X509_USER_CERT \ - --capath /etc/grid-security/certificates \ - https://pelargir.ics.muni.cz:9000?text -\end{verbatim} -or -\begin{verbatim} - curl -3 --key $X509_USER_KEY --cert $X509_USER_CERT \ - --capath /etc/grid-security/certificates \ - https://pelargir.ics.muni.cz:9000/1234567890?text -\end{verbatim} - -\subsection{Job state changes as an RSS feed} -The \LB includes an RSS interface allowing users to keep trace of their jobs in a very simple way using an RSS reader. The parameters of the RSS feeds are predefined, so no configuration is required. - -The address of a feed is given by the URL of the \LB server and a \textit{/RSS:rss\_feed\_name} postfix, e.g. -\begin{verbatim} - https://pelargir.ics.muni.cz:9000/RSS:finished -\end{verbatim} - -There are currently 3 feeds implemented in LB: -\begin{itemize} - \item \textit{finished} for jobs in terminal states (Done/OK, Aborted and Canceled) - \item \textit{running} for running jobs - \item \textit{aborted} for aborted jobs -\end{itemize} - -\subsection{Other useful tools} - -For debugging purposes, low-level commands for getting \LB job status and job related events are provided in -\verb'examples' directory (\verb'glite-lb-job_status' and \verb'glite-lb-job_log'). The same directory -contains also debugging commands for getting of all user jobs (\verb'glite-lb-user_jobs') and -CE-reputability rank (see Section \ref{s:ce-rank}, \verb'glite-lb-stats'). - diff --git a/org.glite.lb.doc/src/LBUG-Troubleshooting.tex b/org.glite.lb.doc/src/LBUG-Troubleshooting.tex deleted file mode 100644 index 50994c2..0000000 --- a/org.glite.lb.doc/src/LBUG-Troubleshooting.tex +++ /dev/null @@ -1,59 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -\section{Troubleshooting} - -Please, report usage problems via the GGUS support system at -\begin{center} -\url{https://gus.fzk.de/index.html} -\end{center} -Apparent software bugs are tracked in Savannah at -\begin{center} -\url{https://savannah.cern.ch/bugs/?func=additem&group=jra1mdw} -\end{center} - -When submitting a \LB spcecific problem/bug, the following information might be useful: -\begin{itemize} -\item version of software used (all \verb'glite-lb-*' packages installed at your site) -\item description of the problem, the \verb'jobId', addresses of all relevant - machines (\LB server, ...), environment variables set, etc. -\item output from the following commands: -\begin{verbatim} - glite-wms-job-status - glite-wms-job-logging-info -v 3 -\end{verbatim} -\item information on your proxy: -\begin{verbatim} - voms-proxy-info -debug -all -\end{verbatim} -or, if VOMS client is not installed, -\begin{verbatim} - grid-proxy-info -debug -\end{verbatim} -\item sometimes additional information can be found in the output from the commands -\begin{verbatim} - glite-lb-job_status - glite-lb-job_log -\end{verbatim} -that should be available in the \verb'$GLITE_LOCATION/examples' directory, -\item appropriate excerpts from the logs on the server side are also highly appreciated, -please tell your administrator to look at the Troubleshooting section in LB Administrator's -Guide \cite{lbag} to follow the steps there and provide you the necessary information. -\end{itemize} - -Users are encouradged to send developers all non-bugs comments and questions by email to -address \email{egee-jra1@lindir.ics.muni.cz}. - diff --git a/org.glite.lb.doc/src/LBUG.tex b/org.glite.lb.doc/src/LBUG.tex deleted file mode 100644 index 6fb9994..0000000 --- a/org.glite.lb.doc/src/LBUG.tex +++ /dev/null @@ -1,60 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -\documentclass{egee} -\def\insideUG{} - -\input{definitions} - -\title{Logging and Bookkeeping} -\Subtitle{User's Guide} -\author{CESNET EGEE III JRA1 and SA3 team} -\DocIdentifier{glite-lb-doc-ug-\version} -\DeliverableId{} -\Date{\today} -\Activity{JRA1: Middleware Engineering} -\DocStatus{FINAL, version \version} -\Dissemination{PUBLIC} -\DocumentLink{\url{http://egee.cesnet.cz/cvsweb/LB/LBUG.pdf}} -\Abstract{\input{LBUG-Abstract}} - -\begin{document} - -\input{frontmatter} -\tableofcontents - -\newpage -\input{versions} - -\newpage -\input{LBUG-Introduction} - -\newpage -\input{LBUG-Tools} - -\newpage -\input{LBUG-Troubleshooting} - -\appendix -\newpage -\input{LBUG-Appendix} - -\newpage -\bibliographystyle{unsrt} -\bibliography{lbjp} - -\end{document} - diff --git a/org.glite.lb.doc/src/README b/org.glite.lb.doc/src/README deleted file mode 100644 index 20b9e45..0000000 --- a/org.glite.lb.doc/src/README +++ /dev/null @@ -1,13 +0,0 @@ -This is the official documentation for Logging and Bookkeeping Service. -It consists of the following documents: - -LBUG.pdf - Logging and Bookkeeping User's Guide -LBAG.pdf - Logging and Bookkeeping Admin's Guide -LBDG.pdf - Logging and Bookkeeping Developer's Guide -LBTP.pdf - Logging and Bookkeeping Test Plan - -Please, report all bugs to EU EGEE Bug Tracking System located at -https://savannah.cern.ch/bugs/?func=additem&group=jra1mdw - -Feel free to send us your non-bugs comments to email -egee-jra1@lindir.ics.muni.cz diff --git a/org.glite.lb.doc/src/README-standards.txt b/org.glite.lb.doc/src/README-standards.txt deleted file mode 100644 index 77e795b..0000000 --- a/org.glite.lb.doc/src/README-standards.txt +++ /dev/null @@ -1,291 +0,0 @@ -Logging and Bookkeeping (LB) service and standards -================================================== - -The aim of this document is to list all possible IT standards related to the -Logging and Bookkeeping (LB) service togehter with the recommendations what should -be changed in the LB code to support the standards as well as with the proposals -to change also the standard specifications. There is no particular order in the list. - -Good starting points for reading are: - -[OGSA-Standards] Defining the Grid: A Roadmap for OGSA® Standards -OGF Informational Document GFD-I.123 http://www.ogf.org/documents/GFD.123.pdf -- overview of the many interrelated recommendations and -informational documents being produced by the OGSA - -[OGSA-Architecture] The Open Grid Services Architecture, Version 1.5 -OGF Informational Document GFD-I.080 http://www.ogf.org/documents/GFD.80.pdf -- Job Tracking not explicitly mentioned here, maybe we could propose OGSA-LB? :) - -Standards and Web services -- see http://www.ibm.com/developerworks/webservices/standards/ - - -Command Line + User Interface Standards ---------------------------------------- - -- support for Internationalization (i18n) and localization (l10n), -in particular UTF-8 support in user tags --- switch all output to LC_MESSAGES compliant format - -- standard error codes from all CLI tools --- define on gLite level - - -Coding and Language Standards ------------------------------ - -[WSDL] Web Services Description Language (WSDL) 1.1 -W3C Note http://www.w3.org/TR/wsdl -- check if LB.wsdl and LBTypes.wsdl satisfy this specification - -[XML] Extensible Markup Language (XML) 1.1 (Second Edition) -W3C Recommendation http://www.w3.org/TR/xml11 -- check if all XMLs in LB satisfy this specification - -[XML-Namespaces] Namespaces in XML 1.1 (Second Edition) -W3C Recommendation http://www.w3.org/TR/xml-names11 -- check if all XML namespaces in LB satisfy this specification - -[SOAP] SOAP Version 1.2 -W3C Recommendation http://www.w3.org/TR/soap12 -- check SOAP in security.gsoap-plugin -- see also W3C Working Group XML Protocol: http://www.w3.org/2000/xp/Group/ - -[GNU] GNU Coding Standards: http://www.gnu.org/prep/standards/ -- DISCUSSION: adopt these coding standards to the code of LB? - - -Network Protocols Standards ---------------------------- - -[IPv6] Internet Protocol version 6 (IPv6) -IETF Standard, for IPv6 related specifications see http://www.ipv6.org/specs.html -- all communication in LB must be modified to fully support IPv6 -- affected modules: [org.glite.]jobid, security.gss, security.gsoap-plugin, lb.common, -lb.client, lb.logger, lb.server - -[SNMP] Simple Network Management Protocol (SNMP), Version 3 -IETF Standard, for list of related RFCs see http://en.wikipedia.org/wiki/SNMP#RFCs -- SNMPv3: http://www.ibr.cs.tu-bs.de/projects/snmpv3/ -- create private enterprise numbers for gLite under the prefix: -iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) -- create MIB for LB and implement basic monitoring functions (lb.server) - - -Job related standards ---------------------- - -[JSDL] Job Submission Description Language (JSDL) Specification, Version 1.0 -OGF Recommendation GFD-R.136 http://www.ogf.org/documents/GFD.136.pdf -- specifies the semantics and structure of JSDL and includes the normative XML Schema for JSDL -- LB should be aware of the JSDL format since some of the attributes are (will be) read from it - -[JSDL-exp] Implementation and Interoperability Experiences with the Job Submission Description Language(JSDL) 1.0 -OGF Experimental Document GFD-E.140 http://www.ogf.org/documents/GFD.140.pdf -- good summary of different JSDL implementations and interoperability experiences -- LB should be aware of different JSDL implementations - -[OGSA-BES] OGSA Basic Execution Service, Version 1.0 -OGF Proposed Recommendation GFD-R-P.108 http://www.ogf.org/documents/GFD.108.pdf -- defines a basic state model with states: -pending, running, finished, terminated, failed (last three terminal states) -- plus specializations: -running -> running stage-in, running executing, running stage-out -running -> running proceeded, running suspended (with events resume, suspend) -running -> running on-resource, running migrating (with event migrate) -running -> running can-proceed, running held (with events hold, release) -- LB could provide information for BES-Factory and BES-Activity port-type -BES-Factory port-type defines operations for initiating, monitoring, and managing -sets of activities, and for accessing information about the BES. -BES-Activity port-type indicates an extension point for operations relating to the -monitoring and management of individual activities. BES-Activity is unspecified -and maybe it could be extended by LB specification in the future. -- reflect the above states specializations in the LB state machine - - -WS Standards ------------- - -[WS-I-BP] The Web Services-Interoperability Organization (WS-I) Basic Profile -Version 1.1 (Specification) http://www.ws-i.org/Profiles/BasicProfile-1.1.html -Version 1.2 (Board Approval Draft) http://www.ws-i.org/Profiles/BasicProfile-1.2.html -Version 2.0 (Working Group Draft) http://www.ws-i.org/Profiles/BasicProfile-2_0(WGD).html -- defines a set of non-proprietary WS specifications, along with clarifications, -refinements, interpretations and amplifications of those specifications which promote -interoperability -- rather general specification of WS interoperability, defines messages and service description -(esp. SOAP Bindings) -- check if LB WS needs to change - -[WS-Addresing] Web Services Addressing 1.0 - Core -W3C Recommendation http://www.w3.org/TR/ws-addr-core -+ -[WS-Naming] WS-Naming Specification -OGF Proposed Recommendation GFD-R-P.109 http://www.ogf.org/documents/GFD.109.pdf -- in LB define properly EndPoint Identifier (EPI) - - -WS Data Acces and Integration ------------------------------ - -[WS-DAI] Web Services Data Access and Integration - The Core (WS-DAI) Specification, Version 1.0 -OGF Proposed Recommendation GFD-R-P.074 http://www.ogf.org/documents/GFD.74.pdf -- specification for a collection of generic data interfaces that are made available as WS -- describe basic concepts (data service model, interface, data access, lifetime) -and data service properties and messages (static and configurable data description, data access and -factory messages) -- this is general specification, see particular proposals to access relational [WS-DAIR] and -XML [WS-DAIX] representations of data below -- there are probably no particular needs to change this specification (at the moment) -- LB probably COULD be WS-DAI compliant and implement at least one of the WS-DAIR or WS-DAIX -realisations - do we really want it? - - -[WS-DAIX] Web Services Data Access and Integration - The XML Realization (WS-DAIX) Specification, Version 1.0 -OGF Proposed Recommendation GFD-R-P.075 http://www.ogf.org/documents/GFD.75.pdf -- specification for a collection of data access interfaces for XML data resources -- it is NOT a new query/update language for XML, it works as a "channel" to XPath/XQuery/XUpdate -- defines new interfaces XMLCollectionDescription and XMLCollectionAccess --- direct access to data: XPathAccess/XQueryAccess/XUpdateAccess across a XMLCollection --- indirect access: XPathFactory/XQueryFactory/XUpdateFactory across a XMLCollection -- XMLCollection collects together XML documents (MAY be nested) --- several different approaches in LB possible: "single document" could be a -job state description -> collection of jobs -one event -> collection of events -one query -> complex queries --- XMLCollectionAccess then defines operations -Add/Get/Remove Documents, Create/Remove Subcollection, Add/Get/Remove Schema -- XMLSequence represents the result sequence of an XQuery or XPath request. A sequence is -an ordered collection of zero or more items (node, atomic value) -- implementation in LB MAY be either easy (update already used XML to WS-DAIX "format") -or very difficult (keep data on LB server in one or more different XML formats) - - -[WS-DAIR] Web Services Data Access and Integration - The Relational Realisation (WS-DAIR) Specification, Version 1.0 -OGF Proposed Recommendation GFD-R-P.076 http://www.ogf.org/documents/GFD.76.pdf -- specification for a collection of data access interfaces for relational data resources -- defines a new direct access interfaces SQLAccessDescription and SQLAccess -and indirect SQLAccessFactory and SQLResponseFactory -- SQLAccess then defines operations -GetSQLPropertyDocument (returns SQLAccessDescription, i.e. static schema + dataset description) and -SQLExecute (IN: SQLExecuteRequest, OUT: SQLExecuteResponse) -- response is defined by SQLResponseDescription/Access, --- it can contain SQLRowSets - results of an SQL query over the database, it is defined by SQLRowSetDescription/Access -- implementation in LB could be easier than for WS-DAIX -- could be an independent service on top of the LB database (or directly in the lb.server?) -- should not be difficult to define the AccessDescription and implement Access - - -[DAIS-InterTest] Interoperability Testing for DAIS Working Group Specifications -OGF Informational Document GFD-I.077 http://www.ogf.org/documents/GFD.77.pdf -- describes how to test WS-DAI* implementations (mandatory and optional features) -- once LB implements WS-DAI*, these tests will have to be performed - - -WS Notifications ----------------- - -WS-Notification is a family of related specifications that define a standard Web services -approach to notification using a topic-based publish/subscribe pattern. -- see http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wsn - -[WS-BaseNotification] Web Services Base Notification 1.3 -OASIS Standard http://docs.oasis-open.org/wsn/wsn-ws_base_notification-1.3-spec-os.pdf -- standard message exchanges to be implemented by service providers that wish to participate in Notifications -- defines notification consumer and producer interface, pull-style notifications, -subscription manager interface, and some security considerations -- Notifications via WS is a new functionality to LB that should not be too difficult to implement - -[WS-BrokeredNotification] Web Services Brokered Notification 1.3 -OASIS Standard http://docs.oasis-open.org/wsn/wsn-ws_brokered_notification-1.3-spec-os.pdf -- standard message exchanges for a notification broker service provider (allowing publication -of messages from entities that are not themselves service providers) -- a notification broker is an intermediary between message publishers and message subscribers -- possible implementation in LB might consider a notification broker rather than implementing -the functionality directly within the LB server - -[WS-Topics] Web Services Topics 1.3 -OASIS Standard http://docs.oasis-open.org/wsn/wsn-ws_topics-1.3-spec-os.pdf -- defines a mechanism to organize and categorize items of interest for subscription known as “topics” -- defines four topic expression dialects that can be used as subscription expressions in subscribe -request messages and other parts of the WS-Notification system -- specifies an XML model for describing metadata associated with topics -- this document should be considered during implementation of WS-Notifications - - -WS Reliable Messaging ---------------------- - -[WS-RM] Web Services ReliableMessaging 1.1 -OASIS Standard http://docs.oasis-open.org/ws-rx/wsrm/200702/wsrm-1.1-spec-os-01-e1.html -- describes a protocol that allows messages to be delivered reliably between -distributed applications in the presence of software component, system, or network failures -- see also https://www.ibm.com/developerworks/webservices/library/specification/ws-rm/ -- it probably SHOULD be considered when implementing LB WS-Notifications as well as -in the standard WS messaging provided by LB - - -WS Security ------------ - -[WS-I-BSP] The Web Services-Interoperability Organization (WS-I) Basic Security Profile -Version 1.0 (Specification) http://www.ws-i.org/Profiles/BasicSecurityProfile-1.0.html -Version 1.1 (Working Group Approval Draft) http://www.ws-i.org/Profiles/BasicSecurityProfile-1.1.html -- defines transport layer mechanisms, SOAP nodes and messages, security headers, timestamps, -security tokens (X.509, Kerberos, SAML, EncryptedKey), XML Signature and XML Encryption, -attachment security -- LB should probably adopt all these mechanisms - -[WS-I-RSP] The Web Services-Interoperability Organization (WS-I) Reliable Security Profile -Version 1.0 (Working Group Draft) http://www.ws-i.org/Profiles/ReliableSecureProfile-1.0.html -- defines secure reliable messaging and secure conversation -- LB should probably adopt all these mechanisms -- see also Reliable Secure Profile Usage Scenarios http://www.ws-i.org/profiles/rsp-scenarios-1.0.pdf - -[Sec-addr] Secure Addressing Profile 1.0 -OGF Proposed Recommendation GFD-R-P.131 http://www.ogf.org/documents/GFD.131.pdf -- defines WS-SecurityPolicy assertions within WS-Addressing -- in LB define properly EndPoint Reference (EPR) -- affects all LB WS (ljocha: especially LB notifications?) - -[Sec-comm] Secure Communication Profile 1.0 -OGF Proposed Recommendation GFD-R-P.132 http://www.ogf.org/documents/GFD.132.pdf -- defines authentication, authorization (and auditing), integrity and confidentiality properties of WS interactions -- affects all LB WS, LB SHOULD adopt: --- Message-level authentication (see section 7) --- Integrity (e.g. CRITICAL_SIGNING of SOAP messages) --- more transport-level mechanisms and policies (see section 6) -- proper LB security audit required - - -WS Transactions ---------------- - -WS Transactions specifications define mechanisms for transactional interoperability between -WS domains and provide a means to compose transactional qualities of service into WS applications. -- see http://www.ibm.com/developerworks/webservices/library/specification/ws-tx -- describes an extensible coordination framework (WS-Coordination) and specific coordination types for -short duration, ACID transactions (WS-AtomicTransaction) and longer running business transactions (WS-BusinessActivity) -- LB should consider WS-AtomicTransaction when logging via WS is going to be supported -(org.glite.lb.java-client?) and WS-BusinessActivity probably for WS queries - - -Other references ----------------- - -[OASIS] OASIS Standards and Other Approved Work -- see http://www.oasis-open.org/specs/ - -[OGF] OGF Documents -- http://www.ogf.org/gf/docs/?final - -[W3C] W3C Technical Reports and Publications -- see http://www.w3.org/TR/ - -[STD] IETF Official Internet Protocol Standards -- see http://www.rfc-editor.org/rfcxx00.html - -[IETF] IETF Internet-Drafts -- see http://www.ietf.org/ID.html - diff --git a/org.glite.lb.doc/src/change_acl.tex b/org.glite.lb.doc/src/change_acl.tex deleted file mode 100644 index 61214b8..0000000 --- a/org.glite.lb.doc/src/change_acl.tex +++ /dev/null @@ -1,94 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -\subsubsection{Example: Changing Job Access Control List} -\label{e:change-acl} - -In order to change the Access Control List (ACL) for a job, a special event -\verb'ChangeACL' is used. This event can be logged by the job owner using the -\verb'glite-lb-logevent' command (see also Sect.~\ref{glite-lb-logevent}). -The general template for changing the ACL is as follows: - -\begin{verbatim} -glite-lb-logevent -e ChangeACL -s UserInterface -p -j - --user_id - --user_id_type - --permission READ - --permission_type --operation -\end{verbatim} - -where - -\begin{tabularx}{\textwidth}{>{\texttt}lX} -\verb'' & specifies the job to change access to\\ -\verb'' & specifies the user to grant or revoke permission. The - parameter can be either an X.500 name - (subject name), a VOMS group (of the form VO:Group), or a Full - qualified attribute name (FQAN). \\ -\verb'' & indicates the type of the user\_id given above. - \verb'DN', \verb'GROUP', and \verb'FQAN' can be given to - specify X.500 name, VOMS group, or FQAN, respectively \\ -\verb'' & ACL permission to change, currently only \verb'READ' is - supported. \\ -\verb'' & Type of permission requested. \verb'ALLOW' or - \verb'DENY' can be specified. \\ -\verb'' & Operation requested to be performed with ACL. \verb'ADD' - or \verb'REMOVE' can be specified. \\ -\end{tabularx} - -Adding a user specified by his or her subject name to the ACL (\ie granting -access rights to another user): - -\begin{verbatim} -glite-lb-logevent -e ChangeACL -s UserInterface -p -j \ - --user_id '/O=CESNET/O=Masaryk University/CN=Daniel Kouril' \ - --user_id_type DN --permission READ --permission_type ALLOW \ - --operation ADD -\end{verbatim} - - -Removing a user specified by his or her subject name from the ACL (\ie -revoking access right to another user): - -\begin{verbatim} -glite-lb-logevent -e ChangeACL -s UserInterface -p -j \ - --user_id '/O=CESNET/O=Masaryk University/CN=Daniel Kouril' \ - --user_id_type DN --permission READ --permission_type ALLOW \ - --operation REMOVE -\end{verbatim} - - -Adding a VOMS attribute to the ACL: - -\begin{verbatim} -glite-lb-logevent -e ChangeACL -s UserInterface -p -j \ - --user_id '/VOCE/Role=Administrator' --user_id_type FQAN \ - --permission READ --permission_type ALLOW \ - --operation ADD -\end{verbatim} - - -Note that \LBver{1.x} supported only using VOMS group names, not full FQANs, -whose support has been introduced in \LBver{2.0}. \LBver{1.x} also did not -allowed the users to use symbolic names for the values specifying ACL -setting and integers must be used instead. For example, to grant access -right on a \LBver{1.x} server one has to use following syntax: - -\begin{verbatim} -glite-lb-logevent -e ChangeACL -s UserInterface -p -j \ - --user_id '/O=CESNET/O=Masaryk University/CN=Daniel Kouril' \ - --user_id_type 0 --permission 1 --permission_type 0 --operation 0 -\end{verbatim} diff --git a/org.glite.lb.doc/src/components.tex b/org.glite.lb.doc/src/components.tex deleted file mode 100644 index 314ce77..0000000 --- a/org.glite.lb.doc/src/components.tex +++ /dev/null @@ -1,166 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -\subsubsection{\LB API and library} -Both logging events and querying the service are implemented via -calls to a~public \LB API. -The complete API (both logging and queries) -is available in ANSI~C binding, most of the querying capabilities also in C++. -These APIs are provided as sets of C/C++ header files and shared libraries. -The library implements communication protocol with other \LB components -(logger and server), including encryption, authentication etc. -Since \LBver{2.0} an experimental Java binding of the logging API is available. - -We do not describe the API here in detail; it is documented in~\LB Developer's -Guide\cite{lbdg}, -including complete reference and both simple and complex usage examples. - -Events can be also logged with a~standalone program (using the C~API in turn), -intended for usage in scripts. - -The query interface is also available as a~web-service provided by the -\LB server (Sect.~\ref{server}). - -Finally, certain frequent queries (all user's jobs, single job status, \dots) -are available as HTML pages (by pointing ordinary web browser to the \LB server -endpoint), or as simple text queries (since \LBver{2.0}) intended for scripts. -See~% -\ifx\insideUG\undefined -\cite{lbug} -\else -\ref{simple} -\fi -for details. - -\subsubsection{Logger} -\label{comp:logger} -The task of the \emph{logger} component is taking over the events from -the logging library, storing them reliably, and forwarding to the destination -server. -The component should be deployed very close to each source of events---on the -same machine ideally, or, in the case of computing elements with many -worker nodes, on the head node of the cluster% -\footnote{In this setup logger also serves as an application proxy, -overcoming networking issues like private address space of the worker nodes, -blocked outbound connectivity etc.}. - -Technically the functionality is realized with two daemons: -\begin{itemize} -\item \emph{Local-logger} accepts incoming events, -appends them in a~plain disk file (one file per Grid job), -and forwards to inter-logger. -It is kept as simple as possible in order to achieve -maximal reliability. -\item \emph{Inter-logger} accepts the events from the local-logger, -implements the event routing (currently trivial as the destination -address is a~part of the jobid), and manages -delivery queues (one per destination server). -It is also responsible for crash recovery---on startup, the queues are -populated with undelivered events read from the local-logger files. -Finally, the inter-logger purges the files when the events are delivered to -their final destination. -\end{itemize} - -\subsubsection{Server} -\label{server} -\emph{\LB server} is the destination component where the events are delivered, -stored and processed to be made available for user queries. -The server storage backend is implemented using MySQL database. - -Incoming events are parsed, checked for correctness, authorized (only the job -owner can store events belonging to a~particular job), and stored into the -database. -In addition, the current state of the job is retrieved from the database, -the event is fed -into the state machine -\ifx\insideUG\undefined\relax\else -(Sect.~\ref{evprocess}), -\fi -and the job state updated -accordingly. - -On the other hand, the server exposes querying interface (Fig.~\ref{f:comp-query}% -\ifx\insideUG\undefined\relax\else -, Sect.~\ref{retrieve} -\fi -). -The incoming user queries are transformed into SQL queries on the underlying -database engine. -The query result is filtered, authorization rules applied, and the result -sent back to the user. - -While using the SQL database, its full query power is not made available -to end users. -In order to avoid either intentional or unintentional denial-of-service -attacks, the queries are restricted in such a~way that the transformed SQL -query must hit a~highly selective index on the database. -Otherwise the query is refused, as full database scan would yield unacceptable -load. -The set of indices is configurable, and it may involve both \LB system -attributes (\eg job owner, computing element, -timestamps of entering particular state,~\dots) and user defined ones. - -The server also maintains the active notification handles% -\ifx\insideUG\undefined\relax\else -(Sect.~\ref{retrieve}) -\fi -, providing the subscription interface to the user. -Whenever an event arrives and the updated job state is computed, -it is matched against the active handles% -\footnote{The current implementation enforces specifying an~actual jobid -in the subscription hence the matching has minimal performance impact.}. -Each match generates a~notification message, an extended \LB event -containing the job state data, notification handle, -and the current user's listener location. -The event is passed to the \emph{notification inter-logger} -via persistent disk file and directly (see Fig.~\ref{f:comp-query}). -The daemon delivers events in the standard way, using the specified -listener as destination. -In addition, the server generates control messages when the user re-subscribes, -changing the listener location. -Inter-logger recognizes these messages, and changes its routing of all -pending events belonging to this handle accordingly. - - -% asi nepotrebujeme \subsubsection{Clients} - -\subsubsection{Proxy} -\label{s:proxy} - -\emph{\LB proxy} is the implementation of the concept of local view on job state (see -\ifx\insideUG\undefined{\cite{lbug}}\else{Sect.~\ref{local}}\fi). Since -\LBver{2.0}, \LB proxy is intergrated into \LB server executable. When deployed (on -the WMS node in the current gLite middleware) it takes over the role of the -local-logger daemon---it accepts the incoming events, stores them in files, and -forwards them to the inter-logger. - -In addition, the proxy provides the basic principal functionality of \LB server, -\ie processing events into job state and providing a~query interface, -with the following differences: -\begin{itemize} -\item only events coming from sources on this node are considered; hence -the job state may be incomplete, -\item proxy is accessed through local UNIX-domain socket instead of network -interface, -\item no authorization checks are performed---proxy is intended for -privileged access only (enforced by the file permissions on the socket), -\item aggressive purge strategy is applied---whenever a~job reaches -a~known terminal state (which means that no further events are expected), it is purged -from the local database immediately, -\item no index checks are applied---we both trust the privileged parties -and do not expect the database to grow due to the purge strategy. -\end{itemize} - diff --git a/org.glite.lb.doc/src/consumer_api.tex b/org.glite.lb.doc/src/consumer_api.tex deleted file mode 100644 index d081b38..0000000 --- a/org.glite.lb.doc/src/consumer_api.tex +++ /dev/null @@ -1,576 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -% -*- mode: latex -*- - -\section{\LB\ Querying (Consumer) API} -\label{s:Consumer-API} -The \LB Consumer API is used to obtain information from \LB server -or Proxy using simple query language (see -Sect.~\ref{s:querylang}). There are two types of queries based -on the results returned: -\begin{itemize} -\item query for events -- the result contains events satisfying given -criteria, -\item query for jobs -- the result contains JobId's and job states of jobs -satisfying given criteria. -\end{itemize} -The potential result sets can be very large; the \LB server imposes -limits on the result set size, which can be further restricted by the -client. - - -\subsection{Query Language} -\label{s:querylang} -The \LB query language is based on simple value assertions on job and -event attributes. There are two types of queries based on the -complexity of selection criteria, \textit{simple} and -\textit{complex}. -Simple queries are can be described by the following formula: -\begin{displaymath} -\textit{attr}_1 \mathop{\textrm{ OP }} \textit{value}_1 \wedge \dots \wedge -\textit{attr}_n \mathop{\textrm{ OP }} \textit{value}_n -\end{displaymath} -where $\textit{attr}_i$ is attribute name, $\mathop{\textrm{ OP }}$ is -one of the $=$, $<$, $>$, $\neq$ and $\in$ relational operators and -$\textit{value}$ is single value (or, in the case of $\in$ operator, -interval) from attribute type. - -Complex queries can be described using the following formula: -\begin{multline*} -(\textit{attr}_1 \mathop{\textrm{ OP }} \textit{value}_{1,1} \vee \dots \vee -\textit{attr}_1 \mathop{\textrm{ OP }} \textit{value}_{1,i_1}) \wedge \\ -(\textit{attr}_2 \mathop{\textrm{ OP }} \textit{value}_{2,1} \vee \dots \vee -\textit{attr}_2 \mathop{\textrm{ OP }} \textit{value}_{2,i_2}) \wedge \\ -\vdots \\ -\wedge (\textit{attr}_n \mathop{\textrm{ OP }} \textit{value}_{n,1} \vee \dots \vee -\textit{attr}_n \mathop{\textrm{ OP }} \textit{value}_{n,i_n}) -\end{multline*} -The complex query can, in contrast to simple query, contain more -assertions on value of single attribute, which are ORed together. - -\marginpar{Indexed attributes}% -The query must always contain at least one attribute indexed -on the \LB server; this restriction is necessary to avoid matching the -selection criteria against all jobs in the \LB database. The list of -indexed attributes for given \LB server can be obtained by \LB API -call. - -\subsection{C Language Binding} - -\subsubsection{Call Semantics} -The \LB server queries are, in contrast to logging event calls, -synchronous (for asynchronous variant see Sect.~\ref{s:Notification-API}, -notifications). The server response contains \jobid's, job states -and/or events known to the server at the moment of processing the -query. Due to the asynchronous nature of event delivery it may not -contain all data that was actually sent; the job state computation is -designed to be resilient to event loss to some extent. - -\marginpar{Result size limits}% -When the item count returned by \LB\ server exceeds the defined -limits, the \verb'E2BIG' error occur. There are two limits\,---\,the server -and the user limit. The user defined limit may be set in the context -at the client side, while the server imposed limit is configured at -the server and can be only queried by the client. The way the \LB -library and server handles the over--limit result size can be -specified by setting context parameter -\verb'EDG_WLL_PARAM_QUERY_RESULTS' to one of the following values: -\begin{itemize} -\item \verb'EDG_WLL_QUERYRES_NONE'\,---\,In case the limit is reached, -no results are returned at all. -\item \verb'EDG_WLL_QUERYRES_LIMITED'\,---\,A result contains at most -``limit'' item count. -\item \verb'EDG_WLL_QUERYRES_ALL'\,---\,All results are returned and -limits have no effect. This option is available only in special cases -such as ``user jobs query'' and the ``job status query''. Otherwise -the EINVAL error is returned. -\end{itemize} -Default value is \verb'EDG_WLL_QUERYRES_NONE'. - - -\subsubsection{Header Files} -\begin{table}[h!] -\begin{tabularx}{\textwidth}{>{\tt}lX} -glite/lb/consumer.h & Prototypes for all query functions. \\ -\end{tabularx} -\end{table} - -\subsubsection{Context Parameters} -The table~\ref{t:ccontext} shows parameters relevant to the query API. - -\begin{table}[h!] -\begin{tabularx}{\textwidth}{lX} -{\bf Name} & {\bf Description} \\ -\hline -\lstinline'EDG_WLL_PARAM_QUERY_SERVER' & -Default server name to query. -\\ -\lstinline'EDG_WLL_PARAM_QUERY_SERVER_PORT' & -Default server port to query. -\\ -\lstinline'EDG_WLL_PARAM_QUERY_SERVER_OVERRIDE' & -host:port parameter setting override even values in \jobid (useful for -debugging \& hacking only) -\\ -\lstinline'EDG_WLL_PARAM_QUERY_TIMEOUT' & -Query timeout. -\\ -\lstinline'EDG_WLL_PARAM_QUERY_JOBS_LIMIT' & -Maximal query jobs result size. -\\ -\lstinline'EDG_WLL_PARAM_QUERY_EVENTS_LIMIT' & -Maximal query events result size. -\\ -\lstinline'EDG_WLL_PARAM_QUERY_RESULTS' & -Flag to indicate handling of too large results. -\\ -\end{tabularx} -\caption{Consumer specific context parameters} -\label{t:ccontext} -\end{table} - - -\subsubsection{Return Values} -\LB\ server returns errors which are classified as hard and soft errors. -The main difference between these categories is that in the case of soft -errors results may still be returned. The authorization errors belong to -``soft error'' sort. Hard errors like \verb'ENOMEM' are typically all -unrecoverable, to obtain results the query must be repeated, possibly -after correcting the failure condition the error indicated. - -Depending on the setting of context parameter -\verb'EDG_WLL_PARAM_QUERY_RESULTS', the \verb'E2BIG' error may fall into both -categories. - - -\subsubsection{Query Condition Encoding} -\label{s:queryrec} -The \LB query language is mapped into (one- or two-dimensional) array -of attribute value assertions represented by -\verb'edg_wll_QueryRec' structure: -\begin{lstlisting} -typedef struct _edg_wll_QueryRec { - edg_wll_QueryAttr attr; //* \textit{attribute to query} - edg_wll_QueryOp op; //* \textit{query operation} - union { - char * tag; //* \textit{user tag name / JDL attribute "path"} - edg_wll_JobStatCode state; //* \textit{job status code} - } attr_id; - union edg_wll_QueryVal { - int i; //* \textit{integer query attribute value} - char *c; //* \textit{character query attribute value} - struct timeval t; //* \textit{time query attribute value} - glite_jobid_t j; //* \textit{JobId query attribute value} - } value, value2; -} edg_wll_QueryRec; -\end{lstlisting} - -% \TODO{pro prehlednost bych mozna pridal seznam vsech atributu na ktere se lze ptat} - -The table~\ref{t:cqueryattr} shows the most common query attributes. -For a complete list see \texttt{query\_rec.h}. - -\begin{table}[ht] -\begin{tabularx}{\textwidth}{lX} -{\bf Name} & {\bf Description} \\ -\hline -\lstinline'EDG_WLL_QUERY_ATTR_JOBID' & Job ID to query. \\ -\lstinline'EDG_WLL_QUERY_ATTR_OWNER' & Job owner. \\ -\lstinline'EDG_WLL_QUERY_ATTR_STATUS' & Current job status. \\ -\lstinline'EDG_WLL_QUERY_ATTR_LOCATION' & Where is the job processed. \\ -\lstinline'EDG_WLL_QUERY_ATTR_DESTINATION' & Destination CE. \\ -\lstinline'EDG_WLL_QUERY_ATTR_DONECODE' & Minor done status (OK,failed,cancelled). \\ -\lstinline'EDG_WLL_QUERY_ATTR_USERTAG' & User tag. \\ -\lstinline'EDG_WLL_QUERY_ATTR_JDL_ATTR' & Arbitrary JDL attribute. \\ -\lstinline'EDG_WLL_QUERY_ATTR_STATEENTERTIME' & When entered current status. \\ -\lstinline'EDG_WLL_QUERY_ATTR_LASTUPDATETIME' & Time of the last known event of the job. \\ -\end{tabularx} -\caption{Query record specific attributes.} -\label{t:cqueryattr} -\end{table} - -The table~\ref{t:cqueryop} shows all supported query operations. - -\begin{table}[ht] -\begin{tabularx}{\textwidth}{lX} -{\bf Name} & {\bf Description} \\ -\hline -\lstinline'EDG_WLL_QUERY_OP_EQUAL' & Attribute is equal to the operand value. \\ -\lstinline'EDG_WLL_QUERY_OP_LESS' & Attribute is grater than the operand value. \\ -\lstinline'EDG_WLL_QUERY_OP_GREATER' & Attribute is less than the operand value. \\ -\lstinline'EDG_WLL_QUERY_OP_WITHIN' & Attribute is in given interval. \\ -\lstinline'EDG_WLL_QUERY_OP_UNEQUAL' & Attribute is not equal to the operand value. \\ -\lstinline'EDG_WLL_QUERY_OP_CHANGED' & Attribute has changed from last check (supported since \LBver{2.0} in notification matching). \\ -\end{tabularx} -\caption{Query record specific operations.} -\label{t:cqueryop} -\end{table} - - - -\subsubsection{Query Jobs Examples} -\label{s:qjobs} - -The simplest use case corresponds to the situation when an exact job ID -is known and the only information requested is the job status. The job ID -format is described in~\cite{djra1.4}. Since \LBver{2.0}, it is also possible to -query all jobs belonging to a specified user, VO or RB. - -The following example shows how to retrieve the status information -about all user's jobs running at a specified CE. - -First we have to include neccessary headers: -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=headers-end\ headers]{cons_example1.c} - -Define and initialize variables: -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=variables-end\ variables]{cons_example1.c} - -Initialize context and set parameters: -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=context-end\ context]{cons_example1.c} - -Set the query record to \emph{all (user's) jobs running at CE 'XYZ'}: -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=queryrec-end\ queryrec]{cons_example1.c} - -Query jobs: -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=query-end\ query]{cons_example1.c} - -Now we can for example print the job states: -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=printstates-end\ printstates]{cons_example1.c} - - -In many cases the basic logic using only conjunctions is not sufficient. -For example, if you need all your jobs running at the destination XXX or at -the destination YYY, the only way to do this with the \texttt{edg\_wll\_QueryJobs()} -call is to call it twice. The \texttt{edg\_wll\_QueryJobsExt()} call allows to make -such a~query in a single step. -The function accepts an array of condition lists. Conditions within a~single list are -OR-ed and the lists themselves are AND-ed. - -The next query example describes how to get all user's jobs running at -CE 'XXX' or 'YYY'. - -We will need an array of three conditions (plus one last empty): - -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=variables-end\ variables]{cons_example2.c} - -The query condition is the following: - -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=queryrec-end\ queryrec]{cons_example2.c} - -As can be clearly seen, there are three lists supplied to -\texttt{edg\_wll\_QueryJobsExt()}. The first list specifies the owner of the -job, the second list provides the required status (\texttt{Running}) and -the last list specifies the two destinations. -The list of lists is terminated with \texttt{NULL}. -This query equals to the formula -\begin{quote} -\texttt{(user=NULL) and (state=Running) and (dest='XXX' or dest='YYY')}. -\end{quote} - -To query the jobs, we simply call -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=query-end\ query]{cons_example2.c} - - - -\subsubsection{Query Events Examples} - -Event queries and job queries are similar. Obviously, the return type is -different \Dash the \LB\ raw events. There is one more input parameter -representing specific conditions on events (possibly empty) in addition to -conditions on jobs. - -The following example shows how to select all events (and therefore jobs) -marking red jobs (jobs that were marked red at some time in the past) as green. - -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=variables-end\ variables]{cons_example3.c} - -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=queryrec-end\ queryrec]{cons_example3.c} - -This example uses \texttt{edg\_wll\_QueryEvents()} call. Two condition lists are -given to \texttt{edg\_wll\_QueryEvents()} call. One represents job conditions and -the second represents event conditions. These two lists are joined together with -logical and (both condition lists have to be satisfied). This is necessary as -events represent a state of a job in a particular moment and this changes in time. - -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=query-end\ query]{cons_example3.c} - -The \texttt{edg\_wll\_QueryEvents()} returns matched events and save them in the -\texttt{eventsOut} variable. Required job IDs are stored in the edg\_wll\_Event -structure. - -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=printevents-end\ printevents]{cons_example3.c} - -In a similar manor to \texttt{edg\_wll\_QueryJobsExt()}, there exists also \texttt{edg\_wll\_QueryEventsExt()} -that can be used to more complex queries related to events. See also \texttt{README.queries} for more examples. - - -Last \LB Querying API call is \texttt{edg\_wll\_JobLog()} that returns all events related to a single job. -In fact, it is a convenience wrapper around \texttt{edg\_wll\_QueryEvents()} and its usage is clearly -demonstrated in the client example \texttt{job\_log.c} (in the client module). - - - -\subsection{C++ Language Binding} -The querying C++ \LB API is modelled after the C \LB API using these basic principles: -\begin{itemize} -\item queries are expressed as vectors of -\verb'glite::lb::QueryRecord' instances, -\item \LB context and general query methods are represented by class -\verb'glite::lb::ServerConnection', -\item \LB job specific queries are encapsulated within class -\verb'glite::lb::Job', -\item query results are returned as (vector or list of) -\verb'glite::lb::Event' or \verb'glite::lb::JobStatus' read-only instances. -\end{itemize} - - -\subsubsection{Header Files} -Header files for the \LB consumer API are summarized in table~\ref{t:ccppheaders}. -\begin{table}[h] -\begin{tabularx}{\textwidth}{>{\tt}lX} -glite/lb/Event.h & Event class for event query results. \\ -glite/lb/JobStatus.h & JobStatus class for job query results. \\ -glite/lb/ServerConnection.h & Core of the C++ \LB API, defines -\verb'QueryRecord' class for specifying queries and -\verb'ServerConnection' class for performing the queries. \\ -glite/lb/Job.h & Defines \verb'Job' class with methods for job -specific queries. \\ -\end{tabularx} -\caption{Consumer C++ API header files} -\label{t:ccppheaders} -\end{table} - -\subsubsection{QueryRecord} -The \verb'glite::lb::QueryRecord' class serves as the base for mapping -the \LB query language into C++, similarly to the C counterpart -\verb'edg_wll_QueryRecord'. The \verb'QueryRecord' object represents -condition on value of single attribute: -\begin{lstlisting} -using namespace glite::lb; - -QueryRecord a(QueryRecord::OWNER, QueryRecord::EQUAL, "me"); -\end{lstlisting} -The \verb'QueryRecord' class defines symbolic names for attributes (in -fact just aliases to \verb'EDG_WLL_QUERY_ATTR_' symbols described in table\ -\ref{t:cqueryattr}) and for logical operations (aliases to -\verb'EDG_WLL_QUERY_OP_' symbols, table\ \ref{t:cqueryop}). The last -parameter to the \verb'QueryRecord' constructor is the attribute -value. - -There are constructors with additional arguments for specific -attribute conditions or logical operators that require it, \ie\ -the \verb'QueryRecord::WITHIN' operator and queries about state enter -times. The query condition ``job that started running between \verb'start' -and \verb'end' times' can be represented in the following way: -\begin{lstlisting} -struct timeval start, end; - -QueryRecord a(QueryRecord::TIME, QueryRecord::WITHIN, JobStatus::RUNNING, - start, end); -\end{lstlisting} - - -\subsubsection{Event} -The objects of class \verb'glite::lb::Event' are returned by the \LB event -queries. The \verb'Event' class intgstr roduces symbolic names for event -type (enum \verb'Event::Type'), event attributes (enum -\verb'Event::Attr') and their types (enum -\verb'Event::AttrType'), feature not available through the C API, as -well as (read only) access to the attribute values. Using -these methods you can: -\begin{itemize} -\item get the event type (both symbolic and string): -\begin{lstlisting} - Event event; - - // we suppose event gets somehow filled in - cout << "Event type: " << event.type << endl; - - cout << "Event name:" << endl; - // these two lines should print the same string - cout << Event::getEventName(event.type) << endl; - cout << event.name() << endl; -\end{lstlisting} -\item get the list of attribute types and values (see -line~\ref{l:getattrs} of the example), -\item get string representation of attribute names, -\item get value of given attribute. -\end{itemize} -The following example demonstrates this by printing event name and attributes: -\lstinputlisting[title={\bf File:}\lstname,numbers=left,linerange=event-end\ event]{util.C} - -\subsubsection{JobStatus} -The \verb'glite::lb::JobStatus' is a result type of job status -queries in the same way the \verb'glite::lb::Event' is used in event -queries. The \verb'JobStatus' class provides symbolic names for job -states (enum \verb'JobStatus::Code'), state attributes -(enum \verb'JobStatus::Attr') and their types (enum -\verb'JobStatus::AttrType'), and read only access to the -attribute values. Using the \verb'JobStatus' interface you can: -\begin{itemize} -\item get the string name for the symbolic job state: -\begin{lstlisting} - JobStatus status; - - // we suppose status gets somehow filled in - cout << "Job state: " << status.type << endl; - - cout << "State name: " << endl; - // these two lines should print the same string - cout << JobStatus::getStateName(status.type) << endl; - cout << status.name() << endl; -\end{lstlisting} -\item get the job state name (both symbolic and string), -\item get the list of job state attributes and types, -\item convert the attribute names from symbolic to string form and -vice versa, -\item get value of given attribute. -\end{itemize} -The following example demostrates this by printing job status (name -and attributes): -\lstinputlisting[title={\bf File:}\lstname,numbers=left,linerange=status-end\ status]{util.C} - -\subsubsection{ServerConnection}\label{s:ServerConnection} -The \verb'glite::lb::ServerConnection' class represents particular \LB -server and allows for queries not specific to particular job (these -are separated into \verb'glite::lb:Job' class). The -\verb'ServerConnection' instance thus encapsulates client part of -\verb'edg_wll_Context' and general query methods. - -There are accessor methods for every consumer context parameter listed -in table \ref{t:ccontext}, \eg for \verb'EDG_WLL_PARAM_QUERY_SERVER' -we have the following methods: -\begin{lstlisting} -void setQueryServer(const std::string& host, int port); -std::pair getQueryServer() const; -\end{lstlisting} -We can also use the generic accessors defined for the parameter types -\verb'Int', \verb'String' and \verb'Time', \eg: -\begin{lstlisting} -void setParam(edg_wll_ContextParam name, int value); -int getParamInt(edg_wll_ContextParam name) const; -\end{lstlisting} - -The \verb'ServerConnection' class provides methods for both event and job queries: -\begin{lstlisting} -void queryJobs(const std::vector& query, - std::vector& jobList) const; - -void queryJobs(const std::vector >& query, - std::vector& jobList) const; - -void queryJobStates(const std::vector& query, - int flags, - std::vector & states) const; - -void queryJobStates(const std::vector >& query, - int flags, - std::vector & states) const; - -void queryEvents(const std::vector& job_cond, - const std::vector& event_cond, - std::vector& events) const; - -void queryEvents(const std::vector >& job_cond, - const std::vector >& event_cond, - std::vector& eventList) const; -\end{lstlisting} -You can see that we use \verb'std::vector' instead of \verb'NULL' terminated -arrays for both query condition lists and results. The API does -not differentiate simple and extended queries by method name -(\verb'queryJobs' and \verb'queryJobsExt' in C), but by parameter -type (\verb'vector' -vs. \verb'vector>'). On the other hand there are -different methods for obtaining \jobid's and full job states as well -as convenience methods for getting user jobs. - -Now we can show the first example of job query from section -\ref{s:qjobs} rewritten in C++. First we have to include the headers: -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=headers-end\ headers]{cons_example1.cpp} - -Define variables: -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=variables-end\ variables]{cons_example1.cpp} - -Initialize server object: -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=queryserver-end\ queryserver]{cons_example1.cpp} - -Create the query condition vector: -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=querycond-end\ querycond]{cons_example1.cpp} - -Perform the query: -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=query-end\ query]{cons_example1.cpp} - -Print the results: -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=printstates-end\ printstates]{cons_example1.cpp} - -The operations can throw an exception, so the code should be enclosed -within try--catch clause. - -The second example rewritten to C++ looks like that; first the query -condition vector: -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=queryrec-end\ queryrec]{cons_example2.cpp} - -The query itself: -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=query-end\ query]{cons_example2.cpp} - -\subsubsection{Job} -The \verb'glite::lb::Job' class encapsulates \LB server queries -specific for particular job as well as client part of context. The -\verb'Job' object provides method for getting the job status and the -event log (\ie all events belonging to the job): -\begin{lstlisting} -JobStatus status(int flags) const; - -void log(std::vector &events) const; -\end{lstlisting} - -\marginpar{\bf Important!}% -It is important to notice that \verb'Job' objects contain -\verb'ServerConnection' as private member and thus encapsulate client -part of context. That makes them relatively heavy--weight objects and -therefore it is not recommended to create too many instances, but -reuse one instance by assigning different \jobid's to it. - - -\subsection{Web-Services Binding}\label{s:Consumer-API-WS} - -\TODO{ljocha: Complete review, list of all relevant (WSDL) files, their location, etc.} - -In this section we describe the operations defined in the \LB\ WSDL -file (\texttt{LB.wsdl}) as well as its custom types (\texttt{LBTypes.wsdl}). - -For the sake of readability this documentation does not follow the structure -of WSDL strictly, avoiding to duplicate information which is already present -here. Consequently, the SOAP messages are not documented, for example, as they -are derived from operation inputs and outputs mechanically. -The same holds for types: \eg\ we do not document defined elements -which correspond 1:1 to types but are required due to the literal SOAP -encoding. - -For exact definition of the operations and types see the WSDL file. - -\TODO{ljocha: Add fully functional WS examples - in Java, Python, C?} - - -Aby se na to neapomnelo: - -perl-SOAP-Lite-0.69 funguje -perl-SOAP-Lite-0.65 ne (stejne rve document/literal support is EXPERIMENTAL in SOAP::Lite ), tak ma asi pravdu - - -musi mit metodu ns() - diff --git a/org.glite.lb.doc/src/copyright.tex b/org.glite.lb.doc/src/copyright.tex deleted file mode 100644 index 41d9fc9..0000000 --- a/org.glite.lb.doc/src/copyright.tex +++ /dev/null @@ -1,40 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -% Taken from: -% https://twiki.cern.ch/twiki/bin/view/EGEE/EGEEgLiteSoftwareLicense -% -\vfill{} - -{\bf -Copyright} \copyright\ {\bf Members of the EGEE Collaboration. 2004. See -\href{http://www.eu-egee.org/partners/}{http://www.eu-egee.org/partners/} for -details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at - -\begin{center} -\href{http://www.apache.org/licenses/LICENSE-2.0}{http://www.apache.org/licenses/LICENSE-2.0} -\end{center} - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -} - diff --git a/org.glite.lb.doc/src/definitions.tex b/org.glite.lb.doc/src/definitions.tex deleted file mode 100644 index fdca0d7..0000000 --- a/org.glite.lb.doc/src/definitions.tex +++ /dev/null @@ -1,54 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -% external packages -\usepackage{xspace} -\usepackage{ifthen} -\usepackage{comment} -\usepackage{listings} - -% useful definitions -\def\LB{L\&B\xspace} -\newcommand\LBver[1]{\textbf{\LB version {#1}\xspace}} -\def\JP{JP\xspace} -%\def\eg{e.\,g.} -\def\eg{for example\xspace} -\def\Eg{For example\xspace} -%\def\ie{i.\,e.} -\def\ie{that is\xspace} -\def\wrt{with respect to\xspace} -\def\Dash{---\penalty-1000} - -\def\req{\noindent\textbf{Prerequisities:}} -\def\how{\noindent\textbf{How to run:}} -\def\what{\noindent\textbf{What to test:}} -\def\result{\noindent\textbf{Expected result:}} -\def\note{\noindent\textbf{Note:}} -\def\path#1{{\normalfont\textsf{#1}}} -\def\code#1{\texttt{#1}} -\def\ctblb#1{\code{org.glite.testsuites.ctb/LB/tests/#1}} - -\specialcomment{hints}{\par\noindent\textbf{Hints: }\begingroup\slshape}{\endgroup} -%\includecomment{hints} - -\long\def\TODO#1{\par\noindent\textbf{TODO:} {\sl#1}\par} -\long\def\ludek#1{} - -\hyphenation{plug-in} - -\newcommand{\email}[1]{\href{mailto:#1}{#1}} - -\input{ver.tex} diff --git a/org.glite.lb.doc/src/doxygen.sty b/org.glite.lb.doc/src/doxygen.sty deleted file mode 100644 index 90f368b..0000000 --- a/org.glite.lb.doc/src/doxygen.sty +++ /dev/null @@ -1,64 +0,0 @@ -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{doxygen} -\RequirePackage{calc} -\RequirePackage{array} -%\pagestyle{fancyplain} -\newcommand{\clearemptydoublepage}{\newpage{\pagestyle{empty}\cleardoublepage}} -%\renewcommand{\chaptermark}[1]{\markboth{#1}{}} -%\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}} -%\lhead[\fancyplain{}{\bfseries\thepage}] -% {\fancyplain{}{\bfseries\rightmark}} -%\rhead[\fancyplain{}{\bfseries\leftmark}] -% {\fancyplain{}{\bfseries\thepage}} -%\rfoot[\fancyplain{}{\bfseries\scriptsize Generated on Tue Feb 22 11:20:54 2005 for Glite LB Client: C - Interface by Doxygen }]{} -%\lfoot[]{\fancyplain{}{\bfseries\scriptsize Generated on Tue Feb 22 11:20:54 2005 for Glite LB Client: C - Interface by Doxygen }} -%\cfoot{} -\newenvironment{CompactList} -{\begin{list}{}{ - \setlength{\leftmargin}{0.5cm} - \setlength{\itemsep}{0pt} - \setlength{\parsep}{0pt} - \setlength{\topsep}{0pt} - \renewcommand{\makelabel}{}}} -{\end{list}} -\newenvironment{CompactItemize} -{ - \begin{itemize} - \setlength{\itemsep}{-3pt} - \setlength{\parsep}{0pt} - \setlength{\topsep}{0pt} - \setlength{\partopsep}{0pt} -} -{\end{itemize}} -\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp} -\newlength{\tmplength} -\newenvironment{TabularC}[1] -{ -\setlength{\tmplength} - {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)} - \par\begin{tabular*}{\linewidth} - {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|} -} -{\end{tabular*}\par} -\newcommand{\entrylabel}[1]{ - {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{\textbf{#1}}\\}}} -\newenvironment{Desc} -{\begin{list}{} - { - \settowidth{\labelwidth}{40pt} - \setlength{\leftmargin}{\labelwidth} - \setlength{\parsep}{0pt} - \setlength{\itemsep}{-4pt} - \renewcommand{\makelabel}{\entrylabel} - } -} -{\end{list}} -\newenvironment{Indent} - {\begin{list}{}{\setlength{\leftmargin}{0.5cm}} - \item[]\ignorespaces} - {\unskip\end{list}} -\setlength{\parindent}{0cm} -\setlength{\parskip}{0.2cm} -\addtocounter{secnumdepth}{1} -\sloppy -\usepackage[T1]{fontenc} diff --git a/org.glite.lb.doc/src/doxyhack.tex b/org.glite.lb.doc/src/doxyhack.tex deleted file mode 100644 index c628fcf..0000000 --- a/org.glite.lb.doc/src/doxyhack.tex +++ /dev/null @@ -1,47 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -% save previous definitions for use in new macros -\let\dsection=\section -\let\dsubsection=\subsection -\let\dsubsubsection=\subsubsection - -% change the sections definition to reflect the actual hierarchy -% - section is just one in each included file -\renewcommand{\section}[1]{\dsubsubsection{#1}} -% - subsections are for member section headings (constructors, data, ...) -\renewcommand{\subsection}[2]{\ifx*#1 -\dsubsubsection*{#2}\def\zbytek{} -\else -\dsubsubsection*{#1}\def\zbytek{#2}\fi -\zbytek} -% - subsubsections are for particular class members -\def\eatbraces#1]{} -\def\dosubsubsection#1{\par - \vskip 10pt\framebox{\begin{minipage}{\linewidth}{\hangindent=20pt\noindent\bf #1\par}\end{minipage}}\vskip-2pt} -\renewcommand{\subsubsection}[2]{\ifx*#1 - \dosubsubsection{#2}\def\zbytek{} -\else\ifx[#1 - \def\zbytek{\expandafter\dosubsubsection\eatbraces} -\else - \dosubsubsection{#1}\def\zbytek{#2} -\fi\fi -\zbytek} - -%\let\ddescription=\description -%\let\denddescription=\enddescription -%\renewenvironment{description}{\list{}{\labelwidth 5cm\leftmargin 3cm}}{\endlist} - diff --git a/org.glite.lb.doc/src/egee.cls b/org.glite.lb.doc/src/egee.cls deleted file mode 100644 index 9a7e524..0000000 --- a/org.glite.lb.doc/src/egee.cls +++ /dev/null @@ -1,452 +0,0 @@ -% egee.cls: -% -% $Id$ -% -\NeedsTeXFormat{LaTeX2e} -\ProvidesClass{egee}[2002/06/20 EGEE LaTeX Class] -\typeout{EGEE LaTeX class -- 2002/06/13 Rock Lobster!} -% -%% Notes: This class file tries, as largely as possible, to copy the Microsoft -%% Word template document EDMS 2098656 v2.2. Differences and notes are listed -%% below: -%% o The Word Template uses 11pt for the main body, but 12 point -%% occasionally. Any such occurrence of 12pt is mapped into 11pt in this -%% class-file. -%% o This class inherits 11pt article. In that class Huge=30pt and -%% LARGE=22pt, which matches the required point-size for the title page. -%% o The parskip in the Word doc is exactly 1.4mm (0.7mm above and below). -%% Here we've taken the liberty of adding some glue to make things fit -%% better. -%% o The Word Template shows all the (sub)sections on the contents page in -%% capitals and subsubsections in italics. The LateX class doesn't. - -%% Interface - example of an option, should we want to use these later. -%\newif\ifmonotitle\monotitlefalse - -%\DeclareOption{mono}{\monotitletrue} - -\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} -\ProcessOptions - - -% Inherit! -\LoadClass[11pt]{article} - -% Necessary packages: -\RequirePackage{lastpage} -\RequirePackage{tabularx} -\RequirePackage{pslatex} -\RequirePackage{times} -\RequirePackage{verbatim} -\RequirePackage{geometry} -\RequirePackage{url} - -\usepackage[hang,bf,small]{caption} - -% -% We now define a new \if command to test for PDF being enabled. -% It is important because loading graphicx overrides the definition -% of \pdfoutput and sets it to true even when PDF is not enabled. -% Use \ifpdf instead of \ifx\pdfoutput\undefined hereafter. -% - -\newif\ifpdf -\ifx\pdfoutput\undefined - \pdffalse - % \typeout{PDF _not_ defined} -\else - \pdfoutput=1 - \pdftrue - % \typeout{PDF _is_ defined} -\fi - -\ifpdf - \usepackage[pdftex, - pdfpagemode={UseOutlines},bookmarks=true,bookmarksopen=true, - bookmarksopenlevel=2,bookmarksnumbered=true, - hypertexnames=false,colorlinks,linkcolor={blue}, - citecolor={blue},urlcolor={red}, - pdfstartview={FitV}]{hyperref} -\else - \usepackage[hypertex]{hyperref} -\fi - -\ifpdf - \usepackage[pdftex]{graphicx} - \pdfcompresslevel 9 - \pdfadjustspacing 1 -\else - \usepackage[dvips]{graphicx} -\fi - -\usepackage{color} - -\def\footsize{5mm} - -%% -%% PAGE GEOMETRY DEFINITIONS -%% -% From Template file -\geometry{centering,includeheadfoot} -\geometry{a4paper,top=12.5mm,headheight=12.5mm,headsep=5mm,foot=\footsize,footskip=13.3mm,bottom=12.5mm} -\geometry{right=25mm,left=25mm} - - -% APM -- I don't think these are right, my impression is above is correct -%\geometry{a4paper,margin=0.98in,headheight=0.72in} - - -%% -%% PAGE COLOUR DEFINITIONS -%% -\definecolor{blue}{rgb}{0.1,0.1,0.5} -\definecolor{lightgrey}{gray}{0.65} - - -% paulm's prefered name ... -\def\bibname{References} - -\setlength{\parindent}{0pt} -\setlength{\parskip}{1.4mm plus 0.4mm minus 0.2mm} - -\def\@defaultfooter{ - \def\@oddfoot{\vbox to \footsize {% - {\color{blue}\hrule width \textwidth height 1pt depth 0pt}% - \vfil - \small\hbox to \textwidth{\ISTNumber% - \hfil - \hbox{\colorbox{yellow}{\MakeUppercase{\@Dissemination}}}% - \hfil - \hbox{\thepage/\pageref{LastPage}}}% - }% - }% -} - - -\def\ps@title{% - \@defaultfooter - \def\@oddhead{\hbox to \textwidth{\LargeEGEELogo\hfil\CESNETLogo\hfil\ISTLogo}} -} - -\def\ps@headings{% - \@defaultfooter - \def\@oddhead{\vbox to \headheight{% -%\hrule width \textwidth height 1pt\relax - \vbox to 0.75\headheight{% - \hbox to \textwidth{% - \hbox to 0pt{\EGEELogo\hss}% - \hfil - \hbox to 8cm{% - \vbox to 0.75\headheight{% - \vfil - \parbox{8cm}{% - \centering\color{blue}% - \textbf{\MakeUppercase{\@title}}% -\ifx\@Subtitle\@empty\else - \par\textbf{\scriptsize\@Subtitle}% -\fi - }% - \vfil - }% - \hss}% - \hfil -%\hbox to 0pt{\vrule width 1pt height 10pt depth 0pt \hss}% -%% {\scriptsize\setlength{\parskip}{0pt}\setlength{\topsep}{0pt}% -%% % \vbox to 0.75\headheight{% -%% \parbox{4cm}{x% -%% \begin{flushright}% -%% \textit{Doc. Identifier}:\\ -%% \textbf{\@DocIdentifier}\\ -%% \vfil -%% \textit{Date}: \textbf{\@Date} -%% \end{flushright}% -%% }% -%% % }% -%% }% -\hbox to 0pt{\hss\vbox to 0.75\headheight{%\hrule -\tiny%\scriptsize -\parfillskip0pt -\leftskip 0pt plus 1fil -\parskip0ex -\textit{Doc.\ Identifier}: -\par -\textbf{\@DocIdentifier} -\vfil -\textit{Date}: \textbf{\@Date} -%\hrule -}}% -% \hbox to 4cm{\scriptsize -% \vbox to 0.75\headheight{% -% \parbox{4cm}{ -% \halign{\hfill####\cr -% \textit{Doc. Identifier}:\cr -% \textbf{\@DocIdentifier}\cr -% % \noalign{\vfil} -% \textit{Date}: \textbf{\@Date}\cr -% }}% -% \vfil -% }% -% }% - }% - }% -%\hrule width \textwidth height 1pt\relax - \vfil\vskip 2.5mm\relax - {\color{blue}\hrule width \textwidth height 1pt depth 0pt}% - }% - }% -} - -\pagestyle{headings} - -\setlength{\captionmargin}{1cm} - -% image file extensions respective to the output format -\ifpdf - \DeclareGraphicsExtensions{.jpg,.pdf,.png} - \pdfcompresslevel=9 -% \pdfinfo{ /Title (\@DocumentLink) } - \pdfinfo{ /Title (EGEE) } -\else - \DeclareGraphicsExtensions{.eps} -\fi - -\def\frontboxwidth{12.6cm}% - - - -%% -%% Define our title page -%% -\AtBeginDocument{ -\pagestyle{title}% -\hbox{}% Force top of page -\vfill -{\centering -% \Huge\bf\textsf{\textcolor{blue}{EGEE}}\\[20mm]% - \gLiteLogo\\[20mm]% - \LARGE\sc\textsf{\bf \@title}\\[5mm]% - \ifx\@Subtitle\@empty\else - \normalsize\textsf{\@Subtitle}\\[10mm]% - \fi - \ifx\@DeliverableId\@empty\else - \LARGE\sc\textsf{\bf \@DeliverableId}\\[5mm]% - \fi -}% -\vfill -\hbox to \textwidth{ - \hfil - \vbox{ - {\color{blue}\hrule width \frontboxwidth height 1mm depth 0pt} - \hbox to \frontboxwidth{\sf - \begin{tabularx}{\frontboxwidth}{l>{\raggedright\arraybackslash}X} - Document identifier: & \textbf{\@DocIdentifier}\\[3mm] - Date: & \textbf{\@Date}\\[3mm] - Activity:& \textbf{\@Activity}\\[3mm] - Document status: & \textbf{\@DocStatus}\\[3mm] - Document link:& \textbf{\@DocumentLink}\\[3mm] - \end{tabularx} - } - {\color{blue}\hrule width \frontboxwidth height 1mm depth 0pt} - } -} -\vfill -{\sf\underline{Abstract}: \@Abstract} -\vfill -\newpage % end of the first page -\pagestyle{headings} -\setcounter{tocdepth}{3} -} % End of AtBeginningDocument - - -% -% EGEE style small-capital section titles. -% -% The numbering is aligned with the WinWord style, -% although it is not common in the english typography... -% -\newcommand{\sectionbreak}{\newpage} -\renewcommand{\thesection}{\arabic{section}.} -\renewcommand{\thesubsection}{\thesection\arabic{subsection}.} -\renewcommand{\thesubsubsection}{\thesubsection\arabic{subsubsection}.} - -\renewcommand\section{\@startsection {section}{1}{\z@}% - {-3.5ex \@plus -1ex \@minus -.2ex}% - {2.3ex \@plus.2ex}% - {\normalfont\Large\bfseries\sffamily\scshape}} - -\renewcommand\subsection{\@startsection{subsection}{2}{\z@}% - {-3.25ex\@plus -1ex \@minus -.2ex}% - {1.5ex \@plus .2ex}% - {\normalfont\large\bfseries\sffamily\scshape}} -\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% - {-3.25ex\@plus -1ex \@minus -.2ex}% - {1.5ex \@plus .2ex}% - {\normalfont\normalsize\bfseries\sffamily\scshape}} - - - -%% APM NEED TO REDEFINE section -%\titleformat{\section}{\Large\bfseries\sffamily\scshape}{\thesection}{1em}{} -%\titlecontents{section} [2em] {\vspace*{4pt}} -% {\large \sc \bfseries \contentslabel{2em}} -% {\large \sc \bfseries \hspace*{-2em}} -% {\large \textbf{\titlerule*[1ex]{.}\contentspage}} [\vspace*{4pt}] - -%\titleformat{\subsection}{\large\bfseries\sffamily\scshape}{\thesubsection}{1em}{} -%\titlecontents{subsection} [5em] {} -% {\sc \contentslabel{3em}} -% {\sc \hspace*{-3em}} -% {\titlerule*[1ex]{.}\contentspage} - - -% -% common constants -% -\def\ISTNumber{INFSO-RI-222667} -\newsavebox{\@EGEELogo} -\savebox{\@EGEELogo}{\includegraphics[height=0.75\headheight]{egee}} -\def\EGEELogo{\usebox{\@EGEELogo}} -\def\LargeEGEELogo{\includegraphics[height=\headheight]{egee}} -\def\ISTLogo{\includegraphics[height=\headheight]{isi}} -\def\gLiteLogo{\includegraphics[width=0.6\textwidth]{glite}} -\def\CESNETLogo{\includegraphics[height=\headheight]{cesnet}} - -% -% parameters to be supplied by the author -% -\def\Subtitle#1{\gdef\@Subtitle{#1}} -\gdef\@Subtitle{\@latex@warning@no@line{No \noexpand\Subtitle given}} - -\def\DeliverableId#1{\gdef\@DeliverableId{#1}} -\gdef\@DeliverableId{\@latex@warning@no@line{No \noexpand\DeliverableId given}} - -\def\DocIdentifier#1{\gdef\@DocIdentifier{#1}} -\gdef\@DocIdentifier{\@latex@warning@no@line{No \noexpand\DocIdentifier given % - (e.g. EGEE-JRA1-TEC-edmsId-v0-1)}} - -\def\Date#1{\gdef\@Date{#1}} -\gdef\@Date{\@latex@warning@no@line{No \noexpand\Date given % - (e.g. 01/01/2004)}} - -\def\Activity#1{\gdef\@Activity{#1}} -\gdef\@Activity{\@latex@warning@no@line{No \noexpand\Activity given % - (e.g. JRA1 Middleware Engineering and Integration )}} - -\def\DocStatus#1{\gdef\@DocStatus{#1}} -\gdef\@DocStatus{\@latex@warning@no@line{No \noexpand\DocStatus given % - (e.g. DRAFT, WORKING, DELIVERED)}} - -\def\Dissemination#1{\gdef\@Dissemination{#1}} -\gdef\@Dissemination{\@latex@warning@no@line{No \noexpand\Dissemination given % - (e.g. PUBLIC, INTERNAL, ...)}} - -\def\DocumentLink#1{\gdef\@DocumentLink{#1}} -\gdef\@DocumentLink{\@latex@warning@no@line{No \noexpand\DocumentLink given % - (e.g. http://cern.ch)}} - -\long\def\Abstract#1{\gdef\@Abstract{#1}} -\gdef\@Abstract{\@latex@warning@no@line{No \noexpand\Abstract given}} - -%% -%% Define the abstract using an environment abstract - -% -% This will produce the mailto link in the PDF file -% -% -% We use the URL package, which does this nicely. The old way (\HTTP) was -% a bit buggy as it had problems with '~'s and '_'s -% -\urlstyle{sf} -\ifpdf - \newcommand{\Email}[1]{\href{mailto:#1}{<{#1}>}} - \newcommand{\HTTP}[1]{\href{#1}{\url{#1}}} -\else - \newcommand{\Email}[1]{\textsf{<{#1}>}} - \newcommand{\HTTP}[1]{\url{#1}} -\fi - - -% -% We now redifine \part and \section so that the table of contents -% has the sections/parts in upper case. -% -% Note: need to use \uppercase because \MakeUppercase is not robust -% -\def\@part[#1]#2{% - \ifnum \c@secnumdepth >\m@ne - \refstepcounter{part}% - \addcontentsline{toc}{part}{\thepart\hspace{1em}\uppercase{#1}}% - \else - \addcontentsline{toc}{part}{\uppercase{#1}}% - \fi - {\parindent \z@ \raggedright - \interlinepenalty \@M - \normalfont - \ifnum \c@secnumdepth >\m@ne - \Large\bfseries \partname\nobreakspace\thepart - \par\nobreak - \fi - \huge \bfseries #2% - \markboth{}{}\par}% - \nobreak - \vskip 3ex - \@afterheading} - -\def\@sect#1#2#3#4#5#6[#7]#8{% - \ifnum #2>\c@secnumdepth - \let\@svsec\@empty - \else - \refstepcounter{#1}% - \protected@edef\@svsec{\@seccntformat{#1}\relax}% - \fi - \@tempskipa #5\relax - \ifdim \@tempskipa>\z@ - \begingroup - #6{% - \@hangfrom{\hskip #3\relax\@svsec}% - \interlinepenalty \@M #8\@@par}% - \endgroup - \csname #1mark\endcsname{\uppercase{#7}}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname}% - \fi - \texorpdfstring{\uppercase{#7}}{#7}}% - \else - \def\@svsechd{% - #6{\hskip #3\relax - \@svsec #8}% - \csname #1mark\endcsname{\uppercase{#7}}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname}% - \fi - \texorpdfstring{\uppercase{#7}}{#7}}}% - \fi - \@xsect{#5}} - -% \addcontentsline{toc} expands to \contentsline{NAME} -% which in turn expands to \l@NAME. So, to specify -% the table of contents, we must define \l@chapter, \l@section, -% \l@subsection, ... ; to specify the list of figures, we must define -% \l@figure; and so on. Most of these can be defined with the -% \@dottedtocline command, which produces a contents line with dots -% between the title and the page number. It works as follows: -% -% \@dottedtocline{LEVEL}{INDENT}{NUMWIDTH} -% LEVEL : An entry is produced only if LEVEL < or = value of -% 'tocdepth' counter. Note, \chapter is level 0, \section -% is level 1, etc. -% INDENT : The indentation from the outer left margin of the start of -% the contents line. -% NUMWIDTH : The width of a box in which the section number is to go, -% if TITLE includes a \numberline command. -% - -\def\l@part{\@dottedtocline{1}{4em}{2.0em}} -\def\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} -\def\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} -\def\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} -\def\l@subparagraph{\@dottedtocline{5}{10em}{5em}} - diff --git a/org.glite.lb.doc/src/events.tex.T b/org.glite.lb.doc/src/events.tex.T deleted file mode 100644 index 29748fa..0000000 --- a/org.glite.lb.doc/src/events.tex.T +++ /dev/null @@ -1,35 +0,0 @@ -@@@{ -gen qq{ -% !! Automatically generated file. Do not edit. -% !! Change the corresponding template file $ARGV -}; -@@@} - -\subsection*{Events for gLite world:} - -\begin{tabularx}{\textwidth}{l>{\bfseries}lX} -@@@{ -my $flesh = 'gLite'; #XXX -my $fleshno = 0; -my $eventno = $fleshno; -for my $e (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } - $event->getTypes) { - my $u = uc $e; - my $c = getTypeComment $event $e; - - if ($flesh ne $event->{flesh}->{$e}) { - $flesh = $event->{flesh}->{$e}; - gen "\\end{tabularx}\n\n"; - gen "\\subsection*{Events for $flesh world:}\n\n"; - gen "\\begin{tabularx}{\\textwidth}{l>{\\bfseries}lX}\n"; - $fleshno += 100; - $eventno = $fleshno; - } - $eventno++; - gen "$eventno. \& $e: \& $c \\\\ \n"; -} -@@@} -\end{tabularx} - -\endinput - diff --git a/org.glite.lb.doc/src/frontmatter.tex b/org.glite.lb.doc/src/frontmatter.tex deleted file mode 100644 index f603d03..0000000 --- a/org.glite.lb.doc/src/frontmatter.tex +++ /dev/null @@ -1,59 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -\begin{center} -{\bf Delivery Slip} -\end{center} -\begin{tabularx}{\textwidth}{|l|l|l|X|X|} -\hline - & {\bf Name} & {\bf Partner} & {\bf Date} & {\bf Signature} \\ -\hline -{\bf From} & Ale\v{s} K\v{r}enek & CESNET & August 1, 2008 & \\ -\hline -{\bf Reviewed by} & & & & \\ - -\hline -{\bf Approved by} & & & & \\ -\hline -\end{tabularx} - -\begin{center} -{\bf Document Change Log} -\end{center} - -\begin{tabularx}{\textwidth}{|l|l|X|X|} -\hline -{\bf Issue } & {\bf Date } & {\bf Comment } & {\bf Author } \\ \hline -Initial version & August 1, 2008 & & CESNET team \\ \hline -Reviewer's comments &&& \\ \hline -Users' comments &&& \\ - -\hline -\end{tabularx} - -\begin{center} -{\bf Document Change Record} -\end{center} - -\begin{tabularx}{\textwidth}{|l|l|X|} -\hline -{\bf Issue } & {\bf Item } & {\bf Reason for Change } \\ \hline - -\hline -\end{tabularx} - -\input{copyright} -\clearpage diff --git a/org.glite.lb.doc/src/images/LB-components-LB-WMS.pdf b/org.glite.lb.doc/src/images/LB-components-LB-WMS.pdf deleted file mode 100755 index f6a8e96d742b2b22235a0b6261789fc8f44f10ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79142 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ιZtQ~6 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%0Aj<^Crn+T94vugsnUIxQe8~g^ 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 diff --git a/org.glite.lb.doc/src/images/LB-components-gather.pdf b/org.glite.lb.doc/src/images/LB-components-gather.pdf deleted file mode 100644 index 479548860df6aa808d48cc23d6c989064044f7c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48193 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

    mx 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 diff --git a/org.glite.lb.doc/src/images/cesnet.pdf b/org.glite.lb.doc/src/images/cesnet.pdf deleted file mode 100644 index 9b07738d8c962af32dcfad0e592bba658aff31e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4518 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�%;KDw)eq+4ZSccvbI57^3UU4A-` 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%0AGND93L=g%gIDK!!ysLl`!@s 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

    rqYt<)4I3yKrvD#M(mV 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 diff --git a/org.glite.lb.doc/src/images/isi.pdf b/org.glite.lb.doc/src/images/isi.pdf deleted file mode 100644 index 4ff331cbe7bf18fb7ded3fc20ca7e25c9d9ca6ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19672 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 F!e4Asw7LKQ diff --git a/org.glite.lb.doc/src/images/seqtree.pdf b/org.glite.lb.doc/src/images/seqtree.pdf deleted file mode 100644 index 33ea80248b0aeb7757fc150e6c22a6d5ce2d68b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5715 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 Dp0uyF diff --git a/org.glite.lb.doc/src/images/wms2-jobstat.pdf b/org.glite.lb.doc/src/images/wms2-jobstat.pdf deleted file mode 100644 index fb3464807c597633804ac29c6f9a35a1e34a40fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7328 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 diff --git a/org.glite.lb.doc/src/lbjp.bib b/org.glite.lb.doc/src/lbjp.bib deleted file mode 100644 index f92fa1b..0000000 --- a/org.glite.lb.doc/src/lbjp.bib +++ /dev/null @@ -1,780 +0,0 @@ - -@InProceedings{ condor, - author = "Michael Litzkow and Miron Livny and Matthew Mutka", - title = "{C}ondor - A Hunter of Idle Workstations", - booktitle = "Proceedings of the 8th International Conference of - Distributed Computing Systems", - year = "1988", - month = "June" -} - -@InProceedings{ gram, - author = "K. Czajkowski and I. Foster and N. Karonis and C. - Kesselman and Martin S. Smith and S. Tuecke", - title = "A resource management architecture for metacomputing - systems.", - booktitle = "Proceedings of the IPPS/SPDP Workshop on Job Scheduling - Strategies for Parallel Processing", - year = "1988", - pages = "62-82" -} - -@InProceedings{ lsf, - author = "S. Zhou", - title = "LSF: Load sharing in large-scale heterogenous distributed - systems", - booktitle = "Proceedings of the Workshop on Cluster Computing", - year = "1992" -} - -@Misc{ dce, - author = "Open Group CAE Specification", - title = "DCE: Remote Procedure Call", - howpublished = "ISBN 1-85912-041-5", - year = "1994" -} - -@Misc{ pbs, - author = "Henderson, R. and Tweten, D", - title = "Portable Batch System: External reference Specification", - howpublished = "NASA, Ames Research Center", - year = "1996" -} - -@Article{ globus, - author = "I. Foster and C. Kesselman", - title = "Globus: a metacomputing infrastructure toolkit.", - journal = "International Journal of Supercomputer Applications", - year = "1997", - volume = "11", - number = "2", - pages = "115-128" -} - -@Misc{ ulm, - author = "J. Abela and T. Debeaupuis", - title = "Universal Format for Logger Messages", - howpublished = "IETF Internet Draft", - year = "1997" -} - -@InProceedings{ autopilot, - author = "R.L. Ribler and J.S. Vetter and H. Simitci and D.A. Reed", - title = "Autopilot: adaptive control of distributed applications", - booktitle = "Proceedings of the Seventh IEEE Symposium on - High-Performance Distributed Computing", - year = "1998", - pages = "172-179" -} - -@InProceedings{ gsi, - author = "I. Foster and C. Kesselman and G. Tsudik and S. Tuecke", - title = "{A Security Architecture for Computational Grids}", - booktitle = "Proceedings of the 5th ACM Conference on Computer and - Communications Security Conference", - year = 1998, - pages = "83-92" -} - -@InProceedings{ classad, - author = "Rajesh Raman and Miron Livny and Marvin Solomon", - title = "Matchmaking: Distributed Resource Management for High - Throughput Computing", - booktitle = "Proceedings of the Seventh IEEE International Symposium on - High Performance Distributed Computing", - year = "1998" -} - -@Article{ nws, - author = "R.Wolski and N. Spring and J. Hayes", - title = "The network weather service: a distributed resource - performance forecasting service for metacomputing", - journal = "J. Future Generation Comput. Syst.", - year = "1999", - volume = "15", - number = "(5/6)", - pages = "757-768" -} - -@Misc{ tls, - author = "T. Dierks and C. Allen", - title = "The {TLS} {P}rotocol {V}ersion 1.0", - howpublished = "IETF RFC 2246 (Standards Track)", - year = 1999, - month = "January" -} - -@Misc{ gssapi, - author = "{J. Linn}", - title = "{Generic Security Service Application Program Interface - Version 2, Update 1}", - howpublished = "IETF RFC 2743", - year = "2000", - month = "January" -} - -@TechReport{ lbdraft, - author = {M. Ruda and A. Krenek and L. Matyska and J. Pospisil and - M. Vocu and J. Sitera}, - title = {Logging and bookkeeping architecture}, - institution = {EU DataGrid}, - year = {2001}, - note = {Part of Deliverable D1.1 WP1 Report on current - technology} -} - -@InProceedings{ mds2, - author = "K. Czajkowski and S. Fitzgerald and I. Foster and C. - Kesselman.", - title = "Grid Information Services for Distributed Resource - Sharing.", - booktitle = " Proceedings of the Tenth IEEE International Symposium on - High-Performance Distributed Computing (HPDC-10)", - year = "2001", - month = "August", - publisher = "IEEE Press" -} - -@Misc{ gma, - author = "B. Tierney and R. Aydt and D. Gunter and W. Smith and - Valerie Taylor and R. Wolski and M. Swany.", - title = "A Grid Monitoring Service Architecture.", - howpublished = "Global Grid Forum Performance Working Group", - year = "2001" -} - -@Misc{ rgma, - author = "S. Fisher", - title = "Relational Model for Information and Monitoring", - howpublished = "Technical Report GWD-Perf-7-1, GGF", - year = "2001" -} - -@InProceedings{ mercury, - author = "Zoltan Balaton and Peter Kacsuk and Norbert Podhorszki and - Ferenc Vajda.", - title = "From Cluster Monitoring to Grid Monitoring Based on GRM", - booktitle = "In proceedings 7th EuroPar2001 Parallel Processings, - Manchester, UK.", - year = "2001", - pages = "874-881" -} - -@Article{ siena, - author = "Antonio Carzaniga and others", - title = "Design and evaluation of a wide-area event notification - service", - journal = "ACM Transactions on Computer Systems", - year = "2001", - volume = "19", - number = "3", - pages = "332-383" -} - -@InProceedings{ maui, - author = "D. Jackson and Q. Snell and M. Clement", - title = "Core algorithms of the Maui scheduler", - booktitle = "Proceedings of the 7th Workshop on Job Scheduling - Strategies for Parallel Processing", - year = "2001" -} - -@Misc{ ggfxml, - author = "W. Smith and D. Gunther and D. Quesnel", - title = "A simple xml producer-consumer protocol", - howpublished = "Grid Working Document GWD-Perf-8-2, Global Grid Forum, - Performance Working Group", - year = "2001" -} - -@TechReport{ lbdraft2, - author = {M. Ruda and A. Krenek and L. Matyska and J. Pospisil and - M. Vocu and J. Sitera}, - title = {Logging and bookkeeping architecture for {D}ata{G}rid - {R}elease 2}, - institution = {EU DataGrid}, - year = {2002}, - note = {Part of Deliverable D1.2 Definition of architecture, - technical plan and evaluation criteria for scheduling, - resource management, security and job description} -} - -@InProceedings{ code, - author = "W. Smith", - title = "A System for Monitoring and Management of Computational - Grids.", - booktitle = "In Proceedings of the 2002 International Conference on - Parallel Processing", - year = "2002" -} - -@Misc{ hawkeye, - title = "HawkEye: A Monitoring and Management Tool for Distributed - Systems", - howpublished = "\url{http://www.cs.wisc.edu/condor/hawkeye}", - year = "2002" -} - -@InProceedings{ chep03, - author = {G. Avellino et.al.}, - title = {{The first deployment of workload management services on - the EU DataGrid testbed: feedback on design and - implementation}}, - booktitle = {Computing in High Energy and Nuclear Physics (CHEP03)}, - year = {2003}, - note = {La Jolla, Ca, USA, March 2003}, - fauthor = {G. Avellino, S. Beco, B. Cantalupo, F. Pacini, A. - Terracina, A. Maraschini, D. Colling, S. Monforte, M. - Pappalardo, L. Salconi, F. Giacomini, E. Ronchieri, D. - Kouril, A. Krenek, L. Matyska, M. Mulac, J. Pospisil, M. - Ruda, Z. Salvet, J. Sitera, M. Vocu, M. Mezzadri, F. Prelz, - A. Gianelle, R. Peluso, M. Sgaravatto, S. Barale, A. - Guarise, A. Werbrouck} -} - -@Article{ alien, - author = "P. Saiz and others", - title = "{AliEn - ALICE environment on the GRID}", - journal = "{Nuclear Instruments and Methods in Physics Research, - Section A}", - year = "2003", - volume = "502", - number = "2-3", - pages = "437-440", - fauthor = { P. Saiz, L. Aphecetche, P. Buncic, R. Piskac, J.E. - Revsbech, V. Sego} -} - -@InProceedings{ rgma2, - author = "A. Cooke and others", - title = "R-GMA: An information integration system for grid - monitoring", - booktitle = "Proc. of the 11th International Conference on Cooperative - Information Systems", - year = "2003" -} - -@InProceedings{ netlogger, - author = "B. Tierney and D. Gunter", - title = "NetLogger: a toolkit for distributed system performance - tuning and debugging", - booktitle = "Proceedings of the IFIP/IEEE Eighth International - Symposium on Integrated Network Management (IM 2003)", - year = "2003", - pages = "97-100", - publisher = "Kluwer", - bolume = "246 of IFIP Conference Proceedings" -} - -@InProceedings{ monalisa, - author = "H.B. Newman and I.C. Legrand and P. Galvez and R. Voicu - and C. Cirstoiu", - title = "MonALISA: a distributed monitoring service architecture", - booktitle = "Computing in High Energy and Nuclear Physics (CHEP03), La - Jolla, CA", - year = "2003" -} - -@InProceedings{ gridrm, - author = "M.A. Baker and G.C. Smith", - title = "GridRM: an extensible resource monitoring system", - booktitle = "Proceedings of the IEEE International Cluster Computing - Conference", - year = "2003", - pages = "207-214" -} - -@InProceedings{ gridlab, - author = "Zoltan Balaton and Gabor Gombas", - title = "Resource and Job Monitoring in the Grid", - booktitle = "Proc. of the Euro-Par 2003 International Conference, - Klagenfurt", - year = 2003 -} - -@Misc{ rgmacms, - author = "D. Bonacorsi and D. Colling and L. Field and S. Fisher and - C. Grandi and P. R. Hobson and P. Kyberd and B. MacEvoy and - J. J. Nebrensky and H. Tallini and S. Traylen", - title = "Scalability Tests of R-GMA Based Grid Job Monitoring - System for CMS Monte Carlo Data Production", - howpublished = "IEEE NSS Conference, Oregon, USA", - year = "2003", - month = "21-24 October" -} - -@Misc{ xacml, - author = "{OASIS Standard}", - title = "{eXtensible Access Control Markup Language (XACML), - Version 1.0}", - year = 2003, - month = "February" -} - -@InProceedings{ gacl1, - author = "L. Cornwall and J. Jensen and D. Kelsey and A. McNab", - title = "{EU DataGrid and GridPP authorization and access control}", - booktitle = "Proceedings of the UK e-Science All Hands Meeting", - year = "2003", - pages = "382--384" -} - -@Misc{ glue, - author = "S. Andreozzi and M. Sgaravatto and C. Vistoli", - title = "Sharing a conceptual model of Grid resources and services", - howpublished = "Proceedings of the Conference for Computing in High Energy - and Nuclear Physics (CHEP03)", - year = "2003" -} - -@InProceedings{ perf, - author = "Xuehai Zhang and Jeffrey L. Freschl and Jennifer M. - Schopf", - title = "A Performance Study of Monitoring and Information Services - for Distributed Systems", - booktitle = "12th IEEE International Symposium on High Performance - Distributed Computing (HPDC-12 '03)", - year = "2003" -} - -@InProceedings{ glite, - author = "E. Laure and F. Hemmer and F. Prelz and S. Beco and S. - Fisher and M. Livny and L. Guy and M. Barroso and P. Buncic - and P. Kunszt and A. {Di Meglio} and A. Aimar and A. Edlund - and D. Groep and F. Pacini and M. Sgaravatto and O. Mulmo", - title = "Middleware for the next generation Grid infrastructure", - booktitle = "Computing in High Energy Physics and Nuclear Physics (CHEP - 2004)", - year = 2004 -} - -@Article{ jgc, - author = {G. Avellino and others}, - title = {{The DataGrid Workload Management System: Challenges and - Results}}, - journal = {Journal of Grid Computing}, - year = {Dec 2004}, - volume = {2}, - number = {4}, - pages = {353--367}, - fauthor = { G. Avellino, S. Beco, B. Cantalupo, A. Maraschini, F. - Pacini, M. Sottilaro, A. Terracina, D. Colling, F. - Giacomini, E. Ronchieri, A. Gianelle, M. Mazzucato, R. - Peluso, M. Sgaravatto, A. Guarise, R. Piro, A. Werbrouck, - D. Kouøil, A. Køenek, L. Matyska, M. Mulaè, J. Pospí¹il, M. - Ruda, Z. Salvet, J. Sitera, J. ©krabal, M. Vocù, M. - Mezzadri, F. Prelz, S. Monforte, M. Pappalardo} -} - -@Misc{ apart, - author = "M. Gerndt and others", - title = "Performance Tools for the {Grid}: State of the Art and - Future", - howpublished = "Tech. Rep. Lehrstuhl fuer Rechnertechnik und - Rechnerorganisation, Technische Universitaet Muenchen - (LRR-TUM). - \url{http://www.lpds.sztaki.hu/~zsnemeth/apart/}", - year = "2004" -} - -@InProceedings{ ahm04194, - author = {Shrija Rajbhandari and David W. Walker}, - title = "{Support for Provenance in a Service-based Computing - Grid}", - booktitle = "{Proceedings of the third UK e-Science All Hands Meeting, - Nottingham, UK}", - year = {2004} -} - -@TechReport{ gro04, - author = {Paul T. Groth}, - title = "{Recording provenance in service-oriented architectures}", - institution = "{University of Southampton; Faculty of Engineering, - Science and Mathematics; School of Electronics and Computer - Science}", - year = {2004} -} - -@InProceedings{ glm04b, - author = {Paul Groth and Michael Luck and Luc Moreau}, - title = "{A protocol for recording provenance in service-oriented - grids}", - booktitle = "{Proceedings of the 8th International Conference on - Principles of Distributed Systems (OPODIS04)}", - year = {2004} -} - -@Article{ ganglia, - author = "M.L. Massie and B.N. Chun and D.E. Culler", - title = "Ganglia Distributed Monitoring System: Design, - Implementation, and Experience", - journal = "Parallel Computing", - year = "2004", - volume = "30", - pages = "817-840" -} - -@Misc{ gae, - author = "Arshad Ali and Ashiq Anjum and Julian Bunn and Richard - Cavanaugh and Frank van Lingen and Richard McClatchey and - Harvey Newman and Waqas ur Rehman and Conrad Steenberg and - Michael Thomas and Ian Willers", - title = "Job Monitoring in an Interactive Grid Analysis - Environment", - howpublished = "Computing in High Energy Physics 2004", - year = "2004" -} - -@InProceedings{ voms1, - author = "R. Alfieri and R. Cecchini and V. Ciaschini and L. - dell'Agnello and \'{A}. Frohner and A. Gianoli and K. - L\H{o}rentey and F. Spataro", - title = "{VOMS}, an {A}uthorization {S}ystem for {V}irtual - {O}rganizations", - booktitle = "Grid Computing: First European Across Grids Conference", - year = "2004" -} - -@InProceedings{ delegation, - author = "V. Welch and I. Foster and C. Kesselman and O. Mulmo and - L. Pearlman and S. Tuecke and J. Gawor and S. Meder and F. - Siebenlist", - title = "{X.509 Proxy Certificates for Dynamic Delegation}", - booktitle = "Proceedings of the 3rd Annual PKI R\&D Workshop", - year = 2004, - month = "April" -} - -@Misc{ proxycert, - author = "S. Tuecke and V. Welch and D. Engert and L. Pearlman and - M. Thompson", - title = "Internet {X}.509 {P}ublic {K}ey {I}nfrastructure ({PKI}) - proxy certificate profile", - howpublished = "IETF RFC 3820", - year = 2004, - month = "June" -} - -@InProceedings{ chep, - author = "D. Kouøil and others", - title = "Distributed Tracking, Storage, and Re-use of Job State - Information on the Grid", - booktitle = "Computing in High Energy and Nuclear Physics (CHEP04)", - year = "2004" -} - -@Misc{ genericlb, - author = "{CESNET JRA1 team}", - title = "Current and Foreseen {\LB}\ Design", - howpublished = "3rd EGEE Conference, Athens, - \url{http://indico.cern.ch/contributionDisplay.py?contribId=201&sessionId=73&confId=0513}" - , - year = 2005 -} - -@InProceedings{ eup1, - author = "Liming Chen and Victor Tan and Fenglian Xu and Alexis - Biller and Paul Groth and Simon Miles and John Ibbotson and - Michael Luck and Luc Moreau", - title = "{A proof of concept: Provenance in a Service Oriented - Architecture}", - booktitle = "{Proceedings of the fourth UK e-Science All Hands Meeting, - Nottingham, UK}", - year = {2005} -} - -@InProceedings{ tgx05, - author = {Paul Townend and Paul Groth and Jie Xu}, - title = "{A provenance-aware weighted fault tolerance scheme for - service-based applications}", - booktitle = "{Proceedings of the $8^{th}$ IEEE International Symposium - on Object-oriented Real-time distributed Computing (ISORC - 2005)}", - year = {2005} -} - -@InProceedings{ mygrid, - author = "M. Nedim Alpdemir and Arijit Mukherjee and Norman W. Paton - and Alvaro A.A. Fernandes and Paul Watson and Kevin Glover - and Chris Greenhalgh and Tom Oinn and Hannah Tipney", - title = "Contextualised Workflow Execution in myGrid", - booktitle = " Proc European Grid Conference , Springer-Verlag LNCS - 3470", - year = 2005, - pages = "444-453" -} - -@Article{ condor2, - author = "Douglas Thain and Todd Tannenbaum and Miron Livny", - title = "Distributed computing in practice: the Condor experience.", - journal = "Concurrency - Practice and Experience", - year = "2005", - volume = "17", - number = "2-4", - pages = "323-356" -} - -@InProceedings{ globus4, - author = "I. Foster", - title = "Globus Toolkit Version 4: Software for Service-Oriented - Systems.", - booktitle = "IFIP International Conference on Network and Parallel - Computing, Springer-Verlag LNCS 3779,", - year = "2005", - pages = "2-13" -} - -@InProceedings{ cgmapisa, - author = "Andrea Ceccanti and Ond\v{r}ej Kraj\'{\i}\v{c}ek and - Ale\v{s} K\v{r}enek and Lud\v{e}k Matyska and Miroslav - Ruda.", - title = "Towards Scalable and Interoperable Grid Monitoring - Infrastructure.", - booktitle = "Proceedings of the first CoreGRID Integration Workshop", - year = "2005", - pages = "10-18" -} - -@InProceedings{ cgma, - author = "Ondøej Krajíèek and Ale¹ Køenek and Ludìk Matyska and - Miroslav Ruda and Jiøí Sitera", - title = "Capability Languages in C-GMA", - booktitle = "Proceedings of Cracow Grid Workshop (CGW05)", - year = "2005" -} - -@Article{ taxonomy, - author = {Serafeim Zanikolas and Rizos Sakellariou}, - title = {A taxonomy of grid monitoring systems}, - journal = {Future Gener. Comput. Syst.}, - year = {2005}, - volume = {21}, - number = {1}, - pages = {163--188}, - issn = {0167-739X}, - doi = {http://dx.doi.org/10.1016/j.future.2004.07.002}, - publisher = {Elsevier Science Publishers B. V.}, - address = {Amsterdam, The Netherlands, The Netherlands} -} - -@Article{ unicore, - author = "Achim Streit and Dietmar Erwin and Thomas Lippert and - Daniel Mallmann and Roger Menday and Michael Rambadt and - Morris Riedel and Mathilde Romberg and Bernd Schuller and - Philipp Wieder", - title = "UNICORE - From Project Results to Production Grids", - journal = "Grid Computing : New Frontiers of High Performance - Computing", - year = "2005", - pages = "357 - 376" -} - -@Article{ voms2, - author = "R. Alfieri and R. Cecchini and V. Ciaschini and L. - dell'Agnello and \'{A}. Frohner and K. L\H{o}rentey and F. - Spataro", - title = "{From gridmap-file to VOMS: managing authorization in a - Grid environment}", - journal = "Future Generation Computer Systems", - year = "2005", - pages = "549-558", - month = "April" -} - -@InProceedings{ cgw05, - author = "F. Dvoøák and D. Kouøil and A. Køenek and L. Matyska and - M. Mulaè and J.Pospi¹il and M. Ruda and Z. Salvet and J. - Sitera and J. ©krabal and M. Vocù ", - title = "Services for Tracking and Archival of Grid Job - Information", - booktitle = "Proceeding of Cracow Grid Workshop", - year = "2005" -} - -@Misc{ rfc4122, - author = "P. Leach and M. Mealling and R. Salz", - title = "A Universally Unique IDentifier (UUID) URN Namespace", - howpublished = "IETF RFC 4122", - year = "2005" -} - -@Misc{ euprovenance, - title = "{EU FP6 Programme Enabling and Supporting Provenance in - Grids for Complex Problems}", - howpublished = "\url{http://twiki.gridprovenance.org/bin/view/Provenance/ProjectInformation}" - , - year = 2006 -} - -@Misc{ atlas, - author = "TODO - predelat na neco poradneho", - title = "{The ATLAS Experiment}", - howpublished = "\url{http://atlas.ch/}", - year = 2006 -} - -@Misc{ ami, - author = "TODO - predelat na neco poradneho", - title = "{The Atlas Metadata Interface}", - howpublished = "\url{https://atlastagcollector.in2p3.fr:8443/AMI/}", - year = 2006 -} - -@Misc{ alice, - author = "TODO - predelat na neco poradneho", - title = "{A Large Ion Collider Experiment}", - howpublished = "\url{http://aliceinfo.cern.ch/Public}", - year = 2006 -} - -@Misc{ sam, - author = "TODO - predelat na neco poradneho", - title = "{SAM (Sequential data Access via Meta-data)}", - howpublished = "\url{http://d0db.fnal.gov/sam/}", - year = 2006 -} - -@InProceedings{ gacl2, - author = "A. McNab and S. Kaushal", - title = "Web services with gridsite and C/C++/scripts", - booktitle = "Computing in High Energy and Nuclear Physics (CHEP 2006)", - year = "2006" -} - -@Misc{ crossgrid, - author = "CrossGrid", - title = "{CrossGrid Project}", - howpublished = "\url{http://www.crossgrid.org}" -} - -@Misc{ dgas, - author = "DGAS", - title = "{The Distributed Grid Accounting System}", - howpublished = "\url{http://www.to.infn.it/grid/accounting/main.html}" -} - -@Misc{ egee, - author = "EGEE", - title = "{Enabling Grids for E-sciencE (EGEE) Project}", - howpublished = "\url{http://lcg.web.cern.ch/LCG/}" -} - -@Misc{ gridice, - author = "EGEE", - title = "{GridIce, the eyes of the Grid}", - howpublished = "\url{http://gridice2.cnaf.infn.it:50080/gridice/}" -} - -@Misc{ djra1.2, - author = {{EGEE JRA1}}, - title = {{EGEE Middleware Design---Release 1}}, - howpublished = {\url{https://edms.cern.ch/document/487871/}} -} - -@Misc{ djra1.3, - author = {{EGEE JRA1}}, - title = {{EGEE Middleware Release 1}}, - howpublished = {\url{https://edms.cern.ch/document/567624/}} -} - -@Misc{ djra1.4, - author = {{EGEE JRA1}}, - title = {{EGEE Middleware Architecture---Release 2}}, - howpublished = {\url{https://edms.cern.ch/document/594698/}} -} - -@Misc{ jra2jobmetrics, - author = "EGEE JRA2", - title = "{Job Metrics}", - howpublished = "\url{http://egee-jra2.web.cern.ch/EGEE-JRA2/QoS/JobsMetrics/JobMetrics.htm}" - -} - -@Misc{ lbug, - author = "A. K\v{r}enek and others", - title = "{L\&B User's Guide}", - howpublished = "\url{http://egee.cesnet.cz/en/JRA1/LB/}", -} - -@Misc{ lbdg, - author = "A. K\v{r}enek and others", - title = "{L\&B Developer's Guide}", - howpublished = "\url{http://egee.cesnet.cz/en/JRA1/LB/}", -} - -@Misc{ lbag, - author = "A. K\v{r}enek and others", - title = "{L\&B Administrator's Guide}", - howpublished = "\url{http://egee.cesnet.cz/en/JRA1/LB/}", -} - -@Misc{ lbtp, - author = "A. K\v{r}enek and others", - title = "{L\&B Test Plan}", - howpublished = "\url{http://egee.cesnet.cz/en/JRA1/LB/}", -} - -@Misc{ wmsug, - author = "F. Pacini and others", - title = "{WMS User's Guide}", - howpublished = "\url{https://edms.cern.ch/file/572489/1/WMS-guide.pdf}" -} - -@Misc{ lcg, - author = "LCG", - title = "{LHC Computing Project (LCG)}", - howpublished = "\url{http://lcg.web.cern.ch/LCG/}" -} - -@Misc{ pasoa, - title = "{PASOA: Provenance Aware Service Oriented Architecture}", - howpublished = "\url{http://twiki.pasoa.ecs.soton.ac.uk/bin/view/PASOA/AboutPasoa}" - -} - -@InProceedings{ hpdc07, - author = {Miroslav Ruda and Ale\v{s} K\v{r}enek and Milo\v{s} - Mula\v{c} and Jan Posp\'{\i}\v{s}il and Zden\v{e}k \v{S}ustr}, - title = {A uniform job monitoring service in multiple job - universes}, - booktitle = {GMW '07: Proceedings of the 2007 workshop on Grid - monitoring}, - year = {2007}, - pages = {17--22}, - address = {New York, NY, USA}, - publisher = {ACM}, - isbn = {978-1-59593-716-2}, - location = {Monterey, California, USA}, - doi = {http://doi.acm.org/10.1145/1272680.1272684}, - abstract = {We describe an ongoing work of extending the gLite Logging - and Bookkeeping (\LB) service to be able to track - additional types of jobs, with the vision of being able to - uniformly follow jobs on the Grid, even when they pass - between different middleware domains. Details are given on - the simpler case of PBS jobs, which prove the cabability of - \LB to deal with additional job types, as well as started - more complex and challenging work on Condor jobs, where the - impact of eventual success is larger.} -} - -@Misc{ etics_manual, - title = "ETICS User Manual", - howpublished = "\url{https://edms.cern.ch/file/795312//ETICS-User_Manual-latest.pdf}", -} - - -@InProceedings{ LB4CRL, - author="Daniel Kouril and Ludek Matyska and Michal Prochazka", - title="A Robust and Efficient Mechanism to Distribute Certificate Revocation - Information Using the Grid Monitoring Architecture,", - pages="614-619", - booktitle="21st International Conference on Advanced Information Networking and -Applications Workshops (AINAW'07)", - year=2007 -} - -@Misc{ lcas, - title = "{Site Authorisation and Enforcement Services: LCAS, LCMAPS, and gLExec}", - howpublished = "\url{https://www.nikhef.nl/pub/projects/grid/gridwiki/index.php/LCAS}", -} - diff --git a/org.glite.lb.doc/src/listings.sty b/org.glite.lb.doc/src/listings.sty deleted file mode 100644 index 7c3eceb..0000000 --- a/org.glite.lb.doc/src/listings.sty +++ /dev/null @@ -1,2002 +0,0 @@ -%% -%% This is file `listings.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% listings-1.3.dtx (with options: `kernel') -%% -%% Please read the software license in listings-1.3.dtx or listings-1.3.pdf. -%% -%% (w)(c) 1996--2004 Carsten Heinz and/or any other author listed -%% elsewhere in this file. -%% -%% Send comments and ideas on the package, error reports and additional -%% programming languages to . -%% -\def\filedate{2004/09/07} -\def\fileversion{1.3} -\NeedsTeXFormat{LaTeX2e} -\AtEndOfPackage{\ProvidesPackage{listings} - [\filedate\space\fileversion\space(Carsten Heinz)]} -\def\lst@CheckVersion#1{\edef\reserved@a{#1}% - \ifx\lst@version\reserved@a \expandafter\@gobble - \else \expandafter\@firstofone \fi} -\let\lst@version\fileversion -\def\lst@InputCatcodes{% - \makeatletter \catcode`\"12% - \catcode`\^^@\active - \catcode`\^^I9% - \catcode`\^^L9% - \catcode`\^^M9% - \catcode`\%14% - \catcode`\~\active} -\def\lst@RestoreCatcodes#1{% - \ifx\relax#1\else - \noexpand\catcode`\noexpand#1\the\catcode`#1\relax - \expandafter\lst@RestoreCatcodes - \fi} -\edef\lst@RestoreCatcodes{% - \noexpand\lccode`\noexpand\/`\noexpand\/% - \lst@RestoreCatcodes\"\^^I\^^M\~\^^@\relax} -\lst@InputCatcodes -\AtEndOfPackage{\lst@RestoreCatcodes} -\def\@lst{lst} -\def\lst@IfSubstring#1#2{% - \def\lst@temp##1#1##2##3\relax{% - \ifx \@empty##2\expandafter\@secondoftwo - \else \expandafter\@firstoftwo \fi}% - \expandafter\lst@temp#2#1\@empty\relax} -\def\lst@IfOneOf#1\relax#2{% - \def\lst@temp##1,#1,##2##3\relax{% - \ifx \@empty##2\expandafter\@secondoftwo - \else \expandafter\@firstoftwo \fi}% - \expandafter\lst@temp\expandafter,#2,#1,\@empty\relax} -\def\lst@DeleteKeysIn#1#2{% - \expandafter\lst@DeleteKeysIn@\expandafter#1#2,\relax,} -\def\lst@DeleteKeysIn@#1#2,{% - \ifx\relax#2\@empty - \expandafter\@firstoftwo\expandafter\lst@RemoveCommas - \else - \ifx\@empty#2\@empty\else - \def\lst@temp##1,#2,##2{% - ##1% - \ifx\@empty##2\@empty\else - \expandafter\lst@temp\expandafter,% - \fi ##2}% - \edef#1{\expandafter\lst@temp\expandafter,#1,#2,\@empty}% - \fi - \fi - \lst@DeleteKeysIn@#1} -\def\lst@RemoveCommas#1{\edef#1{\expandafter\lst@RC@#1\@empty}} -\def\lst@RC@#1{\ifx,#1\expandafter\lst@RC@ \else #1\fi} -\def\lst@ReplaceIn#1#2{% - \expandafter\lst@ReplaceIn@\expandafter#1#2\@empty\@empty} -\def\lst@ReplaceInArg#1#2{\lst@ReplaceIn@#1#2\@empty\@empty} -\def\lst@ReplaceIn@#1#2#3{% - \ifx\@empty#3\relax\else - \def\lst@temp##1#2##2{% - \ifx\@empty##2% - \lst@lAddTo#1{##1}% - \else - \lst@lAddTo#1{##1#3}\expandafter\lst@temp - \fi ##2}% - \let\@tempa#1\let#1\@empty - \expandafter\lst@temp\@tempa#2\@empty - \expandafter\lst@ReplaceIn@\expandafter#1% - \fi} -\providecommand*\@gobblethree[3]{} -\def\lst@GobbleNil#1\@nil{} -\def\lst@Swap#1#2{#2#1} -\def\lst@true{\let\lst@if\iftrue} -\def\lst@false{\let\lst@if\iffalse} -\lst@false -\def\lst@IfNextCharsArg#1{% - \def\lst@tofind{#1}\lst@IfNextChars\lst@tofind} -\def\lst@IfNextChars#1#2#3{% - \let\lst@tofind#1\def\@tempa{#2}\def\@tempb{#3}% - \let\lst@eaten\@empty \lst@IfNextChars@} -\def\lst@IfNextChars@{\expandafter\lst@IfNextChars@@\lst@tofind\relax} -\def\lst@IfNextChars@@#1#2\relax#3{% - \def\lst@tofind{#2}\lst@lAddTo\lst@eaten{#3}% - \ifx#1#3% - \ifx\lst@tofind\@empty - \let\lst@next\@tempa - \else - \let\lst@next\lst@IfNextChars@ - \fi - \expandafter\lst@next - \else - \expandafter\@tempb - \fi} -\def\lst@IfNextCharActive#1#2#3{% - \begingroup \lccode`\~=`#3\lowercase{\endgroup - \ifx~}#3% - \def\lst@next{#1}% - \else - \def\lst@next{#2}% - \fi \lst@next #3} -\def\lst@for#1\do#2{% - \def\lst@forbody##1{#2}% - \@for\lst@forvar:=#1\do - {\expandafter\lst@forbody\expandafter{\lst@forvar}}} -\def\lst@MakeActive#1{% - \let\lst@temp\@empty \lst@MakeActive@#1% - \relax\relax\relax\relax\relax\relax\relax\relax\relax} -\begingroup -\catcode`\^^@=\active \catcode`\^^A=\active \catcode`\^^B=\active -\catcode`\^^C=\active \catcode`\^^D=\active \catcode`\^^E=\active -\catcode`\^^F=\active \catcode`\^^G=\active \catcode`\^^H=\active -\gdef\lst@MakeActive@#1#2#3#4#5#6#7#8#9{\let\lst@next\relax - \ifx#1\relax - \else \lccode`\^^@=`#1% - \ifx#2\relax - \lowercase{\lst@lAddTo\lst@temp{^^@}}% - \else \lccode`\^^A=`#2% - \ifx#3\relax - \lowercase{\lst@lAddTo\lst@temp{^^@^^A}}% - \else \lccode`\^^B=`#3% - \ifx#4\relax - \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B}}% - \else \lccode`\^^C=`#4% - \ifx#5\relax - \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C}}% - \else \lccode`\^^D=`#5% - \ifx#6\relax - \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D}}% - \else \lccode`\^^E=`#6% - \ifx#7\relax - \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E}}% - \else \lccode`\^^F=`#7% - \ifx#8\relax - \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F}}% - \else \lccode`\^^G=`#8% - \ifx#9\relax - \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F^^G}}% - \else \lccode`\^^H=`#9% - \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F^^G^^H}}% - \let\lst@next\lst@MakeActive@ - \fi \fi \fi \fi \fi \fi \fi \fi \fi - \lst@next} -\endgroup -\def\lst@DefActive#1#2{\lst@MakeActive{#2}\let#1\lst@temp} -\def\lst@DefOther#1#2{% - \begingroup \def#1{#2}\escapechar\m@ne \expandafter\endgroup - \expandafter\lst@DefOther@\meaning#1\relax#1} -\def\lst@DefOther@#1>#2\relax#3{\edef#3{\zap@space#2 \@empty}} -\def\lst@InsideConvert#1{% - \lst@ifmathescape - \lst@InsideConvert@e#1$\@nil - \lst@if - \lst@InsideConvert@ey#1\@nil - \else - \lst@InsideConvert@#1 \@empty - \expandafter\@gobbletwo - \fi - \expandafter\lst@next - \else - \lst@InsideConvert@#1 \@empty - \fi} -\begingroup \lccode`\~=`\ \relax \lowercase{% -\gdef\lst@InsideConvert@#1 #2{% - \lst@MakeActive{#1}% - \ifx\@empty#2% - \lst@lExtend\lst@arg{\lst@temp}% - \else - \lst@lExtend\lst@arg{\lst@temp~}% - \expandafter\lst@InsideConvert@ - \fi #2} -}\endgroup -\def\lst@InsideConvert@e#1$#2\@nil{% - \ifx\@empty#2\@empty \lst@false \else \lst@true \fi} -\def\lst@InsideConvert@ey#1$#2$#3\@nil{% - \lst@InsideConvert@#1 \@empty - \lst@lAddTo\lst@arg{% - \lst@ifdropinput\else - \lst@TrackNewLines\lst@OutputLostSpace \lst@XPrintToken - \setbox\@tempboxa=\hbox\bgroup$\lst@escapebegin - #2% - \lst@escapeend$\egroup \lst@CalcLostSpaceAndOutput - \lst@whitespacefalse - \fi}% - \def\lst@next{\lst@InsideConvert{#3}}% -} -\def\lst@XConvert{\@ifnextchar\bgroup \lst@XConvertArg\lst@XConvert@} -\def\lst@XConvertArg#1{% - {\lst@false \let\lst@arg\@empty - \lst@XConvert#1\@nil - \global\let\@gtempa\lst@arg}% - \lst@lExtend\lst@arg{\expandafter{\@gtempa}}% - \lst@XConvertNext} -\def\lst@XConvert@#1{% - \ifx\@nil#1\else - \begingroup\lccode`\~=`#1\lowercase{\endgroup - \lst@lAddTo\lst@arg~}% - \expandafter\lst@XConvertNext - \fi} -\def\lst@XConvertNext{% - \lst@if \expandafter\lst@XConvertX - \else \expandafter\lst@XConvert \fi} -\def\lst@XConvertX#1{% - \ifx\@nil#1\else - \lst@XConvertX@#1\relax - \expandafter\lst@XConvert - \fi} -\def\lst@XConvertX@#1#2\relax{% - \begingroup\lccode`\~=`#1\lowercase{\endgroup - \lst@XCConvertX@@~}{#2}} -\def\lst@XCConvertX@@#1#2{\lst@lAddTo\lst@arg{{#1#2}}} -\def\lst@Require#1#2#3#4#5{% - \begingroup - \aftergroup\lst@true - \ifx\@empty#3\@empty\else - \def\lst@prefix{#2}\let\lst@require\@empty - \edef\lst@temp{\expandafter\zap@space#3 \@empty}% - \lst@for\lst@temp\do{% - \ifx\@empty##1\@empty\else \lstKV@OptArg[]{##1}{% - #4[####1]{####2}% - \@ifundefined{\@lst\lst@prefix @\lst@malias $\lst@oalias}% - {\edef\lst@require{\lst@require,\lst@malias $\lst@oalias}}% - {}}% - \fi}% - \global\let\lst@loadaspects\@empty - \lst@InputCatcodes - \ifx\lst@require\@empty\else - \lst@for{#5}\do{% - \ifx\lst@require\@empty\else - \InputIfFileExists{##1}{}{}% - \fi}% - \fi - \ifx\lst@require\@empty\else - \PackageError{Listings}{Couldn't load requested #1}% - {The following #1s weren't loadable:^^J\@spaces - \lst@require^^JThis may cause errors in the sequel.}% - \aftergroup\lst@false - \fi - \ifx\lst@loadaspects\@empty\else - \lst@RequireAspects\lst@loadaspects - \fi - \fi - \endgroup} -\def\lst@IfRequired[#1]#2{% - \lst@NormedDef\lst@temp{[#1]#2}% - \expandafter\lst@IfRequired@\lst@temp\relax} -\def\lst@IfRequired@[#1]#2\relax#3{% - \lst@IfOneOf #2$#1\relax\lst@require - {\lst@DeleteKeysIn@\lst@require#2$#1,\relax,% - \global\expandafter\let - \csname\@lst\lst@prefix @#2$#1\endcsname\@empty - #3}} -\let\lst@require\@empty -\def\lst@NoAlias[#1]#2{% - \lst@NormedDef\lst@oalias{#1}\lst@NormedDef\lst@malias{#2}} -\gdef\lst@LAS#1#2#3#4#5#6#7{% - \lst@Require{#1}{#2}{#3}#4#5% - #4#3% - \@ifundefined{lst#2@\lst@malias$\lst@oalias}% - {\PackageError{Listings}% - {#1 \ifx\@empty\lst@oalias\else \lst@oalias\space of \fi - \lst@malias\space undefined}% - {The #1 is not loadable. \@ehc}}% - {#6\csname\@lst#2@\lst@malias $\lst@oalias\endcsname #7}} -\def\lst@RequireAspects#1{% - \lst@Require{aspect}{asp}{#1}\lst@NoAlias\lstaspectfiles} -\let\lstloadaspects\lst@RequireAspects -\@ifundefined{lstaspectfiles} - {\newcommand\lstaspectfiles{lstmisc0.sty,lstmisc.sty}}{} -\gdef\lst@DefDriver#1#2#3#4{% - \@ifnextchar[{\lst@DefDriver@{#1}{#2}#3#4}% - {\lst@DefDriver@{#1}{#2}#3#4[]}} -\gdef\lst@DefDriver@#1#2#3#4[#5]#6{% - \def\lst@name{#1}\let\lst@if#4% - \lst@NormedDef\lst@driver{\@lst#2@#6$#5}% - \lst@IfRequired[#5]{#6}{\begingroup \lst@true}% - {\begingroup}% - \lst@setcatcodes - \@ifnextchar[{\lst@XDefDriver{#1}#3}{\lst@DefDriver@@#3}} -\gdef\lst@DefDriver@@#1#2{% - \lst@if - \global\@namedef{\lst@driver}{#1{#2}}% - \fi - \endgroup - \@ifnextchar[\lst@XXDefDriver\@empty} -\gdef\lst@XXDefDriver[#1]{% - \ifx\@empty#1\@empty\else - \lst@if - \lstloadaspects{#1}% - \else - \@ifundefined{\lst@driver}{}% - {\xdef\lst@loadaspects{\lst@loadaspects,#1}}% - \fi - \fi} -\gdef\lst@XDefDriver#1#2[#3]#4#5{\lst@DefDriver@@#2{also#1=[#3]#4,#5}} -\let\lst@UserCommand\gdef -\newcommand*\lst@BeginAspect[2][]{% - \def\lst@curraspect{#2}% - \ifx \lst@curraspect\@empty - \expandafter\lst@GobbleAspect - \else - \let\lst@next\@empty - \lst@IfRequired[]{#2}% - {\lst@RequireAspects{#1}% - \lst@if\else \let\lst@next\lst@GobbleAspect \fi}% - {\let\lst@next\lst@GobbleAspect}% - \expandafter\lst@next - \fi} -\def\lst@EndAspect{% - \csname\@lst patch@\lst@curraspect\endcsname - \let\lst@curraspect\@empty} -\long\def\lst@GobbleAspect#1\lst@EndAspect{\let\lst@curraspect\@empty} -\def\lst@Key#1#2{% - \@ifnextchar[{\lstKV@def{#1}{#2}}% - {\def\lst@temp{\lst@Key@{#1}{#2}} - \afterassignment\lst@temp - \global\@namedef{KV@\@lst @#1}####1}} -\def\lstKV@def#1#2[#3]{% - \global\@namedef{KV@\@lst @#1@default\expandafter}\expandafter - {\csname KV@\@lst @#1\endcsname{#3}}% - \def\lst@temp{\lst@Key@{#1}{#2}}\afterassignment\lst@temp - \global\@namedef{KV@\@lst @#1}##1} -\def\lst@Key@#1#2{% - \ifx\relax#2\@empty\else - \begingroup \globaldefs\@ne - \csname KV@\@lst @#1\endcsname{#2}% - \endgroup - \fi} -\def\lst@UseHook#1{\csname\@lst hk@#1\endcsname} -\def\lst@AddToHook{\lst@ATH@\iffalse\lst@AddTo} -\def\lst@AddToHookExe{\lst@ATH@\iftrue\lst@AddTo} -\def\lst@AddToHookAtTop{\lst@ATH@\iffalse\lst@AddToAtTop} -\long\def\lst@ATH@#1#2#3#4{% - \@ifundefined{\@lst hk@#3}{% - \expandafter\gdef\csname\@lst hk@#3\endcsname{}}{}% - \expandafter#2\csname\@lst hk@#3\endcsname{#4}% - \def\lst@temp{#4}% - #1% \iftrue|false - \begingroup \globaldefs\@ne \lst@temp \endgroup - \fi} -\long\def\lst@AddTo#1#2{% - \expandafter\gdef\expandafter#1\expandafter{#1#2}} -\def\lst@AddToAtTop#1#2{\def\lst@temp{#2}% - \expandafter\expandafter\expandafter\gdef - \expandafter\expandafter\expandafter#1% - \expandafter\expandafter\expandafter{\expandafter\lst@temp#1}} -\def\lst@lAddTo#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}} -\def\lst@Extend#1#2{% - \expandafter\lst@AddTo\expandafter#1\expandafter{#2}} -\def\lst@lExtend#1#2{% - \expandafter\lst@lAddTo\expandafter#1\expandafter{#2}} -\RequirePackage{keyval}[1997/11/10] -\def\lstKV@TwoArg#1#2{\gdef\@gtempa##1##2{#2}\@gtempa#1{}{}} -\def\lstKV@ThreeArg#1#2{\gdef\@gtempa##1##2##3{#2}\@gtempa#1{}{}{}} -\def\lstKV@FourArg#1#2{\gdef\@gtempa##1##2##3##4{#2}\@gtempa#1{}{}{}{}} -\def\lstKV@OptArg[#1]#2#3{% - \gdef\@gtempa[##1]##2{#3}\lstKV@OptArg@{#1}#2\@} -\def\lstKV@OptArg@#1{\@ifnextchar[\lstKV@OptArg@@{\lstKV@OptArg@@[#1]}} -\def\lstKV@OptArg@@[#1]#2\@{\@gtempa[#1]{#2}} -\def\lstKV@XOptArg[#1]#2#3{% - \global\let\@gtempa#3\lstKV@OptArg@{#1}#2\@} -\def\lstKV@CSTwoArg#1#2{% - \gdef\@gtempa##1,##2,##3\relax{#2}% - \@gtempa#1,,\relax} -\def\lstKV@SetIf#1{\lstKV@SetIf@#1\relax} -\def\lstKV@SetIf@#1#2\relax#3{\lowercase{% - \expandafter\let\expandafter#3% - \csname if\ifx #1t}true\else false\fi\endcsname} -\def\lstKV@SwitchCases#1#2#3{% - \def\lst@temp##1\\#1&##2\\##3##4\@nil{% - \ifx\@empty##3% - #3% - \else - ##2% - \fi - }% - \lst@temp\\#2\\#1&\\\@empty\@nil} -\lst@UserCommand\lstset{\begingroup \lst@setcatcodes \lstset@} -\def\lstset@#1{\endgroup \ifx\@empty#1\@empty\else\setkeys{lst}{#1}\fi} -\def\lst@setcatcodes{\makeatletter \catcode`\==12\relax} -\def\lst@NewMode#1{% - \ifx\@undefined#1% - \lst@mode\lst@newmode\relax \advance\lst@mode\@ne - \xdef\lst@newmode{\the\lst@mode}% - \global\chardef#1=\lst@mode - \lst@mode\lst@nomode - \fi} -\newcount\lst@mode -\def\lst@newmode{\m@ne}% init -\lst@NewMode\lst@nomode % init (of \lst@mode :-) -\def\lst@UseDynamicMode{% - \@tempcnta\lst@dynamicmode\relax \advance\@tempcnta\@ne - \edef\lst@dynamicmode{\the\@tempcnta}% - \expandafter\lst@Swap\expandafter{\expandafter{\lst@dynamicmode}}} -\lst@AddToHook{InitVars}{\let\lst@dynamicmode\lst@newmode} -\def\lst@EnterMode#1#2{% - \bgroup \lst@mode=#1\relax #2% - \lst@FontAdjust - \lst@lAddTo\lst@entermodes{\lst@EnterMode{#1}{#2}}} -\lst@AddToHook{InitVars}{\let\lst@entermodes\@empty} -\let\lst@entermodes\@empty % init -\def\lst@LeaveMode{% - \ifnum\lst@mode=\lst@nomode\else - \egroup \expandafter\lsthk@EndGroup - \fi} -\lst@AddToHook{EndGroup}{}% init -\def\lst@InterruptModes{% - \lst@Extend\lst@modestack{\expandafter{\lst@entermodes}}% - \lst@LeaveAllModes} -\lst@AddToHook{InitVars}{\global\let\lst@modestack\@empty} -\def\lst@ReenterModes{% - \ifx\lst@modestack\@empty\else - \lst@LeaveAllModes - \global\let\@gtempa\lst@modestack - \global\let\lst@modestack\@empty - \expandafter\lst@ReenterModes@\@gtempa\relax - \fi} -\def\lst@ReenterModes@#1#2{% - \ifx\relax#2\@empty - \gdef\@gtempa##1{#1}% - \expandafter\@gtempa - \else - \lst@AddTo\lst@modestack{{#1}}% - \expandafter\lst@ReenterModes@ - \fi - {#2}} -\def\lst@LeaveAllModes{% - \ifnum\lst@mode=\lst@nomode - \expandafter\lsthk@EndGroup - \else - \expandafter\egroup\expandafter\lst@LeaveAllModes - \fi} -\lst@AddToHook{ExitVars}{\lst@LeaveAllModes} -\lst@NewMode\lst@Pmode -\lst@NewMode\lst@GPmode -\def\lst@modetrue{\let\lst@ifmode\iftrue \lsthk@ModeTrue} -\let\lst@ifmode\iffalse % init -\lst@AddToHook{ModeTrue}{}% init -\def\lst@Lmodetrue{\let\lst@ifLmode\iftrue} -\let\lst@ifLmode\iffalse % init -\lst@AddToHook{EOL}{\@whilesw \lst@ifLmode\fi \lst@LeaveMode} -\def\lst@NormedDef#1#2{\lowercase{\edef#1{\zap@space#2 \@empty}}} -\def\lst@NormedNameDef#1#2{% - \lowercase{\edef\lst@temp{\zap@space#1 \@empty}% - \expandafter\xdef\csname\lst@temp\endcsname{\zap@space#2 \@empty}}} -\def\lst@GetFreeMacro#1{% - \@tempcnta\z@ \def\lst@freemacro{#1\the\@tempcnta}% - \lst@GFM@} -\def\lst@GFM@{% - \expandafter\ifx \csname\lst@freemacro\endcsname \relax - \edef\lst@freemacro{\csname\lst@freemacro\endcsname}% - \else - \advance\@tempcnta\@ne - \expandafter\lst@GFM@ - \fi} -\newbox\lst@gtempboxa -\newtoks\lst@token \newcount\lst@length -\def\lst@ResetToken{\lst@token{}\lst@length\z@} -\lst@AddToHook{InitVarsBOL}{\lst@ResetToken \let\lst@lastother\@empty} -\lst@AddToHook{EndGroup}{\lst@ResetToken \let\lst@lastother\@empty} -\def\lst@lettertrue{\let\lst@ifletter\iftrue} -\def\lst@letterfalse{\let\lst@ifletter\iffalse} -\lst@AddToHook{InitVars}{\lst@letterfalse} -\def\lst@Append#1{\advance\lst@length\@ne - \lst@token=\expandafter{\the\lst@token#1}} -\def\lst@AppendOther{% - \lst@ifletter \lst@Output\lst@letterfalse \fi - \futurelet\lst@lastother\lst@Append} -\def\lst@AppendLetter{% - \lst@ifletter\else \lst@OutputOther\lst@lettertrue \fi - \lst@Append} -\def\lst@SaveToken{% - \global\let\lst@gthestyle\lst@thestyle - \global\let\lst@glastother\lst@lastother - \xdef\lst@RestoreToken{\noexpand\lst@token{\the\lst@token}% - \noexpand\lst@length\the\lst@length\relax - \noexpand\let\noexpand\lst@thestyle - \noexpand\lst@gthestyle - \noexpand\let\noexpand\lst@lastother - \noexpand\lst@glastother}} -\def\lst@IfLastOtherOneOf#1{\lst@IfLastOtherOneOf@ #1\relax} -\def\lst@IfLastOtherOneOf@#1{% - \ifx #1\relax - \expandafter\@secondoftwo - \else - \ifx\lst@lastother#1% - \lst@IfLastOtherOneOf@t - \else - \expandafter\expandafter\expandafter\lst@IfLastOtherOneOf@ - \fi - \fi} -\def\lst@IfLastOtherOneOf@t#1\fi\fi#2\relax{\fi\fi\@firstoftwo} -\newdimen\lst@currlwidth % \global -\newcount\lst@column \newcount\lst@pos % \global -\lst@AddToHook{InitVarsBOL} - {\global\lst@currlwidth\z@ \global\lst@pos\z@ \global\lst@column\z@} -\def\lst@CalcColumn{% - \@tempcnta\lst@column - \advance\@tempcnta\lst@length - \advance\@tempcnta-\lst@pos} -\newdimen\lst@lostspace % \global -\lst@AddToHook{InitVarsBOL}{\global\lst@lostspace\z@} -\def\lst@UseLostSpace{\ifdim\lst@lostspace>\z@ \lst@InsertLostSpace \fi} -\def\lst@InsertLostSpace{% - \lst@Kern\lst@lostspace \global\lst@lostspace\z@} -\def\lst@InsertHalfLostSpace{% - \global\lst@lostspace.5\lst@lostspace \lst@Kern\lst@lostspace} -\newdimen\lst@width -\lst@Key{basewidth}{0.6em,0.45em}{\lstKV@CSTwoArg{#1}% - {\def\lst@widthfixed{##1}\def\lst@widthflexible{##2}% - \ifx\lst@widthflexible\@empty - \let\lst@widthflexible\lst@widthfixed - \fi - \def\lst@temp{\PackageError{Listings}% - {Negative value(s) treated as zero}% - \@ehc}% - \let\lst@error\@empty - \ifdim \lst@widthfixed<\z@ - \let\lst@error\lst@temp \let\lst@widthfixed\z@ - \fi - \ifdim \lst@widthflexible<\z@ - \let\lst@error\lst@temp \let\lst@widthflexible\z@ - \fi - \lst@error}} -\lst@AddToHook{FontAdjust} - {\lst@width=\lst@ifflexible\lst@widthflexible - \else\lst@widthfixed\fi \relax} -\lst@Key{fontadjust}{false}[t]{\lstKV@SetIf{#1}\lst@iffontadjust} -\def\lst@FontAdjust{\lst@iffontadjust \lsthk@FontAdjust \fi} -\lst@AddToHook{InitVars}{\lsthk@FontAdjust} -\def\lst@OutputBox#1{\lst@alloverstyle{\box#1}} -\def\lst@alloverstyle#1{#1}% init -\def\lst@Kern#1{% - \setbox\z@\hbox{{\lst@currstyle{\kern#1}}}% - \global\advance\lst@currlwidth \wd\z@ - \lst@OutputBox\z@} -\def\lst@CalcLostSpaceAndOutput{% - \global\advance\lst@lostspace \lst@length\lst@width - \global\advance\lst@lostspace-\wd\@tempboxa - \global\advance\lst@currlwidth \wd\@tempboxa - \global\advance\lst@pos -\lst@length - \setbox\@tempboxa\hbox{\let\lst@OutputBox\box - \ifdim\lst@lostspace>\z@ \lst@leftinsert \fi - \box\@tempboxa - \ifdim\lst@lostspace>\z@ \lst@rightinsert \fi}% - \lst@OutputBox\@tempboxa \lsthk@PostOutput} -\lst@AddToHook{PostOutput}{}% init -\def\lst@OutputToken{% - \lst@TrackNewLines \lst@OutputLostSpace - \lst@ifgobbledws - \lst@gobbledwhitespacefalse - \lst@@discretionary - \fi - \lst@CheckMerge - {\lst@thestyle{\lst@FontAdjust - \setbox\@tempboxa\lst@hbox - {\lsthk@OutputBox - \lst@lefthss - \expandafter\lst@FillOutputBox\the\lst@token\@empty - \lst@righthss}% - \lst@CalcLostSpaceAndOutput}}% - \lst@ResetToken} -\lst@AddToHook{OutputBox}{}% init -\def\lst@gobbledwhitespacetrue{\global\let\lst@ifgobbledws\iftrue} -\def\lst@gobbledwhitespacefalse{\global\let\lst@ifgobbledws\iffalse} -\lst@AddToHookExe{InitBOL}{\lst@gobbledwhitespacefalse}% init -\def\lst@Delay#1{% - \lst@CheckDelay - #1% - \lst@GetOutputMacro\lst@delayedoutput - \edef\lst@delayed{\the\lst@token}% - \edef\lst@delayedlength{\the\lst@length}% - \lst@ResetToken} -\def\lst@Merge#1{% - \lst@CheckMerge - #1% - \edef\lst@merged{\the\lst@token}% - \edef\lst@mergedlength{\the\lst@length}% - \lst@ResetToken} -\def\lst@MergeToken#1#2{% - \advance\lst@length#2% - \lst@lExtend#1{\the\lst@token}% - \expandafter\lst@token\expandafter{#1}% - \let#1\@empty} -\def\lst@CheckDelay{% - \ifx\lst@delayed\@empty\else - \lst@GetOutputMacro\@gtempa - \ifx\lst@delayedoutput\@gtempa - \lst@MergeToken\lst@delayed\lst@delayedlength - \else - {\lst@ResetToken - \lst@MergeToken\lst@delayed\lst@delayedlength - \lst@delayedoutput}% - \let\lst@delayed\@empty - \fi - \fi} -\def\lst@CheckMerge{% - \ifx\lst@merged\@empty\else - \lst@MergeToken\lst@merged\lst@mergedlength - \fi} -\let\lst@delayed\@empty % init -\let\lst@merged\@empty % init -\def\lst@column@fixed{% - \lst@flexiblefalse - \lst@width\lst@widthfixed\relax - \let\lst@OutputLostSpace\lst@UseLostSpace - \let\lst@FillOutputBox\lst@FillFixed - \let\lst@hss\hss - \def\lst@hbox{\hbox to\lst@length\lst@width}} -\def\lst@FillFixed#1{#1\lst@FillFixed@} -\def\lst@FillFixed@#1{% - \ifx\@empty#1\else \lst@hss#1\expandafter\lst@FillFixed@ \fi} -\def\lst@column@flexible{% - \lst@flexibletrue - \lst@width\lst@widthflexible\relax - \let\lst@OutputLostSpace\lst@UseLostSpace - \let\lst@FillOutputBox\@empty - \let\lst@hss\@empty - \let\lst@hbox\hbox} -\def\lst@column@fullflexible{% - \lst@column@flexible - \def\lst@OutputLostSpace{\lst@ifnewline \lst@UseLostSpace\fi}% - \let\lst@leftinsert\@empty - \let\lst@rightinsert\@empty} -\def\lst@outputpos#1#2\relax{% - \def\lst@lefthss{\lst@hss}\let\lst@righthss\lst@lefthss - \let\lst@rightinsert\lst@InsertLostSpace - \ifx #1c% - \let\lst@leftinsert\lst@InsertHalfLostSpace - \else\ifx #1r% - \let\lst@righthss\@empty - \let\lst@leftinsert\lst@InsertLostSpace - \let\lst@rightinsert\@empty - \else - \let\lst@lefthss\@empty - \let\lst@leftinsert\@empty - \ifx #1l\else \PackageWarning{Listings}% - {Unknown positioning for output boxes}% - \fi - \fi\fi} -\def\lst@flexibletrue{\let\lst@ifflexible\iftrue} -\def\lst@flexiblefalse{\let\lst@ifflexible\iffalse} -\lst@Key{columns}{[c]fixed}{\lstKV@OptArg[]{#1}{% - \ifx\@empty##1\@empty\else \lst@outputpos##1\relax\relax \fi - \expandafter\let\expandafter\lst@arg - \csname\@lst @column@##2\endcsname - \lst@arg - \ifx\lst@arg\relax - \PackageWarning{Listings}{Unknown column format `##2'}% - \else - \lst@ifflexible - \let\lst@columnsflexible\lst@arg - \else - \let\lst@columnsfixed\lst@arg - \fi - \fi}} -\let\lst@columnsfixed\lst@column@fixed % init -\let\lst@columnsflexible\lst@column@flexible % init -\lst@Key{flexiblecolumns}\relax[t]{% - \lstKV@SetIf{#1}\lst@ifflexible - \lst@ifflexible \lst@columnsflexible - \else \lst@columnsfixed \fi} -\newcount\lst@newlines -\lst@AddToHook{InitVars}{\global\lst@newlines\z@} -\lst@AddToHook{InitVarsBOL}{\global\advance\lst@newlines\@ne} -\def\lst@NewLine{% - \ifx\lst@OutputBox\@gobble\else - \par\noindent \hbox{}% - \fi - \global\advance\lst@newlines\m@ne - \lst@newlinetrue} -\def\lst@newlinetrue{\global\let\lst@ifnewline\iftrue} -\lst@AddToHookExe{PostOutput}{\global\let\lst@ifnewline\iffalse}% init -\def\lst@TrackNewLines{% - \ifnum\lst@newlines>\z@ - \lsthk@OnNewLine - \lst@DoNewLines - \fi} -\lst@AddToHook{OnNewLine}{}% init -\lst@Key{emptylines}\maxdimen{% - \@ifstar{\lst@true\@tempcnta\@gobble#1\relax\lst@GobbleNil}% - {\lst@false\@tempcnta#1\relax\lst@GobbleNil}#1\@nil - \advance\@tempcnta\@ne - \edef\lst@maxempty{\the\@tempcnta\relax}% - \let\lst@ifpreservenumber\lst@if} -\def\lst@DoNewLines{ - \@whilenum\lst@newlines>\lst@maxempty \do - {\lst@ifpreservenumber - \lsthk@OnEmptyLine - \global\advance\c@lstnumber\lst@advancelstnum - \fi - \global\advance\lst@newlines\m@ne}% - \@whilenum \lst@newlines>\@ne \do - {\lsthk@OnEmptyLine \lst@NewLine}% - \ifnum\lst@newlines>\z@ \lst@NewLine \fi} -\lst@AddToHook{OnEmptyLine}{}% init -\lst@Key{identifierstyle}{}{\def\lst@identifierstyle{#1}} -\lst@AddToHook{EmptyStyle}{\let\lst@identifierstyle\@empty} -\def\lst@GotoTabStop{% - \ifnum\lst@newlines=\z@ - \setbox\@tempboxa\hbox{\lst@outputspace}% - \setbox\@tempboxa\hbox to\wd\@tempboxa{{\lst@currstyle{\hss}}}% - \lst@CalcLostSpaceAndOutput - \else - \global\advance\lst@lostspace \lst@length\lst@width - \global\advance\lst@column\lst@length \lst@length\z@ - \fi} -\def\lst@OutputOther{% - \lst@CheckDelay - \ifnum\lst@length=\z@\else - \let\lst@thestyle\lst@currstyle - \lsthk@OutputOther - \lst@OutputToken - \fi} -\lst@AddToHook{OutputOther}{}% init -\let\lst@currstyle\relax % init -\def\lst@Output{% - \lst@CheckDelay - \ifnum\lst@length=\z@\else - \ifx\lst@currstyle\relax - \let\lst@thestyle\lst@identifierstyle - \else - \let\lst@thestyle\lst@currstyle - \fi - \lsthk@Output - \lst@OutputToken - \fi - \let\lst@lastother\relax} -\lst@AddToHook{Output}{}% init -\def\lst@GetOutputMacro#1{% - \lst@ifletter \global\let#1\lst@Output - \else \global\let#1\lst@OutputOther\fi} -\def\lst@PrintToken{% - \lst@ifletter \lst@Output \lst@letterfalse - \else \lst@OutputOther \let\lst@lastother\@empty \fi} -\def\lst@XPrintToken{% - \lst@PrintToken \lst@CheckMerge - \ifnum\lst@length=\z@\else \lst@PrintToken \fi} -\def\lst@BeginDropOutput#1{% - \xdef\lst@BDOnewlines{\the\lst@newlines}% - \global\let\lst@BDOifnewline\lst@ifnewline - \lst@EnterMode{#1}% - {\lst@modetrue - \let\lst@OutputBox\@gobble - \aftergroup\lst@BDORestore}} -\def\lst@BDORestore{% - \global\lst@newlines\lst@BDOnewlines - \global\let\lst@ifnewline\lst@BDOifnewline} -\let\lst@EndDropOutput\lst@LeaveMode -\def\lst@ProcessLetter{\lst@whitespacefalse \lst@AppendLetter} -\def\lst@ProcessOther{\lst@whitespacefalse \lst@AppendOther} -\def\lst@ProcessDigit{% - \lst@whitespacefalse - \lst@ifletter \expandafter\lst@AppendLetter - \else \expandafter\lst@AppendOther\fi} -\def\lst@whitespacetrue{\global\let\lst@ifwhitespace\iftrue} -\def\lst@whitespacefalse{\global\let\lst@ifwhitespace\iffalse} -\lst@AddToHook{InitVarsBOL}{\lst@whitespacetrue} -\lst@Key{tabsize}{8} - {\ifnum#1>\z@ \def\lst@tabsize{#1}\else - \PackageError{Listings}{Strict positive integer expected}% - {You can't use `#1' as tabsize. \@ehc}% - \fi} -\lst@Key{showtabs}f[t]{\lstKV@SetIf{#1}\lst@ifshowtabs} -\lst@Key{tab}{\kern.06em\hbox{\vrule\@height.3ex}% - \hrulefill\hbox{\vrule\@height.3ex}} - {\def\lst@tab{#1}} -\def\lst@ProcessTabulator{% - \lst@XPrintToken \lst@whitespacetrue - \global\advance\lst@column -\lst@pos - \@whilenum \lst@pos<\@ne \do - {\global\advance\lst@pos\lst@tabsize}% - \lst@length\lst@pos - \lst@PreGotoTabStop} -\def\lst@PreGotoTabStop{% - \lst@ifshowtabs - \lst@TrackNewLines - \setbox\@tempboxa\hbox to\lst@length\lst@width - {{\lst@currstyle{\hss\lst@tab}}}% - \lst@CalcLostSpaceAndOutput - \else - \lst@ifkeepspaces - \@tempcnta\lst@length \lst@length\z@ - \@whilenum \@tempcnta>\z@ \do - {\lst@AppendOther\lst@outputspace - \advance\@tempcnta\m@ne}% - \lst@OutputOther - \else - \lst@GotoTabStop - \fi - \fi - \lst@length\z@ \global\lst@pos\z@} -\def\lst@outputspace{\ } -\def\lst@visiblespace{\lst@ttfamily{\char32}\textvisiblespace} -\lst@Key{showspaces}{false}[t]{\lstKV@SetIf{#1}\lst@ifshowspaces} -\lst@Key{keepspaces}{false}[t]{\lstKV@SetIf{#1}\lst@ifkeepspaces} -\lst@AddToHook{Init} - {\lst@ifshowspaces - \let\lst@outputspace\lst@visiblespace - \lst@keepspacestrue - \fi} -\def\lst@keepspacestrue{\let\lst@ifkeepspaces\iftrue} -\def\lst@ProcessSpace{% - \lst@ifkeepspaces - \lst@whitespacetrue - \lst@PrintToken - \lst@AppendOther\lst@outputspace - \lst@PrintToken - \else \ifnum\lst@newlines=\z@ - \lst@AppendSpecialSpace - \else \ifnum\lst@length=\z@ - \global\advance\lst@lostspace\lst@width - \global\advance\lst@pos\m@ne - \lst@whitespacetrue - \else - \lst@AppendSpecialSpace - \fi - \fi \fi} -\def\lst@AppendSpecialSpace{% - \lst@ifwhitespace - \lst@PrintToken - \global\advance\lst@lostspace\lst@width - \global\advance\lst@pos\m@ne - \lst@gobbledwhitespacetrue - \else - \lst@whitespacetrue - \lst@PrintToken - \lst@AppendOther\lst@outputspace - \lst@PrintToken - \fi} -\lst@Key{formfeed}{\bigbreak}{\def\lst@formfeed{#1}} -\def\lst@ProcessFormFeed{% - \lst@XPrintToken - \ifnum\lst@newlines=\z@ - \lst@EOLUpdate \lsthk@InitVarsBOL - \fi - \lst@formfeed - \lst@whitespacetrue} -\def\lst@Def#1{\lccode`\~=#1\lowercase{\def~}} -\def\lst@Let#1{\lccode`\~=#1\lowercase{\let~}} -\lst@AddToAtTop{\try@load@fontshape}{\def\space{ }} -\def\lst@SelectStdCharTable{% - \lst@Def{9}{\lst@ProcessTabulator}% - \lst@Def{12}{\lst@ProcessFormFeed}% - \lst@Def{32}{\lst@ProcessSpace}} -\def\lst@CCPut#1#2{% - \ifnum#2=\z@ - \expandafter\@gobbletwo - \else - \lccode`\~=#2\lccode`\/=#2\lowercase{\lst@CCPut@~{#1/}}% - \fi - \lst@CCPut#1} -\def\lst@CCPut@#1#2{\lst@lAddTo\lst@SelectStdCharTable{\def#1{#2}}} -\lst@CCPut \lst@ProcessOther - {"21}{"22}{"28}{"29}{"2B}{"2C}{"2E}{"2F} - {"3A}{"3B}{"3D}{"3F}{"5B}{"5D} - \z@ -\lst@CCPut \lst@ProcessDigit - {"30}{"31}{"32}{"33}{"34}{"35}{"36}{"37}{"38}{"39} - \z@ -\lst@CCPut \lst@ProcessLetter - {"40}{"41}{"42}{"43}{"44}{"45}{"46}{"47} - {"48}{"49}{"4A}{"4B}{"4C}{"4D}{"4E}{"4F} - {"50}{"51}{"52}{"53}{"54}{"55}{"56}{"57} - {"58}{"59}{"5A} - {"61}{"62}{"63}{"64}{"65}{"66}{"67} - {"68}{"69}{"6A}{"6B}{"6C}{"6D}{"6E}{"6F} - {"70}{"71}{"72}{"73}{"74}{"75}{"76}{"77} - {"78}{"79}{"7A} - \z@ -\def\lst@CCPutMacro#1#2#3{% - \ifnum#2=\z@ \else - \begingroup\lccode`\~=#2\relax \lccode`\/=#2\relax - \lowercase{\endgroup\expandafter\lst@CCPutMacro@ - \csname\@lst @um/\expandafter\endcsname - \csname\@lst @um/@\endcsname /~}#1{#3}% - \expandafter\lst@CCPutMacro - \fi} -\def\lst@CCPutMacro@#1#2#3#4#5#6{% - \lst@lAddTo\lst@SelectStdCharTable{\def#4{#5#1}}% - \def#1{\lst@UM#3}% - \def#2{#6}} -\def\lst@UM#1{\csname\@lst @um#1@\endcsname} -\lst@CCPutMacro - \lst@ProcessOther {"23}\# - \lst@ProcessLetter{"24}\textdollar - \lst@ProcessOther {"25}\% - \lst@ProcessOther {"26}\& - \lst@ProcessOther {"27}{\lst@ifupquote \textquotesingle - \else \char39\relax \fi} - \lst@ProcessOther {"2A}{\lst@ttfamily*\textasteriskcentered} - \lst@ProcessOther {"2D}{\lst@ttfamily{-{}}{$-$}} - \lst@ProcessOther {"3C}{\lst@ttfamily<\textless} - \lst@ProcessOther {"3E}{\lst@ttfamily>\textgreater} - \lst@ProcessOther {"5C}{\lst@ttfamily{\char92}\textbackslash} - \lst@ProcessOther {"5E}\textasciicircum - \lst@ProcessLetter{"5F}{\lst@ttfamily{\char95}\textunderscore} - \lst@ProcessOther {"60}{\lst@ifupquote \textasciigrave - \else \char96\relax \fi} - \lst@ProcessOther {"7B}{\lst@ttfamily{\char123}\textbraceleft} - \lst@ProcessOther {"7C}{\lst@ttfamily|\textbar} - \lst@ProcessOther {"7D}{\lst@ttfamily{\char125}\textbraceright} - \lst@ProcessOther {"7E}\textasciitilde - \lst@ProcessOther {"7F}- - \@empty\z@\@empty -\def\lst@ttfamily#1#2{\ifx\f@family\ttdefault#1\relax\else#2\fi} -\lst@AddToHook{Init}{\edef\ttdefault{\ttdefault}} -\lst@Key{upquote}{false}[t]{\lstKV@SetIf{#1}\lst@ifupquote - \lst@ifupquote - \@ifundefined{textasciigrave}% - {\let\KV@lst@upquote\@gobble - \lstKV@SetIf f\lst@ifupquote \@gobble\fi - \PackageError{Listings}{Option `upquote' requires `textcomp' - package.\MessageBreak The option has been disabled}% - {Add \string\usepackage{textcomp} to your preamble.}}% - {}% - \fi} -\AtBeginDocument{% - \@ifpackageloaded{upquote}{\RequirePackage{textcomp}% - \lstset{upquote}}{}% - \@ifpackageloaded{upquote2}{\lstset{upquote}}{}} -\def\lst@activecharstrue{\let\lst@ifactivechars\iftrue} -\def\lst@activecharsfalse{\let\lst@ifactivechars\iffalse} -\lst@activecharstrue -\def\lst@SelectCharTable{% - \lst@SelectStdCharTable - \lst@ifactivechars - \catcode9\active \catcode12\active \catcode13\active - \@tempcnta=32\relax - \@whilenum\@tempcnta<128\do - {\catcode\@tempcnta\active\advance\@tempcnta\@ne}% - \fi - \lst@ifec \lst@DefEC \fi - \let\do\lst@do@noligs \verbatim@nolig@list - \lsthk@SelectCharTable - \lst@DeveloperSCT -\lst@DefRange - \ifx\lst@Backslash\relax\else - \lst@LetSaveDef{"5C}\lsts@backslash\lst@Backslash - \fi} -\lst@Key{SelectCharTable}{}{\def\lst@DeveloperSCT{#1}} -\lst@Key{MoreSelectCharTable}\relax{\lst@lAddTo\lst@DeveloperSCT{#1}} -\lst@AddToHook{SetLanguage}{\let\lst@DeveloperSCT\@empty} -\def\lst@do@noligs#1{% - \begingroup \lccode`\~=`#1\lowercase{\endgroup - \lst@do@noligs@~}} -\def\lst@do@noligs@#1{% - \expandafter\expandafter\expandafter\def - \expandafter\expandafter\expandafter#1% - \expandafter\expandafter\expandafter{\expandafter\lst@NoLig#1}} -\def\lst@NoLig{\advance\lst@length\m@ne \lst@Append\lst@nolig} -\def\lst@nolig{\lst@UM\@empty}% -\@namedef{\@lst @um@}{\leavevmode\kern\z@} -\def\lst@SaveOutputDef#1#2{% - \begingroup \lccode`\~=#1\relax \lowercase{\endgroup - \def\lst@temp##1\def~##2##3\relax}{% - \global\expandafter\let\expandafter#2\@gobble##2\relax}% - \expandafter\lst@temp\lst@SelectStdCharTable\relax} -\lst@SaveOutputDef{"5C}\lstum@backslash -\lst@Key{extendedchars}{true}[t]{\lstKV@SetIf{#1}\lst@ifec} -\def\lst@DefEC{% - \lst@CCECUse \lst@ProcessLetter - ^^80^^81^^82^^83^^84^^85^^86^^87^^88^^89^^8a^^8b^^8c^^8d^^8e^^8f% - ^^90^^91^^92^^93^^94^^95^^96^^97^^98^^99^^9a^^9b^^9c^^9d^^9e^^9f% - ^^a0^^a1^^a2^^a3^^a4^^a5^^a6^^a7^^a8^^a9^^aa^^ab^^ac^^ad^^ae^^af% - ^^b0^^b1^^b2^^b3^^b4^^b5^^b6^^b7^^b8^^b9^^ba^^bb^^bc^^bd^^be^^bf% - ^^c0^^c1^^c2^^c3^^c4^^c5^^c6^^c7^^c8^^c9^^ca^^cb^^cc^^cd^^ce^^cf% - ^^d0^^d1^^d2^^d3^^d4^^d5^^d6^^d7^^d8^^d9^^da^^db^^dc^^dd^^de^^df% - ^^e0^^e1^^e2^^e3^^e4^^e5^^e6^^e7^^e8^^e9^^ea^^eb^^ec^^ed^^ee^^ef% - ^^f0^^f1^^f2^^f3^^f4^^f5^^f6^^f7^^f8^^f9^^fa^^fb^^fc^^fd^^fe^^ff% - ^^00} -\def\lst@CCECUse#1#2{% - \ifnum`#2=\z@ - \expandafter\@gobbletwo - \else - \ifnum\catcode`#2=\active - \lccode`\~=`#2\lccode`\/=`#2\lowercase{\lst@CCECUse@#1~/}% - \else - \lst@ifactivechars \catcode`#2=\active \fi - \lccode`\~=`#2\lccode`\/=`#2\lowercase{\def~{#1/}}% - \fi - \fi - \lst@CCECUse#1} -\def\lst@CCECUse@#1#2#3{% - \expandafter\def\csname\@lst @EC#3\endcsname{\lst@UM#3}% - \expandafter\let\csname\@lst @um#3@\endcsname #2% - \edef#2{\noexpand#1% - \expandafter\noexpand\csname\@lst @EC#3\endcsname}} -\lst@AddToHook{Init} - {\let\lsts@nfss@catcodes\nfss@catcodes - \let\nfss@catcodes\lst@nfss@catcodes} -\def\lst@nfss@catcodes{% - \lst@makeletter - ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\relax - \@makeother (\@makeother )\@makeother ,\@makeother :\@makeother\&% - \@makeother 0\@makeother 1\@makeother 2\@makeother 3\@makeother 4% - \@makeother 5\@makeother 6\@makeother 7\@makeother 8\@makeother 9% - \@makeother =\lsts@nfss@catcodes} -\def\lst@makeletter#1{% - \ifx\relax#1\else\catcode`#111\relax \expandafter\lst@makeletter\fi} -\lst@Key{useoutput}{2}{\edef\lst@useoutput{\ifcase#10 0\or 1\else 2\fi}} -\lst@AddToHook{Init} -{\edef\lst@OrgOutput{\the\output}% -\ifcase\lst@useoutput\relax -\or - \output{\global\setbox\lst@gtempboxa\box\@cclv - \expandafter\egroup - \lst@SaveToken - \lst@InterruptModes - \setbox\@cclv\box\lst@gtempboxa - \bgroup\lst@OrgOutput\egroup - \bgroup - \aftergroup\pagegoal\aftergroup\vsize - \aftergroup\lst@ReenterModes\aftergroup\lst@RestoreToken}% -\else - \output{\lst@RestoreOrigCatcodes - \lst@ifec \lst@RestoreOrigExtendedCatcodes \fi - \lst@OrgOutput}% -\fi} -\def\lst@GetChars#1#2#3{% - \let#1\@empty - \@tempcnta#2\relax \@tempcntb#3\relax - \loop \ifnum\@tempcnta<\@tempcntb\relax - \lst@lExtend#1{\expandafter\catcode\the\@tempcnta=}% - \lst@lExtend#1{\the\catcode\@tempcnta\relax}% - \ifnum\the\catcode\@tempcnta=\active - \begingroup\lccode`\~=\@tempcnta - \lowercase{\endgroup - \lst@lExtend#1{\expandafter\let\expandafter~\csname - lstecs@\the\@tempcnta\endcsname}% - \expandafter\let\csname lstecs@\the\@tempcnta\endcsname~}% - \fi - \advance\@tempcnta\@ne - \repeat} -\def\lst@ScanChars{% - \lst@GetChars\lst@RestoreOrigCatcodes\@ne {128}% - \lst@GetChars\lst@RestoreOrigExtendedCatcodes{128}{256}} -\lst@Key{rescanchars}\relax{\lst@ScanChars} -\AtBeginDocument{\lst@ScanChars} -\lst@Key{alsoletter}\relax{% - \lst@DoAlso{#1}\lst@alsoletter\lst@ProcessLetter} -\lst@Key{alsodigit}\relax{% - \lst@DoAlso{#1}\lst@alsodigit\lst@ProcessDigit} -\lst@Key{alsoother}\relax{% - \lst@DoAlso{#1}\lst@alsoother\lst@ProcessOther} -\lst@AddToHook{SelectCharTable} - {\lst@alsoother \lst@alsodigit \lst@alsoletter} -\lst@AddToHookExe{SetLanguage}% init - {\let\lst@alsoletter\@empty - \let\lst@alsodigit\@empty - \let\lst@alsoother\@empty} -\def\lst@DoAlso#1#2#3{% - \lst@DefOther\lst@arg{#1}\let#2\@empty - \expandafter\lst@DoAlso@\expandafter#2\expandafter#3\lst@arg\relax} -\def\lst@DoAlso@#1#2#3{% - \ifx\relax#3\expandafter\@gobblethree \else - \begingroup \lccode`\~=`#3\relax \lowercase{\endgroup - \def\lst@temp##1\def~##2##3\relax{% - \edef\lst@arg{\def\noexpand~{\noexpand#2\expandafter - \noexpand\@gobble##2}}}}% - \expandafter\lst@temp\lst@SelectStdCharTable\relax - \lst@lExtend#1{\lst@arg}% - \fi - \lst@DoAlso@#1#2} -\def\lst@SaveDef#1#2{% - \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~}} -\def\lst@DefSaveDef#1#2{% - \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~\def~}} -\def\lst@LetSaveDef#1#2{% - \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~\let~}} -\def\lst@CDef#1{\lst@CDef@#1} -\def\lst@CDef@#1#2#3#4{\lst@CDefIt#1{#2}{#3}{#4#2#3}#4} -\def\lst@CDefX#1{\lst@CDefX@#1} -\def\lst@CDefX@#1#2#3{\lst@CDefIt#1{#2}{#3}{}} -\def\lst@CDefIt#1#2#3#4#5#6#7#8{% - \ifx\@empty#2\@empty - \def#1{#6\def\lst@next{#7#4#8}\lst@next}% - \else \ifx\@empty#3\@empty - \def#1##1{% - #6% - \ifx##1#2\def\lst@next{#7#4#8}\else - \def\lst@next{#5##1}\fi - \lst@next}% - \else - \def#1{% - #6% - \lst@IfNextCharsArg{#2#3}{#7#4#8}% - {\expandafter#5\lst@eaten}}% - \fi \fi} -\def\lst@CArgX#1#2\relax{% - \lst@DefActive\lst@arg{#1#2}% - \expandafter\lst@CArg\lst@arg\relax} -\def\lst@CArg#1#2\relax{% - \lccode`\/=`#1\lowercase{\def\lst@temp{/}}% - \lst@GetFreeMacro{lst@c\lst@temp}% - \expandafter\lst@CArg@\lst@freemacro#1#2\@empty\@empty\relax} -\def\lst@CArg@#1#2#3#4\@empty#5\relax#6{% - \let#1#2% - \ifx\@empty#3\@empty - \def\lst@next{#6{#2{}{}}}% - \else - \def\lst@next{#6{#2#3{#4}}}% - \fi - \lst@next #1} -\def\lst@CArgEmpty#1\@empty{#1} -\lst@Key{excludedelims}\relax - {\lsthk@ExcludeDelims \lst@NormedDef\lst@temp{#1}% - \expandafter\lst@for\lst@temp\do - {\expandafter\let\csname\@lst @ifex##1\endcsname\iftrue}} -\def\lst@DelimPrint#1#2{% - #1% - \begingroup - \lst@mode\lst@nomode \lst@modetrue - #2\lst@XPrintToken - \endgroup - \lst@ResetToken - \fi} -\def\lst@DelimOpen#1#2#3#4#5#6\@empty{% - \lst@TrackNewLines \lst@XPrintToken - \lst@DelimPrint#1{#6}% - \lst@EnterMode{#4}{\def\lst@currstyle#5}% - \lst@DelimPrint{#1#2}{#6}% - #3} -\def\lst@DelimClose#1#2#3\@empty{% - \lst@TrackNewLines \lst@XPrintToken - \lst@DelimPrint{#1#2}{#3}% - \lst@LeaveMode - \lst@DelimPrint{#1}{#3}} -\def\lst@BeginDelim{\lst@DelimOpen\iffalse\else{}} -\def\lst@EndDelim{\lst@DelimClose\iffalse\else} -\def\lst@BeginIDelim{\lst@DelimOpen\iffalse{}{}} -\def\lst@EndIDelim{\lst@DelimClose\iffalse{}} -\lst@AddToHook{SelectCharTable}{\lst@DefDelims} -\lst@AddToHookExe{SetLanguage}{\let\lst@DefDelims\@empty} -\def\lst@Delim#1{% - \lst@false \let\lst@cumulative\@empty \let\lst@arg\@empty - \@ifstar{\@ifstar{\lst@Delim@{#1}}% - {\let\lst@cumulative\relax - \lst@Delim@{#1}}}% - {\lst@true\lst@Delim@{#1}}} -\def\lst@Delim@#1[#2]{% - \gdef\lst@delimtype{#2}% - \@ifnextchar[\lst@Delim@sty - {\lst@Delim@sty[#1]}} -\def\lst@Delim@sty[#1]{% - \def\lst@delimstyle{#1}% - \ifx\@empty#1\@empty\else - \lst@Delim@sty@ #1\@nil - \fi - \@ifnextchar[\lst@Delim@option - \lst@Delim@delim} -\def\lst@Delim@option[#1]{\def\lst@arg{[#1]}\lst@Delim@delim} -\def\lst@Delim@sty@#1#2\@nil{% - \if\relax\noexpand#1\else - \edef\lst@delimstyle{\expandafter\noexpand - \csname\@lst @\lst@delimstyle\endcsname}% - \fi} -\def\lst@Delim@delim#1\relax#2#3#4#5#6#7#8{% - \ifx #4\@empty \lst@Delim@delall{#2}\fi - \ifx\@empty#1\@empty - \ifx #4\@nil - \@ifundefined{\@lst @#2DM@\lst@delimtype}% - {\lst@Delim@delall{#2@\lst@delimtype}}% - {\lst@Delim@delall{#2DM@\lst@delimtype}}% - \fi - \else - \expandafter\lst@Delim@args\expandafter - {\lst@delimtype}{#1}{#5}#6{#7}{#8}#4% - \let\lst@delim\@empty - \expandafter\lst@IfOneOf\lst@delimtype\relax#3% - {\@ifundefined{\@lst @#2DM@\lst@delimtype}% - {\lst@lExtend\lst@delim{\csname\@lst @#2@\lst@delimtype - \expandafter\endcsname\lst@arg}}% - {\lst@lExtend\lst@delim{\expandafter\lst@UseDynamicMode - \csname\@lst @#2DM@\lst@delimtype - \expandafter\endcsname\lst@arg}}% - \ifx #4\@nil - \let\lst@temp\lst@DefDelims \let\lst@DefDelims\@empty - \expandafter\lst@Delim@del\lst@temp\@empty\@nil\@nil\@nil - \else - \lst@lExtend\lst@DefDelims\lst@delim - \fi}% - {\PackageError{Listings}{Illegal type `\lst@delimtype'}% - {#2 types are #3.}}% - \fi} -\def\lst@Delim@args#1#2#3#4#5#6#7{% - \begingroup - \lst@false \let\lst@next\lst@XConvert - \@ifnextchar #4{\xdef\lst@delimtype{\expandafter\@gobble - \lst@delimtype}% - #5\lst@next#2\@nil - \lst@lAddTo\lst@arg{\@empty#6}% - \lst@GobbleNil}% - {\lst@next#2\@nil - \lst@lAddTo\lst@arg{\@empty#3}% - \lst@GobbleNil}% - #1\@nil - \global\let\@gtempa\lst@arg - \endgroup - \let\lst@arg\@gtempa - \ifx #7\@nil\else - \expandafter\lst@Delim@args@\expandafter{\lst@delimstyle}% - \fi} -\def\lst@Delim@args@#1{% - \lst@if - \lst@lAddTo\lst@arg{{{#1}\lst@modetrue}}% - \else - \ifx\lst@cumulative\@empty - \lst@lAddTo\lst@arg{{{}#1}}% - \else - \lst@lAddTo\lst@arg{{{#1}}}% - \fi - \fi} -\def\lst@Delim@del#1\@empty#2#3#4{% - \ifx #2\@nil\else - \def\lst@temp{#1\@empty#2#3}% - \ifx\lst@temp\lst@delim\else - \lst@lAddTo\lst@DefDelims{#1\@empty#2#3{#4}}% - \fi - \expandafter\lst@Delim@del - \fi} -\def\lst@Delim@delall#1{% - \begingroup - \edef\lst@delim{\expandafter\string\csname\@lst @#1\endcsname}% - \lst@false \global\let\@gtempa\@empty - \expandafter\lst@Delim@delall@\lst@DefDelims\@empty - \endgroup - \let\lst@DefDelims\@gtempa} -\def\lst@Delim@delall@#1{% - \ifx #1\@empty\else - \ifx #1\lst@UseDynamicMode - \lst@true - \let\lst@next\lst@Delim@delall@do - \else - \def\lst@next{\lst@Delim@delall@do#1}% - \fi - \expandafter\lst@next - \fi} -\def\lst@Delim@delall@do#1#2\@empty#3#4#5{% - \expandafter\lst@IfSubstring\expandafter{\lst@delim}{\string#1}% - {}% - {\lst@if \lst@AddTo\@gtempa\lst@UseDynamicMode \fi - \lst@AddTo\@gtempa{#1#2\@empty#3#4{#5}}}% - \lst@false \lst@Delim@delall@} -\gdef\lst@DefDelimB#1#2#3#4#5#6#7#8{% - \lst@CDef{#1}#2% - {#3}% - {\let\lst@bnext\lst@CArgEmpty - \lst@ifmode #4\else - #5% - \def\lst@bnext{#6{#7}{#8}}% - \fi - \lst@bnext}% - \@empty} -\gdef\lst@DefDelimE#1#2#3#4#5#6#7{% - \lst@CDef{#1}#2% - {#3}% - {\let\lst@enext\lst@CArgEmpty - \ifnum #7=\lst@mode% - #4% - \let\lst@enext#6% - \else - #5% - \fi - \lst@enext}% - \@empty} -\lst@AddToHook{Init}{\let\lst@bnext\relax \let\lst@enext\relax} -\gdef\lst@DefDelimBE#1#2#3#4#5#6#7#8#9{% - \lst@CDef{#1}#2% - {#3}% - {\let\lst@bnext\lst@CArgEmpty - \ifnum #7=\lst@mode - #4% - \let\lst@bnext#9% - \else - \lst@ifmode\else - #5% - \def\lst@bnext{#6{#7}{#8}}% - \fi - \fi - \lst@bnext}% - \@empty} -\gdef\lst@delimtypes{s,l} -\gdef\lst@DelimKey#1#2{% - \lst@Delim{}#2\relax - {Delim}\lst@delimtypes #1% - {\lst@BeginDelim\lst@EndDelim} - i\@empty{\lst@BeginIDelim\lst@EndIDelim}} -\lst@Key{delim}\relax{\lst@DelimKey\@empty{#1}} -\lst@Key{moredelim}\relax{\lst@DelimKey\relax{#1}} -\lst@Key{deletedelim}\relax{\lst@DelimKey\@nil{#1}} -\gdef\lst@DelimDM@l#1#2\@empty#3#4#5{% - \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}} -\gdef\lst@DelimDM@s#1#2#3\@empty#4#5#6{% - \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}% - \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}} -\def\lst@ReplaceInput#1{\lst@CArgX #1\relax\lst@CDefX{}{}} -\def\lst@Literatekey#1\@nil@{\let\lst@ifxliterate\lst@if - \def\lst@literate{#1}} -\lst@Key{literate}{}{\@ifstar{\lst@true \lst@Literatekey} - {\lst@false\lst@Literatekey}#1\@nil@} -\lst@AddToHook{SelectCharTable} - {\ifx\lst@literate\@empty\else - \expandafter\lst@Literate\lst@literate{}\relax\z@ - \fi} -\def\lst@Literate#1#2#3{% - \ifx\relax#2\@empty\else - \lst@CArgX #1\relax\lst@CDef - {} - {\let\lst@next\@empty - \lst@ifxliterate - \lst@ifmode \let\lst@next\lst@CArgEmpty \fi - \fi - \ifx\lst@next\@empty - \ifx\lst@OutputBox\@gobble\else - \lst@XPrintToken \let\lst@scanmode\lst@scan@m - \lst@token{#2}\lst@length#3\relax - \lst@XPrintToken - \fi - \let\lst@next\lst@CArgEmptyGobble - \fi - \lst@next}% - \@empty - \expandafter\lst@Literate - \fi} -\def\lst@CArgEmptyGobble#1\@empty{} -\def\lst@BeginDropInput#1{% - \lst@EnterMode{#1}% - {\lst@modetrue - \let\lst@OutputBox\@gobble - \let\lst@ifdropinput\iftrue - \let\lst@ProcessLetter\@gobble - \let\lst@ProcessDigit\@gobble - \let\lst@ProcessOther\@gobble - \let\lst@ProcessSpace\@empty - \let\lst@ProcessTabulator\@empty - \let\lst@ProcessFormFeed\@empty}} -\let\lst@ifdropinput\iffalse % init -\lst@Key{basicstyle}\relax{\def\lst@basicstyle{#1}} -\lst@Key{inputencoding}\relax{\def\lst@inputenc{#1}} -\lst@AddToHook{Init} - {\lst@basicstyle - \ifx\lst@inputenc\@empty\else - \@ifundefined{inputencoding}{}% - {\inputencoding\lst@inputenc}% - \fi} -\lst@AddToHookExe{EmptyStyle} - {\let\lst@basicstyle\@empty - \let\lst@inputenc\@empty} -\def\lst@parshape{\parshape\@ne \z@ \linewidth} -\lst@AddToHookAtTop{EveryLine}{\lst@parshape} -\lst@AddToHookAtTop{EndGroup}{\lst@parshape} -\newcount\lst@lineno % \global -\lst@AddToHook{InitVars}{\global\lst@lineno\@ne} -\lst@Key{print}{true}[t]{\lstKV@SetIf{#1}\lst@ifprint} -\lst@Key{firstline}\relax{\def\lst@firstline{#1\relax}} -\lst@Key{lastline}\relax{\def\lst@lastline{#1\relax}} -\lst@AddToHook{PreSet} - {\let\lst@firstline\@ne \def\lst@lastline{9999999\relax}} -\lst@Key{linerange}\relax{\lstKV@OptArg[]{#1}{% - \def\lst@interrange{##1}\def\lst@linerange{##2,}}} -\lst@AddToHook{PreSet}{\def\lst@firstline{1\relax}% - \let\lst@linerange\@empty} -\lst@AddToHook{Init} -{\ifx\lst@linerange\@empty - \edef\lst@linerange{{\lst@firstline}-{\lst@lastline},}% - \fi - \lst@GetLineInterval}% -\def\lst@GetLineInterval{\expandafter\lst@GLI\lst@linerange\@nil} -\def\lst@GLI#1,#2\@nil{\def\lst@linerange{#2}\lst@GLI@#1--\@nil} -\def\lst@GLI@#1-#2-#3\@nil{% - \ifx\@empty#1\@empty - \let\lst@firstline\@ne - \else - \def\lst@firstline{#1\relax}% - \fi - \ifx\@empty#2\@empty - \def\lst@lastline{9999999\relax}% - \else - \ifx -#2% - \let\lst@lastline\lst@firstline - \else - \def\lst@lastline{#2\relax}% - \fi - \fi} -\lst@Key{nolol}{false}[t]{\lstKV@SetIf{#1}\lst@ifnolol} -\def\lst@nololtrue{\let\lst@ifnolol\iftrue} -\let\lst@ifnolol\iffalse % init -\lst@Key{captionpos}{t}{\def\lst@captionpos{#1}} -\lst@Key{abovecaptionskip}\smallskipamount{\def\lst@abovecaption{#1}} -\lst@Key{belowcaptionskip}\smallskipamount{\def\lst@belowcaption{#1}} -\lst@Key{label}\relax{\def\lst@label{#1}} -\lst@Key{title}\relax{\def\lst@title{#1}\let\lst@caption\relax} -\lst@Key{caption}\relax{\lstKV@OptArg[{#1}]{#1}% - {\def\lst@caption{##2}\def\lst@@caption{##1}}% - \let\lst@title\@empty} -\lst@AddToHookExe{TextStyle} - {\let\lst@caption\@empty \let\lst@@caption\@empty - \let\lst@title\@empty \let\lst@label\@empty} -\@ifundefined{thechapter} - {\newcounter{lstlisting} - \renewcommand\thelstlisting{\@arabic\c@lstlisting}} - {\newcounter{lstlisting}[chapter] - \renewcommand\thelstlisting - {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@lstlisting}} -\lst@UserCommand\lstlistingname{Listing} -\@ifundefined{abovecaptionskip} -{\newskip\abovecaptionskip - \newskip\belowcaptionskip}{} -\@ifundefined{@makecaption} -{\long\def\@makecaption#1#2{% - \vskip\abovecaptionskip - \sbox\@tempboxa{#1: #2}% - \ifdim \wd\@tempboxa >\hsize - #1: #2\par - \else - \global \@minipagefalse - \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}% - \fi - \vskip\belowcaptionskip}% -}{} -\def\fnum@lstlisting{% - \lstlistingname - \ifx\lst@@caption\@empty\else~\thelstlisting\fi}% -\def\lst@MakeCaption#1{% - \lst@ifdisplaystyle - \ifx #1t% - \ifx\lst@@caption\@empty\expandafter\lst@HRefStepCounter \else - \expandafter\refstepcounter - \fi {lstlisting}% - \ifx\lst@label\@empty\else \label{\lst@label}\fi - \let\lst@arg\lst@intname \lst@ReplaceIn\lst@arg\lst@filenamerpl - \global\let\lst@name\lst@arg \global\let\lstname\lst@name - \lst@ifnolol\else - \ifx\lst@@caption\@empty - \ifx\lst@caption\@empty - \ifx\lst@intname\@empty \else \def\lst@temp{ }% - \ifx\lst@intname\lst@temp \else - \addcontentsline{lol}{lstlisting}\lst@name - \fi\fi - \fi - \else - \addcontentsline{lol}{lstlisting}% - {\protect\numberline{\thelstlisting}\lst@@caption}% - \fi - \fi - \fi - \ifx\lst@caption\@empty\else - \lst@IfSubstring #1\lst@captionpos - {\begingroup \let\@@vskip\vskip - \def\vskip{\afterassignment\lst@vskip \@tempskipa}% - \def\lst@vskip{\nobreak\@@vskip\@tempskipa\nobreak}% - \par\@parboxrestore\normalsize\normalfont % \noindent (AS) - \ifx #1t\allowbreak \fi - \ifx\lst@title\@empty - \lst@makecaption\fnum@lstlisting\lst@caption % (AS) - \else - \lst@maketitle\lst@title % (AS) - \fi - \ifx #1b\allowbreak \fi - \endgroup}{}% - \fi - \fi} -\def\lst@makecaption{\@makecaption} -\def\lst@maketitle{\@makecaption\lst@title@dropdelim} -\def\lst@title@dropdelim#1{\ignorespaces} -\AtBeginDocument{% -\@ifundefined{captionlabelfalse}{}{% - \def\lst@maketitle{\captionlabelfalse\@makecaption\@empty}}% -\@ifundefined{caption@startrue}{}{% - \def\lst@maketitle{\caption@startrue\@makecaption\@empty}}% -} -\def\lst@HRefStepCounter#1{% - \begingroup - \c@lstlisting\lst@neglisting - \advance\c@lstlisting\m@ne \xdef\lst@neglisting{\the\c@lstlisting}% - \ifx\hyper@refstepcounter\@undefined\else - \hyper@refstepcounter{#1}% - \fi - \endgroup} -\gdef\lst@neglisting{\z@}% init -\lst@Key{boxpos}{c}{\def\lst@boxpos{#1}} -\def\lst@boxtrue{\let\lst@ifbox\iftrue} -\let\lst@ifbox\iffalse -\lst@Key{float}\relax[\lst@floatplacement]{% - \lstKV@SwitchCases{#1}% - {true&\let\lst@floatdefault\lst@floatplacement - \let\lst@float\lst@floatdefault\\% - false&\let\lst@floatdefault\relax - \let\lst@float\lst@floatdefault - }{\def\lst@next{\@ifstar{\let\lst@beginfloat\@dblfloat - \let\lst@endfloat\end@dblfloat - \lst@KFloat}% - {\let\lst@beginfloat\@float - \let\lst@endfloat\end@float - \lst@KFloat}} - \edef\lst@float{#1}% - \expandafter\lst@next\lst@float\relax}} -\def\lst@KFloat#1\relax{% - \ifx\@empty#1\@empty - \let\lst@float\lst@floatplacement - \else - \def\lst@float{#1}% - \fi} -\lst@Key{floatplacement}{tbp}{\def\lst@floatplacement{#1}} -\lst@AddToHook{PreSet}{\let\lst@float\lst@floatdefault} -\lst@AddToHook{TextStyle}{\let\lst@float\relax} -\let\lst@floatdefault\relax % init -\lst@AddToHook{DeInit}{% - \ifx\lst@float\relax - \global\let\lst@doendpe\@doendpe - \else - \global\let\lst@doendpe\@empty - \fi} -\AtBeginDocument{% -\@ifundefined{c@float@type}% - {\edef\ftype@lstlisting{\ifx\c@figure\@undefined 1\else 4\fi}} - {\edef\ftype@lstlisting{\the\c@float@type}% - \addtocounter{float@type}{\value{float@type}}}% -} -\lst@Key{aboveskip}\medskipamount{\def\lst@aboveskip{#1}} -\lst@Key{belowskip}\medskipamount{\def\lst@belowskip{#1}} -\lst@AddToHook{TextStyle} - {\let\lst@aboveskip\z@ \let\lst@belowskip\z@} -\lst@Key{everydisplay}{}{\def\lst@EveryDisplay{#1}} -\lst@AddToHook{TextStyle}{\let\lst@ifdisplaystyle\iffalse} -\lst@AddToHook{DisplayStyle}{\let\lst@ifdisplaystyle\iftrue} -\let\lst@ifdisplaystyle\iffalse -\def\lst@Init#1{% - \begingroup - \ifx\lst@float\relax\else - \edef\@tempa{\noexpand\lst@beginfloat{lstlisting}[\lst@float]}% - \expandafter\@tempa - \fi - \ifhmode\ifinner \lst@boxtrue \fi\fi - \lst@ifbox - \lsthk@BoxUnsafe - \hbox to\z@\bgroup - $\if t\lst@boxpos \vtop - \else \if b\lst@boxpos \vbox - \else \vcenter \fi\fi - \bgroup \par\noindent - \else - \lst@ifdisplaystyle - \lst@EveryDisplay - \par\penalty-50\relax - \vspace\lst@aboveskip - \fi - \fi - \normalbaselines - \abovecaptionskip\lst@abovecaption\relax - \belowcaptionskip\lst@belowcaption\relax - \lst@MakeCaption t% - \lsthk@PreInit \lsthk@Init - \lst@ifdisplaystyle - \global\let\lst@ltxlabel\@empty - \if@inlabel - \lst@ifresetmargins - \leavevmode - \else - \xdef\lst@ltxlabel{\the\everypar}% - \lst@AddTo\lst@ltxlabel{% - \global\let\lst@ltxlabel\@empty - \everypar{\lsthk@EveryLine\lsthk@EveryPar}}% - \fi - \fi - \everypar\expandafter{\lst@ltxlabel - \lsthk@EveryLine\lsthk@EveryPar}% - \else - \everypar{}\let\lst@NewLine\@empty - \fi - \lsthk@InitVars \lsthk@InitVarsBOL - \lst@Let{13}\lst@MProcessListing - \let\lst@Backslash#1% - \lst@EnterMode{\lst@Pmode}{\lst@SelectCharTable}% - \lst@InitFinalize} -\let\lst@InitFinalize\@empty % init -\lst@AddToHook{PreInit} - {\rightskip\z@ \leftskip\z@ \parfillskip=\z@ plus 1fil - \let\par\@@par} -\lst@AddToHook{EveryLine}{}% init -\lst@AddToHook{EveryPar}{}% init -\lst@Key{showlines}f[t]{\lstKV@SetIf{#1}\lst@ifshowlines} -\def\lst@DeInit{% - \lst@XPrintToken \lst@EOLUpdate - \global\advance\lst@newlines\m@ne - \lst@ifshowlines - \lst@DoNewLines - \else - \setbox\@tempboxa\vbox{\lst@DoNewLines}% - \fi - \lst@ifdisplaystyle \par\removelastskip \fi - \lsthk@ExitVars\everypar{}\lsthk@DeInit\normalbaselines\normalcolor - \lst@MakeCaption b% - \lst@ifbox - \egroup $\hss \egroup - \vrule\@width\lst@maxwidth\@height\z@\@depth\z@ - \else - \lst@ifdisplaystyle - \par\penalty-50\vspace\lst@belowskip - \fi - \fi - \ifx\lst@float\relax\else - \expandafter\lst@endfloat - \fi - \endgroup} -\newdimen\lst@maxwidth % \global -\lst@AddToHook{InitVars}{\global\lst@maxwidth\z@} -\lst@AddToHook{InitVarsEOL} - {\ifdim\lst@currlwidth>\lst@maxwidth - \global\lst@maxwidth\lst@currlwidth - \fi} -\def\lst@EOLUpdate{\lsthk@EOL \lsthk@InitVarsEOL} -\def\lst@MProcessListing{% - \lst@XPrintToken \lst@EOLUpdate \lsthk@InitVarsBOL - \global\advance\lst@lineno\@ne - \ifnum \lst@lineno>\lst@lastline - \lst@ifdropinput \lst@LeaveMode \fi - \ifx\lst@linerange\@empty - \expandafter\expandafter\expandafter\lst@EndProcessListing - \else - \lst@interrange - \lst@GetLineInterval - \expandafter\expandafter\expandafter\lst@SkipToFirst - \fi - \else - \expandafter\lst@BOLGobble - \fi} -\let\lst@EndProcessListing\endinput -\lst@Key{gobble}{0}{\def\lst@gobble{#1}} -\def\lst@BOLGobble{% - \ifnum\lst@gobble>\z@ - \@tempcnta\lst@gobble\relax - \expandafter\lst@BOLGobble@ -\fi} -\def\lst@BOLGobble@@{% - \ifnum\@tempcnta>\z@ - \expandafter\lst@BOLGobble@ - \fi} -\def\lstenv@BOLGobble@@{% - \lst@IfNextChars\lstenv@endstring{\lstenv@End}% - {\advance\@tempcnta\m@ne \expandafter\lst@BOLGobble@@\lst@eaten}} -\def\lst@BOLGobble@#1{% - \let\lst@next#1% - \ifx \lst@next\relax\else - \ifx \lst@next\lst@MProcessListing\else - \ifx \lst@next\lst@processformfeed\else - \ifx \lst@next\lstenv@backslash - \let\lst@next\lstenv@BOLGobble@@ - \else - \let\lst@next\lst@BOLGobble@@ - \ifx #1\lst@processtabulator - \advance\@tempcnta-\lst@tabsize\relax - \ifnum\@tempcnta<\z@ - \lst@length-\@tempcnta \lst@PreGotoTabStop - \fi - \else - \advance\@tempcnta\m@ne - \fi - \fi \fi \fi \fi - \lst@next} -\def\lst@processformfeed{\lst@ProcessFormFeed} -\def\lst@processtabulator{\lst@ProcessTabulator} -\lst@Key{name}\relax{\def\lst@intname{#1}} -\lst@AddToHookExe{PreSet}{\global\let\lst@intname\@empty} -\lst@AddToHook{PreInit}{% - \let\lst@arg\lst@intname \lst@ReplaceIn\lst@arg\lst@filenamerpl - \global\let\lst@name\lst@arg \global\let\lstname\lst@name} -\def\lst@filenamerpl{_\textunderscore $\textdollar -\textendash} -\def\l@lstlisting#1#2{\@dottedtocline{1}{1.5em}{2.3em}{#1}{#2}} -\lst@UserCommand\lstlistlistingname{Listings} -\lst@UserCommand\lstlistoflistings{\bgroup - \let\contentsname\lstlistlistingname - \let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{lol}}% - \tableofcontents \egroup} -\@ifpackageloaded{scrlfile} -{\newcommand*\lol@heading{\float@listhead{\lstlistlistingname}} - \renewcommand*\lstlistoflistings{% - \begingroup% - \if@twocolumn - \@restonecoltrue\onecolumn - \else - \@restonecolfalse - \fi - \lol@heading% - \@parskipfalse\@parskip@indent% - \@starttoc{lol}% - \if@restonecol\twocolumn\fi - \endgroup}% -}{} -\newcommand\lstinline[1][]{% - \leavevmode\bgroup % \hbox\bgroup --> \bgroup - \def\lst@boxpos{b}% - \lsthk@PreSet\lstset{flexiblecolumns,#1}% - \lsthk@TextStyle - \@ifnextchar\bgroup{\afterassignment\lst@InlineG \let\@let@token}% - \lstinline@} -\def\lstinline@#1{% - \lst@Init\relax - \lst@IfNextCharActive{\lst@InlineM#1}{\lst@InlineJ#1}} -\lst@AddToHook{TextStyle}{}% init -\lst@AddToHook{SelectCharTable}{\lst@inlinechars} -\global\let\lst@inlinechars\@empty -\def\lst@InlineM#1{\gdef\lst@inlinechars{% - \lst@Def{`#1}{\lst@DeInit\egroup\global\let\lst@inlinechars\@empty}% - \lst@Def{13}{\lst@DeInit\egroup \global\let\lst@inlinechars\@empty - \PackageError{Listings}{lstinline ended by EOL}\@ehc}}% - \lst@inlinechars} -\def\lst@InlineJ#1{% - \def\lst@temp##1#1{% - \let\lst@arg\@empty \lst@InsideConvert{##1}\lst@arg - \lst@DeInit\egroup}% - \lst@temp} -\def\lst@InlineG{% - \lst@Init\relax - \lst@IfNextCharActive{\lst@InlineM\}}% - {\let\lst@arg\@empty \lst@InlineGJ}} -\def\lst@InlineGJ{\futurelet\@let@token\lst@InlineGJTest} -\def\lst@InlineGJTest{% - \ifx\@let@token\egroup - \afterassignment\lst@InlineGJEnd - \expandafter\let\expandafter\@let@token - \else - \ifx\@let@token\@sptoken - \let\lst@next\lst@InlineGJReadSp - \else - \let\lst@next\lst@InlineGJRead - \fi - \expandafter\lst@next - \fi} -\def\lst@InlineGJEnd{\lst@arg\lst@DeInit\egroup} -\def\lst@InlineGJRead#1{% - \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}% - \lst@InlineGJ} -\def\lst@InlineGJReadSp#1{% - \lccode`\~=`\ \lowercase{\lst@lAddTo\lst@arg~}% - \lst@InlineGJ#1} -\def\lst@MakePath#1{\ifx\@empty#1\@empty\else\lst@MakePath@#1/\@nil/\fi} -\def\lst@MakePath@#1/{#1/\lst@MakePath@@} -\def\lst@MakePath@@#1/{% - \ifx\@nil#1\expandafter\@gobble - \else \ifx\@empty#1\else #1/\fi \fi - \lst@MakePath@@} -\lst@Key{inputpath}{}{\edef\lst@inputpath{\lst@MakePath{#1}}} -\def\lstinputlisting{% - \begingroup \lst@setcatcodes \lst@inputlisting} -\newcommand\lst@inputlisting[2][]{% - \endgroup - \def\lst@set{#1}% - \IfFileExists{\lst@inputpath#2}% - {\expandafter\lst@InputListing\expandafter{\lst@inputpath#2}}% - {\filename@parse{\lst@inputpath#2}% - \edef\reserved@a{\noexpand\lst@MissingFileError - {\filename@area\filename@base}% - {\ifx\filename@ext\relax tex\else\filename@ext\fi}}% - \reserved@a}% - \lst@doendpe \@newlistfalse \ignorespaces} -\def\lst@MissingFileError#1#2{% - \typeout{^^J! Package Listings Error: File `#1(.#2)' not found.^^J% - ^^JType X to quit or to proceed,^^J% - or enter new name. (Default extension: #2)^^J}% - \message{Enter file name: }% - {\endlinechar\m@ne \global\read\m@ne to\@gtempa}% - \ifx\@gtempa\@empty \else - \def\reserved@a{x}\ifx\reserved@a\@gtempa\batchmode\@@end\fi - \def\reserved@a{X}\ifx\reserved@a\@gtempa\batchmode\@@end\fi - \filename@parse\@gtempa - \edef\filename@ext{% - \ifx\filename@ext\relax#2\else\filename@ext\fi}% - \edef\reserved@a{\noexpand\IfFileExists % - {\filename@area\filename@base.\filename@ext}% - {\noexpand\lst@InputListing % - {\filename@area\filename@base.\filename@ext}}% - {\noexpand\lst@MissingFileError - {\filename@area\filename@base}{\filename@ext}}}% - \expandafter\reserved@a % - \fi} -\let\lst@ifdraft\iffalse -\DeclareOption{draft}{\let\lst@ifdraft\iftrue} -\DeclareOption{final}{\let\lst@ifdraft\iffalse} -\lst@AddToHook{PreSet} - {\lst@ifdraft - \let\lst@ifprint\iffalse - \@gobbletwo\fi\fi - \fi} -\def\lst@InputListing#1{% - \begingroup - \lsthk@PreSet \gdef\lst@intname{#1}% - \expandafter\lstset\expandafter{\lst@set}% - \lsthk@DisplayStyle - \catcode\active=\active - \lst@Init\relax \let\lst@gobble\z@ - \lst@SkipToFirst - \lst@ifprint \def\lst@next{\input{#1}}% - \else \let\lst@next\@empty \fi - \lst@next - \lst@DeInit - \endgroup} -\def\lst@SkipToFirst{% - \ifnum \lst@lineno<\lst@firstline - \lst@BeginDropInput\lst@Pmode - \lst@Let{13}\lst@MSkipToFirst - \lst@Let{10}\lst@MSkipToFirst - \else - \expandafter\lst@BOLGobble - \fi} -\def\lst@MSkipToFirst{% - \global\advance\lst@lineno\@ne - \ifnum \lst@lineno=\lst@firstline - \lst@LeaveMode \global\lst@newlines\z@ - \lsthk@InitVarsBOL - \expandafter\lst@BOLGobble - \fi} -\def\lstenv@DroppedWarning{% - \ifx\lst@dropped\@undefined\else - \PackageWarning{Listings}{Text dropped after begin of listing}% - \fi} -\let\lst@dropped\@undefined % init -\begingroup \lccode`\~=`\^^M\lowercase{% -\gdef\lstenv@Process#1{% - \ifx~#1% - \lstenv@DroppedWarning \let\lst@next\lst@SkipToFirst - \else\ifx^^J#1% - \lstenv@DroppedWarning \let\lst@next\lstenv@ProcessJ - \else - \let\lst@dropped#1\let\lst@next\lstenv@Process - \fi \fi - \lst@next} -}\endgroup -\def\lstenv@ProcessJ{% - \let\lst@arg\@empty - \ifx\@currenvir\lstenv@name - \expandafter\lstenv@ProcessJEnv - \else - \expandafter\def\expandafter\lst@temp\expandafter##1% - \csname end\lstenv@name\endcsname - {\lst@InsideConvert{##1}\lstenv@ProcessJ@}% - \expandafter\lst@temp - \fi} -\begingroup \lccode`\~=`\\\lowercase{% -\gdef\lstenv@ProcessJ@{% - \lst@lExtend\lst@arg - {\expandafter\ \expandafter~\lstenv@endstring}% - \catcode10=\active \lst@Let{10}\lst@MProcessListing - \lst@SkipToFirst \lst@arg} -}\endgroup -\def\lstenv@ProcessJEnv#1\end#2{\def\lst@temp{#2}% - \ifx\lstenv@name\lst@temp - \lst@InsideConvert{#1}% - \expandafter\lstenv@ProcessJ@ - \else - \lst@InsideConvert{#1\\end\{#2\}}% - \expandafter\lstenv@ProcessJEnv - \fi} -\def\lstenv@backslash{% - \lst@IfNextChars\lstenv@endstring - {\lstenv@End}% - {\expandafter\lsts@backslash \lst@eaten}}% -\def\lstenv@End{% - \ifx\@currenvir\lstenv@name - \edef\lst@next{\noexpand\end{\lstenv@name}}% - \else - \def\lst@next{\csname end\lstenv@name\endcsname}% - \fi - \lst@next} -\lst@UserCommand\lstnewenvironment#1#2#{% - \@ifundefined{#1}% - {\let\lst@arg\@empty - \lst@XConvert{#1}\@nil - \expandafter\lstnewenvironment@\lst@arg{#1}{#2}}% - {\PackageError{Listings}{Environment `#1' already defined}\@eha - \@gobbletwo}} -\def\@tempa#1#2#3{% -\gdef\lstnewenvironment@##1##2##3##4##5{% - \begingroup - \global\@namedef{end##2}{\lstenv@Error{##2}}% - \global\@namedef{##2}{\def\lstenv@name{##2}% - \begingroup \lst@setcatcodes \catcode\active=\active - \csname##2@\endcsname}% - \let\l@ngrel@x\global - \let\@xargdef\lstenv@xargdef - \expandafter\new@command\csname##2@\endcsname##3% - {\lsthk@PreSet ##4% - \ifx\@currenvir\lstenv@name - \def\lstenv@endstring{#1#2##1#3}% - \else - \def\lstenv@endstring{#1##1}% - \fi - \@namedef{end##2}{\lst@DeInit ##5\endgroup - \lst@doendpe \@ignoretrue}% - \lsthk@DisplayStyle - \let\lst@EndProcessListing\lstenv@SkipToEnd - \lst@Init\lstenv@backslash - \lst@ifprint - \expandafter\expandafter\expandafter\lstenv@Process - \else - \expandafter\lstenv@SkipToEnd - \fi - \lst@insertargs}% - \endgroup}% -} -\let\lst@arg\@empty \lst@XConvert{end}\{\}\@nil -\expandafter\@tempa\lst@arg -\let\lst@insertargs\@empty -\def\lstenv@xargdef#1{ - \expandafter\lstenv@xargdef@\csname\string#1\endcsname#1} -\def\lstenv@xargdef@#1#2[#3][#4]#5{% - \@ifdefinable#2{% - \gdef#2{% - \ifx\protect\@typeset@protect - \expandafter\lstenv@testopt - \else - \@x@protect#2% - \fi - #1% - {#4}}% - \@yargdef - #1% - \tw@ - {#3}% - {#5}}} -\long\def\lstenv@testopt#1#2{% - \@ifnextchar[{\catcode\active5\relax \lstenv@testopt@#1}% - {#1[{#2}]}} -\def\lstenv@testopt@#1[#2]{% - \catcode\active\active - #1[#2]} -\begingroup \lccode`\~=`\\\lowercase{% -\gdef\lstenv@SkipToEnd{% - \long\expandafter\def\expandafter\lst@temp\expandafter##\expandafter - 1\expandafter~\lstenv@endstring{\lstenv@End}% - \lst@temp} -}\endgroup -\def\lstenv@Error#1{\PackageError{Listings}{Extra \string\end#1}% - {I'm ignoring this, since I wasn't doing a \csname#1\endcsname.}} -\begingroup \lccode`\~=`\^^M\lowercase{% -\gdef\lst@TestEOLChar#1{% - \def\lst@insertargs{#1}% - \ifx ~#1\@empty \else - \ifx^^J#1\@empty \else - \global\let\lst@intname\lst@insertargs - \let\lst@insertargs\@empty - \fi \fi} -}\endgroup -\lstnewenvironment{lstlisting}[2][] - {\lst@TestEOLChar{#2}% - \lstset{#1}% - \csname\@lst @SetFirstNumber\endcsname} - {\csname\@lst @SaveFirstNumber\endcsname} -\lst@Key{fancyvrb}\relax[t]{% - \lstKV@SetIf{#1}\lst@iffancyvrb - \lstFV@fancyvrb} -\ifx\lstFV@fancyvrb\@undefined - \gdef\lstFV@fancyvrb{\lst@RequireAspects{fancyvrb}\lstFV@fancyvrb} -\fi -\@ifundefined{ocp}{} - {\lst@AddToHook{OutputBox}% - {\let\lst@ProcessLetter\@firstofone - \let\lst@ProcessDigit\@firstofone - \let\lst@ProcessOther\@firstofone}} -\DeclareOption*{\expandafter\lst@ProcessOption\CurrentOption\relax} -\def\lst@ProcessOption#1#2\relax{% - \ifx #1!% - \lst@DeleteKeysIn\lst@loadaspects{#2}% - \else - \lst@lAddTo\lst@loadaspects{,#1#2}% - \fi} -\@ifundefined{lst@loadaspects} - {\def\lst@loadaspects{strings,comments,escape,style,language,% - keywords,labels,lineshape,frames,emph,index}% - }{} -\InputIfFileExists{lstpatch.sty}{}{} -\let\lst@ifsavemem\iffalse -\DeclareOption{savemem}{\let\lst@ifsavemem\iftrue} -\DeclareOption{noaspects}{\let\lst@loadaspects\@empty} -\ProcessOptions -\lst@RequireAspects\lst@loadaspects -\let\lst@loadaspects\@empty -\lst@UseHook{SetStyle}\lst@UseHook{EmptyStyle} -\lst@UseHook{SetLanguage}\lst@UseHook{EmptyLanguage} -\InputIfFileExists{listings.cfg}{}{} -\InputIfFileExists{lstlocal.cfg}{}{} -\endinput -%% -%% End of file `listings.sty'. diff --git a/org.glite.lb.doc/src/log_usertag.tex b/org.glite.lb.doc/src/log_usertag.tex deleted file mode 100644 index a7194d9..0000000 --- a/org.glite.lb.doc/src/log_usertag.tex +++ /dev/null @@ -1,82 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -\subsubsection{Example: Logging a UserTag event} -\label{e:usertag} - -User tag is an arbitrary ``name=value'' pair with which the user can assign -additional information to a job. Further on, LB can be queried based also on -values of user tags. \LB treats all values as strings only, semantic meaning -is left to user application. For internal reasons, all tag names are stored -in lower-case format. Support for case-sensitivenes is planned in future -versions of \LB. - -In order to add user tag for a job a special event \verb'UserTag' is used. This -event can be logged by the job owner using the glite-lb-logevent command (see -also sec.\ref{glite-lb-logevent}). Here we suppose the command is used from -user's running application because a correct setting of environment variables -needed by the command is assured. - -General template for adding user tag is as follows: - -\begin{verbatim} -glite-lb-logevent -s Application -e UserTag - -j - -c - --name - --value -\end{verbatim} - -where - -\begin{tabularx}{\textwidth}{lX} -\texttt{} & specifies the name of user tag \\ -\texttt{} & specifies the value of user tag \\ -\end{tabularx} - -The user application is always executed from within a JobWrapper script (part -of Workload Management System \cite{jgc}). The wrapper sets the appropriate -\verb'JobId' in the environment variable \verb'GLITE_WMS_JOBID'. The user -should pass this value to the \verb'-j' option of \verb'glite-lb-logevent'. -Similarly, the wrapper sets an initial value of the event sequence code in the -environment variable \verb'GLITE_WMS_SEQUENCE_CODE'. - -If the user application calls \verb'glite-lb-logevent' just once, it is -sufficient to pass this value to the \verb'-c' option. However, if there are -more subsequent calls, the user is responsible for capturing an updated -sequence code from the stdout of \verb'glite-lb-logevent' and using it in -subsequent calls. The \LB\ design requires the sequence codes in order to be -able to sort events correctly while not relying on strictly synchronized -clocks. - -The example bellow is a job consisting of 100 phases. A user tag phase is used -to log the phase currently being executed. Subsequently, the user may monitor -execution of the job phases as a part of the job status returned by \LB. - -\begin{verbatim} - #!/bin/sh - - for p in `seq 1 100`; do - - # log the UserTag event - GLITE_WMS_SEQUENCE_CODE=`glite-lb-logevent -s Application - -e UserTag - -j $GLITE_WMS_JOBID -c $GLITE_WMS_SEQUENCE_CODE - --name=phase --value=$p` - - # do the actual computation here - done -\end{verbatim} diff --git a/org.glite.lb.doc/src/logevent.tex b/org.glite.lb.doc/src/logevent.tex deleted file mode 100644 index 5c505b3..0000000 --- a/org.glite.lb.doc/src/logevent.tex +++ /dev/null @@ -1,66 +0,0 @@ -% -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. -%% See http://www.eu-egee.org/partners for details on the copyright holders. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -% -\subsection{glite-lb-logevent} -\label{glite-lb-logevent} - -Besides the API's \LB\ offers its users a simple command-line interface for -logging events. The command \verb'glite-lb-logevent' is used for this purpose. -However, it is intended for internal WMS debugging tests in the first place and -should not be used for common event logging because of possibility of confusing -\LB\ server job state automaton. - -The command \verb'glite-lb-logevent' is a complex logging tool and the complete -list of parameters can be obtained using the \verb'-h' option. However, -the only legal user usage is for logging \verb'UserTag' and \verb'ChangeACL' -events. The following description is therefore concentrating only on options -dealing with these two events. - -Command usage is: - -\begin{verbatim} - glite-lb-logevent [-h] [-p] [-c seq_code] - -j -s Application -e [key=value ...] -\end{verbatim} - -where - -\begin{tabularx}{\textwidth}{lX} -\texttt{ -p -{}-priority} & send a priority event\\ -\texttt{ -c -{}-sequence} & event sequence code\\ -\texttt{ -j -{}-jobid} & JobId\\ -\texttt{ -e -{}-event} & select event type (see -e help)\\ -\end{tabularx} - -%\medskip - -Each event specified after \verb'-e' option has different sub-options enabling -to set event specific values. - -Address of local-logger, daemon responsible for further message delivery, must -be specified by environment -variable \verb'GLITE_WMS_LOG_DESTINATION' in a form \verb'address:port'. - -Because user is allowed to change ACL or add user tags only for her jobs, paths -to valid X509 user credentials has to be set to authorise her. This is done -using standard X509 environment variables \verb'X509_USER_KEY' and -\verb'X509_USER_CERT'. - -For additional information see also manual page glite-lb-logevent(1). - -\input log_usertag.tex - -\input change_acl.tex diff --git a/org.glite.lb.doc/src/lstdoc.sty b/org.glite.lb.doc/src/lstdoc.sty deleted file mode 100644 index 3b9806f..0000000 --- a/org.glite.lb.doc/src/lstdoc.sty +++ /dev/null @@ -1,451 +0,0 @@ -%% -%% This is file `lstdoc.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% listings-1.3.dtx (with options: `doc') -%% -%% Please read the software license in listings-1.3.dtx or listings-1.3.pdf. -%% -%% (w)(c) 1996--2004 Carsten Heinz and/or any other author listed -%% elsewhere in this file. -%% -%% Send comments and ideas on the package, error reports and additional -%% programming languages to . -%% -\def\filedate{2004/09/07} -\def\fileversion{1.3} -\ProvidesPackage{lstdoc} - [\filedate\space\fileversion\space(Carsten Heinz)] -\let\lstdoc@currversion\fileversion -\RequirePackage[writefile]{listings}[2004/09/07] -\newif\iffancyvrb \IfFileExists{fancyvrb.sty}{\fancyvrbtrue}{} -\newif\ifcolor \IfFileExists{color.sty}{\colortrue}{} -\lst@false -\newif\ifhyper -\@ifundefined{pdfoutput} - {} - {\ifnum\pdfoutput>\z@ \lst@true \fi} -\@ifundefined{VTeXversion} - {} - {\ifnum\OpMode>\z@ \lst@true \fi} -\lst@if \IfFileExists{hyperref.sty}{\hypertrue}{}\fi -\newif\ifalgorithmic \IfFileExists{algorithmic.sty}{\algorithmictrue}{} -\newif\iflgrind \IfFileExists{lgrind.sty}{\lgrindtrue}{} -\iffancyvrb \RequirePackage{fancyvrb}\fi -\ifhyper \RequirePackage[colorlinks]{hyperref}\else - \def\href#1{\texttt}\fi -\ifcolor \RequirePackage{color}\fi -\ifalgorithmic \RequirePackage{algorithmic}\fi -\iflgrind \RequirePackage{lgrind}\fi -\RequirePackage{nameref} -\RequirePackage{url} -\renewcommand\ref{\protect\T@ref} -\renewcommand\pageref{\protect\T@pageref} -\def\lst@BeginRemark#1{% - \begin{quote}\topsep0pt\let\small\footnotesize\small#1:} -\def\lst@EndRemark{\end{quote}} -\newenvironment{TODO} - {\lst@BeginRemark{To do}}{\lst@EndRemark} -\newenvironment{ALTERNATIVE} - {\lst@BeginRemark{Alternative}}{\lst@EndRemark} -\newenvironment{REMOVED} - {\lst@BeginRemark{Removed}}{\lst@EndRemark} -\newenvironment{OLDDEF} - {\lst@BeginRemark{Old definition}}{\lst@EndRemark} -\def\advise{\par\list\labeladvise - {\advance\linewidth\@totalleftmargin - \@totalleftmargin\z@ - \@listi - \let\small\footnotesize \small\sffamily - \parsep \z@ \@plus\z@ \@minus\z@ - \topsep6\p@ \@plus1\p@\@minus2\p@ - \def\makelabel##1{\hss\llap{##1}}}} -\let\endadvise\endlist -\def\advisespace{\hbox{}\qquad} -\def\labeladvise{$\to$} -\newenvironment{syntax} - {\list{}{\itemindent-\leftmargin - \def\makelabel##1{\hss\lst@syntaxlabel##1,,,,\relax}}} - {\endlist} -\def\lst@syntaxlabel#1,#2,#3,#4\relax{% - \llap{\scriptsize\itshape#3}% - \def\lst@temp{#2}% - \expandafter\lst@syntaxlabel@\meaning\lst@temp\relax - \rlap{\hskip-\itemindent\hskip\itemsep\hskip\linewidth - \llap{\ttfamily\lst@temp}\hskip\labelwidth - \def\lst@temp{#1}% - \ifx\lst@temp\lstdoc@currversion#1\fi}} -\def\lst@syntaxlabel@#1>#2\relax - {\edef\lst@temp{\zap@space#2 \@empty}} -\newcommand*\syntaxnewline{\newline\hbox{}\kern\labelwidth} -\newcommand*\syntaxor{\qquad or\qquad} -\newcommand*\syntaxbreak - {\hfill\kern0pt\discretionary{}{\kern\labelwidth}{}} -\let\syntaxfill\hfill -\def\alternative#1{\lst@true \alternative@#1,\relax,} -\def\alternative@#1,{% - \ifx\relax#1\@empty - \expandafter\@gobble - \else - \ifx\@empty#1\@empty\else - \lst@if \lst@false \else $\vert$\fi - \textup{\texttt{#1}}% - \fi - \fi - \alternative@} -\long\def\m@cro@#1#2#3{\endgroup \topsep\MacroTopsep \trivlist - \edef\saved@macroname{\string#3}% - \def\makelabel##1{\llap{##1}}% - \if@inlabel - \let\@tempa\@empty \count@\macro@cnt - \loop \ifnum\count@>\z@ - \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat - \edef\makelabel##1{\llap{\vtop to\baselineskip - {\@tempa\hbox{##1}\vss}}}% - \advance \macro@cnt \@ne - \else \macro@cnt\@ne \fi - \edef\@tempa{\noexpand\item[% - #1% - \noexpand\PrintMacroName - \else - \expandafter\noexpand\csname Print#2Name\endcsname % MODIFIED - \fi - {\string#3}]}% - \@tempa - \global\advance\c@CodelineNo\@ne - #1% - \SpecialMainIndex{#3}\nobreak - \DoNotIndex{#3}% - \else - \csname SpecialMain#2Index\endcsname{#3}\nobreak % MODIFIED - \fi - \global\advance\c@CodelineNo\m@ne - \ignorespaces} -\def\macro{\begingroup - \catcode`\\12 - \MakePrivateLetters \m@cro@ \iftrue {Macro}}% MODIFIED -\def\environment{\begingroup - \catcode`\\12 - \MakePrivateLetters \m@cro@ \iffalse {Env}}% MODIFIED -\def\newdocenvironment#1#2#3#4{% - \@namedef{#1}{#3\begingroup \catcode`\\12\relax - \MakePrivateLetters \m@cro@ \iffalse {#2}}% - \@namedef{end#1}{#4\endmacro}% - \@ifundefined{Print#2Name}{\expandafter - \let\csname Print#2Name\endcsname\PrintMacroName}{}% - \@ifundefined{SpecialMain#2Index}{\expandafter - \let\csname SpecialMain#2Index\endcsname\SpecialMainIndex}{}} -\newdocenvironment{aspect}{Aspect}{}{} -\def\PrintAspectName#1{} -\def\SpecialMainAspectIndex#1{% - \@bsphack - \index{aspects:\levelchar\protect\aspectname{#1}\encapchar main}% - \@esphack} -\newdocenvironment{lstkey}{Key}{}{} -\def\PrintKeyName#1{\strut\keyname{#1}\ } -\def\SpecialMainKeyIndex#1{% - \@bsphack - \index{keys\levelchar\protect\keyname{#1}\encapchar main}% - \@esphack} -\newcounter{argcount} -\def\labelargcount{\texttt{\#\arabic{argcount}}\hskip\labelsep$=$} -\def\macroargs{\list\labelargcount - {\usecounter{argcount}\leftmargin=2\leftmargin - \parsep \z@ \@plus\z@ \@minus\z@ - \topsep4\p@ \@plus\p@ \@minus2\p@ - \itemsep\z@ \@plus\z@ \@minus\z@ - \def\makelabel##1{\hss\llap{##1}}}} -\def\endmacroargs{\endlist\@endparenv} -\lst@RequireAspects{writefile} -\newbox\lst@samplebox -\lstnewenvironment{lstsample}[3][] - {\global\let\lst@intname\@empty - \gdef\lst@sample{#2}% - \setbox\lst@samplebox=\hbox\bgroup - \setkeys{lst}{language={},style={},tabsize=4,gobble=5,% - basicstyle=\small\ttfamily,basewidth=0.51em,point={#1}} - #3% - \lst@BeginAlsoWriteFile{\jobname.tmp}} - {\lst@EndWriteFile\egroup - \ifdim \wd\lst@samplebox>.5\linewidth - \begin{center}% - \hbox to\linewidth{\box\lst@samplebox\hss}% - \end{center}% - \lst@sampleInput - \else - \begin{center}% - \begin{minipage}{0.45\linewidth}\lst@sampleInput\end{minipage}% - \qquad - \begin{minipage}{0.45\linewidth}% - \hbox to\linewidth{\box\lst@samplebox\hss}% - \end{minipage}% - \end{center}% - \fi} -\lst@InstallKeywords{p}{point}{pointstyle}\relax{keywordstyle}{}ld -\lstnewenvironment{lstxsample}[1][] - {\begingroup - \setkeys{lst}{belowskip=-\medskipamount,language={},style={},% - tabsize=4,gobble=5,basicstyle=\small\ttfamily,% - basewidth=0.51em,point={#1}} - \lst@BeginAlsoWriteFile{\jobname.tmp}} - {\endgroup - \endgroup} -\def\lst@sampleInput{% - \MakePercentComment\catcode`\^^M=10\relax - \small\lst@sample - {\setkeys{lst}{SelectCharTable=\lst@ReplaceInput{\^\^I}% - {\lst@ProcessTabulator}}% - \leavevmode \input{\jobname.tmp}}\MakePercentIgnore} -\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}% - {1.25ex \@plus1ex \@minus.2ex}% - {-1em}% - {\normalfont\normalsize\bfseries}} -\def\lstref#1{\emph{\ref{#1} \nameref{#1}}} -\def\@part[#1]#2{\addcontentsline{toc}{part}{#1}% - {\parindent\z@ \raggedright \interlinepenalty\@M - \normalfont \huge \bfseries #2\markboth{}{}\par}% - \nobreak\vskip 3ex\@afterheading} -\renewcommand*\l@section[2]{% - \addpenalty\@secpenalty - \addvspace{.25em \@plus\p@}% - \setlength\@tempdima{1.5em}% - \begingroup - \parindent \z@ \rightskip \@pnumwidth - \parfillskip -\@pnumwidth - \leavevmode - \advance\leftskip\@tempdima - \hskip -\leftskip - #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par - \endgroup} -\renewcommand*\l@subsection{\@dottedtocline{2}{0pt}{2.3em}} -\renewcommand*\l@subsubsection{\@dottedtocline{3}{0pt}{3.2em}} -\newcommand\ikeyname[1]{% - \lstkeyindex{#1}{}% - \lstaspectindex{#1}{}% - \keyname{#1}} -\newcommand\ekeyname[1]{% - \@bsphack - \lstkeyindex{#1}{\encapchar usage}% - \lstaspectindex{#1}{\encapchar usage}% - \@esphack} -\newcommand\rkeyname[1]{% - \@bsphack - \lstkeyindex{#1}{\encapchar main}% - \lstaspectindex{#1}{\encapchar main}% - \@esphack{\rstyle\keyname{#1}}} -\newcommand\icmdname[1]{% - \@bsphack - \lstaspectindex{#1}{}% - \@esphack\texttt{\string#1}} -\newcommand\rcmdname[1]{% - \@bsphack - \lstaspectindex{#1}{\encapchar main}% - \@esphack\texttt{\rstyle\string#1}} -\def\lstaspectindex#1#2{% - \global\@namedef{lstkandc@\string#1}{}% - \@ifundefined{lstisaspect@\string#1} - {\index{unknown\levelchar - \protect\texttt{\protect\string\string#1}#2}}% - {\index{\@nameuse{lstisaspect@\string#1}\levelchar - \protect\texttt{\protect\string\string#1}#2}}% -} -\def\lstkeyindex#1#2{% -} -\def\lstisaspect[#1]#2{% - \global\@namedef{lstaspect@#1}{#2}% - \lst@AddTo\lst@allkeysandcmds{,#2}% - \@for\lst@temp:=#2\do - {\ifx\@empty\lst@temp\else - \global\@namedef{lstisaspect@\lst@temp}{#1}% - \fi}} -\gdef\lst@allkeysandcmds{} -\def\lstprintaspectkeysandcmds#1{% - \lst@true - \expandafter\@for\expandafter\lst@temp - \expandafter:\expandafter=\csname lstaspect@#1\endcsname\do - {\lst@if\lst@false\else, \fi \texttt{\lst@temp}}} -\def\lstcheckreference{% - \@for\lst@temp:=\lst@allkeysandcmds\do - {\ifx\lst@temp\@empty\else - \@ifundefined{lstkandc@\lst@temp} - {\typeout{\lst@temp\space not in reference guide?}}{}% - \fi}} -\newcommand*\lst{\texttt{lst}} -\newcommand*\Cpp{C\texttt{++}} -\let\keyname\texttt -\let\keyvalue\texttt -\let\hookname\texttt -\newcommand*\aspectname[1]{{\normalfont\sffamily#1}} -\DeclareRobustCommand\packagename[1]{% - {\leavevmode\text@command{#1}% - \switchfontfamily\sfdefault\rmdefault - \check@icl #1\check@icr - \expandafter}}% -\renewcommand\packagename[1]{{\normalfont\sffamily#1}} -\def\switchfontfamily#1#2{% - \begingroup\xdef\@gtempa{#1}\endgroup - \ifx\f@family\@gtempa\fontfamily#2% - \else\fontfamily#1\fi - \selectfont} -\ifcolor - \definecolor{darkgreen}{rgb}{0,0.5,0} - \def\rstyle{\color{darkgreen}} -\else - \let\rstyle\empty -\fi -\gdef\lst@emails{} -\newcommand*\lstthanks[2] - {#1\lst@AddTo\lst@emails{,#1,<#2>}% - \ifx\@empty#2\@empty\typeout{Missing email for #1}\fi} -\newcommand*\lsthelper[3] - {{\let~\ #1}% - \lst@IfOneOf#1\relax\lst@emails - {}{\typeout{^^JWarning: Unknown helper #1.^^J}}} -\lstdefinelanguage[doc]{Pascal}{% - morekeywords={alfa,and,array,begin,boolean,byte,case,char,const,div,% - do,downto,else,end,false,file,for,function,get,goto,if,in,% - integer,label,maxint,mod,new,not,of,or,pack,packed,page,program,% - procedure,put,read,readln,real,record,repeat,reset,rewrite,set,% - text,then,to,true,type,unpack,until,var,while,with,write,writeln},% - sensitive=false,% - morecomment=[s]{(*}{*)},% - morecomment=[s]{\{}{\}},% - morestring=[d]{'}} -\lstdefinestyle{} - {basicstyle={},% - keywordstyle=\bfseries,identifierstyle={},% - commentstyle=\itshape,stringstyle={},% - numberstyle={},stepnumber=1,% - pointstyle=\pointstyle} -\def\pointstyle{% - {\let\lst@um\@empty \xdef\@gtempa{\the\lst@token}}% - \expandafter\lstkeyindex\expandafter{\@gtempa}{}% - \expandafter\lstaspectindex\expandafter{\@gtempa}{}% - \rstyle} -\lstset{defaultdialect=[doc]Pascal,language=Pascal,style={}} -\def\lstscanlanguages#1#2#3{% - \begingroup - \def\lst@DefDriver@##1##2##3##4[##5]##6{% - \lst@false - \lst@lAddTo\lst@scan{##6(##5),}% - \begingroup - \@ifnextchar[{\lst@XDefDriver{##1}##3}{\lst@DefDriver@@##3}}% - \def\lst@XXDefDriver[##1]{}% - \lst@InputCatcodes - \def\lst@dontinput{#3}% - \let\lst@scan\@empty - \lst@for{#2}\do{% - \lst@IfOneOf##1\relax\lst@dontinput - {}% - {\InputIfFileExists{##1}{}{}}}% - \global\let\@gtempa\lst@scan - \endgroup - \let#1\@gtempa} -\def\lstprintlanguages#1{% - \def\do##1{\setbox\@tempboxa\hbox{##1\space\space}% - \ifdim\wd\@tempboxa<.5\linewidth \wd\@tempboxa.5\linewidth - \else \wd\@tempboxa\linewidth \fi - \box\@tempboxa\allowbreak}% - \begin{quote} - \par\noindent - \hyphenpenalty=\@M \rightskip=\z@\@plus\linewidth\relax - \lst@BubbleSort#1% - \expandafter\lst@NextLanguage#1\relax(\relax),% - \end{quote}} -\def\lst@NextLanguage#1(#2),{% - \ifx\relax#1\else - \def\lst@language{#1}\def\lst@dialects{(#2),}% - \expandafter\lst@NextLanguage@ - \fi} -\def\lst@NextLanguage@#1(#2),{% - \def\lst@temp{#1}% - \ifx\lst@temp\lst@language - \lst@lAddTo\lst@dialects{(#2),}% - \expandafter\lst@NextLanguage@ - \else - \do{\lst@language - \ifx\lst@dialects\lst@emptydialect\else - \expandafter\lst@NormedDef\expandafter\lst@language - \expandafter{\lst@language}% - \space(% - \lst@BubbleSort\lst@dialects - \expandafter\lst@PrintDialects\lst@dialects(\relax),% - )% - \fi}% - \def\lst@next{\lst@NextLanguage#1(#2),}% - \expandafter\lst@next - \fi} -\def\lst@emptydialect{(),} -\def\lst@PrintDialects(#1),{% - \ifx\@empty#1\@empty empty\else - \lst@PrintDialect{#1}% - \fi - \lst@PrintDialects@} -\def\lst@PrintDialects@(#1),{% - \ifx\relax#1\else - , \lst@PrintDialect{#1}% - \expandafter\lst@PrintDialects@ - \fi} -\def\lst@PrintDialect#1{% - \lst@NormedDef\lst@temp{#1}% - \expandafter\ifx\csname\@lst dd@\lst@language\endcsname\lst@temp - \texttt{\underbar{#1}}% - \else - \texttt{#1}% - \fi} -\def\lst@IfLE#1#2\@empty#3#4\@empty{% - \ifx #1\relax - \let\lst@next\@firstoftwo - \else \ifx #3\relax - \let\lst@next\@secondoftwo - \else - \lowercase{\ifx#1#3}% - \def\lst@next{\lst@IfLE#2\@empty#4\@empty}% - \else - \lowercase{\ifnum`#1<`#3}\relax - \let\lst@next\@firstoftwo - \else - \let\lst@next\@secondoftwo - \fi - \fi - \fi \fi - \lst@next} -\def\lst@BubbleSort#1{% - \ifx\@empty#1\else - \lst@false - \expandafter\lst@BubbleSort@#1\relax,\relax,% - \expandafter\lst@BubbleSort@\expandafter,\lst@sorted - \relax,\relax,% - \let#1\lst@sorted - \lst@if - \def\lst@next{\lst@BubbleSort#1}% - \expandafter\expandafter\expandafter\lst@next - \fi - \fi} -\def\lst@BubbleSort@#1,#2,{% - \ifx\@empty#1\@empty - \def\lst@sorted{#2,}% - \def\lst@next{\lst@BubbleSort@@}% - \else - \let\lst@sorted\@empty - \def\lst@next{\lst@BubbleSort@@#1,#2,}% - \fi - \lst@next} -\def\lst@BubbleSort@@#1,#2,{% - \ifx\relax#1\else - \ifx\relax#2% - \lst@lAddTo\lst@sorted{#1,}% - \expandafter\expandafter\expandafter\lst@BubbleSort@@@ - \else - \lst@IfLE #1\relax\@empty #2\relax\@empty - {\lst@lAddTo\lst@sorted{#1,#2,}}% - {\lst@true \lst@lAddTo\lst@sorted{#2,#1,}}% - \expandafter\expandafter\expandafter\lst@BubbleSort@@ - \fi - \fi} -\def\lst@BubbleSort@@@#1\relax,{} -\endinput -%% -%% End of file `lstdoc.sty'. diff --git a/org.glite.lb.doc/src/lstlang1.sty b/org.glite.lb.doc/src/lstlang1.sty deleted file mode 100644 index c108403..0000000 --- a/org.glite.lb.doc/src/lstlang1.sty +++ /dev/null @@ -1,1226 +0,0 @@ -%% -%% This is file `lstlang1.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% lstdrvrs-1.3.dtx (with options: `lang1') -%% -%% (w)(c) 1996/1997/1998/1999/2000/2001/2002/2003/2004 Carsten Heinz -%% and/or any other author listed elsewhere in this file. -%% -%% This file is distributed under the terms of the LaTeX Project Public -%% License from CTAN archives in directory macros/latex/base/lppl.txt. -%% Either version 1.0 or, at your option, any later version. -%% -%% This file is completely free and comes without any warranty. -%% -%% Send comments and ideas on the package, error reports and additional -%% programming languages to . -%% -\ProvidesFile{lstlang1.sty} - [2004/09/05 1.3 listings language file] -%% -%% ACSL definition (c) 2000 by Andreas Matthias -%% -\lst@definelanguage{ACSL}[90]{Fortran}% - {morekeywords={algorithm,cinterval,constant,derivative,discrete,% - dynamic,errtag,initial,interval,maxterval,minterval,% - merror,xerror,nsteps,procedural,save,schedule,sort,% - table,terminal,termt,variable},% - sensitive=false,% - morecomment=[l]!% - }[keywords, comments]% -%% -%% Ada 95 definition (c) Torsten Neuer -%% -\lst@definelanguage[95]{Ada}[83]{Ada}% - {morekeywords={abstract,aliased,protected,requeue,tagged,until}}% -\lst@definelanguage[83]{Ada}% - {morekeywords={abort,abs,accept,access,all,and,array,at,begin,body,% - case,constant,declare,delay,delta,digits,do,else,elsif,end,entry,% - exception,exit,for,function,generic,goto,if,in,is,limited,loop,% - mod,new,not,null,of,or,others,out,package,pragma,private,% - procedure,raise,range,record,rem,renames,return,reverse,select,% - separate,subtype,task,terminate,then,type,use,when,while,with,% - xor},% - sensitive=f,% - morecomment=[l]--,% - morestring=[m]",% percent not defined as stringizer so far - morestring=[m]'% - }[keywords,comments,strings]% -%% -%% awk definitions (c) Christoph Giess -%% -\lst@definelanguage[gnu]{Awk}[POSIX]{Awk}% - {morekeywords={and,asort,bindtextdomain,compl,dcgettext,gensub,% - lshift,mktime,or,rshift,strftime,strtonum,systime,xor,extension}% - }% -\lst@definelanguage[POSIX]{Awk}% - {keywords={BEGIN,END,close,getline,next,nextfile,print,printf,% - system,fflush,atan2,cos,exp,int,log,rand,sin,sqrt,srand,gsub,% - index,length,match,split,sprintf,strtonum,sub,substr,tolower,% - toupper,if,while,do,for,break,continue,delete,exit,function,% - return},% - sensitive,% - morecomment=[l]\#,% - morecomment=[l]//,% - morecomment=[s]{/*}{*/},% - morestring=[b]"% - }[keywords,comments,strings]% -%% -%% Visual Basic definition (c) 2002 Robert Frank -%% -\lst@definelanguage[Visual]{Basic} - {morekeywords={Abs,Array,Asc,AscB,AscW,Atn,Avg,CBool,CByte,CCur,% - CDate,CDbl,Cdec,Choose,Chr,ChrB,ChrW,CInt,CLng,Command,Cos,% - Count,CreateObject,CSng,CStr,CurDir,CVar,CVDate,CVErr,Date,% - DateAdd,DateDiff,DatePart,DateSerial,DateValue,Day,DDB,Dir,% - DoEvents,Environ,EOF,Error,Exp,FileAttr,FileDateTime,FileLen,% - Fix,Format,FreeFile,FV,GetAllStrings,GetAttr,% - GetAutoServerSettings,GetObject,GetSetting,Hex,Hour,IIf,% - IMEStatus,Input,InputB,InputBox,InStr,InstB,Int,Integer,IPmt,% - IsArray,IsDate,IsEmpty,IsError,IsMissing,IsNull,IsNumeric,% - IsObject,LBound,LCase,Left,LeftB,Len,LenB,LoadPicture,Loc,LOF,% - Log,Ltrim,Max,Mid,MidB,Min,Minute,MIRR,Month,MsgBox,Now,NPer,% - NPV,Oct,Partition,Pmt,PPmt,PV,QBColor,Rate,RGB,Right,RightB,Rnd,% - Rtrim,Second,Seek,Sgn,Shell,Sin,SLN,Space,Spc,Sqr,StDev,StDevP,% - Str,StrComp,StrConv,String,Switch,Sum,SYD,Tab,Tan,Time,Timer,% - TimeSerial,TimeValue,Trim,TypeName,UBound,Ucase,Val,Var,VarP,% - VarType,Weekday,Year},% functions - morekeywords=[2]{Accept,Activate,Add,AddCustom,AddFile,AddFromFile,% - AddFromTemplate,AddItem,AddNew,AddToAddInToolbar,% - AddToolboxProgID,Append,AppendChunk,Arrange,Assert,AsyncRead,% - BatchUpdate,BeginTrans,Bind,Cancel,CancelAsyncRead,CancelBatch,% - CancelUpdate,CanPropertyChange,CaptureImage,CellText,CellValue,% - Circle,Clear,ClearFields,ClearSel,ClearSelCols,Clone,Close,Cls,% - ColContaining,ColumnSize,CommitTrans,CompactDatabase,Compose,% - Connect,Copy,CopyQueryDef,CreateDatabase,CreateDragImage,% - CreateEmbed,CreateField,CreateGroup,CreateIndex,CreateLink,% - CreatePreparedStatement,CreatePropery,CreateQuery,% - CreateQueryDef,CreateRelation,CreateTableDef,CreateUser,% - CreateWorkspace,Customize,Delete,DeleteColumnLabels,% - DeleteColumns,DeleteRowLabels,DeleteRows,DoVerb,Drag,Draw,Edit,% - EditCopy,EditPaste,EndDoc,EnsureVisible,EstablishConnection,% - Execute,ExtractIcon,Fetch,FetchVerbs,Files,FillCache,Find,% - FindFirst,FindItem,FindLast,FindNext,FindPrevious,Forward,% - GetBookmark,GetChunk,GetClipString,GetData,GetFirstVisible,% - GetFormat,GetHeader,GetLineFromChar,GetNumTicks,GetRows,% - GetSelectedPart,GetText,GetVisibleCount,GoBack,GoForward,Hide,% - HitTest,HoldFields,Idle,InitializeLabels,InsertColumnLabels,% - InsertColumns,InsertObjDlg,InsertRowLabels,InsertRows,Item,% - KillDoc,Layout,Line,LinkExecute,LinkPoke,LinkRequest,LinkSend,% - Listen,LoadFile,LoadResData,LoadResPicture,LoadResString,% - LogEvent,MakeCompileFile,MakeReplica,MoreResults,Move,MoveData,% - MoveFirst,MoveLast,MoveNext,MovePrevious,NavigateTo,NewPage,% - NewPassword,NextRecordset,OLEDrag,OnAddinsUpdate,OnConnection,% - OnDisconnection,OnStartupComplete,Open,OpenConnection,% - OpenDatabase,OpenQueryDef,OpenRecordset,OpenResultset,OpenURL,% - Overlay,PaintPicture,Paste,PastSpecialDlg,PeekData,Play,Point,% - PopulatePartial,PopupMenu,Print,PrintForm,PropertyChanged,Pset,% - Quit,Raise,RandomDataFill,RandomFillColumns,RandomFillRows,% - rdoCreateEnvironment,rdoRegisterDataSource,ReadFromFile,% - ReadProperty,Rebind,ReFill,Refresh,RefreshLink,RegisterDatabase,% - Reload,Remove,RemoveAddInFromToolbar,RemoveItem,Render,% - RepairDatabase,Reply,ReplyAll,Requery,ResetCustom,% - ResetCustomLabel,ResolveName,RestoreToolbar,Resync,Rollback,% - RollbackTrans,RowBookmark,RowContaining,RowTop,Save,SaveAs,% - SaveFile,SaveToFile,SaveToolbar,SaveToOle1File,Scale,ScaleX,% - ScaleY,Scroll,Select,SelectAll,SelectPart,SelPrint,Send,% - SendData,Set,SetAutoServerSettings,SetData,SetFocus,SetOption,% - SetSize,SetText,SetViewport,Show,ShowColor,ShowFont,ShowHelp,% - ShowOpen,ShowPrinter,ShowSave,ShowWhatsThis,SignOff,SignOn,Size,% - Span,SplitContaining,StartLabelEdit,StartLogging,Stop,% - Synchronize,TextHeight,TextWidth,ToDefaults,TwipsToChartPart,% - TypeByChartType,Update,UpdateControls,UpdateRecord,UpdateRow,% - Upto,WhatsThisMode,WriteProperty,ZOrder},% methods - morekeywords=[3]{AccessKeyPress,AfterAddFile,AfterChangeFileName,% - AfterCloseFile,AfterColEdit,AfterColUpdate,AfterDelete,% - AfterInsert,AfterLabelEdit,AfterRemoveFile,AfterUpdate,% - AfterWriteFile,AmbienChanged,ApplyChanges,Associate,% - AsyncReadComplete,AxisActivated,AxisLabelActivated,% - AxisLabelSelected,AxisLabelUpdated,AxisSelected,% - AxisTitleActivated,AxisTitleSelected,AxisTitleUpdated,% - AxisUpdated,BeforeClick,BeforeColEdit,BeforeColUpdate,% - BeforeConnect,BeforeDelete,BeforeInsert,BeforeLabelEdit,% - BeforeLoadFile,BeforeUpdate,ButtonClick,ButtonCompleted,% - ButtonGotFocus,ButtonLostFocus,Change,ChartActivated,% - ChartSelected,ChartUpdated,Click,ColEdit,Collapse,ColResize,% - ColumnClick,Compare,ConfigChageCancelled,ConfigChanged,% - ConnectionRequest,DataArrival,DataChanged,DataUpdated,DblClick,% - Deactivate,DeviceArrival,DeviceOtherEvent,DeviceQueryRemove,% - DeviceQueryRemoveFailed,DeviceRemoveComplete,DeviceRemovePending,% - DevModeChange,Disconnect,DisplayChanged,Dissociate,% - DoGetNewFileName,Done,DonePainting,DownClick,DragDrop,DragOver,% - DropDown,EditProperty,EnterCell,EnterFocus,Event,ExitFocus,% - Expand,FootnoteActivated,FootnoteSelected,FootnoteUpdated,% - GotFocus,HeadClick,InfoMessage,Initialize,IniProperties,% - ItemActivated,ItemAdded,ItemCheck,ItemClick,ItemReloaded,% - ItemRemoved,ItemRenamed,ItemSeletected,KeyDown,KeyPress,KeyUp,% - LeaveCell,LegendActivated,LegendSelected,LegendUpdated,% - LinkClose,LinkError,LinkNotify,LinkOpen,Load,LostFocus,% - MouseDown,MouseMove,MouseUp,NodeClick,ObjectMove,% - OLECompleteDrag,OLEDragDrop,OLEDragOver,OLEGiveFeedback,% - OLESetData,OLEStartDrag,OnAddNew,OnComm,Paint,PanelClick,% - PanelDblClick,PathChange,PatternChange,PlotActivated,% - PlotSelected,PlotUpdated,PointActivated,PointLabelActivated,% - PointLabelSelected,PointLabelUpdated,PointSelected,% - PointUpdated,PowerQuerySuspend,PowerResume,PowerStatusChanged,% - PowerSuspend,QueryChangeConfig,QueryComplete,QueryCompleted,% - QueryTimeout,QueryUnload,ReadProperties,Reposition,% - RequestChangeFileName,RequestWriteFile,Resize,ResultsChanged,% - RowColChange,RowCurrencyChange,RowResize,RowStatusChanged,% - SelChange,SelectionChanged,SendComplete,SendProgress,% - SeriesActivated,SeriesSelected,SeriesUpdated,SettingChanged,% - SplitChange,StateChanged,StatusUpdate,SysColorsChanged,% - Terminate,TimeChanged,TitleActivated,TitleSelected,% - TitleActivated,UnboundAddData,UnboundDeleteRow,% - UnboundGetRelativeBookmark,UnboundReadData,UnboundWriteData,% - Unload,UpClick,Updated,Validate,ValidationError,WillAssociate,% - WillChangeData,WillDissociate,WillExecute,WillUpdateRows,% - WithEvents,WriteProperties},% VB-events - morekeywords=[4]{AppActivate,Base,Beep,Call,Case,ChDir,ChDrive,% - Const,Declare,DefBool,DefByte,DefCur,DefDate,DefDbl,DefDec,% - DefInt,DefLng,DefObj,DefSng,DefStr,Deftype,DefVar,DeleteSetting,% - Dim,Do,Else,ElseIf,End,Enum,Erase,Event,Exit,Explicit,FileCopy,% - For,ForEach,Friend,Function,Get,GoSub,GoTo,If,Implements,Kill,% - Let,LineInput,Lock,Lset,MkDir,Name,Next,OnError,On,Option,% - Private,Property,Public,Put,RaiseEvent,Randomize,ReDim,Rem,% - Reset,Resume,Return,RmDir,Rset,SavePicture,SaveSetting,% - SendKeys,SetAttr,Static,Sub,Then,Type,Unlock,Wend,While,Width,% - With,Write},% statements - sensitive=false,% - keywordcomment=rem,% - MoreSelectCharTable=\def\lst@BeginKC@{% chmod - \lst@ResetToken - \lst@BeginComment\lst@GPmode{{\lst@commentstyle}% - \lst@Lmodetrue\lst@modetrue}\@empty},% - morecomment=[l]{'},% - morecomment=[s]{/*}{*/},% - morestring=[b]",% - }[keywords,comments,strings,keywordcomments] -\lst@definelanguage[ANSI]{C++}[ISO]{C++}{}% -\lst@definelanguage[GNU]{C++}[ISO]{C++}% - {morekeywords={__attribute__,__extension__,__restrict,__restrict__,% - typeof,__typeof__},% - }% -\lst@definelanguage[Visual]{C++}[ISO]{C++}% - {morekeywords={__asm,__based,__cdecl,__declspec,dllexport,% - dllimport,__except,__fastcall,__finally,__inline,__int8,__int16,% - __int32,__int64,naked,__stdcall,thread,__try,__leave},% - }% -\lst@definelanguage[ISO]{C++}[ANSI]{C}% - {morekeywords={and,and_eq,asm,bad_cast,bad_typeid,bitand,bitor,bool,% - catch,class,compl,const_cast,delete,dynamic_cast,explicit,export,% - false,friend,inline,mutable,namespace,new,not,not_eq,operator,or,% - or_eq,private,protected,public,reinterpret_cast,static_cast,% - template,this,throw,true,try,typeid,type_info,typename,using,% - virtual,wchar_t,xor,xor_eq},% - }% -%% -%% Objective-C definition (c) 1997 Detlev Droege -%% -\lst@definelanguage[Objective]{C}[ANSI]{C} - {morekeywords={bycopy,id,in,inout,oneway,out,self,super,% - @class,@defs,@encode,@end,@implementation,@interface,@private,% - @protected,@protocol,@public,@selector},% - moredirectives={import}% - }% -%% -%% Handel-C definition, refer http://www.celoxica.com -%% -\lst@definelanguage[Handel]{C}[ANSI]{C} - {morekeywords={assert,chan,chanin,chanout,clock,delay,expr,external,% - external_divide,family,ifselect,in,inline,interface,internal,% - internal_divid,intwidth,let,macro,mpram,par,part,prialt,proc,ram,% - releasesema,reset,rom,select,sema,set,seq,shared,signal,try,% - reset,trysema,typeof,undefined,width,with,wom},% - }% -\lst@definelanguage[ANSI]{C}% - {morekeywords={auto,break,case,char,const,continue,default,do,double,% - else,enum,extern,float,for,goto,if,int,long,register,return,% - short,signed,sizeof,static,struct,switch,typedef,union,unsigned,% - void,volatile,while},% - sensitive,% - morecomment=[s]{/*}{*/},% - morecomment=[l]//,% nonstandard - morestring=[b]",% - morestring=[b]',% - moredelim=*[directive]\#,% - moredirectives={define,elif,else,endif,error,if,ifdef,ifndef,line,% - include,pragma,undef,warning}% - }[keywords,comments,strings,directives]% -%% -%% C-Sharp definition (c) 2002 Martin Brodbeck -%% -\lst@definelanguage[Sharp]{C}% - {morekeywords={abstract,base,bool,break,byte,case,catch,char,checked,% - class,const,continue,decimal,default,delegate,do,double,else,% - enum,event,explicit,extern,false,finally,fixed,float,for,foreach,% - goto,if,implicit,in,int,interface,internal,is,lock,long,% - namespace,new,null,object,operator,out,override,params,private,% - protected,public,readonly,ref,return,sbyte,sealed,short,sizeof,% - static,string,struct,switch,this,throw,true,try,typeof,uint,% - ulong,unchecked,unsafe,ushort,using,virtual,void,while,% - as,volatile,stackalloc},% Kai K\"ohne - sensitive,% - morecomment=[s]{/*}{*/},% - morecomment=[l]//,% - morestring=[b]" - }[keywords,comments,strings]% -%% -%% csh definition (c) 1998 Kai Below -%% -\lst@definelanguage{csh} - {morekeywords={alias,awk,cat,echo,else,end,endif,endsw,exec,exit,% - foreach,glob,goto,history,if,logout,nice,nohup,onintr,repeat,sed,% - set,setenv,shift,source,switch,then,time,while,umask,unalias,% - unset,wait,while,@,env,argv,child,home,ignoreeof,noclobber,% - noglob,nomatch,path,prompt,shell,status,verbose,print,printf,% - sqrt,BEGIN,END},% - morecomment=[l]\#,% - morestring=[d]"% - }[keywords,comments,strings]% -%% -%% bash,sh definition (c) 2003 Riccardo Murri -%% -\lst@definelanguage{bash}[]{sh}% - {morekeywords={alias,bg,bind,builtin,command,compgen,complete,% - declare,disown,enable,fc,fg,history,jobs,et,local,logout,printf,% - pushd,popd,select,set,suspend,shopt,source,times,type,typeset,% - ulimit,unalias,wait},% - }% -\lst@definelanguage{sh}% - {morekeywords={awk,break,case,cat,cd,continue,do,done,echo,else,% - env,eval,exec,expr,exit,export,false,fi,for,function,getopts,% - hash,history,if,kill,nice,nohup,ps,pwd,read,readonly,return,% - sed,shift,test,then,times,trap,true,umask,unset,until,while},% - morecomment=[l]\#,% - morestring=[d]"% - }[keywords,comments,strings]% -\lst@definelanguage[90]{Fortran}[95]{Fortran}{} -\lst@definelanguage[95]{Fortran}[77]{Fortran}% - {deletekeywords=SAVE,% - morekeywords={ACTION,ADVANCE,ALLOCATE,ALLOCATABLE,ASSIGNMENT,CASE,% - CONTAINS,CYCLE,DEALLOCATE,DEFAULT,DELIM,EXIT,INCLUDE,IN,NONE,IN,% - OUT,INTENT,INTERFACE,IOLENGTH,KIND,LEN,MODULE,NAME,NAMELIST,NMT,% - NULLIFY,ONLY,OPERATOR,OPTIONAL,OUT,PAD,POINTER,POSITION,PRIVATE,% - PUBLIC,READWRITE,RECURSIVE,RESULT,SELECT,SEQUENCE,SIZE,STAT,% - TARGET,USE,WHERE,WHILE,BLOCKDATA,DOUBLEPRECISION,ELSEIF,% - ENDBLOCKDATA,ENDDO,ENDFILE,ENDFUNCTION,ENDIF,ENDINTERFACE,% - ENDMODULE,ENDPROGRAM,ENDSELECT,ENDSUBROUTINE,ENDTYPE,ENDWHERE,% - GOTO,INOUT,SELECTCASE},% - deletecomment=[f],% no fixed comment line: 1998 Magne Rudshaug - morecomment=[l]!% - }% -\lst@definelanguage[77]{Fortran}% - {morekeywords={ACCESS,ASSIGN,BACKSPACE,BLANK,BLOCK,CALL,CHARACTER,% - CLOSE,COMMON,COMPLEX,CONTINUE,DATA,DIMENSION,DIRECT,DO,DOUBLE,% - ELSE,END,ENTRY,EOF,EQUIVALENCE,ERR,EXIST,EXTERNAL,FILE,FMT,FORM,% - FORMAT,FORMATTED,FUNCTION,GO,TO,IF,IMPLICIT,INQUIRE,INTEGER,% - INTRINSIC,IOSTAT,LOGICAL,NAMED,NEXTREC,NUMBER,OPEN,OPENED,% - PARAMETER,PAUSE,PRECISION,PRINT,PROGRAM,READ,REAL,REC,RECL,% - RETURN,REWIND,SEQUENTIAL,STATUS,STOP,SUBROUTINE,THEN,TYPE,% - UNFORMATTED,UNIT,WRITE,SAVE},% - sensitive=f,%% not Fortran standard %% - morecomment=[f]*,% - morecomment=[f]C,% - morecomment=[f]c,% - morestring=[d]"% - }[keywords,comments,strings]% -\lst@definelanguage{HTML}% - {morekeywords={A,ABBR,ACRONYM,ADDRESS,APPLET,AREA,B,BASE,BASEFONT,% - BDO,BIG,BLOCKQUOTE,BODY,BR,BUTTON,CAPTION,CENTER,CITE,CODE,COL,% - COLGROUP,DD,DEL,DFN,DIR,DIV,DL,DOCTYPE,DT,EM,FIELDSET,FONT,FORM,% - FRAME,FRAMESET,HEAD,HR,H1,H2,H3,H4,H5,H6,HTML,I,IFRAME,IMG,INPUT,% - INS,ISINDEX,KBD,LABEL,LEGEND,LH,LI,LINK,LISTING,MAP,META,MENU,% - NOFRAMES,NOSCRIPT,OBJECT,OPTGROUP,OPTION,P,PARAM,PLAINTEXT,PRE,% - OL,Q,S,SAMP,SCRIPT,SELECT,SMALL,SPAN,STRIKE,STRING,STRONG,STYLE,% - SUB,SUP,TABLE,TBODY,TD,TEXTAREA,TFOOT,TH,THEAD,TITLE,TR,TT,U,UL,% - VAR,XMP,% - accesskey,action,align,alink,alt,archive,axis,background,bgcolor,% - border,cellpadding,cellspacing,charset,checked,cite,class,classid,% - code,codebase,codetype,color,cols,colspan,content,coords,data,% - datetime,defer,disabled,dir,event,error,for,frameborder,headers,% - height,href,hreflang,hspace,http-equiv,id,ismap,label,lang,link,% - longdesc,marginwidth,marginheight,maxlength,media,method,multiple,% - name,nohref,noresize,noshade,nowrap,onblur,onchange,onclick,% - ondblclick,onfocus,onkeydown,onkeypress,onkeyup,onload,onmousedown,% - profile,readonly,onmousemove,onmouseout,onmouseover,onmouseup,% - onselect,onunload,rel,rev,rows,rowspan,scheme,scope,scrolling,% - selected,shape,size,src,standby,style,tabindex,text,title,type,% - units,usemap,valign,value,valuetype,vlink,vspace,width,xmlns},% - tag=**[s]<>,% - sensitive=f,% - morestring=[d]",% ??? doubled - MoreSelectCharTable=% - \lst@CArgX--\relax\lst@DefDelimB{}{}% - {\ifnum\lst@mode=\lst@tagmode\else - \expandafter\@gobblethree - \fi}% - \lst@BeginComment\lst@commentmode{{\lst@commentstyle}}% - \lst@CArgX--\relax\lst@DefDelimE{}{}{}% - \lst@EndComment\lst@commentmode - }[keywords,comments,strings,html]% -%% -%% AspectJ definition (c) Robert Wenner -%% -\lst@definelanguage[AspectJ]{Java}[]{Java}% - {morekeywords={% - adviceexecution,after,args,around,aspect,aspectOf,before,% - call,cflow,cflowbelow,% - execution,get,handler,if,initialization,issingleton,pointcut,% - percflow,percflowbelow,perthis,pertarget,preinitialization,% - privileged,proceed,returning,set,staticinitialization,strictfp,% - target,this,thisEnclosingJoinPoint,thisJoinPoint,throwing,% - within,withincode},% - MoreSelectCharTable=% - \lst@DefSaveDef{`.}\lst@umdot{\lst@umdot\global\let\lst@derefop\@empty}% - \ifx\lst@derefinstalled\@empty\else - \global\let\lst@derefinstalled\@empty -\lst@AddToHook{Output}% -{\lst@ifkeywords - \ifx\lst@derefop\@empty - \global\let\lst@derefop\relax - \ifx\lst@thestyle\lst@gkeywords@sty - \ifx\lst@currstyle\relax - \let\lst@thestyle\lst@identifierstyle - \else - \let\lst@thestyle\lst@currstyle - \fi - \fi - \fi - \fi} -\lst@AddToHook{BOL}{\global\let\lst@derefop\relax}% -\lst@AddTo\lst@ProcessSpace{\global\let\lst@derefop\relax}% - \fi - }% -\lst@definelanguage{Java}% - {morekeywords={abstract,boolean,break,byte,case,catch,char,class,% - const,continue,default,do,double,else,extends,false,final,% - finally,float,for,goto,if,implements,import,instanceof,int,% - interface,label,long,native,new,null,package,private,protected,% - public,return,short,static,super,switch,synchronized,this,throw,% - throws,transient,true,try,void,volatile,while},% - sensitive,% - morecomment=[l]//,% - morecomment=[s]{/*}{*/},% - morestring=[b]",% - morestring=[b]',% - }[keywords,comments,strings]% -%% -%% ByteCodeJava definition (c) 2004 Martine Gautier -%% -\lst@definelanguage{JVMIS}% - {morekeywords={aaload,astore,aconst_null,aload,aload_0,aload_1,% - aload_2,aload_3,anewarray,areturn,arraylength,astore,astore_0,% - astore_1,astore_2,astore_3,athrow,baload,bastore,bipush,caload,% - castore,checkcast,d2f,d2i,d2l,dadd,daload,dastore,dcmpg,dcmpl,% - dconst_0,dconst_1,ddiv,dload,dload_0,dload_1,dload_2,dload_3,% - dmul,dneg,drem,dreturn,dstore,dstore_0,dstore_1,dstore_2,% - dstore_3,dsub,dup,dup_x1,dup_x2,dup2,dup2_x1,dup2_x2,f2d,% - f2i,f2l,fadd,faload,fastore,fcmpg,fcmpl,fconst_0,fconst_1,% - fconst_2,fdiv,fload,fload_0,fload_1,fload_2,fload_3,fmul,% - fneg,frem,freturn,fstore,fstore_0,fstore_1,fstore_2,fstore_3,% - fsub,getfield,getstatic,goto,goto_w,i2b,i2c,i2d,i2f,i2l,i2s,% - iadd,iaload,iand,iastore,iconst_0,iconst_1,iconst_2,iconst_3,% - iconst_4,iconst_5,idiv,if_acmpeq,if_acmpne,if_icmpeq,if_icmpne,% - if_icmplt,if_cmpge,if_cmpgt,if_cmple,ifeq,ifne,iflt,ifge,ifgt,% - ifle,ifnonnull,ifnull,iinc,iload,iload_0,iload_1,iload_2,% - iload_3,imul,ineg,instanceof,invokeinterface,invokespecial,% - invokestatic,invokevirtual,ior,irem,ireturn,ishl,ishr,istore,% - istore_0,istore_1,istore_2,istore_3,isub,iushr,ixor,jsr,jsr_w,% - l2d,l2f,l2i,ladd,laload,land,lastore,lcmp,lconst_0,lconst_1,% - ldc,ldc_w,ldc2_w,ldiv,lload,lload_0,lload_1,lload_2,lload_3,% - lmul,lneg,lookupswitch,lor,lrem,lreturn,lshl,lshr,lstore,% - lstore_0,lstore_1,lstore_2,lstore_3,lsub,lushr,lxor,% - monitorenter,monitorexit,multianewarray,new,newarray,nop,pop,% - pop2,putfield,putstatic,ret,return,saload,sastore,sipush,swap,% - tableswitch,wide,limit,locals,stack},% - }[keywords]% -\lst@definelanguage{Matlab}% - {morekeywords={gt,lt,gt,lt,amp,abs,acos,acosh,acot,acoth,acsc,acsch,% - all,angle,ans,any,asec,asech,asin,asinh,atan,atan2,atanh,auread,% - auwrite,axes,axis,balance,bar,bessel,besselk,bessely,beta,% - betainc,betaln,blanks,bone,break,brighten,capture,cart2pol,% - cart2sph,caxis,cd,cdf2rdf,cedit,ceil,chol,cla,clabel,clc,clear,% - clf,clock,close,colmmd,Colon,colorbar,colormap,ColorSpec,colperm,% - comet,comet3,compan,compass,computer,cond,condest,conj,contour,% - contour3,contourc,contrast,conv,conv2,cool,copper,corrcoef,cos,% - cosh,cot,coth,cov,cplxpair,cputime,cross,csc,csch,csvread,% - csvwrite,cumprod,cumsum,cylinder,date,dbclear,dbcont,dbdown,% - dbquit,dbstack,dbstatus,dbstep,dbstop,dbtype,dbup,ddeadv,ddeexec,% - ddeinit,ddepoke,ddereq,ddeterm,ddeunadv,deblank,dec2hex,deconv,% - del2,delete,demo,det,diag,diary,diff,diffuse,dir,disp,dlmread,% - dlmwrite,dmperm,dot,drawnow,echo,eig,ellipj,ellipke,else,elseif,% - end,engClose,engEvalString,engGetFull,engGetMatrix,engOpen,% - engOutputBuffer,engPutFull,engPutMatrix,engSetEvalCallback,% - engSetEvalTimeout,engWinInit,eps,erf,erfc,erfcx,erfinv,error,% - errorbar,etime,etree,eval,exist,exp,expint,expm,expo,eye,fclose,% - feather,feof,ferror,feval,fft,fft2,fftshift,fgetl,fgets,figure,% - fill,fill3,filter,filter2,find,findstr,finite,fix,flag,fliplr,% - flipud,floor,flops,fmin,fmins,fopen,for,format,fplot,fprintf,% - fread,frewind,fscanf,fseek,ftell,full,function,funm,fwrite,fzero,% - gallery,gamma,gammainc,gammaln,gca,gcd,gcf,gco,get,getenv,% - getframe,ginput,global,gplot,gradient,gray,graymon,grid,griddata,% - gtext,hadamard,hankel,help,hess,hex2dec,hex2num,hidden,hilb,hist,% - hold,home,hostid,hot,hsv,hsv2rgb,if,ifft,ifft2,imag,image,% - imagesc,Inf,info,input,int2str,interp1,interp2,interpft,inv,% - invhilb,isempty,isglobal,ishold,isieee,isinf,isletter,isnan,% - isreal,isspace,issparse,isstr,jet,keyboard,kron,lasterr,lcm,% - legend,legendre,length,lin2mu,line,linspace,load,log,log10,log2,% - loglog,logm,logspace,lookfor,lower,ls,lscov,lu,magic,matClose,% - matDeleteMatrix,matGetDir,matGetFp,matGetFull,matGetMatrix,% - matGetNextMatrix,matGetString,matlabrc,matlabroot,matOpen,% - matPutFull,matPutMatrix,matPutString,max,mean,median,menu,mesh,% - meshc,meshgrid,meshz,mexAtExit,mexCallMATLAB,mexdebug,% - mexErrMsgTxt,mexEvalString,mexFunction,mexGetFull,mexGetMatrix,% - mexGetMatrixPtr,mexPrintf,mexPutFull,mexPutMatrix,mexSetTrapFlag,% - min,more,movie,moviein,mu2lin,mxCalloc,mxCopyCharacterToPtr,% - mxCopyComplex16ToPtr,mxCopyInteger4ToPtr,mxCopyPtrToCharacter,% - mxCopyPtrToComplex16,mxCopyPtrToInteger4,mxCopyPtrToReal8,% - mxCopyReal8ToPtr,mxCreateFull,mxCreateSparse,mxCreateString,% - mxFree,mxFreeMatrix,mxGetIr,mxGetJc,mxGetM,mxGetN,mxGetName,% - mxGetNzmax,mxGetPi,mxGetPr,mxGetScalar,mxGetString,mxIsComplex,% - mxIsFull,mxIsNumeric,mxIsSparse,mxIsString,mxIsTypeDouble,% - mxSetIr,mxSetJc,mxSetM,mxSetN,mxSetName,mxSetNzmax,mxSetPi,% - mxSetPr,NaN,nargchk,nargin,nargout,newplot,nextpow2,nnls,nnz,% - nonzeros,norm,normest,null,num2str,nzmax,ode23,ode45,orient,orth,% - pack,pascal,patch,path,pause,pcolor,pi,pink,pinv,plot,plot3,% - pol2cart,polar,poly,polyder,polyeig,polyfit,polyval,polyvalm,% - pow2,print,printopt,prism,prod,pwd,qr,qrdelete,qrinsert,quad,% - quad8,quit,quiver,qz,rand,randn,randperm,rank,rat,rats,rbbox,% - rcond,real,realmax,realmin,refresh,rem,reset,reshape,residue,% - return,rgb2hsv,rgbplot,rootobject,roots,rose,rosser,rot90,rotate,% - round,rref,rrefmovie,rsf2csf,save,saxis,schur,sec,sech,semilogx,% - semilogy,set,setstr,shading,sign,sin,sinh,size,slice,sort,sound,% - spalloc,sparse,spaugment,spconvert,spdiags,specular,speye,spfun,% - sph2cart,sphere,spinmap,spline,spones,spparms,sprandn,sprandsym,% - sprank,sprintf,spy,sqrt,sqrtm,sscanf,stairs,startup,std,stem,% - str2mat,str2num,strcmp,strings,strrep,strtok,subplot,subscribe,% - subspace,sum,surf,surface,surfc,surfl,surfnorm,svd,symbfact,% - symmmd,symrcm,tan,tanh,tempdir,tempname,terminal,text,tic,title,% - toc,toeplitz,trace,trapz,tril,triu,type,uicontrol,uigetfile,% - uimenu,uiputfile,unix,unwrap,upper,vander,ver,version,view,% - viewmtx,waitforbuttonpress,waterfall,wavread,wavwrite,what,% - whatsnew,which,while,white,whitebg,who,whos,wilkinson,wk1read,% - wk1write,xlabel,xor,ylabel,zeros,zlabel,zoom},% - sensitive,% - morecomment=[l]\%,% - morestring=[m]'% - }[keywords,comments,strings]% -%% -%% Mathematica definitions (c) 1999 Michael Wiese -%% -\lst@definelanguage[3.0]{Mathematica}[1.0]{Mathematica}% - {morekeywords={Abort,AbortProtect,AbsoluteDashing,AbsolutePointSize,% - AbsoluteThickness,AbsoluteTime,AccountingFormAiry,AiPrime,AiryBi,% - AiryBiPrime,Alternatives,AnchoredSearch,AxesEdge,AxesOrigin,% - AxesStyle,Background,BetaRegularized,BoxStyle,C,CheckAbort,% - Circle,ClebschGordan,CMYKColor,ColorFunction,ColorOutput,Compile,% - Compiled,CompiledFunction,ComplexExpand,ComposeList,Composition,% - ConstrainedMax,ConstrainedMin,Contexts,ContextToFilename,% - ContourLines,Contours,ContourShading,ContourSmoothing,% - ContourStyle,CopyDirectory,CopyFile,CosIntegral,CreateDirectory,% - Cuboid,Date,DeclarePackage,DefaultColor,DefaultFont,Delete,% - DeleteCases,DeleteDirectory,DeleteFile,Dialog,DialogIndent,% - DialogProlog,DialogSymbols,DigitQ,Directory,DirectoryStack,Disk,% - Dispatch,DownValues,DSolve,Encode,Epilog,Erfc,Evaluate,% - ExponentFunction,FaceGrids,FileByteCount,FileDate,FileNames,% - FileType,Find,FindList,FixedPointList,FlattenAt,Fold,FoldList,% - Frame,FrameLabel,FrameStyle,FrameTicks,FromCharacterCode,% - FromDate,FullGraphics,FullOptions,GammaRegularized,% - GaussianIntegers,GraphicsArray,GraphicsSpacing,GridLines,% - GroebnerBasis,Heads,HeldPart,HomeDirectory,Hue,IgnoreCases,% - InputStream,Install,InString,IntegerDigits,InterpolatingFunction,% - InterpolatingPolynomial,Interpolation,Interrupt,InverseFunction,% - InverseFunctions,JacobiZeta,LetterQ,LinearProgramming,ListPlay,% - LogGamma,LowerCaseQ,MachineNumberQ,MantissaExponent,MapIndexed,% - MapThread,MatchLocalNames,MatrixExp,MatrixPower,MeshRange,% - MeshStyle,MessageList,Module,NDSolve,NSolve,NullRecords,% - NullWords,NumberFormat,NumberPadding,NumberSigns,OutputStream,% - PaddedForm,ParentDirectory,Pause,Play,PlayRange,PlotRegion,% - PolygonIntersections,PolynomialGCD,PolynomialLCM,PolynomialMod,% - PostScript,PowerExpand,PrecisionGoal,PrimePi,Prolog,% - QRDecomposition,Raster,RasterArray,RealDigits,Record,RecordLists,% - RecordSeparators,ReleaseHold,RenameDirectory,RenameFile,% - ReplaceHeldPart,ReplacePart,ResetDirectory,Residue,% - RiemannSiegelTheta,RiemannSiegelZ,RotateLabel,SameTest,% - SampleDepth,SampledSoundFunction,SampledSoundList,SampleRate,% - SchurDecomposition,SessionTime,SetAccuracy,SetDirectory,% - SetFileDate,SetPrecision,SetStreamPosition,Shallow,SignPadding,% - SinIntegral,SixJSymbol,Skip,Sound,SpellingCorrection,% - SphericalRegion,Stack,StackBegin,StackComplete,StackInhibit,% - StreamPosition,Streams,StringByteCount,StringConversion,% - StringDrop,StringInsert,StringPosition,StringReplace,% - StringReverse,StringTake,StringToStream,SurfaceColor,% - SyntaxLength,SyntaxQ,TableAlignments,TableDepth,% - TableDirections,TableHeadings,TableSpacing,ThreeJSymbol,TimeUsed,% - TimeZone,ToCharacterCode,ToDate,ToHeldExpression,TokenWords,% - ToLowerCase,ToUpperCase,Trace,TraceAbove,TraceBackward,% - TraceDepth,TraceDialog,TraceForward,TraceOff,TraceOn,% - TraceOriginal,TracePrint,TraceScan,Trig,Unevaluated,Uninstall,% - UnsameQ,UpperCaseQ,UpValues,ViewCenter,ViewVertical,With,Word,% - WordSearch,WordSeparators},% - morendkeywords={Stub,Temporary,$Aborted,$BatchInput,$BatchOutput,% - $CreationDate,$DefaultFont,$DumpDates,$DumpSupported,$Failed,% - $Input,$Inspector,$IterationLimit,$Language,$Letters,$Linked,% - $LinkSupported,$MachineEpsilon,$MachineID,$MachineName,% - $MachinePrecision,$MachineType,$MaxMachineNumber,$MessageList,% - $MessagePrePrint,$MinMachineNumber,$ModuleNumber,$NewMessage,% - $NewSymbol,$Notebooks,$OperatingSystem,$Packages,$PipeSupported,% - $PreRead,$ReleaseNumber,$SessionID,$SoundDisplayFunction,% - $StringConversion,$StringOrder,$SyntaxHandler,$TimeUnit,% - $VersionNumber}% - }% -\lst@definelanguage[1.0]{Mathematica}% - {morekeywords={Abs,Accuracy,AccurayGoal,AddTo,AiryAi,AlgebraicRules,% - AmbientLight,And,Apart,Append,AppendTo,Apply,ArcCos,ArcCosh,% - ArcCot,ArcCoth,ArcCsc,ArcCsch,ArcSec,ArcSech,ArcSin,ArcSinh,% - ArcTan,ArcTanh,Arg,ArithmeticGeometricMean,Array,AspectRatio,% - AtomQ,Attributes,Axes,AxesLabel,BaseForm,Begin,BeginPackage,% - BernoulliB,BesselI,BesselJ,BesselK,BesselY,Beta,Binomial,Blank,% - BlankNullSequence,BlankSequence,Block,Boxed,BoxRatios,Break,Byte,% - ByteCount,Cancel,Cases,Catch,Ceiling,CForm,Character,Characters,% - ChebyshevT,ChebyshevU,Check,Chop,Clear,ClearAll,ClearAttributes,% - ClipFill,Close,Coefficient,CoefficientList,Collect,ColumnForm,% - Complement,Complex,CompoundExpression,Condition,Conjugate,% - Constants,Context,Continuation,Continue,ContourGraphics,% - ContourPlot,Cos,Cosh,Cot,Coth,Count,Csc,Csch,Cubics,Cyclotomic,% - D,Dashing,Decompose,Decrement,Default,Definition,Denominator,% - DensityGraphics,DensityPlot,Depth,Derivative,Det,DiagonalMatrix,% - DigitBlock,Dimensions,DirectedInfinity,Display,DisplayFunction,% - Distribute,Divide,DivideBy,Divisors,DivisorSigma,Do,Dot,Drop,Dt,% - Dump,EdgeForm,Eigensystem,Eigenvalues,Eigenvectors,Eliminate,% - EllipticE,EllipticExp,EllipticF,EllipticK,EllipticLog,EllipticPi,% - EllipticTheta,End,EndPackage,EngineeringForm,Environment,Equal,% - Erf,EulerE,EulerPhi,EvenQ,Exit,Exp,Expand,ExpandAll,% - ExpandDenominator,ExpandNumerator,ExpIntegralE,ExpIntegralEi,% - Exponent,Expression,ExtendedGCD,FaceForm,Factor,FactorComplete,% - Factorial,Factorial2,FactorInteger,FactorList,FactorSquareFree,% - FactorSquareFreeList,FactorTerms,FactorTermsList,FindMinimum,% - FindRoot,First,Fit,FixedPoint,Flatten,Floor,FontForm,For,Format,% - FormatType,FortranForm,Fourier,FreeQ,FullDefinition,FullForm,% - Function,Gamma,GCD,GegenbauerC,General,Get,Goto,Graphics,% - Graphics3D,GrayLevel,Greater,GreaterEqual,Head,HermiteH,% - HiddenSurface,Hold,HoldForm,Hypergeometric0F1, Hypergeometric1F1,% - Hypergeometric2F1,HypergeometricU,Identity,IdentityMatrix,If,Im,% - Implies,In,Increment,Indent,Infix,Information,Inner,Input,% - InputForm,InputString,Insert,Integer,IntegerQ,Integrate,% - Intersection,Inverse,InverseFourier,InverseJacobiSN,% - InverseSeries,JacobiAmplitude,JacobiP,JacobiSN,JacobiSymbol,Join,% - Label,LaguerreL,Last,LatticeReduce,LCM,LeafCount,LegendreP,% - LegendreQ,LegendreType,Length,LerchPhi,Less,LessEqual,Level,% - Lighting,LightSources,Limit,Line,LinearSolve,LineBreak,List,% - ListContourPlot,ListDensityPlot,ListPlot,ListPlot3D,Literal,Log,% - LogicalExpand,LogIntegral,MainSolve,Map,MapAll,MapAt,MatchQ,% - MatrixForm,MatrixQ,Max,MaxBend,MaxMemoryUsed,MemberQ,% - MemoryConstrained,MemoryInUse,Mesh,Message,MessageName,Messages,% - Min,Minors,Minus,Mod,Modulus,MoebiusMu,Multinomial,N,NameQ,Names,% - NBernoulliB,Needs,Negative,Nest,NestList,NIntegrate,% - NonCommutativeMultiply,NonConstants,NonNegative,Normal,Not,% - NProduct,NSum,NullSpace,Number,NumberForm,NumberPoint,NumberQ,% - NumberSeparator,Numerator,O,OddQ,Off,On,OpenAppend,OpenRead,% - OpenTemporary,OpenWrite,Operate,Optional,Options,Or,Order,% - OrderedQ,Out,Outer,OutputForm,PageHeight,PageWidth,% - ParametricPlot,ParametricPlot3D,Part,Partition,PartitionsP,% - PartitionsQ,Pattern,Permutations,Plot,Plot3D,PlotDivision,% - PlotJoined,PlotLabel,PlotPoints,PlotRange,PlotStyle,Pochhammer,% - Plus,Point,PointSize,PolyGamma,Polygon,PolyLog,PolynomialQ,% - PolynomialQuotient,PolynomialRemainder,Position,Positive,Postfix,% - Power,PowerMod,PrecedenceForm,Precision,PreDecrement,Prefix,% - PreIncrement,Prepend,PrependTo,Prime,PrimeQ,Print,PrintForm,% - Product,Protect,PseudoInverse,Put,PutAppend,Quartics,Quit,% - Quotient,Random,Range,Rational,Rationalize,Raw,Re,Read,ReadList,% - Real,Rectangle,Reduce,Remove,RenderAll,Repeated,RepeatedNull,% - Replace,ReplaceAll,ReplaceRepeated,Rest,Resultant,Return,Reverse,% - RGBColor,Roots,RotateLeft,RotateRight,Round,RowReduce,Rule,% - RuleDelayed,Run,RunThrough,SameQ,Save,Scaled,Scan,ScientificForm,% - Sec,Sech,SeedRandom,Select,Sequence,SequenceForm,Series,% - SeriesData,Set,SetAttributes,SetDelayed,SetOptions,Shading,Share,% - Short,Show,Sign,Signature,Simplify,Sin,SingularValues,Sinh,% - Skeleton,Slot,SlotSequence,Solve,SolveAlways,Sort,% - SphericalHarmonicY,Splice,Sqrt,StirlingS1,StirlingS2,String,% - StringBreak,StringForm,StringJoin,StringLength,StringMatchQ,% - StringSkeleton,Subscript,Subscripted,Subtract,SubtractForm,Sum,% - Superscript,SurfaceGraphics,Switch,Symbol,Table,TableForm,TagSet,% - TagSetDelayed,TagUnset,Take,Tan,Tanh,ToString,TensorRank,TeXForm,% - Text,TextForm,Thickness,Thread,Through,Throw,Ticks,% - TimeConstrained,Times,TimesBy,Timing,ToExpression,Together,% - ToRules,ToString,TotalHeight,TotalWidth,Transpose,TreeForm,TrueQ,% - Unequal,Union,Unique,Unprotect,Unset,Update,UpSet,UpSetDelayed,% - ValueQ,Variables,VectorQ,ViewPoint,WeierstrassP,% - WeierstrassPPrime,Which,While,WorkingPrecision,Write,WriteString,% - Xor,ZeroTest,Zeta},% - morendkeywords={All,Automatic,Catalan,ComplexInfinity,Constant,% - Degree,E,EndOfFile,EulerGamma,False,Flat,GoldenRatio,HoldAll,% - HoldFirst,HoldRest,I,Indeterminate,Infinity,Listable,Locked,% - Modular,None,Null,OneIdentity,Orderless,Pi,Protected,% - ReadProtected,True,$CommandLine,$Context,$ContextPath,$Display,% - $DisplayFunction,$Echo,$Epilog,$IgnoreEOF,$Line,$Messages,% - $Output,$Path,$Post,$Pre,$PrePrint,$RecursionLimit,$System,% - $Urgent,$Version},% - sensitive,% - morecomment=[s]{(*}{*)},% - morestring=[d]"% - }[keywords,comments,strings]% -%% -%% Octave definition (c) 2001,2002 Ulrich G. Wortmann -%% -\lst@definelanguage{Octave}% - {morekeywords={gt,lt,gt,lt,amp,abs,acos,acosh,acot,acoth,acsc,acsch,% - all,angle,ans,any,asec,asech,asin,asinh,atan,atan2,atanh,auread,% - auwrite,axes,axis,balance,bar,bessel,besselk,bessely,beta,% - betainc,betaln,blanks,bone,break,brighten,capture,cart2pol,% - cart2sph,caxis,cd,cdf2rdf,cedit,ceil,chol,cla,clabel,clc,clear,% - clf,clock,close,colmmd,Colon,colorbar,colormap,ColorSpec,colperm,% - comet,comet3,compan,compass,computer,cond,condest,conj,contour,% - contour3,contourc,contrast,conv,conv2,cool,copper,corrcoef,cos,% - cosh,cot,coth,cov,cplxpair,cputime,cross,csc,csch,csvread,% - csvwrite,cumprod,cumsum,cylinder,date,dbclear,dbcont,dbdown,% - dbquit,dbstack,dbstatus,dbstep,dbstop,dbtype,dbup,ddeadv,ddeexec,% - ddeinit,ddepoke,ddereq,ddeterm,ddeunadv,deblank,dec2hex,deconv,% - del2,delete,demo,det,diag,diary,diff,diffuse,dir,disp,dlmread,% - dlmwrite,dmperm,dot,drawnow,echo,eig,ellipj,ellipke,else,elseif,% - end,engClose,engEvalString,engGetFull,engGetMatrix,engOpen,% - engOutputBuffer,engPutFull,engPutMatrix,engSetEvalCallback,% - engSetEvalTimeout,engWinInit,eps,erf,erfc,erfcx,erfinv,% - errorbar,etime,etree,eval,exist,exp,expint,expm,expo,eye,fclose,% - feather,feof,ferror,feval,fft,fft2,fftshift,fgetl,fgets,figure,% - fill,fill3,filter,filter2,find,findstr,finite,fix,flag,fliplr,% - flipud,floor,flops,fmin,fmins,fopen,for,format,fplot,fprintf,% - fread,frewind,fscanf,fseek,ftell,full,function,funm,fwrite,fzero,% - gallery,gamma,gammainc,gammaln,gca,gcd,gcf,gco,get,getenv,% - getframe,ginput,global,gplot,gradient,gray,graymon,grid,griddata,% - gtext,hadamard,hankel,help,hess,hex2dec,hex2num,hidden,hilb,hist,% - hold,home,hostid,hot,hsv,hsv2rgb,if,ifft,ifft2,imag,image,% - imagesc,Inf,info,input,int2str,interp1,interp2,interpft,inv,% - invhilb,isempty,isglobal,ishold,isieee,isinf,isletter,isnan,% - isreal,isspace,issparse,isstr,jet,keyboard,kron,lasterr,lcm,% - legend,legendre,length,lin2mu,line,linspace,load,log,log10,log2,% - loglog,logm,logspace,lookfor,lower,ls,lscov,lu,magic,matClose,% - matDeleteMatrix,matGetDir,matGetFp,matGetFull,matGetMatrix,% - matGetNextMatrix,matGetString,matlabrc,matlabroot,matOpen,% - matPutFull,matPutMatrix,matPutString,max,mean,median,menu,mesh,% - meshc,meshgrid,meshz,mexAtExit,mexCallMATLAB,mexdebug,% - mexErrMsgTxt,mexEvalString,mexFunction,mexGetFull,mexGetMatrix,% - mexGetMatrixPtr,mexPrintf,mexPutFull,mexPutMatrix,mexSetTrapFlag,% - min,more,movie,moviein,mu2lin,mxCalloc,mxCopyCharacterToPtr,% - mxCopyComplex16ToPtr,mxCopyInteger4ToPtr,mxCopyPtrToCharacter,% - mxCopyPtrToComplex16,mxCopyPtrToInteger4,mxCopyPtrToReal8,% - mxCopyReal8ToPtr,mxCreateFull,mxCreateSparse,mxCreateString,% - mxFree,mxFreeMatrix,mxGetIr,mxGetJc,mxGetM,mxGetN,mxGetName,% - mxGetNzmax,mxGetPi,mxGetPr,mxGetScalar,mxGetString,mxIsComplex,% - mxIsFull,mxIsNumeric,mxIsSparse,mxIsString,mxIsTypeDouble,% - mxSetIr,mxSetJc,mxSetM,mxSetN,mxSetName,mxSetNzmax,mxSetPi,% - mxSetPr,NaN,nargchk,nargin,nargout,newplot,nextpow2,nnls,nnz,% - nonzeros,norm,normest,null,num2str,nzmax,ode23,ode45,orient,orth,% - pack,pascal,patch,path,pause,pcolor,pi,pink,pinv,plot,plot3,% - pol2cart,polar,poly,polyder,polyeig,polyfit,polyval,polyvalm,% - pow2,print,printopt,prism,prod,pwd,qr,qrdelete,qrinsert,quad,% - quad8,quit,quiver,qz,rand,randn,randperm,rank,rat,rats,rbbox,% - rcond,real,realmax,realmin,refresh,rem,reset,reshape,residue,% - return,rgb2hsv,rgbplot,rootobject,roots,rose,rosser,rot90,rotate,% - round,rref,rrefmovie,rsf2csf,save,saxis,schur,sec,sech,semilogx,% - semilogy,set,setstr,shading,sign,sin,sinh,size,slice,sort,sound,% - spalloc,sparse,spaugment,spconvert,spdiags,specular,speye,spfun,% - sph2cart,sphere,spinmap,spline,spones,spparms,sprandn,sprandsym,% - sprank,sprintf,spy,sqrt,sqrtm,sscanf,stairs,startup,std,stem,% - str2mat,str2num,strcmp,strings,strrep,strtok,subplot,subscribe,% - subspace,sum,surf,surface,surfc,surfl,surfnorm,svd,symbfact,% - symmmd,symrcm,tan,tanh,tempdir,tempname,terminal,text,tic,title,% - toc,toeplitz,trace,trapz,tril,triu,type,uicontrol,uigetfile,% - uimenu,uiputfile,unix,unwrap,upper,vander,ver,version,view,% - viewmtx,waitforbuttonpress,waterfall,wavread,wavwrite,what,% - whatsnew,which,while,white,whitebg,who,whos,wilkinson,wk1read,% - stderr,stdout,plot,set,endif,wk1write,xlabel,xor,ylabel,zeros,% - zlabel,zoom,endwhile,endfunction},% - sensitive=f,% - morecomment=[l]\#,% - morecomment=[l]\#\#,% - morestring=[m]',% - morestring=[m]"% - }[keywords,comments,strings]% -\lst@definelanguage[XSC]{Pascal}[Standard]{Pascal} - {deletekeywords={alfa,byte,pack,unpack},% 1998 Andreas Stephan - morekeywords={dynamic,external,forward,global,module,nil,operator,% - priority,sum,type,use,dispose,mark,page,release,cimatrix,% - cinterval,civector,cmatrix,complex,cvector,dotprecision,imatrix,% - interval,ivector,rmatrix,rvector,string,im,inf,re,sup,chr,comp,% - eof,eoln,expo,image,ival,lb,lbound,length,loc,mant,maxlength,odd,% - ord,pos,pred,round,rval,sign,substring,succ,trunc,ub,ubound}% - }% -\lst@definelanguage[Borland6]{Pascal}[Standard]{Pascal} - {morekeywords={asm,constructor,destructor,implementation,inline,% - interface,nil,object,shl,shr,string,unit,uses,xor},% - morendkeywords={Abs,Addr,ArcTan,Chr,Concat,Copy,Cos,CSeg,DiskFree,% - DiskSize,DosExitCode,DosVersion,DSeg,EnvCount,EnvStr,Eof,Eoln,% - Exp,FExpand,FilePos,FileSize,Frac,FSearch,GetBkColor,GetColor,% - GetDefaultPalette,GetDriverName,GetEnv,GetGraphMode,GetMaxMode,% - GetMaxX,GetMaxY,GetModeName,GetPaletteSize,GetPixel,GetX,GetY,% - GraphErrorMsg,GraphResult,Hi,ImageSize,InstallUserDriver,% - InstallUserFont,Int,IOResult,KeyPressed,Length,Lo,MaxAvail,% - MemAvail,MsDos,Odd,Ofs,Ord,OvrGetBuf,OvrGetRetry,ParamCount,% - ParamStr,Pi,Pos,Pred,Ptr,Random,ReadKey,Round,SeekEof,SeekEoln,% - Seg,SetAspectRatio,Sin,SizeOf,Sound,SPtr,Sqr,Sqrt,SSeg,Succ,% - Swap,TextHeight,TextWidth,Trunc,TypeOf,UpCase,WhereX,WhereY,% - Append,Arc,Assign,AssignCrt,Bar,Bar3D,BlockRead,BlockWrite,ChDir,% - Circle,ClearDevice,ClearViewPort,Close,CloseGraph,ClrEol,ClrScr,% - Dec,Delay,Delete,DelLine,DetectGraph,Dispose,DrawPoly,Ellipse,% - Erase,Exec,Exit,FillChar,FillEllipse,FillPoly,FindFirst,FindNext,% - FloodFill,Flush,FreeMem,FSplit,GetArcCoords,GetAspectRatio,% - GetDate,GetDefaultPalette,GetDir,GetCBreak,GetFAttr,% - GetFillSettings,GetFTime,GetImage,GetIntVec,GetLineSettings,% - GetMem,GetPalette,GetTextSettings,GetTime,GetVerify,% - GetViewSettings,GoToXY,Halt,HighVideo,Inc,InitGraph,Insert,% - InsLine,Intr,Keep,Line,LineRel,LineTo,LowVideo,Mark,MkDir,Move,% - MoveRel,MoveTo,MsDos,New,NormVideo,NoSound,OutText,OutTextXY,% - OvrClearBuf,OvrInit,OvrInitEMS,OvrSetBuf,PackTime,PieSlice,% - PutImage,PutPixel,Randomize,Rectangle,Release,Rename,% - RestoreCrtMode,RmDir,RunError,Sector,Seek,SetActivePage,% - SetAllPalette,SetBkColor,SetCBreak,SetColor,SetDate,SetFAttr,% - SetFillPattern,SetFillStyle,SetFTime,SetGraphBufSize,% - SetGraphMode,SetIntVec,SetLineStyle,SetPalette,SetRGBPalette,% - SetTextBuf,SetTextJustify,SetTextStyle,SetTime,SetUserCharSize,% - SetVerify,SetViewPort,SetVisualPage,SetWriteMode,Sound,Str,% - SwapVectors,TextBackground,TextColor,TextMode,Truncate,% - UnpackTime,Val,Window}% - }% -\lst@definelanguage[Standard]{Pascal}% - {morekeywords={alfa,and,array,begin,boolean,byte,case,char,const,div,% - do,downto,else,end,false,file,for,function,get,goto,if,in,% - integer,label,maxint,mod,new,not,of,or,pack,packed,page,program,% - put,procedure,read,readln,real,record,repeat,reset,rewrite,set,% - text,then,to,true,type,unpack,until,var,while,with,write,% - writeln},% - sensitive=f,% - morecomment=[s]{(*}{*)},% - morecomment=[s]{\{}{\}},% - morestring=[d]'% - }[keywords,comments,strings]% -\lst@definelanguage{Perl}% - {morekeywords={abs,accept,alarm,atan2,bind,binmode,bless,caller,% - chdir,chmod,chomp,chop,chown,chr,chroot,close,closedir,connect,% - continue,cos,crypt,dbmclose,dbmopen,defined,delete,die,do,dump,% - each,else,elsif,endgrent,endhostent,endnetent,endprotoent,% - endpwent,endservent,eof,eval,exec,exists,exit,exp,fcntl,fileno,% - flock,for,foreach,fork,format,formline,getc,getgrent,getgrgid,% - getgrnam,gethostbyaddr,gethostbyname,gethostent,getlogin,% - getnetbyaddr,getnetbyname,getnetent,getpeername,getpgrp,% - getppid,getpriority,getprotobyname,getprotobynumber,getprotoent,% - getpwent,getpwnam,getpwuid,getservbyname,getservbyport,% - getservent,getsockname,getsockopt,glob,gmtime,goto,grep,hex,if,% - import,index,int,ioctl,join,keys,kill,last,lc,lcfirst,length,% - link,listen,local,localtime,log,lstat,m,map,mkdir,msgctl,msgget,% - msgrcv,msgsnd,my,next,no,oct,open,opendir,ord,pack,package,pipe,% - pop,pos,print,printf,prototype,push,q,qq,quotemeta,qw,qx,rand,% - read,readdir,readlink,recv,redo,ref,rename,require,reset,return,% - reverse,rewinddir,rindex,rmdir,s,scalar,seek,seekdir,select,% - semctl,semget,semop,send,setgrent,sethostent,setnetent,setpgrp,% - setpriority,setprotoent,setpwent,setservent,setsockopt,shift,% - shmctl,shmget,shmread,shmwrite,shutdown,sin,sleep,socket,% - socketpair,sort,splice,split,sprintf,sqrt,srand,stat,study,sub,% - substr,symlink,syscall,sysopen,sysread,system,syswrite,tell,% - telldir,tie,tied,time,times,tr,truncate,uc,ucfirst,umask,undef,% - unless,unlink,unpack,unshift,untie,until,use,utime,values,vec,% - wait,waitpid,wantarray,warn,while,write,y},% - sensitive,% - morecomment=[l]\#,% - morestring=[b]",% - morestring=[b]',% - MoreSelectCharTable=% - \lst@ReplaceInput{\$\#}{\lst@ProcessOther\$\lst@ProcessOther\#}% - }[keywords,comments,strings]% -%% -%% POV definition (c) 1999 Berthold H\"ollmann -%% -\lst@definelanguage{POV}% - {morekeywords={abs,absorption,acos,acosh,adaptive,adc_bailout,agate,% - agate_turb,all,alpha,ambient,ambient_light,angle,aperture,append,% - arc_angle,area_light,array,asc,asin,asinh,assumed_gamma,atan,% - atan2,atanh,average,background,bezier_spline,bicubic_patch,% - black_hole,blob,blue,blur_samples,bounded_by,box,boxed,bozo,% - break,brick,brick_size,brightness,brilliance,bumps,bump_map,% - bump_size,camera,case,caustics,ceil,checker,chr,clipped_by,clock,% - clock_delta,color,color_map,colour,colour_map,component,% - composite,concat,cone,confidence,conic_sweep,control0,control1,% - cos,cosh,count,crackle,crand,cube,cubic,cubic_spline,cubic_wave,% - cylinder,cylindrical,debug,declare,default,defined,degrees,% - density,density_file,density_map,dents,difference,diffuse,% - dimensions,dimension_size,direction,disc,distance,% - distance_maximum,div,eccentricity,else,emission,end,error,% - error_bound,exp,extinction,fade_distance,fade_power,falloff,% - falloff_angle,false,fclose,file_exists,filter,finish,fisheye,% - flatness,flip,floor,focal_point,fog,fog_alt,fog_offset,fog_type,% - fopen,frequency,gif,global_settings,gradient,granite,% - gray_threshold,green,height_field,hexagon,hf_gray_16,hierarchy,% - hollow,hypercomplex,if,ifdef,iff,ifndef,image_map,include,int,% - interior,interpolate,intersection,intervals,inverse,ior,irid,% - irid_wavelength,jitter,julia_fractal,lambda,lathe,leopard,% - light_source,linear_spline,linear_sweep,local,location,log,% - looks_like,look_at,low_error_factor,macro,mandel,map_type,marble,% - material,material_map,matrix,max,max_intersections,max_iteration,% - max_trace_level,media,media_attenuation,media_interaction,merge,% - mesh,metallic,min,minimum_reuse,mod,mortar,nearest_count,no,% - normal,normal_map,no_shadow,number_of_waves,object,octaves,off,% - offset,omega,omnimax,on,once,onion,open,orthographic,panoramic,% - perspective,pgm,phase,phong,phong_size,pi,pigment,pigment_map,% - planar,plane,png,point_at,poly,polygon,poly_wave,pot,pow,ppm,% - precision,prism,pwr,quadratic_spline,quadric,quartic,quaternion,% - quick_color,quick_colour,quilted,radial,radians,radiosity,radius,% - rainbow,ramp_wave,rand,range,ratio,read,reciprocal,% - recursion_limit,red,reflection,reflection_exponent,refraction,% - render,repeat,rgb,rgbf,rgbft,rgbt,right,ripples,rotate,roughness,% - samples,scale,scallop_wave,scattering,seed,shadowless,sin,% - sine_wave,sinh,sky,sky_sphere,slice,slope_map,smooth,% - smooth_triangle,sor,specular,sphere,spherical,spiral1,spiral2,% - spotlight,spotted,sqr,sqrt,statistics,str,strcmp,strength,strlen,% - strlwr,strupr,sturm,substr,superellipsoid,switch,sys,t,tan,tanh,% - text,texture,texture_map,tga,thickness,threshold,tightness,tile2,% - tiles,torus,track,transform,translate,transmit,triangle,% - triangle_wave,true,ttf,turbulence,turb_depth,type,u,% - ultra_wide_angle,undef,union,up,use_color,use_colour,use_index,% - u_steps,v,val,variance,vaxis_rotate,vcross,vdot,version,vlength,% - vnormalize,vrotate,v_steps,warning,warp,water_level,waves,while,% - width,wood,wrinkles,write,x,y,yes,z},% - moredirectives={break,case,debug,declare,default,else,end,fclose,% - fopen,local,macro,read,render,statistics,switch,undef,version,% - warning,write},% - moredelim=*[directive]\#,% - sensitive,% - morecomment=[l]//,% - morecomment=[s]{/*}{*/},% - morestring=[d]",% - }[keywords,directives,comments,strings]% -%% -%% Python definition (c) 1998 Michael Weber -%% -\lst@definelanguage{Python}% - {morekeywords={access,and,break,class,continue,def,del,elif,else,% - except,exec,finally,for,from,global,if,import,in,is,lambda,not,% - or,pass,print,raise,return,try,while},% - sensitive=true,% - morecomment=[l]\#,% - morecomment=[s]{'''}{'''},% used for documentation text - morecomment=[s]{"""}{"""},% added by Philipp Matthias Hahn - morestring=[b]',% - morestring=[b]"% - }% -%% -%% Scilab definition (c) 2002,2003 Jean-Philippe Grivet -%% -\lst@definelanguage{Scilab}% - {morekeywords={abcd,abinv,abort,abs,acoshm,acosh,acosm,acos,addcolor,% - addf,addinter,addmenu,add_edge,add_node,adj2sp,adj_lists,aff2ab,% - amell,analpf,analyze,ans,apropos,arc_graph,arc_number,argn,arhnk,% - arl2,arma2p,armac,armax1,armax,arma,arsimul,artest,articul,ascii,% - asinhm,asinh,asinm,asin,atanhm,atanh,atanm,atan,augment,auread,% - auwrite,balanc,balreal,bandwr,basename,bdiag,besseli,besselj,% - besselk,bessely,best_match,bezout,bifish,bilin,binomial,black,% - bloc2exp,bloc2ss,bode,bool2s,boolean,boucle,break,bstap,buttmag,% - bvode,cainv,calerf,calfrq,call,canon,casc,case,ccontrg,cdfbet,% - cdfbin,cdfchi,cdfchn,cdffnc,cdff,cdfgam,cdfnbn,cdfnor,cdfpoi,% - cdft,ceil,center,cepstrum,chaintest,chain_struct,champ1,champ,% - chart,chdir,cheb1mag,cheb2mag,check_graph,check_io,chepol,chfact,% - chol,chsolve,circuit,classmarkov,clean,clearfun,clearglobal,% - clear,close,cls2dls,cmb_lin,cmndred,cmoment,code2str,coeff,coffg,% - coff,colcompr,colcomp,colinout,colormap,colregul,companion,comp,% - cond,conj,connex,contour2di,contour2d,contourf,contour,% - contract_edge,contrss,contr,cont_frm,cont_mat,convex_hull,convol,% - convstr,con_nodes,copfac,copy,correl,corr,coshm,cosh,cosm,cos,% - cotg,cothm,coth,covar,csim,cspect,ctr_gram,cumprod,cumsum,% - curblock,cycle_basis,czt,c_link,dasrt,dassl,datafit,date,dbphi,% - dcf,ddp,debug,dec2hex,deff,definedfields,degree,delbpt,% - delete_arcs,delete_nodes,delete,delip,delmenu,demos,denom,% - derivative,derivat,des2ss,des2tf,determ,detr,det,dft,dhinf,% - dhnorm,diag,diary,diff,diophant,dirname,dispbpt,dispfiles,disp,% - dlgamma,double,dragrect,drawaxis,drawlater,drawnow,draw,driver,% - dscr,dsearch,dsimul,dtsi,dt_ility,duplicate,edge_number,% - edit_curv,edit_graph_menus,edit_graph,edit,eigenmarkov,ell1mag,% - elseif,else,emptystr,endfunction,end,eqfir,eqiir,equil1,equil,% - ereduc,erfcx,erfc,erf,errbar,errcatch,errclear,error,eval3dp,% - eval3d,eval,evans,evstr,excel2sci,execstr,exec,exists,exit,expm,% - exp,external,eye,fac3d,factors,faurre,fchamp,fcontour2d,fcontour,% - fec,feedback,feval,ffilt,fftshift,fft,fgrayplot,figure,fileinfo,% - file,filter,findm,findobj,findx0BD,find_freq,find_path,find,% - findABCD,findAC,findBD,findBDK,findR,fit_dat,fix,floor,flts,foo,% - formatman,format,fort,for,fourplan,fplot2d,fplot3d1,fplot3d,% - fprintf,fprintfMat,frep2tf,freq,freson,frexp,frfit,frmag,fscanf,% - fscanfMat,fsfirlin,fsolve,fspecg,fstabst,fstair,ftest,ftuneq,% - fullrfk,fullrf,full,fun2string,funcprot,functions,function,% - funptr,fusee,gainplot,gamitg,gammaln,gamma,gcare,gcd,gcf,% - genfac3d,genlib,genmarkov,gen_net,geom3d,geomean,getblocklabel,% - getcolor,getcurblock,getcwd,getdate,getd,getenv,getfield,getfont,% - getf,getio,getlinestyle,getmark,getpid,getscicosvars,getsymbol,% - getvalue,getversion,get_function_path,get,gfare,gfrancis,girth,% - givens,glever,glist,global,glue,gpeche,graduate,grand,% - graphics_entities,graph_2_mat,graph_center,graph_complement,% - graph_diameter,graph_power,graph_simp,graph_sum,graph_union,% - graph-list,graycolormap,grayplot,graypolarplot,grep,group,% - gr_menu,gschur,gsort,gspec,gstacksize,gtild,g_margin,h2norm,halt,% - hamilton,hankelsv,hank,harmean,havewindow,help,hermit,hess,% - hex2dec,hilb,hinf,hist3d,histplot,horner,host,hotcolormap,% - householder,hrmt,htrianr,hypermat,h_cl,h_inf_st,h_inf,h_norm,% - iconvert,icon_edit,ieee,if,iirgroup,iirlp,iir,ilib_build,% - ilib_compile,ilib_for_link,ilib_gen_gateway,ilib_gen_loader,% - ilib_gen_Make,imag,impl,imrep2ss,imult,im_inv,inistate,input,% - int16,int2d,int32,int3d,int8,intc,intdec,integrate,interpln,% - interp,intersci,intersect,intg,intl,intppty,intsplin,inttrap,% - inttype,int,invr,invsyslin,inv_coeff,inv,iqr,isdef,isdir,isequal,% - iserror,isglobal,isinf,isnan,isoview,isreal,is_connex,jmat,% - justify,kalm,karmarkar,kernel,keyboard,knapsack,kpure,krac2,% - kroneck,kron,lasterror,lattn,lattp,lcf,lcmdiag,lcm,ldivf,ldiv,% - leastsq,legends,length,leqr,levin,lev,lex_sort,lft,lgfft,library,% - lib,lin2mu,lincos,lindquist,lines,line_graph,linfn,linf,link,% - linmeq,linpro,linsolve,linspace,lin,listfiles,list,lmisolver,% - lmitool,loadmatfile,loadplots,loadwave,load_graph,load,locate,% - log10,log1p,log2,logm,logspace,log,lotest,lqe,lqg2stan,lqg_ltr,% - lqg,lqr,lsq,lsslist,lstcat,lstsize,ltitr,ludel,lufact,luget,% - lusolve,lu,lyap,macglov,macr2lst,macrovar,macro,mad,make_graph,% - make_index,manedit,man,mapsound,markp2ss,matfile2sci,matrix,% - mat_2_graph,maxi,max_cap_path,max_clique,max_flow,max,mclearerr,% - mclose,meanf,mean,median,meof,mese,mesh2d,mfft,mfile2sci,mgeti,% - mgetl,mgetstr,mget,milk_drop,mine,mini,minreal,minss,% - min_lcost_cflow,min_lcost_flow1,min_lcost_flow2,min_qcost_flow,% - min_weight_tree,min,mlist,mode,modulo,moment,mopen,move,% - mps2linpro,mputl,mputstr,mput,mrfit,msd,mseek,mtell,mtlb_load,% - mtlb_mode,mtlb_save,mtlb_sparse,mu2lin,mulf,mvvacov,m_circle,% - names,nand2mean,nanmax,nanmeanf,nanmean,nanmedian,nanmin,% - nanstdev,nansum,narsimul,ndims,nearfloat,nehari,neighbors,% - netclose,netwindows,netwindow,newest,newfun,nextpow2,nf3d,nfreq,% - nlev,nnz,nodes_2_path,nodes_degrees,node_number,noisegen,norm,% - null,numdiff,numer,nyquist,obscont1,obscont,observer,obsvss,% - obsv_mat,obs_gram,odedc,odedi,odeoptions,ode_discrete,ode_root,% - ode,oldload,oldsave,ones,optim,orth,param3d1,param3d,% - paramfplot2d,parrot,part,pathconvert,path_2_nodes,pause,pbig,% - pdiv,pen2ea,pencan,penlaur,perctl,perfect_match,pertrans,pfss,% - phasemag,phc,pinv,pipe_network,playsnd,plot2d1,plot2d2,plot2d3,% - plot2d4,plot2d,plot3d1,plot3d2,plot3d3,plot3d,plotframe,% - plotprofile,plot_graph,plot,plzr,pmodulo,pol2des,pol2str,pol2tex,% - polarplot,polar,polfact,poly,portr3d,portrait,power,ppol,prbs_a,% - predecessors,predef,printf,printing,print,prod,profile,projsl,% - projspec,proj,psmall,pspect,pvm_addhosts,pvm_barrier,pvm_bcast,% - pvm_bufinfo,pvm_config,pvm_delhosts,pvm_error,pvm_exit,% - pvm_f772sci,pvm_getinst,pvm_gettid,pvm_get_timer,pvm_gsize,% - pvm_halt,pvm_joingroup,pvm_kill,pvm_lvgroup,pvm_mytid,pvm_parent,% - pvm_probe,pvm_recv,pvm_reduce,pvm_sci2f77,pvm_send,pvm_set_timer,% - pvm_spawn_independent,pvm_spawn,pvm_start,pvm_tasks,% - pvm_tidtohost,pvm,pwd,p_margin,qassign,qr,quapro,quart,quaskro,% - quit,randpencil,rand,range,rankqr,rank,rat,rcond,rdivf,read4b,% - readb,readc_,readmps,read,real,recur,reglin,regress,remezb,remez,% - repfreq,replot,residu,resume,return,riccati,riccsl,ricc,ric_desc,% - rlist,roots,rotate,round,routh_t,rowcompr,rowcomp,rowinout,% - rowregul,rowshuff,rpem,rref,rtitr,rubberbox,salesman,savewave,% - save_graph,save,scaling,scanf,schur,sci2exp,sci2for,sci2map,% - sciargs,scicosim,scicos,scifunc_block,sd2sci,secto3d,select,% - semidef,sensi,setbpt,seteventhandler,setfield,setmenu,% - setscicosvars,set,sfact,sgrid,shortest_path,showprofile,% - show_arcs,show_graph,show_nodes,sident,signm,sign,simp_mode,simp,% - sincd,sinc,sinc,sinhm,sinh,sinm,sin,size,sm2des,sm2ss,smooth,% - solve,sorder,sort,sound,sp2adj,spaninter,spanplus,spantwo,sparse,% - spchol,spcompack,specfact,spec,speye,spget,splin,split_edge,% - spones,sprand,sprintf,spzeros,sqroot,sqrtm,sqrt,squarewave,% - square,srfaur,srkf,ss2des,ss2ss,ss2tf,sscanf,sskf,ssprint,ssrand,% - stabil,stacksize,standard_define,standard_draw,standard_input,% - standard_origin,standard_output,startup,stdevf,stdev,steadycos,% - str2code,strange,strcat,strindex,strings,string,stripblanks,% - strong_connex,strong_con_nodes,strsubst,st_deviation,st_ility,% - subf,subgraph,subplot,successors,sum,supernode,sva,svd,svplot,% - sylm,sylv,sysconv,sysdiag,sysfact,syslin,syssize,systems,system,% - systmat,tabul,tangent,tanhm,tanh,tanm,tan,tdinit,testmatrix,% - texprint,tf2des,tf2ss,then,thrownan,timer,time_id,titlepage,% - tk_getdir,tk_getfile,tlist,toeplitz,tokenpos,tokens,trace,% - translatepaths,trans_closure,trans,trfmod,trianfml,tril,trimmean,% - trisolve,triu,trzeros,typename,typeof,type,uicontrol,uimenu,% - uint16,uint32,uint8,ui_observer,ulink,unglue,union,unique,unix_g,% - unix_s,unix_w,unix_x,unix,unobs,unsetmenu,user,varargin,% - varargout,variancef,variance,varn,warning,wavread,wavwrite,% - wcenter,wfir,what,whereami,whereis,where,while,whos,who_user,who,% - wiener,wigner,window,winsid,with_gtk,with_pvm,with_texmacs,% - with_tk,writb,write4b,write,xarcs,xarc,xarrows,xaxis,xbasc,% - xbasimp,xbasr,xchange,xclear,xclea,xclick,xclip,xdel,xend,xfarcs,% - xfarc,xfpolys,xfpoly,xfrect,xgetech,xgetfile,xgetmouse,xget,% - xgraduate,xgrid,xinfo,xinit,xlfont,xload,xname,xnumb,xpause,% - xpolys,xpoly,xrects,xrect,xrpoly,xs2fig,xs2gif,xs2ppm,xs2ps,% - xsave,xsegs,select,xsetech,xsetm,xset,xstringb,xstringl,xstring,% - xtape,xtitle,x_choices,x_choose,x_dialog,x_matrix,x_mdialog,% - x_message_modeless,x_message,yulewalk,zeropen,zeros,zgrid,zpbutt,% - zpch1,zpch2,zpell,mfprintf,mfscanf,mprintf,mscanf,msprintf,% - msscanf,mucomp,% - ABSBLK_f,AFFICH_f,ANDLOG_f,ANIMXY_f,BIGSOM_f,CLINDUMMY_f,CLKIN_f,% - CLKINV_f,CLKOUT_f,CLKOUTV_f,CLKSOM_f,CLKSOMV_f,CLKSPLIT_f,% - CLOCK_f,CLR_f,CLSS_f,CONST_f,COSBLK_f,CURV_f,DELAY_f,DELAYV_f,% - DEMUX_f,DLR_f,DLRADAPT_f,DLSS_f,EVENTSCOPE_f,EVTDLY_f,EVTGEN_f,% - EXPBLK_f,G_make,GAIN_f,GAINBLK_f,GENERAL_f,GENERIC_f,GENSIN_f,% - GENSQR_f,HALT_f,IFTHEL_f,IN_f,INTEGRAL_f,INTRP2BLK_f,INTRPLBLK_f,% - INVBLK_f,LOGBLK_f,LOOKUP_f,Matplot1,Matplot,MAX_f,MCLOCK_f,% - MFCLCK_f,MIN_f,MUX_f,NDcost,NEGTOPOS_f,OUT_f,POSTONEG_f,POWBLK_f,% - PROD_f,QUANT_f,RAND_f,READC_f,REGISTER_f,RELAY_f,RFILE_f,% - ScilabEval,Sfgrayplot,Sgrayplot,SAMPLEHOLD_f,SAT_f,SAWTOOTH_f,% - SCOPE_f,SCOPXY_f,SELECT_f,SINBLK_f,SOM_f,SPLIT_f,STOP_f,SUPER_f,% - TANBLK_f,TCLSS_f,TEXT_f,TIME_f,TK_EvalFile,TK_EvalStr,TK_GetVar,% - TK_SetVar,TRASH_f,WFILE_f,WRITEC_f,ZCROSS_f,% - \%asn,\%helps,\%k,\%sn},% - alsoletter=\%,% chmod - sensitive,% - morecomment=[l]//,% - morestring=[b]",% - morestring=[m]'% - }[keywords,comments,strings]% -%% -%% SQL definition (c) 1998 Christian Haul -%% (c) 2002 Neil Conway -%% (c) 2002 Robert Frank -%% (c) 2003 Dirk Jesko -%% -\lst@definelanguage{SQL}% - {morekeywords={ABSOLUTE,ACTION,ADD,ALLOCATE,ALTER,ARE,AS,ASSERTION,% - AT,BETWEEN,BIT_LENGTH,BOTH,BY,CASCADE,CASCADED,CASE,CAST,% - CATALOG,CHAR_LENGTH,CHARACTER_LENGTH,CLUSTER,COALESCE,% - COLLATE,COLLATION,COLUMN,CONNECT,CONNECTION,CONSTRAINT,% - CONSTRAINTS,CONVERT,CORRESPONDING,CREATE,CROSS,CURRENT_DATE,% - CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,DAY,DEALLOCATE,% - DEC,DEFERRABLE,DEFERED,DESCRIBE,DESCRIPTOR,DIAGNOSTICS,% - DISCONNECT,DOMAIN,DROP,ELSE,END,EXEC,EXCEPT,EXCEPTION,EXECUTE,% - EXTERNAL,EXTRACT,FALSE,FIRST,FOREIGN,FROM,FULL,GET,GLOBAL,% - GRAPHIC,HAVING,HOUR,IDENTITY,IMMEDIATE,INDEX,INITIALLY,INNER,% - INPUT,INSENSITIVE,INSERT,INTO,INTERSECT,INTERVAL,% - ISOLATION,JOIN,KEY,LAST,LEADING,LEFT,LEVEL,LIMIT,LOCAL,LOWER,% - MATCH,MINUTE,MONTH,NAMES,NATIONAL,NATURAL,NCHAR,NEXT,NO,NOT,NULL,% - NULLIF,OCTET_LENGTH,ON,ONLY,ORDER,ORDERED,OUTER,OUTPUT,OVERLAPS,% - PAD,PARTIAL,POSITION,PREPARE,PRESERVE,PRIMARY,PRIOR,READ,% - RELATIVE,RESTRICT,REVOKE,RIGHT,ROWS,SCROLL,SECOND,SELECT,SESSION,% - SESSION_USER,SIZE,SPACE,SQLSTATE,SUBSTRING,SYSTEM_USER,% - TABLE,TEMPORARY,THEN,TIMEZONE_HOUR,% - TIMEZONE_MINUTE,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,% - TRUE,UNIQUE,UNKNOWN,UPPER,USAGE,USING,VALUE,VALUES,% - VARGRAPHIC,VARYING,WHEN,WHERE,WRITE,YEAR,ZONE,% - AND,ASC,avg,CHECK,COMMIT,count,DECODE,DESC,DISTINCT,GROUP,IN,% FF - LIKE,NUMBER,ROLLBACK,SUBSTR,sum,VARCHAR2,% FF - MIN,MAX,UNION,UPDATE,% RF - ALL,ANY,CUBE,CUBE,DEFAULT,DELETE,EXISTS,GRANT,OR,RECURSIVE,% DJ - ROLE,ROLLUP,SET,SOME,TRIGGER,VIEW},% DJ - morendkeywords={BIT,BLOB,CHAR,CHARACTER,CLOB,DATE,DECIMAL,FLOAT,% DJ - INT,INTEGER,NUMERIC,SMALLINT,TIME,TIMESTAMP,VARCHAR},% moved here - sensitive=false,% DJ - morecomment=[l]--,% - morecomment=[s]{/*}{*/},% - morestring=[d]',% - morestring=[d]"% - }[keywords,comments,strings]% -%% -%% VHDL definition (c) 1997 Kai Wollenweber -%% -\lst@definelanguage{VHDL}% - {morekeywords={ALL,ARCHITECTURE,ABS,AND,ASSERT,ARRAY,AFTER,ALIAS,% - ACCESS,ATTRIBUTE,BEGIN,BODY,BUS,BLOCK,BUFFER,CONSTANT,CASE,% - COMPONENT,CONFIGURATION,DOWNTO,ELSE,ELSIF,END,ENTITY,EXIT,% - FUNCTION,FOR,FILE,GENERIC,GENERATE,GUARDED,GROUP,IF,IN,INOUT,IS,% - INERTIAL,IMPURE,LIBRARY,LOOP,LABEL,LITERAL,LINKAGE,MAP,MOD,NOT,% - NOR,NAND,NULL,NEXT,NEW,OUT,OF,OR,OTHERS,ON,OPEN,PROCESS,PORT,% - PACKAGE,PURE,PROCEDURE,POSTPONED,RANGE,REM,ROL,ROR,REPORT,RECORD,% - RETURN,REGISTER,REJECT,SIGNAL,SUBTYPE,SLL,SRL,SLA,SRA,SEVERITY,% - SELECT,THEN,TYPE,TRANSPORT,TO,USE,UNITS,UNTIL,VARIABLE,WHEN,WAIT,% - WHILE,XOR,XNOR,% - DISCONNECT,ELIF,WITH},% Arnaud Tisserand - sensitive=f,% 1998 Gaurav Aggarwal - morecomment=[l]--,% - morestring=[d]{"}% - }[keywords,comments,strings]% -%% -%% VHDL-AMS definition (c) Steffen Klupsch -%% -\lst@definelanguage[AMS]{VHDL}[]{VHDL}% - {morekeywords={ACROSS,ARRAY,BREAK,DISCONNECT,NATURE,NOISE,PORT,% - PROCEDURAL,QUANTITY,SHARED,SPECTRUM,SUBNATURE,TERMINAL,THROUGH,% - TOLERANCE,UNAFFACTED,UNITS}} -\lst@definelanguage{XSLT}[]{XML}% - {morekeywords={% - % main elements - xsl:stylesheet,xsl:transform,% - % childs of the main element - xsl:apply-imports,xsl:attribute-set,xsl:decimal-format,xsl:import,% - xsl:include,xsl:key,xsl:namespace-alias,xsl:output,xsl:param,% - xsl:preserve-space,xsl:strip-space,xsl:template,xsl:variable,% - % 21 directives - xsl:apply-imports,xsl:apply-templates,xsl:attribute,% - xsl:call-template,xsl:choose,xsl:comment,xsl:copy,xsl:copy-of,% - xsl:element,xsl:fallback,xsl:for-each,xsl:if,xsl:message,% - xsl:number,xsl:otherwise,xsl:processing-instruction,xsl:text,% - xsl:value-of,xsl:variable,xsl:when,xsl:with-param},% - alsodigit={-},% - }% -\lst@definelanguage{Ant}[]{XML}% - {morekeywords={% - project,target,patternset,include,exclude,excludesfile,includesfile,filterset,% - filter,filtersfile,libfileset,custom,classpath,fileset,none,depend,mapper,% - filename,not,date,contains,selector,depth,or,and,present,majority,size,dirset,% - filelist,pathelement,path,param,filterreader,extension,filterchain,linecontainsregexp,% - regexp,classconstants,headfilter,tabstospaces,striplinebreaks,tailfilter,stripjavacomments,% - expandproperties,linecontains,replacetokens,token,striplinecomments,comment,prefixlines,% - classfileset,rootfileset,root,description,xmlcatalog,entity,dtd,substitution,% - extensionSet,propertyfile,entry,vsscheckin,sql,transaction,cvspass,csc,% - dirname,wlrun,wlclasspath,p4label,replaceregexp,get,jjtree,sleep,jarlib,% - dependset,targetfileset,srcfileset,srcfilelist,targetfilelist,zip,zipgroupfileset,zipfileset,% - patch,jspc,webapp,style,test,arg,jvmarg,sysproperty,testlet,env,tstamp,% - format,unwar,vsshistory,icontract,cvschangelog,user,p4submit,ccmcheckin,% - p4change,bzip2,vssadd,javadoc,bottom,source,doctitle,header,excludepackage,bootclasspath,% - doclet,taglet,packageset,sourcepath,link,footer,package,group,title,tag,% - translate,signjar,vajload,vajproject,jarlib,extensionset,WsdlToDotnet,buildnumber,% - jpcovmerge,tomcat,ejbjar,weblogictoplink,jboss,borland,weblogic,iplanet,jonas,% - support,websphere,wasclasspath,war,manifest,attribute,section,metainf,lib,% - classes,webinf,rename,sequential,serverdeploy,generic,property,move,% - copydir,cccheckin,wljspc,fixcrlf,sosget,pathconvert,map,record,p4sync,exec,% - p4edit,maudit,rulespath,searchpath,antlr,netrexxc,jpcovreport,reference,filters,% - coveragepath,execon,targetfile,srcfile,ccmcheckout,ant,xmlvalidate,xslt,% - iplanet,ccmcheckintask,gzip,native2ascii,starteam,ear,archives,input,% - rmic,extdirs,compilerarg,checksum,mail,bcc,message,cc,to,from,loadfile,vsscheckout,% - stylebook,soscheckin,mimemail,stlabel,gunzip,concat,cab,touch,parallel,splash,% - antcall,cccheckout,typedef,p4have,xmlproperty,copy,tomcat,antstructure,ccmcreatetask,% - rpm,delete,replace,replacefilter,replacetoken,replacevalue,mmetrics,waitfor,isfalse,% - equals,available,filepath,os,filesmatch,istrue,isset,socket,http,uptodate,srcfiles,% - untar,loadproperties,echoproperties,vajexport,stcheckout,bunzip2,copyfile,vsscreate,% - ejbc,unjar,tomcat,wsdltodotnet,mkdir,condition,cvs,commandline,marker,argument,% - tempfile,junitreport,report,taskdef,echo,ccupdate,java,renameext,vsslabel,basename,% - javadoc2,vsscp,tar,tarfileset,tomcat,vajimport,setproxy,wlstop,p4counter,ilasm,% - soscheckout,apply,ccuncheckout,jarlib,location,url,cvstagdiff,jlink,mergefiles,% - addfiles,javacc,pvcs,pvcsproject,jarlib,options,depends,chmod,jar,sound,fail,% - success,mparse,blgenclient,genkey,dname,javah,class,ccmreconfigure,unzip,javac,% - src,p4add,soslabel,jpcoverage,triggers,method,vssget,deltree,ddcreator}, - deletekeywords={default},% - } -\lst@definelanguage{XML}% - {keywords={,CDATA,DOCTYPE,ATTLIST,termdef,ELEMENT,EMPTY,ANY,ID,% - IDREF,IDREFS,ENTITY,ENTITIES,NMTOKEN,NMTOKENS,NOTATION,% - INCLUDE,IGNORE,SYSTEM,PUBLIC,NDATA,PUBLIC,% - PCDATA,REQUIRED,IMPLIED,FIXED,%%% preceded by # - xml,xml:space,xml:lang,version,standalone,default,preserve},% - alsoother=$,% - alsoletter=:,% - tag=**[s]<>,% - morestring=[d]",% ??? doubled - morestring=[d]',% ??? doubled - MoreSelectCharTable=% - \lst@CArgX--\relax\lst@DefDelimB{}{}% - {\ifnum\lst@mode=\lst@tagmode\else - \expandafter\@gobblethree - \fi}% - \lst@BeginComment\lst@commentmode{{\lst@commentstyle}}% - \lst@CArgX--\relax\lst@DefDelimE{}{}{}% - \lst@EndComment\lst@commentmode - \lst@CArgX[CDATA[\relax\lst@CDef{}% - {\ifnum\lst@mode=\lst@tagmode - \expandafter\lst@BeginCDATA - \else \expandafter\lst@CArgEmpty - \fi}% - \@empty - \lst@CArgX]]\relax\lst@CDef{}% - {\ifnum\lst@mode=\lst@GPmode - \expandafter\lst@EndComment - \else \expandafter\lst@CArgEmpty - \fi}% - \@empty - }[keywords,comments,strings,html]% -\endinput -%% -%% End of file `lstlang1.sty'. diff --git a/org.glite.lb.doc/src/lstlang2.sty b/org.glite.lb.doc/src/lstlang2.sty deleted file mode 100644 index c1c9121..0000000 --- a/org.glite.lb.doc/src/lstlang2.sty +++ /dev/null @@ -1,1532 +0,0 @@ -%% -%% This is file `lstlang2.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% lstdrvrs-1.3.dtx (with options: `lang2') -%% -%% (w)(c) 1996/1997/1998/1999/2000/2001/2002/2003/2004 Carsten Heinz -%% and/or any other author listed elsewhere in this file. -%% -%% This file is distributed under the terms of the LaTeX Project Public -%% License from CTAN archives in directory macros/latex/base/lppl.txt. -%% Either version 1.0 or, at your option, any later version. -%% -%% This file is completely free and comes without any warranty. -%% -%% Send comments and ideas on the package, error reports and additional -%% programming languages to . -%% -\ProvidesFile{lstlang2.sty} - [2004/09/05 1.3 listings language file] -%% -%% Abap definition by Knut Lickert -%% -\lst@definelanguage[R/3 6.10]{ABAP}[R/3 4.6C]{ABAP}% - {morekeywords={try,endtry},% - }[keywords,comments,strings] -\lst@definelanguage[R/3 4.6C]{ABAP}[R/3 3.1]{ABAP}% - {morekeywords={method,ref,class,create,object,% - methods,endmethod,private,protected,public,section,% - catch,system-exceptions,endcatch,% - },% - moreprocnamekeys={class},% - literate={->}{{$\rightarrow$}}1{=>}{{$\Rightarrow$}}1,% - }[keywords,comments,strings,procnames] -\lst@definelanguage[R/3 3.1]{ABAP}[R/2 5.0]{ABAP}{}% -\lst@definelanguage[R/2 5.0]{ABAP}% - {sensitive=f,% - procnamekeys={report,program,form,function,module},% - morekeywords={*,add,after,alias,analyzer,and,append,appending,area,assign,at,% - authority-check,before,binary,blank,break-point,calendar,call,% - case,change,changing,check,clear,cnt,co,collect,commit,common,% - component,compute,condense,corresponding,cos,cp,cs,currency-conversion,% - cursor,data,database,dataset,decimals,define,delete,deleting,dequeue,% - describe,detail,dialog,directory,div,divide,do,documentation,% - during,dynpro,else,end-of-page,end-of-selection,endat,endcase,% - enddo,endfor,endform,endif,endloop,endmodule,endselect,% - endwhile,enqueue,exceptions,exit,exp,export,exporting,extract,% - field,fields,field-groups,field-symbols,find,for,form,format,free,% - from,function,generating,get,giving,hide,id,if,import,% - importing,in,incl,include,initial,initialization,input,insert,% - interrupt,into,is,language,leave,leading,left-justified,like,line,lines,line-count, - line-selection,list-processing,load,local,log,logfile,loop,% - margin,mark,mask,memory,menue,message,mod,modify,module,move,% - move-text,multiply,na,new,new-line,new-page,no-gaps,np,ns,% - number,obligatory,occurs,of,on,or,others,output,parameter,% - parameters,parts,perform,pf-status,places,position,process,% - raise,raising,ranges,read,refresh,refresh-dynpro,reject,remote,% - replace,report,reserve,reset,restart,right-justified,run,screen,scroll,search,% - segments,select,select-options,selection-screen,set,shift,sin,% - single,sqrt,start-of-selection,statement,structure,submit,% - subtract,summary,summing,suppress,system,table,tables,task,% - text,time,to,top-of-page,trace,transaction,transfer,% - transfer-dynpro,translate,type,unpack,update,user-command,% - using,value,when,where,while,window,with,workfile,write,},% - morecomment=[l]",% - morecomment=[f][0]*,% - morestring=[d]'% - }[keywords,comments,strings,procnames] -\lst@definelanguage[R/2 4.3]{ABAP}[R/2 5.0]{ABAP}% - {deletekeywords={function,importing,exporting,changing,exceptions,% - raise,raising}% - }[keywords,comments,strings] -%% -%% Corba IDL definition (c) 1999 Jens T. Berger Thielemann -%% -\lst@definelanguage[CORBA]{IDL}% - {morekeywords={any,attribute,boolean,case,char,const,context,default,% - double,enum,exception,fixed,float,in,inout,interface,long,module,% - native,Object,octet,oneway,out,raises,readonly,sequence,short,% - string,struct,switch,typedef,union,unsigned,void,wchar,wstring,% - FALSE,TRUE},% - sensitive,% - moredirectives={define,elif,else,endif,error,if,ifdef,ifndef,line,% - include,pragma,undef,warning},% - moredelim=*[directive]\#,% - morecomment=[l]//,% - morecomment=[s]{/*}{*/},% - morestring=[b]"% - }[keywords,comments,strings,directives]% -%% -%% (Objective) Caml definition (c) 1999 Patrick Cousot -%% -%% Objective CAML and Caml light are freely available, together with a -%% reference manual, at URL ftp.inria.fr/lang/caml-light for the Unix, -%% Windows and Macintosh OS operating systems. -%% -\lst@definelanguage[Objective]{Caml}[light]{Caml} - {deletekeywords={not,prefix,value,where},% - morekeywords={assert,asr,class,closed,constraint,external,false,% - functor,include,inherit,land,lazy,lor,lsl,lsr,lxor,method,mod,% - module,new,open,parser,private,sig,struct,true,val,virtual,when,% - object,ref},% TH - }% -\lst@definelanguage[light]{Caml} - {morekeywords={and,as,begin,do,done,downto,else,end,exception,for,% - fun,function,if,in,let,match,mutable,not,of,or,prefix,rec,then,% - to,try,type,value,where,while,with},% - sensitive,% - morecomment=[n]{(*}{*)},% - morestring=[b]",% - moredelim=*[directive]\#,% - moredirectives={open,close,include}% - }[keywords,comments,strings,directives]% -\lst@definelanguage[ibm]{Cobol}[1985]{Cobol}% - {morekeywords={ADDRESS,BEGINNING,COMP-3,COMP-4,COMPUTATIONAL,% - COMPUTATIONAL-3,COMPUTATIONAL-4,DISPLAY-1,EGCS,EJECT,ENDING,% - ENTRY,GOBACK,ID,MORE-LABELS,NULL,NULLS,PASSWORD,RECORDING,% - RETURN-CODE,SERVICE,SKIP1,SKIP2,SKIP3,SORT-CONTROL,SORT-RETURN,% - SUPPRESS,TITLE,WHEN-COMPILED},% - }% -\lst@definelanguage[1985]{Cobol}[1974]{Cobol}% - {morekeywords={ALPHABET,ALPHABETIC-LOWER,ALPHABETIC-UPPER,% - ALPHANUMERIC,ALPHANUMERIC-EDITED,ANY,CLASS,COMMON,CONTENT,% - CONTINUE,DAY-OF-WEEK,END-ADD,END-CALL,END-COMPUTE,END-DELETE,% - END-DIVIDE,END-EVALUATE,END-IF,END-MULTIPLY,END-PERFORM,END-READ,% - END-RECEIVE,END-RETURN,END-REWRITE,END-SEARCH,END-START,% - END-STRING,END-SUBTRACT,END-UNSTRING,END-WRITE,EVALUATE,EXTERNAL,% - FALSE,GLOBAL,INITIALIZE,NUMERIC-EDITED,ORDER,OTHER,% - PACKED-DECIMAL,PADDING,PURGE,REFERENCE,RELOAD,REPLACE,STANDARD-1,% - STANDARD-2,TEST,THEN,TRUE},% - }% -\lst@definelanguage[1974]{Cobol}% - {morekeywords={ACCEPT,ACCESS,ADD,ADVANCING,AFTER,ALL,ALPHABETIC,ALSO,% - ALTER,ALTERNATE,AND,ARE,AREA,AREAS,ASCENDING,ASSIGN,AT,AUTHOR,% - BEFORE,BINARY,BLANK,BLOCK,BOTTOM,BY,CALL,CANCEL,CD,CF,CH,% - CHARACTER,CHARACTERS,CLOCK-UNITS,CLOSE,COBOL,CODE,CODE-SET,% - COLLATING,COLUMN,COMMA,COMMUNICATION,COMP,COMPUTE,CONFIGURATION,% - CONTAINS,CONTROL,CONTROLS,CONVERTING,COPY,CORR,CORRESPONDING,% - COUNT,CURRENCY,DATA,DATE,DATE-COMPILED,DATE-WRITTEN,DAY,DE,% - DEBUG-CONTENTS,DEGUB-ITEM,DEBUG-LINE,DEBUG-NAME,DEBUG-SUB1,% - DEBUG-SUB2,DEBUG-SUB3,DEBUGGING,DECIMAL-POINT,DECLARATIVES,% - DELETE,DELIMITED,DELIMITER,DEPENDING,DESCENDING,DESTINATION,% - DETAIL,DISABLE,DISPLAY,DIVIDE,DIVISION,DOWN,DUPLICATES,DYNAMIC,% - EGI,ELSE,EMI,ENABLE,END,END-OF-PAGE,ENTER,ENVIRONMENT,EOP,EQUAL,% - ERROR,ESI,EVERY,EXCEPTION,EXIT,EXTEND,FD,FILE,FILE-CONTROL,% - FILLER,FINAL,FIRST,FOOTING,FOR,FROM,GENERATE,GIVING,GO,GREATER,% - GROUP,HEADING,HIGH-VALUE,HIGH-VALUES,I-O,I-O-CONTROL,% - IDENTIFICATION,IF,IN,INDEX,INDEXED,INDICATE,INITIAL,INITIATE,% - INPUT,INPUT-OUTPUT,INSPECT,INSTALLATION,INTO,INVALID,IS,JUST,% - JUSTIFIED,KEY,LABEL,LAST,LEADING,LEFT,LENGTH,LESS,LIMIT,LIMITS,% - LINAGE,LINAGE-COUNTER,LINE,LINE-COUNTER,LINES,LINKAGE,LOCK,% - LOW-VALUE,LOW-VALUES,MEMORY,MERGE,MESSAGE,MODE,MODULES,MOVE,% - MULTIPLE,MULTIPLY,NATIVE,NEGATIVE,NEXT,NO,NOT,NUMBER,NUMERIC,% - OBJECT-COMPUTER,OCCURS,OF,OFF,OMITTED,ON,OPEN,OPTIONAL,OR,% - ORGANIZATION,OUTPUT,OVERFLOW,PAGE,PAGE-COUNTER,PERFORM,PF,PH,PIC,% - PICTURE,PLUS,POINTER,POSITION,PRINTING,POSITIVE,PRINTING,% - PROCEDURE,PROCEDURES,PROCEED,PROGRAM,PROGRAM-ID,QUEUE,QUOTE,% - QUOTES,RANDOM,RD,READ,RECEIVE,RECORD,RECORDING,RECORDS,REDEFINES,% - REEL,REFERENCES,RELATIVE,RELEASE,REMAINDER,REMOVAL,RENAMES,% - REPLACING,REPORT,REPORTING,REPORTS,RERUN,RESERVE,RESET,RETURN,% - REVERSED,REWIND,REWRITE,RF,RH,RIGHT,ROUNDED,RUN,SAME,SD,SEARCH,% - SECTION,SECURITY,SEGMENT,SEGMENT-LIMIT,SELECT,SEND,SENTENCE,% - SEPARATE,SEQUENCE,SEQUENTIAL,SET,SIGN,SIZE,SORT,SORT-MERGE,% - SOURCE,SOURCE-COMPUTER,SPACE,SPACES,SPECIAL-NAMES,STANDARD,START,% - STATUS,STOP,STRING,SUB-QUEUE-1,SUB-QUEUE-2,SUB-QUEUE-3,SUBTRACT,% - SUM,SYMBOLIC,SYNC,SYNCHRONIZED,TABLE,TALLYING,TAPE,TERMINAL,% - TERMINATE,TEXT,THAN,THROUGH,THRU,TIME,TIMES,TO,TOP,TRAILING,TYPE,% - UNIT,UNSTRING,UNTIL,UP,UPON,USAGE,USE,USING,VALUE,VALUES,VARYING,% - WHEN,WITH,WORDS,WORKING-STORAGE,WRITE,ZERO,ZEROES,ZEROS},% - alsodigit=-,% - sensitive=f,% ??? - morecomment=[f][commentstyle][6]*,% - morestring=[d]"% ??? doubled - }[keywords,comments,strings]% -\lst@definelanguage{Delphi}% - {morekeywords={and,as,asm,array,begin,case,class,const,constructor,% - destructor,div,do,downto,else,end,except,exports,file,finally,% - for,function,goto,if,implementation,in,inherited,inline,% - initialization,interface,is,label,library,mod,nil,not,object,of,% - or,packed,procedure,program,property,raise,record,repeat,set,% - shl,shr,string,then,to,try,type,unit,until,uses,var,while,with,% - xor,% - absolute,abstract,assembler,at,cdecl,default,dynamic,export,% - external,far,forward,index,name,near,nodefault,on,override,% - private,protected,public,published,read,resident,storedDir,% - virtual,write},% - morendkeywords={Abs,AddExitProc,Addr,AllocMem,AnsiCompareStr,% - AnsiCompareText,AnsiLowerCase,AnsiUpperCase,Append,AppendStr,% - ArcTan,AssignCrt,Assigned,AssignFile,BlockRead,BlockWrite,Break,% - ChangeFileExt,ChDir,Chr,CloseFile,ClrEol,ClrScr,Concat,Continue,% - Copy,Cos,CSeg,CursorTo,Date,DateTimeToFileDate,DateTimeToStr,% - DateTimeToString,DateToStr,DayOfWeek,Dec,DecodeDate,DecodeTime,% - Delete,DeleteFile,DiskFree,DiskSize,Dispose,DisposeStr,% - DoneWinCrt,DSeg,EncodeDate,EncodeTime,Eof,Eoln,Erase,Exclude,% - Exit,Exp,ExpandFileName,ExtractFileExt,ExtractFileName,% - ExtractFilePath,FileAge,FileClose,FileDateToDateTime,FileExists,% - FileGetAttr,FileGetDate,FileOpen,FilePos,FileRead,FileSearch,% - FileSeek,FileSetAttr,FileSetDate,FileSize,FillChar,FindClose,% - FindFirst,FindNext,FloatToDecimal,FloatToStrF,FloatToStr,% - FloatToText,FloatToTextFmt,Flush,FmtLoadStr,FmtStr,Format,% - FormatBuf,FormatDateTime,FormatFloat,Frac,Free,FreeMem,GetDir,% - GetMem,GotoXY,Halt,Hi,High,Inc,Include,InitWinCrt,Insert,Int,% - IntToHex,IntToStr,IOResult,IsValidIdent,KeyPressed,Length,Ln,Lo,% - LoadStr,Low,LowerCase,MaxAvail,MemAvail,MkDir,Move,New,NewStr,% - Now,Odd,Ofs,Ord,ParamCount,ParamStr,Pi,Pos,Pred,Ptr,Random,% - Randomize,Read,ReadBuf,ReadKey,Readln,ReAllocMem,Rename,% - RenameFile,Reset,Rewrite,RmDir,Round,RunError,ScrollTo,Seek,% - SeekEof,SeekEoln,Seg,SetTextBuf,Sin,SizeOf,SPtr,Sqr,Sqrt,SSeg,% - Str,StrCat,StrComp,StrCopy,StrDispose,StrECopy,StrEnd,StrFmt,% - StrLCat,StrIComp,StrLComp,StrLCopy,StrLen,StrLFmt,StrLIComp,% - StrLower,StrMove,StrNew,StrPas,StrPCopy,StrPos,StrScan,StrRScan,% - StrToDate,StrToDateTime,StrToFloat,StrToInt,StrToIntDef,% - StrToTime,StrUpper,Succ,Swap,TextToFloat,Time,TimeToStr,% - TrackCursor,Trunc,Truncate,TypeOf,UpCase,UpperCase,Val,WhereX,% - WhereY,Write,WriteBuf,WriteChar,Writeln},% - sensitive=f,% - morecomment=[s]{(*}{*)},% - morecomment=[s]{\{}{\}},% - morecomment=[l]{//},% 2001 Christian Gudrian - morestring=[d]'% - }[keywords,comments,strings]% -\lst@definelanguage{Eiffel}% - {morekeywords={alias,all,and,as,BIT,BOOLEAN,CHARACTER,check,class,% - creation,Current,debug,deferred,do,DOUBLE,else,elseif,end,% - ensure,expanded,export,external,false,feature,from,frozen,if,% - implies,indexing,infix,inherit,inspect,INTEGER,invariant,is,% - like,local,loop,NONE,not,obsolete,old,once,or,POINTER,prefix,% - REAL,redefine,rename,require,rescue,Result,retry,select,% - separate,STRING,strip,then,true,undefine,unique,until,variant,% - when,xor},% - sensitive,% - morecomment=[l]--,% - morestring=[d]",% - }[keywords,comments,strings]% -%% -%% Euphoria definition (c) 1998 Detlef Reimers -%% -\lst@definelanguage{Euphoria}% - {morekeywords={abort,and,and_bits,append,arctan,atom,by,call,% - call_proc,call_func,c_proc,c_func,clear_screen,close,% - command_line,compare,constant,cos,do,date,else,elsif,end,exit,% - find,floor,for,function,getc,getenv,get_key,gets,global,% - get_pixel,if,include,integer,length,log,match,machine_func,% - machine_proc,mem_copy,mem_set,not,not_bits,or,object,open,% - or_bits,procedure,puts,position,prepend,print,printf,power,peek,% - poke,pixel,poke4,peek4s,peek4u,return,rand,repeat,remainder,% - routine_id,sequence,sqrt,sin,system,sprintf,then,type,to,time,% - trace,tan,while,with,without,xor,xor_bits},% - sensitive,% - morecomment=[l]--,% - morestring=[d]',% - morestring=[d]"% - }[keywords,comments,strings]% -%% -%% Guarded Command Language (GCL) definition -%% (c) 2002 Mark van Eijk -%% -\lst@definelanguage{GCL}% - {morekeywords={const,con,var,array,of,skip,if,fi,do,od,div,mod},% - literate={|[}{\ensuremath{|\hskip -0.1em[}}2% - {]|}{\ensuremath{]\hskip -0.1em|}}2% - {[]}{\ensuremath{[\hskip -0.1em]}}2% - {->}{\ensuremath{\rightarrow}~}2% - {==}{\ensuremath{\equiv}~}2% - {>=}{\ensuremath{\geq}~}2% - {<=}{\ensuremath{\leq}~}2% - {/\\}{\ensuremath{\land}~}2% - {\\/}{\ensuremath{\lor}~}2% - {!}{\ensuremath{\lnot}}1% - {!=}{\ensuremath{\neq}~}2% - {max}{\ensuremath{\uparrow}}1% - {min}{\ensuremath{\downarrow}}1,% - sensitive=f,% - morecomment=[s]{\{}{\}},% - morestring=[d]'% - }[keywords,comments,strings]% -%% -%% gnuplot definition (c) Christoph Giess -%% -\lst@definelanguage{Gnuplot}% - {keywords={abs,acos,acosh,arg,asin,asinh,atan,atan2,atanh,besj0,% - besj1,besy0,besy1,ceil,cos,cosh,erf,erfc,exp,floor,gamma,ibeta,% - inverf,igamma,imag,invnorm,int,lgamma,log,log10,norm,rand,real,% - sgn,sin,sinh,sqrt,tan,tanh,column,tm_hour,tm_mday,tm_min,tm_mon,% - tm_sec,tm_wday,tm_yday,tm_year,valid,cd,call,clear,exit,fit,% - help,if,load,pause,plot,print,pwd,quit,replot,reread,reset,save,% - set,show,shell,splot,test,update,angles,arrow,autoscale,border,% - boxwidth,clabel,clip,cntrparam,contour,data,dgrid3d,dummy,% - format,function,functions,grid,hidden3d,isosamples,key,keytitle,% - label,logscale,mapping,offsets,output,parametric,pointsize,% - polar,rrange,samples,size,style,surface,terminal,tics,time,% - timefmt,title,trange,urange,variables,view,vrange,xdata,xlabel,% - xmargin,xrange,xtics,mxtics,mytics,xdtics,xmtics,xzeroaxis,% - ydata,ylabel,yrange,ytics,ydtics,ymtics,yzeroaxis,zdata,zero,% - zeroaxis,zlabel,zrange,ztics,zdtics,zmtics,timefm,using,title,% - with,index,every,thru,smooth},% - sensitive,% - comment=[l]\#,% - morestring=[b]",% - morestring=[b]',% - }[keywords,comments,strings]% -%% -%% Haskell98 as implemented in Hugs98. See http://www.haskell.org -%% All keywords from Prelude and Standard Libraries -%% (c) 1999 Peter Bartke -%% -\lst@definelanguage{Haskell}% - {otherkeywords={=>},% - morekeywords={abstype,if,then,else,case,class,data,default,deriving,% - hiding,if,in,infix,infixl,infixr,import,instance,let,module,% - newtype,of,qualified,type,where,do,AbsoluteSeek,AppendMode,% - Array,BlockBuffering,Bool,BufferMode,Char,Complex,Double,Either,% - FilePath,Float,Int,Integer,IO,IOError,Ix,LineBuffering,Maybe,% - Ordering,NoBuffering,ReadMode,ReadWriteMode,ReadS,RelativeSeek,% - SeekFromEnd,SeekMode,ShowS,StdGen,String,Void,Bounded,Enum,Eq,% - Eval,ExitCode,exitFailure,exitSuccess,Floating,Fractional,% - Functor,Handle,HandlePosn,IOMode,Integral,List,Monad,MonadPlus,% - MonadZero,Num,Numeric,Ord,Random,RandomGen,Ratio,Rational,Read,% - Real,RealFloat,RealFrac,Show,System,Prelude,EQ,False,GT,Just,% - Left,LT,Nothing,Right,WriteMode,True,abs,accum,accumArray,% - accumulate,acos,acosh,all,and,any,ap,appendFile,applyM,% - approxRational,array,asTypeOf,asin,asinh,assocs,atan,atan2,atanh,% - bounds,bracket,bracket_,break,catch,catMaybes,ceiling,chr,cis,% - compare,concat,concatMap,conjugate,const,cos,cosh,curry,cycle,% - decodeFloat,delete,deleteBy,deleteFirstsBy,denominator,% - digitToInt,div,divMod,drop,dropWhile,either,elem,elems,elemIndex,% - elemIndices,encodeFloat,enumFrom,enumFromThen,enumFromThenTo,% - enumFromTo,error,even,exitFailure,exitWith,exp,exponent,fail,% - filter,filterM,find,findIndex,findIndices,flip,floatDigits,% - floatRadix,floatRange,floatToDigits,floor,foldl,foldM,foldl1,% - foldr,foldr1,fromDouble,fromEnum,fromInt,fromInteger,% - fromIntegral,fromJust,fromMaybe,fromRat,fromRational,% - fromRealFrac,fst,gcd,genericLength,genericTake,genericDrop,% - genericSplitAt,genericIndex,genericReplicate,getArgs,getChar,% - getContents,getEnv,getLine,getProgName,getStdGen,getStdRandom,% - group,groupBy,guard,hClose,hFileSize,hFlush,hGetBuffering,% - hGetChar,hGetContents,hGetLine,hGetPosn,hIsClosed,hIsEOF,hIsOpen,% - hIsReadable,hIsSeekable,hIsWritable,hLookAhead,hPutChar,hPutStr,% - hPutStrLn,hPrint,hReady,hSeek,hSetBuffering,hSetPosn,head,% - hugsIsEOF,hugsHIsEOF,hugsIsSearchErr,hugsIsNameErr,% - hugsIsWriteErr,id,ioError,imagPart,index,indices,init,inits,% - inRange,insert,insertBy,interact,intersect,intersectBy,% - intersperse,intToDigit,ioeGetErrorString,ioeGetFileName,% - ioeGetHandle,isAlreadyExistsError,isAlreadyInUseError,isAlpha,% - isAlphaNum,isAscii,isControl,isDenormalized,isDoesNotExistError,% - isDigit,isEOF,isEOFError,isFullError,isHexDigit,isIEEE,% - isIllegalOperation,isInfinite,isJust,isLower,isNaN,% - isNegativeZero,isNothing,isOctDigit,isPermissionError,isPrefixOf,% - isPrint,isSpace,isSuffixOf,isUpper,isUserError,iterate,ixmap,% - join,last,lcm,length,lex,lexDigits,lexLitChar,liftM,liftM2,% - liftM3,liftM4,liftM5,lines,listArray,listToMaybe,log,logBase,% - lookup,magnitude,makePolar,map,mapAccumL,mapAccumR,mapAndUnzipM,% - mapM,mapM_,mapMaybe,max,maxBound,maximum,maximumBy,maybe,% - maybeToList,min,minBound,minimum,minimumBy,mkPolar,mkStdGen,% - mplus,mod,msum,mzero,negate,next,newStdGen,not,notElem,nub,nubBy,% - null,numerator,odd,openFile,or,ord,otherwise,partition,phase,pi,% - polar,pred,print,product,properFraction,putChar,putStr,putStrLn,% - quot,quotRem,random,randomIO,randomR,randomRIO,randomRs,randoms,% - rangeSize,read,readDec,readFile,readFloat,readHex,readInt,readIO,% - readList,readLitChar,readLn,readParen,readOct,readSigned,reads,% - readsPrec,realPart,realToFrac,recip,rem,repeat,replicate,return,% - reverse,round,scaleFloat,scanl,scanl1,scanr,scanr1,seq,sequence,% - sequence_,setStdGen,show,showChar,showEFloat,showFFloat,% - showFloat,showGFloat,showInt,showList,showLitChar,showParen,% - showSigned,showString,shows,showsPrec,significand,signum,sin,% - sinh,snd,sort,sortBy,span,split,splitAt,sqrt,stderr,stdin,stdout,% - strict,subtract,succ,sum,system,tail,tails,take,takeWhile,tan,% - tanh,toEnum,toInt,toInteger,toLower,toRational,toUpper,transpose,% - truncate,try,uncurry,undefined,unfoldr,union,unionBy,unless,% - unlines,until,unwords,unzip,unzip3,unzip4,unzip5,unzip6,unzip7,% - userError,when,words,writeFile,zero,zip,zip3,zip4,zip5,zip6,zip7,% - zipWith,zipWithM,zipWithM_,zipWith3,zipWith4,zipWith5,zipWith6,% - zipWith7},% - sensitive,% - morecomment=[l]--,% - morecomment=[n]{\{-}{-\}},% - morestring=[b]"% - }[keywords,comments,strings]% -%% -%% IDL definition (c) 1998 Juergen Heim -%% -\lst@definelanguage{IDL}% - {morekeywords={and,begin,case,common,do,else,end,endcase,endelse,% - endfor,endif,endrep,endwhile,eq,for,function,ge,goto,gt,if,le,lt,% - mod,ne,not,of,on_ioerror,or,pro,repeat,return,then,until,while,% - xor,on_error,openw,openr,openu,print,printf,printu,plot,read,% - readf,readu,writeu,stop},% - sensitive=f,% - morecomment=[l];,% - morestring=[d]'% - }[keywords,comments,strings]% -%% -%% Inform definition (c) 2003 Jonathan Sauer -%% -\lst@definelanguage{inform}{% - % Language keywords - morekeywords={breakdo,else,false,for,has,hasnt,if,% - in,indirect,jump,notin,nothing,NULL,objectloop,ofclass,% - private,property,provides,return,rfalse,rtrue,self,string,% - switch,to,true,until,while,with,% - creature,held,multiexcept,multiheld,multiinside,noun,number,% - scope,topic},% - % - % Inform functions - morekeywords=[2]{box,child,children,font,give,inversion,metaclass,move,% - new_line,parent,print,print_ret,read,remove,restore,sibling,% - save,spaces,quit,style,bold,underline,reverse,roman remaining,% - create,destroy,recreate,copy},% - % - % Inform definitions - morekeywords=[3]{Attribute,Array,Class,Constant,Default,End,Endif,Extend,% - Global,Ifdef,Iffalse,Ifndef,Ifnot,Iftrue,Include,Object,% - Property,Verb,Release,Serial,Statusline},% - % - % Library attributes - morekeywords=[4]{absent,animate,clothing,concealed,container,door,edible,% - enterable,female,general,light,lockable locked,male,moved,% - neuter,on,open,openable,pluralname,proper,scenery,scored,% - static,supporter,switchable,talkable,transparent,visited,% - workflag,worn},% - % - % Libary properties - morekeywords=[5]{n_to,s_to,e_to,w_to,ne_to,nw_to,se_to,sw_to,in_to,% - out_to,u_to,d_to,add_to_scope,after,article,articles,before,% - cant_go,capacity,daemon,describe,description,door_dir,door_to,% - each_turn,found_in,grammar,initial,inside_description,invent,% - life,list_together,name number,orders,parse_name,plural,% - react_after,react_before,short_name,short_name_indef,time_left,% - time_out,when_closed,when_open,when_on,when_off,% - with_key}, - % - % Library routines - morekeywords=[6]{Achieved,AfterRoutines,AllowPushDir,Banner,ChangePlayer,% - CommonAncestor,DictionaryLookup,GetGNAOfObject,HasLightSource,% - IndirectlyContains,IsSeeThrough,Locale,LoopOverScope,LTI_Insert,% - MoveFloatingObjects,NextWord,NextWordStopped,NounDomain,% - ObjectIsUntouchable OffersLight,ParseToken,PlaceInScope,PlayerTo,% - PronounNotice,PronounValue,ScopeWithin,SetPronoun,SetTime,% - StartDaemon,StartTimer,StopDaemon,StopTimer,TestScope,TryNumber,% - UnsignedCompare,WordAddress,WordInProperty,WordLength,% - WriteListFrom,YesOrNo},% - % - % Library,entry points - morekeywords=[7]{AfterLife,AfterPrompt,Amusing,BeforeParsing,ChooseObjects,% - DarkToDark,DeathMessage,GamePostRoutine GamePreRoutine,% - Initialise,InScope,LookRoutine,NewRoom,ParseNoun,ParseNumber,% - ParserError,PrintRank,PrintTaskName,PrintVerb,TimePasses,% - UnknownVerb},% - % - % Library constants - morekeywords=[8]{NEWLINE_BIT,INDENT_BIT,FULLINV_BIT,ENGLISH_BIT,RECURSE_BIT,% - ALWAYS_BIT,TERSE_BIT,PARTINV_BIT,DEFART_BIT,WORKFLAG_BIT,% - ISARE_BIT,CONCEAL_BIT},% - % - % Library,meta actions - morekeywords=[9]{Pronouns,Quit,Restart,Restore,Save,Verify,ScriptOn,ScriptOff,% - NotifyOn,NotifyOff,Places,Objects,Score,FullScore,Version,LMode1,% - LMode2,Lmode3},% - % - % Library,main actions - morekeywords=[10]{Close,Disrobe,Drop,Eat,Empty,EmptyT,Enter,Examine,Exit,GetOff,% - Give,Go,GoIn,Insert,Inv,InvTall,InvWide,Lock,Look,Open,PutOn,Remove,% - Search,Show,SwitchOff,SwitchOn,Take,Transfer,Unlock VagueGo,% - Wear},% - % - % Library,stub actions - morekeywords=[11]{Answer,Ask,AskFor,Attack,Blow,Burn,Buy,Climb,Consult,Cut,Dig,% - Drink,Fill,Jump,JumpOver,Kiss,Listen,LookUnder,Mild,No,Pray,Pull,% - Push,PushDir,Rub,Set,SetTo,Sing,Sleep,Smell,,Sleep,Smell,Sorry,% - Squeeze,Strong,Swim,Swing,Taste,Tell,Think,ThrowAt,Tie,Touch,Turn,% - Wait,Wake,WakeOther,Wave,WaveHands,Yes},% - % - otherkeywords={->,-->},% - sensitive=false,% - morestring=[d]{"},% - morecomment=[l]{!}% - }[keywords,comments,strings]% -\lst@definelanguage{Lisp}% - {morekeywords={abort,abs,acons,acos,acosh,adjoin,alphanumericp,alter,% - append,apply,apropos,aref,arrayp,ash,asin,asinh,assoc,atan,atanh,% - atom,bit,boole,boundp,break,butlast,byte,catenate,ceiling,cerror,% - char,character,characterp,choose,chunk,cis,close,clrhash,coerce,% - collect,commonp,compile,complement,complex,complexp,concatenate,% - conjugate,cons,consp,constantp,continue,cos,cosh,cotruncate,% - count,delete,denominator,describe,directory,disassemble,% - documentation,dpb,dribble,ed,eighth,elt,enclose,endp,eq,eql,% - equal,equalp,error,eval,evalhook,evenp,every,exp,expand,export,% - expt,fboundp,fceiling,fdefinition,ffloor,fifth,fill,find,first,% - float,floatp,floor,fmakunbound,format,fourth,fround,ftruncate,% - funcall,functionp,gatherer,gcd,generator,gensym,gentemp,get,getf,% - gethash,identity,imagpart,import,inspect,integerp,intern,% - intersection,tively,isqrt,keywordp,last,latch,lcm,ldb,ldiff,% - length,list,listen,listp,load,log,logand,logbitp,logcount,logeqv,% - logior,lognand,lognor,lognot,logtest,logxor,macroexpand,% - makunbound,map,mapc,mapcan,mapcar,mapcon,maphash,mapl,maplist,% - mask,max,member,merge,min,mingle,minusp,mismatch,mod,namestring,% - nbutlast,nconc,nintersection,ninth,not,notany,notevery,nreconc,% - nreverse,nsublis,nsubst,nth,nthcdr,null,numberp,numerator,nunion,% - oddp,open,packagep,pairlis,pathname,pathnamep,phase,plusp,% - position,positions,pprint,previous,princ,print,proclaim,provide,% - random,rassoc,rational,rationalize,rationalp,read,readtablep,% - realp,realpart,reduce,rem,remhash,remove,remprop,replace,require,% - rest,revappend,reverse,room,round,rplaca,rplacd,sbit,scan,schar,% - search,second,series,set,seventh,shadow,signal,signum,sin,sinh,% - sixth,sleep,some,sort,split,sqrt,streamp,string,stringp,sublis,% - subseq,subseries,subsetp,subst,substitute,subtypep,svref,sxhash,% - symbolp,tailp,tan,tanh,tenth,terpri,third,truename,truncate,% - typep,unexport,unintern,union,until,values,vector,vectorp,warn,% - write,zerop,and,assert,case,ccase,cond,ctypecase,decf,declaim,% - defclass,defconstant,defgeneric,defmacro,defmethod,defpackage,% - defparameter,defsetf,defstruct,deftype,defun,defvar,do,dolist,% - dotimes,ecase,encapsulated,etypecase,flet,formatter,gathering,% - incf,iterate,labels,let,locally,loop,macrolet,mapping,or,pop,% - producing,prog,psetf,psetq,push,pushnew,remf,return,rotatef,% - setf,shiftf,step,time,trace,typecase,unless,untrace,when},% - sensitive,% ??? - alsodigit=-,% - morecomment=[l];,% - morecomment=[s]{\#|}{|\#},% 1997 Aslak Raanes - morestring=[b]"% - }[keywords,comments,strings]% -%% -%% AutoLISP/VisualLISP - Stefan Lagotzki, info@lagotzki.de -%% -\lst@definelanguage[Auto]{Lisp}% - {morekeywords={abs,acad_colordlg,acad_helpdlg,acad_strlsort,% - action_tile,add_list,alert,alloc,and,angle,angtof,angtos,append,% - apply,arx,arxload,arxunload,ascii,assoc,atan,atof,atoi,atom,% - atoms-family,autoarxload,autoload,Boole,boundp,caddr,cadr,car,% - cdr,chr,client_data_tile,close,command,cond,cons,cos,cvunit,% - defun,defun-q,defun-q-list-ref,defun-q-list-set,dictadd,dictnext,% - dictremove,dictrename,dictsearch,dimx_tile,dimy_tile,distance,% - distof,done_dialog,end_image,end_list,entdel,entget,entlast,% - entmake,entmakex,entmod,entnext,entsel,entupd,eq,equal,*error*,% - eval,exit,exp,expand,expt,fill_image,findfile,fix,float,foreach,% - function,gc,gcd,get_attr,get_tile,getangle,getcfg,getcname,% - getcorner,getdist,getenv,getfiled,getint,getkword,getorient,% - getpoint,getreal,getstring,getvar,graphscr,grclear,grdraw,grread,% - grtext,grvecs,handent,help,if,initdia,initget,inters,itoa,lambda,% - last,layoutlist,length,list,listp,load,load_dialog,log,logand,% - logior,lsh,mapcar,max,mem,member,menucmd,menugroup,min,minusp,% - mode_tile,namedobjdict,nentsel,nentselp,new_dialog,not,nth,% - null,numberp,open,or,osnap,polar,prin1,princ,print,progn,prompt,% - quit,quote,read,read-char,read-line,redraw,regapp,rem,repeat,% - reverse,rtos,set,set_tile,setcfg,setenv,setfunhelp,setq,% - setvar,setview,sin,slide_image,snvalid,sqrt,ssadd,ssdel,ssget,% - ssgetfirst,sslength,ssmemb,ssname,ssnamex,sssetfirst,startapp,% - start_dialog,start_image,start_list,strcase,strcat,strlen,subst,% - substr,tablet,tblnext,tblobjname,tblsearch,term_dialog,terpri,% - textbox,textpage,textscr,trace,trans,type,unload_dialog,untrace,% - vector_image,ver,vl-acad-defun,vl-acad-undefun,vl-arx-import,% - vl-bb-ref,vl-bb-set,vl-catch-all-apply,% - vl-catch-all-error-message,vl-catch-all-error-p,vl-cmdf,vl-consp,% - vl-directory-files,vl-doc-export,vl-doc-import,vl-doc-ref,% - vl-doc-set,vl-every,vl-exit-with-error,vl-exit-with-value,% - vl-file-copy,vl-file-delete,vl-file-directory-p,vl-file-rename,% - vl-file-size,vl-file-systime,vl-filename-base,% - vl-filename-directory,vl-filename-extension,vl-filename-mktemp,% - vl-get-resource,vl-list*,vl-list->string,% - vl-list-exported-functions,vl-list-length,vl-list-loaded-vlx,% - vl-load-all,vl-load-com,vl-load-reactors,vl-member-if,% - vl-member-if-not,vl-position,vl-prin1-to-string,% - vl-princ-to-string,vl-propagate,vl-registry-delete,% - vl-registry-descendents,vl-registry-read,vl-registry-write,% - vl-remove,vl-remove-if,vl-remove-if-not,vl-some,vl-sort,% - vl-sort-i,vl-string->list,vl-string-elt,vl-string-left-trim,% - vl-string-mismatch,vl-string-position,vl-string-right-trim,% - vl-string-search,vl-string-subst,vl-string-translate,% - vl-string-trim,vl-symbol-name,vl-symbol-value,vl-symbolp,% - vl-unload-vlx,vl-vbaload,vl-vbarun,vl-vlx-loaded-p,vlax-3D-point,% - vlax-add-cmd,vlax-create-object,vlax-curve-getArea,% - vlax-curve-getDistAtParam,vlax-curve-getDistAtPoint,% - vlax-curve-getEndParam,vlax-curve-getEndPoint,% - vlax-curve-getParamAtDist,vlax-curve-getParamAtPoint,% - vlax-curve-getPointAtDist,vlax-curve-getPointAtParam,% - vlax-curve-getStartParam,vlax-curve-getStartPoint,% - vlax-curve-isClosed,vlax-curve-isPeriodic,vlax-curve-isPlanar,% - vlax-curve-getClosestPointTo,% - vlax-curve-getClosestPointToProjection,vlax-curve-getFirstDeriv,% - vlax-curve-getSecondDeriv,vlax-dump-object,% - vlax-ename->vla-object,vlax-erased-p,vlax-for,% - vlax-get-acad-object,vlax-get-object,vlax-get-or-create-object,% - vlax-get-property,vlax-import-type-library,vlax-invoke-method,% - vlax-ldata-delete,vlax-ldata-get,vlax-ldata-list,vlax-ldata-put,% - vlax-ldata-test,vlax-make-safearray,vlax-make-variant,% - vlax-map-collection,vlax-method-applicable-p,% - vlax-object-released-p,vlax-product-key,% - vlax-property-available-p,vlax-put-property,vlax-read-enabled-p,% - vlax-release-object,vlax-remove-cmd,vlax-safearray-fill,% - vlax-safearray-get-dim,vlax-safearray-get-element,% - vlax-safearray-get-l-bound,vlax-safearray-get-u-bound,% - vlax-safearray-put-element,vlax-safearray-type,% - vlax-safearray->list,vlax-tmatrix,vlax-typeinfo-available-p,% - vlax-variant-change-type,vlax-variant-type,vlax-variant-value,% - vlax-vla-object->ename,vlax-write-enabled-p,vlisp-compile,% - vlr-acdb-reactor,vlr-add,vlr-added-p,vlr-beep-reaction,% - vlr-command-reactor,vlr-current-reaction-name,vlr-data,% - vlr-data-set,vlr-deepclone-reactor,vlr-docmanager-reactor,% - vlr-dwg-reactor,vlr-dxf-reactor,vlr-editor-reactor,% - vlr-insert-reactor,vlr-linker-reactor,vlr-lisp-reactor,% - vlr-miscellaneous-reactor,vlr-mouse-reactor,vlr-notification,% - vlr-object-reactor,vlr-owner-add,vlr-owner-remove,vlr-owners,% - vlr-pers,vlr-pers-list,vlr-pers-p,vlr-pers-release,% - vlr-reaction-names,vlr-reaction-set,vlr-reactions,vlr-reactors,% - vlr-remove,vlr-remove-all,vlr-set-notification,% - vlr-sysvar-reactor,vlr-toolbar-reactor,vlr-trace-reaction,% - vlr-type,vlr-types,vlr-undo-reactor,vlr-wblock-reactor,% - vlr-window-reactor,vlr-xref-reactor,vports,wcmatch,while,% - write-char,write-line,xdroom,xdsize,zerop},% - alsodigit=->,% - otherkeywords={1+,1-},% - sensitive=false,% - morecomment=[l];,% - morecomment=[l];;,% - morestring=[b]"% - }[keywords,comments,strings]% -%% -%% Make definitions (c) 2000 Rolf Niepraschk -%% -\lst@definelanguage[gnu]{make}% - {morekeywords={SHELL,MAKE,MAKEFLAGS,$@,$\%,$<,$?,$^,$+,$*,% - @,^,<,\%,+,?,*,% Markus Pahlow - export,unexport,include,override,define,ifdef,ifneq,ifeq,else,% - endif,vpath,subst,patsubst,strip,findstring,filter,filter-out,% - sort,dir,notdir,suffix,basename,addsuffix,addprefix,join,word,% - words,firstword,wildcard,shell,origin,foreach,% - @D,@F,*D,*F,\%D,\%F,,-->,--->,:-,==,=>,<=,<=>},% - morekeywords={module,include_module,import_module,interface,% - end_module,implementation,mode,is,failure,semidet,nondet,det,% - multi,erroneous,inst,in,out,di,uo,ui,type,typeclass,instance,% - where,with_type,pred,func,lambda,impure,semipure,if,then,else,% - some,all,not,true,fail,pragma,memo,no_inline,inline,loop_check,% - minimal_model,fact_table,type_spec,terminates,does_not_terminate,% - check_termination,promise_only_solution,unsafe_promise_unique,% - source_file,obsolete,import,export,c_header_code,c_code,% - foreign_code,foreign_proc,may_call_mercury,will_not_call_mercury,% - thread_safe,not_thread_safe},% - sensitive=t,% - morecomment=[l]\%,% - morecomment=[s]{/*}{*/},% - morestring=[bd]",% - morestring=[bd]'% - }[keywords,comments,strings]% -%% -%% Miranda definition (c) 1998 Peter Bartke -%% -%% Miranda: pure lazy functional language with polymorphic type system, -%% garbage collection and functions as first class citizens -%% -\lst@definelanguage{Miranda}% - {morekeywords={abstype,div,if,mod,otherwise,readvals,show,type,where,% - with,bool,char,num,sys_message,False,True,Appendfile,Closefile,% - Exit,Stderr,Stdout,System,Tofile,\%include,\%export,\%free,% - \%insert,abs,and,arctan,cjustify,code,concat,const,converse,cos,% - decode,digit,drop,dropwhile,entier,error,exp,filemode,filter,% - foldl,foldl1,foldr,foldr1,force,fst,getenv,hd,hugenum,id,index,% - init,integer,iterate,last,lay,layn,letter,limit,lines,ljustify,% - log,log10,map,map2,max,max2,member,merge,min,min2,mkset,neg,% - numval,or,pi,postfix,product,read,rep,repeat,reverse,rjustify,% - scan,seq,showfloat,shownum,showscaled,sin,snd,sort,spaces,sqrt,% - subtract,sum,system,take,takewhile,tinynum,tl,transpose,undef,% - until,zip2,zip3,zip4,zip5,zip6,zip},% - sensitive,% - morecomment=[l]||,% - morestring=[b]"% - }[keywords,comments,strings]% -%% -%% ML definition (c) 1999 Torben Hoffmann -%% -\lst@definelanguage{ML}% - {morekeywords={abstype,and,andalso,as,case,do,datatype,else,end,% - eqtype,exception,fn,fun,functor,handle,if,in,include,infix,% - infixr,let,local,nonfix,of,op,open,orelse,raise,rec,sharing,sig,% - signature,struct,structure,then,type,val,with,withtype,while},% - sensitive,% - morecomment=[n]{(*}{*)},% - morestring=[d]"% - }[keywords,comments,strings]% -%% -%% Oz definition (c) Andres Becerra Sandoval -%% -\lst@definelanguage{Oz}% - {morekeywords={andthen,at,attr,case,catch,choice,class,% - cond,declare,define,dis,div,else,elsecase,% - elseif,end,export,fail,false,feat,finally,% - from,fun,functor,if,import,in,local,% - lock,meth,mod,not,of,or,orelse,% - prepare,proc,prop,raise,require,self,skip,% - then,thread,true,try,unit},% - sensitive=true,% - morecomment=[l]{\%},% - morecomment=[s]{/*}{*/},% - morestring=[b]",% - morestring=[d]'% - }[keywords,comments,strings]% -%% -%% PHP definition by Luca Balzerani -%% -\lst@definelanguage{PHP}% - {morekeywords={% - %--- core language - ,::,break,case,continue,default,do,else,% - elseif,for,foreach,if,include,require,phpinfo,% - switch,while,false,FALSE,true,TRUE,% - %--- apache functions - apache_lookup_uri,apache_note,ascii2ebcdic,ebcdic2ascii,% - virtual,apache_child_terminate,apache_setenv,% - %--- array functions - array,array_change_key_case,array_chunk,array_count_values,% - array_filter,array_flip,array_fill,array_intersect,% - array_keys,array_map,array_merge,array_merge_recursive,% - array_pad,array_pop,array_push,array_rand,array_reverse,% - array_shift,array_slice,array_splice,array_sum,array_unique,% - array_values,array_walk,arsort,asort,compact,count,current,each,% - extract,in_array,array_search,key,krsort,ksort,list,natsort,% - next,pos,prev,range,reset,rsort,shuffle,sizeof,sort,uasort,% - usort,% - %--- aspell functions - aspell_new,aspell_check,aspell_check_raw,aspell_suggest,% - %--- bc functions - bcadd,bccomp,bcdiv,bcmod,bcmul,bcpow,bcscale,bcsqrt,bcsub,% - %--- bzip2 functions - bzclose,bzcompress,bzdecompress,bzerrno,bzerror,bzerrstr,% - bzopen,bzread,bzwrite,% - %--- calendar functions - JDToGregorian,GregorianToJD,JDToJulian,JulianToJD,JDToJewish,% - JDToFrench,FrenchToJD,JDMonthName,JDDayOfWeek,easter_date,% - unixtojd,jdtounix,cal_days_in_month,cal_to_jd,cal_from_jd,% - %--- ccvs functions - ccvs_init,ccvs_done,ccvs_new,ccvs_add,ccvs_delete,ccvs_auth,% - ccvs_reverse,ccvs_sale,ccvs_void,ccvs_status,ccvs_count,% - ccvs_report,ccvs_command,ccvs_textvalue,% - %--- classobj functions - call_user_method,call_user_method_array,class_exists,get_class,% - get_class_vars,get_declared_classes,get_object_vars,% - is_a,is_subclass_of,method_exists,% - %--- com functions - COM,VARIANT,com_load,com_invoke,com_propget,com_get,com_propput,% - com_set,com_addref,com_release,com_isenum,com_load_typelib,% - %--- cpdf functions - cpdf_add_annotation,cpdf_add_outline,cpdf_arc,cpdf_begin_text,% - cpdf_clip,cpdf_close,cpdf_closepath,cpdf_closepath_fill_stroke,% - cpdf_continue_text,cpdf_curveto,cpdf_end_text,cpdf_fill,% - cpdf_finalize,cpdf_finalize_page,% - cpdf_import_jpeg,cpdf_lineto,cpdf_moveto,cpdf_newpath,cpdf_open,% - cpdf_page_init,cpdf_place_inline_image,cpdf_rect,cpdf_restore,% - cpdf_rmoveto,cpdf_rotate,cpdf_rotate_text,cpdf_save,% - cpdf_scale,cpdf_set_char_spacing,cpdf_set_creator,% - cpdf_set_font,cpdf_set_horiz_scaling,cpdf_set_keywords,% - cpdf_set_page_animation,cpdf_set_subject,cpdf_set_text_matrix,% - cpdf_set_text_rendering,cpdf_set_text_rise,cpdf_set_title,% - cpdf_setdash,cpdf_setflat,cpdf_setgray,cpdf_setgray_fill,% - cpdf_setlinecap,cpdf_setlinejoin,cpdf_setlinewidth,% - cpdf_setrgbcolor,cpdf_setrgbcolor_fill,cpdf_setrgbcolor_stroke,% - cpdf_show_xy,cpdf_stringwidth,cpdf_set_font_directories,% - cpdf_set_viewer_preferences,cpdf_stroke,cpdf_text,% - cpdf_set_action_url,% - %--- crack functions - crack_opendict,crack_closedict,crack_check,crack_getlastmessage,% - %--- ctype functions - ctype_alnum,ctype_alpha,ctype_cntrl,ctype_digit,ctype_lower,% - ctype_print,ctype_punct,ctype_space,ctype_upper,ctype_xdigit,% - %--- curl functions - curl_init,curl_setopt,curl_exec,curl_close,curl_version,% - curl_error,curl_getinfo,% - %--- cybercash functions - cybercash_encr,cybercash_decr,cybercash_base64_encode,% - %--- cybermut functions - cybermut_creerformulairecm,cybermut_testmac,% - %--- cyrus functions - cyrus_connect,cyrus_authenticate,cyrus_bind,cyrus_unbind,% - cyrus_close,% - %--- datetime functions - checkdate,date,getdate,gettimeofday,gmdate,gmmktime,gmstrftime,% - microtime,mktime,strftime,time,strtotime,% - %--- dbase functions - dbase_create,dbase_open,dbase_close,dbase_pack,dbase_add_record,% - dbase_delete_record,dbase_get_record,% - dbase_numfields,dbase_numrecords,% - %--- dba functions - dba_close,dba_delete,dba_exists,dba_fetch,dba_firstkey,% - dba_nextkey,dba_popen,dba_open,dba_optimize,dba_replace,% - %--- dbm functions - dbmopen,dbmclose,dbmexists,dbmfetch,dbminsert,dbmreplace,% - dbmfirstkey,dbmnextkey,dblist,% - %--- dbx functions - dbx_close,dbx_connect,dbx_error,dbx_query,dbx_sort,dbx_compare,% - %--- dio functions - dio_open,dio_read,dio_write,dio_truncate,dio_stat,dio_seek,% - dio_close,% - %--- dir functions - chroot,chdir,dir,closedir,getcwd,opendir,readdir,rewinddir,% - %--- dotnet functions - dotnet_load,% - %--- errorfunc functions - error_log,error_reporting,restore_error_handler,% - trigger_error,user_error,% - %--- exec functions - escapeshellarg,escapeshellcmd,exec,passthru,system,shell_exec,% - %--- fbsql functions - fbsql_affected_rows,fbsql_autocommit,fbsql_change_user,% - fbsql_commit,fbsql_connect,fbsql_create_db,fbsql_create_blob,% - fbsql_database_password,fbsql_data_seek,fbsql_db_query,% - fbsql_drop_db,fbsql_errno,fbsql_error,fbsql_fetch_array,% - fbsql_fetch_field,fbsql_fetch_lengths,fbsql_fetch_object,% - fbsql_field_flags,fbsql_field_name,fbsql_field_len,% - fbsql_field_table,fbsql_field_type,fbsql_free_result,% - fbsql_list_dbs,fbsql_list_fields,fbsql_list_tables,% - fbsql_num_fields,fbsql_num_rows,fbsql_pconnect,fbsql_query,% - fbsql_read_clob,fbsql_result,fbsql_rollback,fbsql_set_lob_mode,% - fbsql_start_db,fbsql_stop_db,fbsql_tablename,fbsql_warnings,% - fbsql_get_autostart_info,fbsql_hostname,fbsql_password,% - fbsql_username,% - %--- fdf functions - fdf_open,fdf_close,fdf_create,fdf_save,fdf_get_value,% - fdf_next_field_name,fdf_set_ap,fdf_set_status,fdf_get_status,% - fdf_get_file,fdf_set_flags,fdf_set_opt,% - fdf_set_javascript_action,fdf_set_encoding,fdf_add_template,% - %--- filepro functions - filepro,filepro_fieldname,filepro_fieldtype,filepro_fieldwidth,% - filepro_fieldcount,filepro_rowcount,% - %--- filesystem functions - basename,chgrp,chmod,chown,clearstatcache,copy,delete,dirname,% - diskfreespace,disk_total_space,fclose,feof,fflush,fgetc,fgetcsv,% - fgetss,file_get_contents,file,file_exists,fileatime,filectime,% - fileinode,filemtime,fileowner,fileperms,filesize,filetype,flock,% - fopen,fpassthru,fputs,fread,fscanf,fseek,fstat,ftell,ftruncate,% - set_file_buffer,is_dir,is_executable,is_file,is_link,% - is_writable,is_writeable,is_uploaded_file,link,linkinfo,mkdir,% - parse_ini_file,pathinfo,pclose,popen,readfile,readlink,rename,% - rmdir,stat,lstat,realpath,symlink,tempnam,tmpfile,touch,umask,% - %--- fribidi functions - fribidi_log2vis,% - %--- ftp functions - ftp_connect,ftp_login,ftp_pwd,ftp_cdup,ftp_chdir,ftp_mkdir,% - ftp_nlist,ftp_rawlist,ftp_systype,ftp_pasv,ftp_get,ftp_fget,% - ftp_fput,ftp_size,ftp_mdtm,ftp_rename,ftp_delete,ftp_site,% - ftp_quit,ftp_exec,ftp_set_option,ftp_get_option,% - %--- funchand functions - call_user_func_array,call_user_func,create_function,% - func_get_args,func_num_args,function_exists,% - register_shutdown_function,register_tick_function,% - %--- gettext functions - bindtextdomain,bind_textdomain_codeset,dcgettext,dcngettext,% - dngettext,gettext,ngettext,textdomain,% - %--- gmp functions - gmp_init,gmp_intval,gmp_strval,gmp_add,gmp_sub,gmp_mul,% - gmp_div_r,gmp_div_qr,gmp_div,gmp_mod,gmp_divexact,gmp_cmp,% - gmp_com,gmp_abs,gmp_sign,gmp_fact,gmp_sqrt,gmp_sqrtrm,% - gmp_pow,gmp_powm,gmp_prob_prime,gmp_gcd,gmp_gcdext,gmp_invert,% - gmp_jacobi,gmp_random,gmp_and,gmp_or,gmp_xor,gmp_setbit,% - gmp_scan0,gmp_scan1,gmp_popcount,gmp_hamdist,% - %--- http functions - header,headers_sent,setcookie,% - %--- hw functions - hw_Array2Objrec,hw_Children,hw_ChildrenObj,hw_Close,hw_Connect,% - hw_Deleteobject,hw_DocByAnchor,hw_DocByAnchorObj,% - hw_Document_BodyTag,hw_Document_Content,hw_Document_SetContent,% - hw_ErrorMsg,hw_EditText,hw_Error,hw_Free_Document,hw_GetParents,% - hw_GetChildColl,hw_GetChildCollObj,hw_GetRemote,% - hw_GetSrcByDestObj,hw_GetObject,hw_GetAndLock,hw_GetText,% - hw_GetObjectByQueryObj,hw_GetObjectByQueryColl,% - hw_GetChildDocColl,hw_GetChildDocCollObj,hw_GetAnchors,% - hw_Mv,hw_Identify,hw_InCollections,hw_Info,hw_InsColl,hw_InsDoc,% - hw_InsertObject,hw_mapid,hw_Modifyobject,hw_New_Document,% - hw_Output_Document,hw_pConnect,hw_PipeDocument,hw_Root,% - hw_Who,hw_getusername,hw_stat,hw_setlinkroot,hw_connection_info,% - hw_insertanchors,hw_getrellink,hw_changeobject,% - %--- ibase functions - ibase_connect,ibase_pconnect,ibase_close,ibase_query,% - ibase_fetch_row,ibase_fetch_object,ibase_field_info,% - ibase_free_result,ibase_prepare,ibase_execute,ibase_trans,% - ibase_rollback,ibase_timefmt,ibase_num_fields,ibase_blob_add,% - ibase_blob_close,ibase_blob_create,ibase_blob_echo,% - ibase_blob_import,ibase_blob_info,ibase_blob_open,% - %--- icap functions - icap_open,icap_close,icap_fetch_event,icap_list_events,% - icap_delete_event,icap_snooze,icap_list_alarms,% - icap_rename_calendar,icap_delete_calendar,icap_reopen,% - %--- iconv functions - iconv,iconv_get_encoding,iconv_set_encoding,ob_iconv_handler,% - %--- ifx functions - ifx_connect,ifx_pconnect,ifx_close,ifx_query,ifx_prepare,ifx_do,% - ifx_errormsg,ifx_affected_rows,ifx_getsqlca,ifx_fetch_row,% - ifx_fieldtypes,ifx_fieldproperties,ifx_num_fields,ifx_num_rows,% - ifx_create_char,ifx_free_char,ifx_update_char,ifx_get_char,% - ifx_copy_blob,ifx_free_blob,ifx_get_blob,ifx_update_blob,% - ifx_textasvarchar,ifx_byteasvarchar,ifx_nullformat,% - ifxus_free_slob,ifxus_close_slob,ifxus_open_slob,% - ifxus_seek_slob,ifxus_read_slob,ifxus_write_slob,% - %--- iisfunc functions - iis_get_server_by_path,iis_get_server_by_comment,iis_add_server,% - iis_set_dir_security,iis_get_dir_security,iis_set_server_rights,% - iis_set_script_map,iis_get_script_map,iis_set_app_settings,% - iis_stop_server,iis_stop_service,iis_start_service,% - %--- image functions - exif_imagetype,exif_read_data,exif_thumbnail,getimagesize,% - imagealphablending,imagearc,imagefilledarc,imageellipse,% - imagechar,imagecharup,imagecolorallocate,imagecolordeallocate,% - imagecolorclosest,imagecolorclosestalpha,imagecolorclosestthwb,% - imagecolorexactalpha,imagecolorresolve,imagecolorresolvealpha,% - imagecolorset,imagecolorsforindex,imagecolorstotal,% - imagecopy,imagecopymerge,imagecopymergegray,imagecopyresized,% - imagecreate,imagecreatetruecolor,imagetruecolortopalette,% - imagecreatefromgd2,imagecreatefromgd2part,imagecreatefromgif,% - imagecreatefrompng,imagecreatefromwbmp,imagecreatefromstring,% - imagecreatefromxpm,imagedashedline,imagedestroy,imagefill,% - imagefilledrectangle,imagefilltoborder,imagefontheight,% - imagegd,imagegd2,imagegif,imagepng,imagejpeg,imagewbmp,% - imageline,imageloadfont,imagepalettecopy,imagepolygon,% - imagepsencodefont,imagepsfreefont,imagepsloadfont,% - imagepsslantfont,imagepstext,imagerectangle,imagesetpixel,% - imagesetstyle,imagesettile,imagesetthickness,imagestring,% - imagesx,imagesy,imagettfbbox,imageftbbox,imagettftext,% - imagetypes,jpeg2wbmp,png2wbmp,iptcembed,read_exif_data,% - %--- imap functions - imap_8bit,imap_alerts,imap_append,imap_base64,imap_binary,% - imap_bodystruct,imap_check,imap_clearflag_full,imap_close,% - imap_delete,imap_deletemailbox,imap_errors,imap_expunge,% - imap_fetchbody,imap_fetchheader,imap_fetchstructure,% - imap_getmailboxes,imap_getsubscribed,imap_header,% - imap_headers,imap_last_error,imap_listmailbox,% - imap_mail,imap_mail_compose,imap_mail_copy,imap_mail_move,% - imap_mime_header_decode,imap_msgno,imap_num_msg,imap_num_recent,% - imap_ping,imap_popen,imap_qprint,imap_renamemailbox,imap_reopen,% - imap_rfc822_parse_headers,imap_rfc822_write_address,% - imap_search,imap_setacl,imap_set_quota,imap_setflag_full,% - imap_status,imap_subscribe,imap_uid,imap_undelete,% - imap_utf7_decode,imap_utf7_encode,imap_utf8,imap_thread,% - %--- info functions - assert,assert_options,extension_loaded,dl,getenv,get_cfg_var,% - get_defined_constants,get_extension_funcs,getmygid,% - get_loaded_extensions,get_magic_quotes_gpc,% - getlastmod,getmyinode,getmypid,getmyuid,get_required_files,% - ini_alter,ini_get,ini_get_all,ini_restore,ini_set,phpcredits,% - phpversion,php_logo_guid,php_sapi_name,php_uname,putenv,% - set_time_limit,version_compare,zend_logo_guid,zend_version,% - %--- ircg functions - ircg_pconnect,ircg_fetch_error_msg,ircg_set_current,ircg_join,% - ircg_msg,ircg_notice,ircg_nick,ircg_topic,ircg_channel_mode,% - ircg_whois,ircg_kick,ircg_ignore_add,ircg_ignore_del,% - ircg_is_conn_alive,ircg_lookup_format_messages,% - ircg_set_on_die,ircg_set_file,ircg_get_username,% - ircg_nickname_unescape,% - %--- java functions - java_last_exception_clear,java_last_exception_get,% - %--- ldap functions - ldap_add,ldap_bind,ldap_close,ldap_compare,ldap_connect,% - ldap_delete,ldap_dn2ufn,ldap_err2str,ldap_errno,ldap_error,% - ldap_first_attribute,ldap_first_entry,ldap_free_result,% - ldap_get_dn,ldap_get_entries,ldap_get_option,ldap_get_values,% - ldap_list,ldap_modify,ldap_mod_add,ldap_mod_del,% - ldap_next_attribute,ldap_next_entry,ldap_read,ldap_rename,% - ldap_set_option,ldap_unbind,ldap_8859_to_t61,% - ldap_next_reference,ldap_parse_reference,ldap_parse_result,% - ldap_sort,ldap_start_tls,ldap_t61_to_8859,% - %--- mail functions - mail,ezmlm_hash,% - %--- math functions - abs,acos,acosh,asin,asinh,atan,atanh,atan2,base_convert,bindec,% - cos,cosh,decbin,dechex,decoct,deg2rad,exp,expm1,floor,% - hexdec,hypot,is_finite,is_infinite,is_nan,lcg_value,log,log10,% - max,min,mt_rand,mt_srand,mt_getrandmax,number_format,octdec,pi,% - rad2deg,rand,round,sin,sinh,sqrt,srand,tan,tanh,% - %--- mbstring functions - mb_language,mb_parse_str,mb_internal_encoding,mb_http_input,% - mb_detect_order,mb_substitute_character,mb_output_handler,% - mb_strlen,mb_strpos,mb_strrpos,mb_substr,mb_strcut,mb_strwidth,% - mb_convert_encoding,mb_detect_encoding,mb_convert_kana,% - mb_decode_mimeheader,mb_convert_variables,% - mb_decode_numericentity,mb_send_mail,mb_get_info,% - mb_ereg,mb_eregi,mb_ereg_replace,mb_eregi_replace,mb_split,% - mb_ereg_search,mb_ereg_search_pos,mb_ereg_search_regs,% - mb_ereg_search_getregs,mb_ereg_search_getpos,% - %--- mcal functions - mcal_open,mcal_popen,mcal_reopen,mcal_close,% - mcal_rename_calendar,mcal_delete_calendar,mcal_fetch_event,% - mcal_append_event,mcal_store_event,mcal_delete_event,% - mcal_list_alarms,mcal_event_init,mcal_event_set_category,% - mcal_event_set_description,mcal_event_set_start,% - mcal_event_set_alarm,mcal_event_set_class,mcal_is_leap_year,% - mcal_date_valid,mcal_time_valid,mcal_day_of_week,% - mcal_date_compare,mcal_next_recurrence,% - mcal_event_set_recur_daily,mcal_event_set_recur_weekly,% - mcal_event_set_recur_monthly_wday,mcal_event_set_recur_yearly,% - mcal_event_add_attribute,mcal_expunge,mcal_week_of_year,% - %--- mcrypt functions - mcrypt_get_cipher_name,mcrypt_get_block_size,% - mcrypt_create_iv,mcrypt_cbc,mcrypt_cfb,mcrypt_ecb,mcrypt_ofb,% - mcrypt_list_modes,mcrypt_get_iv_size,mcrypt_encrypt,% - mcrypt_module_open,mcrypt_module_close,mcrypt_generic_deinit,% - mcrypt_generic,mdecrypt_generic,mcrypt_generic_end,% - mcrypt_enc_is_block_algorithm_mode,% - mcrypt_enc_is_block_mode,mcrypt_enc_get_block_size,% - mcrypt_enc_get_supported_key_sizes,mcrypt_enc_get_iv_size,% - mcrypt_enc_get_modes_name,mcrypt_module_self_test,% - mcrypt_module_is_block_algorithm,mcrypt_module_is_block_mode,% - mcrypt_module_get_algo_key_size,% - %--- mhash functions - mhash_get_hash_name,mhash_get_block_size,mhash_count,mhash,% - %--- misc functions - connection_aborted,connection_status,connection_timeout,% - define,defined,die,eval,exit,get_browser,highlight_file,% - ignore_user_abort,iptcparse,leak,pack,show_source,sleep,uniqid,% - usleep,% - %--- mnogosearch functions - udm_add_search_limit,udm_alloc_agent,udm_api_version,% - udm_cat_list,udm_clear_search_limits,udm_errno,udm_error,% - udm_free_agent,udm_free_ispell_data,udm_free_res,% - udm_get_res_field,udm_get_res_param,udm_load_ispell_data,% - udm_check_charset,udm_check_stored,udm_close_stored,udm_crc32,% - %--- msession functions - msession_connect,msession_disconnect,msession_count,% - msession_destroy,msession_lock,msession_unlock,msession_set,% - msession_uniq,msession_randstr,msession_find,msession_list,% - msession_set_array,msession_listvar,msession_timeout,% - msession_getdata,msession_setdata,msession_plugin,% - %--- msql functions - msql,msql_affected_rows,msql_close,msql_connect,msql_create_db,% - msql_data_seek,msql_dbname,msql_drop_db,msql_dropdb,msql_error,% - msql_fetch_field,msql_fetch_object,msql_fetch_row,% - msql_field_seek,msql_fieldtable,msql_fieldtype,msql_fieldflags,% - msql_free_result,msql_freeresult,msql_list_fields,% - msql_list_dbs,msql_listdbs,msql_list_tables,msql_listtables,% - msql_num_rows,msql_numfields,msql_numrows,msql_pconnect,% - msql_regcase,msql_result,msql_select_db,msql_selectdb,% - %--- mssql functions - mssql_close,mssql_connect,mssql_data_seek,mssql_fetch_array,% - mssql_fetch_object,mssql_fetch_row,mssql_field_length,% - mssql_field_seek,mssql_field_type,mssql_free_result,% - mssql_min_error_severity,mssql_min_message_severity,% - mssql_num_fields,mssql_num_rows,mssql_pconnect,mssql_query,% - mssql_select_db,mssql_bind,mssql_execute,mssql_fetch_assoc,% - mssql_guid_string,mssql_init,mssql_rows_affected,% - %--- muscat functions - muscat_setup,muscat_setup_net,muscat_give,muscat_get,% - %--- mysql functions - mysql_affected_rows,mysql_change_user,mysql_character_set_name,% - mysql_connect,mysql_create_db,mysql_data_seek,mysql_db_name,% - mysql_drop_db,mysql_errno,mysql_error,mysql_escape_string,% - mysql_fetch_assoc,mysql_fetch_field,mysql_fetch_lengths,% - mysql_fetch_row,mysql_field_flags,mysql_field_name,% - mysql_field_seek,mysql_field_table,mysql_field_type,% - mysql_info,mysql_insert_id,mysql_list_dbs,mysql_list_fields,% - mysql_list_tables,mysql_num_fields,mysql_num_rows,% - mysql_ping,mysql_query,mysql_unbuffered_query,% - mysql_result,mysql_select_db,mysql_tablename,mysql_thread_id,% - mysql_get_host_info,mysql_get_proto_info,mysql_get_server_info,% - %--- network functions - checkdnsrr,closelog,debugger_off,debugger_on,% - fsockopen,gethostbyaddr,gethostbyname,gethostbynamel,getmxrr,% - getprotobynumber,getservbyname,getservbyport,ip2long,long2ip,% - pfsockopen,socket_get_status,socket_set_blocking,% - syslog,% - %--- nis functions - yp_get_default_domain,yp_order,yp_master,yp_match,yp_first,% - yp_errno,yp_err_string,yp_all,yp_cat,% - %--- oci8 functions - OCIDefineByName,OCIBindByName,OCILogon,OCIPLogon,OCINLogon,% - OCIExecute,OCICommit,OCIRollback,OCINewDescriptor,OCIRowCount,% - OCIResult,OCIFetch,OCIFetchInto,OCIFetchStatement,% - OCIColumnName,OCIColumnSize,OCIColumnType,OCIServerVersion,% - OCINewCursor,OCIFreeStatement,OCIFreeCursor,OCIFreeDesc,% - OCIError,OCIInternalDebug,OCICancel,OCISetPrefetch,% - OCISaveLobFile,OCISaveLob,OCILoadLob,OCIColumnScale,% - OCIColumnTypeRaw,OCINewCollection,OCIFreeCollection,% - OCICollAppend,OCICollAssignElem,OCICollGetElem,OCICollMax,% - OCICollTrim,% - %--- oracle functions - Ora_Bind,Ora_Close,Ora_ColumnName,Ora_ColumnSize,Ora_ColumnType,% - Ora_CommitOff,Ora_CommitOn,Ora_Do,Ora_Error,Ora_ErrorCode,% - Ora_Fetch,Ora_Fetch_Into,Ora_GetColumn,Ora_Logoff,Ora_Logon,% - Ora_Numcols,Ora_Numrows,Ora_Open,Ora_Parse,Ora_Rollback,% - %--- outcontrol functions - flush,ob_start,ob_get_contents,ob_get_length,ob_get_level,% - ob_flush,ob_clean,ob_end_flush,ob_end_clean,ob_implicit_flush,% - %--- ovrimos functions - ovrimos_connect,ovrimos_close,ovrimos_longreadlen,% - ovrimos_execute,ovrimos_cursor,ovrimos_exec,ovrimos_fetch_into,% - ovrimos_result,ovrimos_result_all,ovrimos_num_rows,% - ovrimos_field_name,ovrimos_field_type,ovrimos_field_len,% - ovrimos_free_result,ovrimos_commit,ovrimos_rollback,% - %--- pcntl functions - pcntl_fork,pcntl_signal,pcntl_waitpid,pcntl_wexitstatus,% - pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,% - pcntl_exec,% - %--- pcre functions - preg_match,preg_match_all,preg_replace,preg_replace_callback,% - preg_quote,preg_grep,Pattern Modifiers,Pattern Syntax,% - %--- pdf functions - pdf_add_annotation,pdf_add_bookmark,pdf_add_launchlink,% - pdf_add_note,pdf_add_outline,pdf_add_pdflink,pdf_add_thumbnail,% - pdf_arc,pdf_arcn,pdf_attach_file,pdf_begin_page,% - pdf_begin_template,pdf_circle,pdf_clip,pdf_close,pdf_closepath,% - pdf_closepath_stroke,pdf_close_image,pdf_close_pdi,% - pdf_concat,pdf_continue_text,pdf_curveto,pdf_delete,% - pdf_endpath,pdf_end_pattern,pdf_end_template,pdf_fill,% - pdf_findfont,pdf_get_buffer,pdf_get_font,pdf_get_fontname,% - pdf_get_image_height,pdf_get_image_width,pdf_get_parameter,% - pdf_get_pdi_value,pdf_get_majorversion,pdf_get_minorversion,% - pdf_initgraphics,pdf_lineto,pdf_makespotcolor,pdf_moveto,% - pdf_open,pdf_open_CCITT,pdf_open_file,pdf_open_gif,% - pdf_open_image_file,pdf_open_jpeg,pdf_open_memory_image,% - pdf_open_pdi_page,pdf_open_png,pdf_open_tiff,pdf_place_image,% - pdf_rect,pdf_restore,pdf_rotate,pdf_save,pdf_scale,pdf_setcolor,% - pdf_setflat,pdf_setfont,pdf_setgray,pdf_setgray_fill,% - pdf_setlinecap,pdf_setlinejoin,pdf_setlinewidth,pdf_setmatrix,% - pdf_setpolydash,pdf_setrgbcolor,pdf_setrgbcolor_fill,% - pdf_set_border_color,pdf_set_border_dash,pdf_set_border_style,% - pdf_set_duration,pdf_set_font,pdf_set_horiz_scaling,% - pdf_set_info_author,pdf_set_info_creator,pdf_set_info_keywords,% - pdf_set_info_title,pdf_set_leading,pdf_set_parameter,% - pdf_set_text_rendering,pdf_set_text_rise,pdf_set_text_matrix,% - pdf_set_word_spacing,pdf_show,pdf_show_boxed,pdf_show_xy,% - pdf_stringwidth,pdf_stroke,pdf_translate,% - %--- pfpro functions - pfpro_init,pfpro_cleanup,pfpro_process,pfpro_process_raw,% - %--- pgsql functions - pg_close,pg_affected_rows,pg_connect,pg_dbname,pg_end_copy,% - pg_query,pg_fetch_array,pg_fetch_object,pg_fetch_row,% - pg_field_name,pg_field_num,pg_field_prtlen,pg_field_size,% - pg_free_result,pg_last_oid,pg_host,pg_last_notice,pg_lo_close,% - pg_lo_export,pg_lo_import,pg_lo_open,pg_lo_read,pg_lo_seek,% - pg_lo_read_all,pg_lo_unlink,pg_lo_write,pg_num_fields,% - pg_options,pg_pconnect,pg_port,pg_put_line,pg_fetch_result,% - pg_client_encoding,pg_trace,pg_tty,pg_untrace,pg_get_result,% - pg_send_query,pg_cancel_query,pg_connection_busy,% - pg_connection_status,pg_copy_from,pg_copy_to,pg_escape_bytea,% - pg_result_error,% - %--- posix functions - posix_kill,posix_getpid,posix_getppid,posix_getuid,% - posix_getgid,posix_getegid,posix_setuid,posix_seteuid,% - posix_setegid,posix_getgroups,posix_getlogin,posix_getpgrp,% - posix_setpgid,posix_getpgid,posix_getsid,posix_uname,% - posix_ctermid,posix_ttyname,posix_isatty,posix_getcwd,% - posix_getgrnam,posix_getgrgid,posix_getpwnam,posix_getpwuid,% - %--- printer functions - printer_open,printer_abort,printer_close,printer_write,% - printer_set_option,printer_get_option,printer_create_dc,% - printer_start_doc,printer_end_doc,printer_start_page,% - printer_create_pen,printer_delete_pen,printer_select_pen,% - printer_delete_brush,printer_select_brush,printer_create_font,% - printer_select_font,printer_logical_fontheight,% - printer_draw_rectangle,printer_draw_elipse,printer_draw_text,% - printer_draw_chord,printer_draw_pie,printer_draw_bmp,% - %--- pspell functions - pspell_add_to_personal,pspell_add_to_session,pspell_check,% - pspell_config_create,pspell_config_ignore,pspell_config_mode,% - pspell_config_repl,pspell_config_runtogether,% - pspell_new,pspell_new_config,pspell_new_personal,% - pspell_store_replacement,pspell_suggest,% - %--- qtdom functions - qdom_tree,qdom_error,% - %--- readline functions - readline,readline_add_history,readline_clear_history,% - readline_info,readline_list_history,readline_read_history,% - %--- recode functions - recode_string,recode,recode_file,% - %--- regex functions - ereg,ereg_replace,eregi,eregi_replace,split,spliti,sql_regcase,% - %--- sem functions - sem_get,sem_acquire,sem_release,sem_remove,shm_attach,% - shm_remove,shm_put_var,shm_get_var,shm_remove_var,ftok,% - %--- sesam functions - sesam_connect,sesam_disconnect,sesam_settransaction,% - sesam_rollback,sesam_execimm,sesam_query,sesam_num_fields,% - sesam_diagnostic,sesam_fetch_result,sesam_affected_rows,% - sesam_field_array,sesam_fetch_row,sesam_fetch_array,% - sesam_free_result,% - %--- session functions - session_start,session_destroy,session_name,session_module_name,% - session_id,session_register,session_unregister,session_unset,% - session_get_cookie_params,session_set_cookie_params,% - session_encode,session_set_save_handler,session_cache_limiter,% - session_write_close,% - %--- shmop functions - shmop_open,shmop_read,shmop_write,shmop_size,shmop_delete,% - %--- snmp functions - snmpget,snmpset,snmpwalk,snmpwalkoid,snmp_get_quick_print,% - snmprealwalk,% - %--- strings functions - addcslashes,addslashes,bin2hex,chop,chr,chunk_split,% - count_chars,crc32,crypt,echo,explode,get_html_translation_table,% - hebrev,hebrevc,htmlentities,htmlspecialchars,implode,join,% - localeconv,ltrim,md5,md5_file,metaphone,nl_langinfo,nl2br,ord,% - print,printf,quoted_printable_decode,quotemeta,str_rot13,rtrim,% - setlocale,similar_text,soundex,sprintf,strncasecmp,strcasecmp,% - strcmp,strcoll,strcspn,strip_tags,stripcslashes,stripslashes,% - strlen,strnatcmp,strnatcasecmp,strncmp,str_pad,strpos,strrchr,% - strrev,strrpos,strspn,strstr,strtok,strtolower,strtoupper,% - strtr,substr,substr_count,substr_replace,trim,ucfirst,ucwords,% - vsprintf,wordwrap,% - %--- swf functions - swf_openfile,swf_closefile,swf_labelframe,swf_showframe,% - swf_getframe,swf_mulcolor,swf_addcolor,swf_placeobject,% - swf_removeobject,swf_nextid,swf_startdoaction,% - swf_actiongeturl,swf_actionnextframe,swf_actionprevframe,% - swf_actionstop,swf_actiontogglequality,swf_actionwaitforframe,% - swf_actiongotolabel,swf_enddoaction,swf_defineline,% - swf_definepoly,swf_startshape,swf_shapelinesolid,% - swf_shapefillsolid,swf_shapefillbitmapclip,% - swf_shapemoveto,swf_shapelineto,swf_shapecurveto,% - swf_shapearc,swf_endshape,swf_definefont,swf_setfont,% - swf_fontslant,swf_fonttracking,swf_getfontinfo,swf_definetext,% - swf_definebitmap,swf_getbitmapinfo,swf_startsymbol,% - swf_startbutton,swf_addbuttonrecord,swf_oncondition,% - swf_viewport,swf_ortho,swf_ortho2,swf_perspective,swf_polarview,% - swf_pushmatrix,swf_popmatrix,swf_scale,swf_translate,swf_rotate,% - %--- sybase functions - sybase_affected_rows,sybase_close,sybase_connect,% - sybase_fetch_array,sybase_fetch_field,sybase_fetch_object,% - sybase_field_seek,sybase_free_result,sybase_get_last_message,% - sybase_min_error_severity,sybase_min_message_severity,% - sybase_num_fields,sybase_num_rows,sybase_pconnect,sybase_query,% - sybase_select_db,% - %--- uodbc functions - odbc_autocommit,odbc_binmode,odbc_close,odbc_close_all,% - odbc_connect,odbc_cursor,odbc_do,odbc_error,odbc_errormsg,% - odbc_execute,odbc_fetch_into,odbc_fetch_row,odbc_fetch_array,% - odbc_fetch_object,odbc_field_name,odbc_field_num,% - odbc_field_len,odbc_field_precision,odbc_field_scale,% - odbc_longreadlen,odbc_num_fields,odbc_pconnect,odbc_prepare,% - odbc_result,odbc_result_all,odbc_rollback,odbc_setoption,% - odbc_tableprivileges,odbc_columns,odbc_columnprivileges,% - odbc_primarykeys,odbc_foreignkeys,odbc_procedures,% - odbc_specialcolumns,odbc_statistics,% - %--- url functions - base64_decode,base64_encode,parse_url,rawurldecode,rawurlencode,% - urlencode,% - %--- var functions - doubleval,empty,floatval,gettype,get_defined_vars,% - import_request_variables,intval,is_array,is_bool,is_double,% - is_int,is_integer,is_long,is_null,is_numeric,is_object,is_real,% - is_scalar,is_string,isset,print_r,serialize,settype,strval,% - unset,var_dump,var_export,is_callable,% - %--- vpopmail functions - vpopmail_add_domain,vpopmail_del_domain,% - vpopmail_add_domain_ex,vpopmail_del_domain_ex,% - vpopmail_add_user,vpopmail_del_user,vpopmail_passwd,% - vpopmail_auth_user,vpopmail_alias_add,vpopmail_alias_del,% - vpopmail_alias_get,vpopmail_alias_get_all,vpopmail_error,% - %--- w32api functions - w32api_set_call_method,w32api_register_function,% - w32api_deftype,w32api_init_dtype,% - %--- wddx functions - wddx_serialize_value,wddx_serialize_vars,wddx_packet_start,% - wddx_add_vars,wddx_deserialize,% - %--- xml functions - xml_parser_create,xml_set_object,xml_set_element_handler,% - xml_set_processing_instruction_handler,xml_set_default_handler,% - xml_set_notation_decl_handler,% - xml_parse,xml_get_error_code,xml_error_string,% - xml_get_current_column_number,xml_get_current_byte_index,% - xml_parser_free,xml_parser_set_option,xml_parser_get_option,% - utf8_encode,xml_parser_create_ns,% - xml_set_start_namespace_decl_handler,% - %--- xslt functions - xslt_set_log,xslt_create,xslt_errno,xslt_error,xslt_free,% - xslt_set_sax_handler,xslt_set_scheme_handler,% - xslt_set_base,xslt_set_encoding,xslt_set_sax_handlers,% - %--- yaz functions - yaz_addinfo,yaz_close,yaz_connect,yaz_errno,yaz_error,yaz_hits,% - yaz_database,yaz_range,yaz_record,yaz_search,yaz_present,% - yaz_scan,yaz_scan_result,yaz_ccl_conf,yaz_ccl_parse,% - yaz_wait,yaz_sort,% - %--- zip functions - zip_close,zip_entry_close,zip_entry_compressedsize,% - zip_entry_filesize,zip_entry_name,zip_entry_open,zip_entry_read,% - zip_read,% - %--- zlib functions - gzclose,gzeof,gzfile,gzgetc,gzgets,gzgetss,gzopen,gzpassthru,% - gzread,gzrewind,gzseek,gztell,gzwrite,readgzfile,gzcompress,% - gzdeflate,gzinflate,gzencode,},% - sensitive,% - morecomment=[l]\#,% - morecomment=[l]//,% - morecomment=[s]{/*}{*/},% - morestring=[b]",% - morestring=[b]'% - }[keywords,comments,strings]% -%% -%% Prolog definition (c) 1997 Dominique de Waleffe -%% -\lst@definelanguage{Prolog}% - {morekeywords={op,mod,abort,ancestors,arg,ascii,ask,assert,asserta,% - assertz,atom,atomic,char,clause,close,concat,consult,ed,ef,em,% - eof,fail,file,findall,write,functor,getc,integer,is,length,% - listing,load,name,nl,nonvar,not,numbervars,op,or,pp,prin,print,% - private,prompt,putc,ratom,read,read_from_this_file,rename,repeat,% - retract,retractall,save,see,seeing,seen,sh,skip,statistics,% - subgoal_of,system,tab,tell,telling,time,told,trace,true,unload,% - untrace,var,write},% - sensitive=f,% - morecomment=[l]\%,% - morecomment=[s]{/*}{*/},% - morestring=[bd]",% - morestring=[bd]'% - }[keywords,comments,strings]% -%% -%% classic rexx listings definition -%% by Patrick TJ McPhee -%% -\lst@definelanguage{Rexx} - {morekeywords={address,arg,call,do,drop,else,end,exit,if,iterate,% - interpret,leave,nop,numeric,options,otherwise,parse,% - procedure,pull,push,queue,return,say,signal,then,to,% - trace,when},% - sensitive=false,% - morecomment=[n]{/*}{*/},% - morestring=[d]{'},% - morestring=[d]{"},% - }[keywords,comments,strings]% -\lst@definelanguage{Ruby}% - {morekeywords={__FILE__,__LINE__,BEGIN,END,alias,and,begin,break,% - case,class,def,defined?,do,else,elsif,end,ensure,false,for,% - if,in,module,next,nil,not,or,redo,rescue,retry,return,self,% - super,then,true,undef,unless,until,when,while,yield},% - sensitive=true,% - morecomment=[l]\#,% - morecomment=[l]\#\#,% - morecomment=[s]{=BEGIN}{=END},% - morestring=[b]',% - morestring=[b]",% - morestring=[b]/% - }[keywords,comments,strings]% -%% -%% SHELXL definition (c) 1999 Aidan Philip Heerdegen -%% -\lst@definelanguage{SHELXL}% - {morekeywords={TITL,CELL,ZERR,LATT,SYMM,SFAC,DISP,UNIT,LAUE,% - REM,MORE,TIME,END,HKLF,OMIT,SHEL,BASF,TWIN,EXTI,SWAT,% - MERG,SPEC,RESI,MOVE,ANIS,AFIX,HFIX,FRAG,FEND,EXYZ,EADP,% - EQIV,OMIT,CONN,PART,BIND,FREE,DFIX,BUMP,SAME,SADI,CHIV,% - FLAT,DELU,SIMU,DEFS,ISOR,SUMP,L.S.,CGLS,SLIM,BLOC,DAMP,% - WGHT,FVAR,BOND,CONF,MPLA,RTAB,LIST,ACTA,SIZE,TEMP,WPDB,% - FMAP,GRID,PLAN,MOLE},% - sensitive=false,% - alsoother=_,% Makes the syntax highlighting ignore the underscores - morecomment=[l]{! },% - }% -%% -%% Tcl/Tk definition (c) Gerd Neugebauer -%% -\lst@definelanguage[tk]{tcl}[]{tcl}% - {morekeywords={activate,add,separator,radiobutton,checkbutton,% - command,cascade,all,bell,bind,bindtags,button,canvas,canvasx,% - canvasy,cascade,cget,checkbutton,config,configu,configur,% - configure,clipboard,create,arc,bitmap,image,line,oval,polygon,% - rectangle,text,textwindow,curselection,delete,destroy,end,entry,% - entrycget,event,focus,font,actual,families,measure,metrics,names,% - frame,get,grab,current,release,status,grid,columnconfigure,% - rowconfigure,image,image,create,bitmap,photo,delete,height,types,% - widt,names,index,insert,invoke,itemconfigure,label,listbox,lower,% - menu,menubutton,message,move,option,add,clear,get,readfile,pack,% - photo,place,radiobutton,raise,scale,scroll,scrollbar,search,see,% - selection,send,stdin,stdout,stderr,tag,bind,text,tk,tkerror,% - tkwait,window,variable,visibility,toplevel,unknown,update,winfo,% - class,exists,ismapped,parent,reqwidth,reqheight,rootx,rooty,% - width,height,wm,aspect,client,command,deiconify,focusmodel,frame,% - geometry,group,iconbitmap,iconify,iconmask,iconname,iconposition,% - iconwindow,maxsize,minsize,overrideredirect,positionfrom,% - protocol,sizefrom,state,title,transient,withdraw,xview,yview,% - yposition,% - -accelerator,-activebackground,-activeborderwidth,% - -activeforeground,-after,-anchor,-arrow,-arrowshape,-aspect,% - -async,-background,-before,-bg,-bigincrement,-bitmap,-bordermode,% - -borderwidth,-button,-capstyle,-channel,-class,-closeenough,% - -colormap,-column,-columnspan,-command,-confine,-container,% - -count,-cursor,-data,-default,-detail,-digits,-direction,% - -displayof,-disableforeground,-elementborderwidth,-expand,% - -exportselection,-extend,-family,-fg,-file,-fill,-focus,-font,% - -fontmap,-foreground,-format,-from,-gamma,-global,-height,% - -highlightbackground,-highlightcolor,-highlightthickness,-icon,% - -image,-in,-insertbackground,-insertborderwidth,-insertofftime,% - -insertontime,-imsertwidth,-ipadx,-ipady,-joinstyle,-jump,% - -justify,-keycode,-keysym,-label,-lastfor,-length,-maskdata,% - -maskfile,-menu,-message,-mode,-offvalue,-onvalue,-orient,% - -outlien,-outlinestipple,-overstrike,-override,-padx,-pady,% - -pageanchor,-pageheight,-pagewidth,-pagey,-pagey,-palette,% - -parent,-place,-postcommand,-relheight,-relief,-relwidth,-relx,% - -rely,-repeatdelay,-repeatinterval,-resolution,-root,-rootx,% - -rooty,-rotate,-row,-rowspan,-screen,-selectcolor,-selectimage,% - -sendevent,-serial,-setgrid,-showvalue,-shrink,-side,-size,% - -slant,-sliderlength,-sliderrelief,-smooth,-splinesteps,-state,% - -sticky,-stipple,-style,-subsample,-subwindow,-tags,-takefocus,% - -tearoff,-tearoffcommand,-text,-textvariable,-tickinterval,-time,% - -title,-to,-troughcolor,-type,-underline,-use,-value,-variable,% - -visual,-width,-wrap,-wraplength,-x,-xscrollcommand,-y,% - -bgstipple,-fgstipple,-lmargin1,-lmargin2,-rmargin,-spacing1,% - -spacing2,-spacing3,-tabs,-yscrollcommand,-zoom,% - activate,add,addtag,bbox,cget,clone,configure,coords,% - curselection,debug,delete,delta,deselect,dlineinfo,dtag,dump,% - entrycget,entryconfigure,find,flash,fraction,get,gettags,handle,% - icursor,identify,index,insert,invoke,itemcget,itemconfigure,mark,% - moveto,own,post,postcascade,postscript,put,redither,ranges,% - scale,select,show,tag,type,unpost,xscrollcommand,xview,% - yscrollcommand,yview,yposition}% - }% -\lst@definelanguage[]{tcl}% - {alsoletter={.:,*=&-},% - morekeywords={after,append,array,names,exists,anymore,donesearch,% - get,nextelement,set,size,startsearch,auto_mkindex,binary,break,% - case,catch,cd,clock,close,concat,console,continue,default,else,% - elseif,eof,error,eval,exec,-keepnewline,exit,expr,fblocked,% - fconfigure,fcopy,file,atime,dirname,executable,exists,extension,% - isdirectory,isfile,join,lstat,mtime,owned,readable,readlink,% - rootname,size,stat,tail,type,writable,-permissions,-group,-owner,% - -archive,-hidden,-readonly,-system,-creator,-type,-force,% - fileevent,flush,for,foreach,format,gets,glob,global,history,if,% - incr,info,argsbody,cmdcount,commands,complete,default,exists,% - globals,level,library,locals,patchlevel,procs,script,tclversion,% - vars,interp,join,lappend,lindex,linsert,list,llength,lrange,% - lreplace,lsearch,-exact,-regexp,-glob,lsort,-ascii,-integer,% - -real,-dictionary,-increasing,-decreasing,-index,-command,load,% - namespace,open,package,forget,ifneeded,provide,require,unknown,% - vcompare,versions,vsatisfies,pid,proc,puts,-nonewline,pwd,read,% - regexp,-indices,regsub,-all,-nocaserename,return,scan,seek,set,% - socket,source,split,string,compare,first,index,last,length,match,% - range,tolower,toupper,trim,trimleft,trimright,subst,switch,tell,% - time,trace,variable,vdelete,vinfo,unknown,unset,uplevel,upvar,% - vwait,while,acos,asin,atan,atan2,ceil,cos,cosh,exp,floor,fmod,% - hypot,log,log10,pow,sin,sinh,sqrt,tan,tanh,abs,double,int,round% - },% - morestring=[d]",% - MoreSelectCharTable=% - \lst@CArgX\#\relax\lst@DefDelimB{}{}% - {\ifx\lst@lastother\lstum@backslash - \expandafter\@gobblethree - \fi}% - \lst@BeginComment\lst@commentmode - {{\lst@commentstyle}\lst@Lmodetrue}% - }[keywords,comments,strings]% -%% -%% VBScript definition (c) 2000 Sonja Weidmann -%% -\lst@definelanguage{VBScript}% - {morekeywords={Call,Case,Const,Dim,Do,Each,Else,End,Erase,Error,Exit,% - Explicit,For,Function,If,Loop,Next,On,Option,Private,Public,% - Randomize,ReDim,Rem,Select,Set,Sub,Then,Wend,While,Abs,Array,Asc,% - Atn,CBool,CByte,CCur,CDate,CDbl,Chr,CInt,CLng,Cos,CreateObject,% - CSng,CStr,Date,DateAdd,DateDiff,DatePart,DateSerial,DateValue,% - Day,Exp,Filter,Fix,FormatCurrency,FormatDateTime,FormatNumber,% - FormatPercent,GetObject,Hex,Hour,InputBox,InStr,InStrRev,Int,% - IsArray,IsDate,IsEmpty,IsNull,IsNumeric,IsObject,Join,LBound,% - LCase,Left,Len,LoadPicture,Log,LTrim,Mid,Minute,Month,MonthName,% - MsgBox,Now,Oct,Replace,RGB,Right,Rnd,Round,RTrim,ScriptEngine,% - ScriptEngineBuildVersion,ScriptEngineMajorVersion,% - ScriptEngineMinorVersion,Second,Sgn,Sin,Space,Split,Sqr,StrComp,% - StrReverse,String,Tan,Time,TimeSerial,TimeValue,Trim,TypeName,% - UBound,UCase,VarType,Weekday,WeekdayName,Year, And,Eqv,Imp,Is,% - Mod,Not,Or,Xor,Add,BuildPath,Clear,Close,Copy,CopyFile,% - CopyFolder,CreateFolder,CreateTextFile,Delete,DeleteFile,% - DeleteFolder,Dictionary,Drive,DriveExists,Drives,Err,Exists,File,% - FileExists,FileSystemObject,Files,Folder,FolderExists,Folders,% - GetAbsolutePathName,GetBaseName,GetDrive,GetDriveName,% - GetExtensionName,GetFile,GetFileName,GetFolder,% - GetParentFolderName,GetSpecialFolder,GetTempName,Items,Keys,Move,% - MoveFile,MoveFolder,OpenAsTextStream,OpenTextFile,Raise,Read,% - ReadAll,ReadLine,Remove,RemoveAll,Skip,SkipLine,TextStream,Write,% - WriteBlankLines,WriteLine,Alias,Archive,CDROM,Compressed,% - Directory,Fixed,ForAppending,ForReading,ForWriting,Hidden,Normal,% - RAMDisk,ReadOnly,Remote,Removable,System,SystemFolder,% - TemporaryFolder,TristateFalse,TristateTrue,TristateUseDefault,% - Unknown,Volume,WindowsFolder,vbAbortRetryIgnore,% - vbApplicationModal,vbArray,vbBinaryCompare,vbBlack,vbBlue,% - vbBoolean,vbByte,vbCr,vbCrLf,vbCritical,vbCurrency,vbCyan,% - vbDataObject,vbDate,vbDecimal,vbDefaultButton1,vbDefaultButton2,% - vbDefaultButton3,vbDefaultButton4,vbDouble,vbEmpty,vbError,% - vbExclamation,vbFirstFourDays,vbFirstFullWeek,vbFirstJan1,% - vbFormFeed,vbFriday,vbGeneralDate,vbGreen,vbInformation,% - vbInteger,vbLf,vbLong,vbLongDate,vbLongTime,vbMagenta,vbMonday,% - vbNewLine,vbNull,vbNullChar,vbNullString,vbOKC,ancel,vbOKOnly,% - vbObject,vbObjectError,vbQuestion,vbRed,vbRetryCancel,vbSaturday,% - vbShortDate,vbShortTime,vbSingle,vbString,vbSunday,vbSystemModal,% - vbTab,vbTextCompare,vbThursday,vbTuesday,vbUseSystem,% - vbUseSystemDayOfWeek,vbVariant,vbVerticalTab,vbWednesday,vbWhite,% - vbYellow,vbYesNo,vbYesNoCancel},% - sensitive=f,% - morecomment=[l]',% - morestring=[d]"% - }[keywords,comments,strings]% -%% -%% VRML definition (c) 2001 Oliver Baum -%% -\lst@definelanguage[97]{VRML} - {morekeywords={DEF,EXTERNPROTO,FALSE,IS,NULL,PROTO,ROUTE,TO,TRUE,USE,% - eventIn,eventOut,exposedField,field,Introduction,Anchor,% - Appearance,AudioClip,Background,Billboard,Box,Collision,Color,% - ColorInterpolator,Cone,Coordinate,CoordinateInterpolator,% - Cylinder,CylinderSensor,DirectionalLight,ElevationGrid,Extrusion,% - Fog,FontStyle,Group,ImageTexture,IndexedFaceSet,IndexedLineSet,% - Inline,LOD,Material,MovieTexture,NavigationInfo,Normal,% - NormalInterpolator,OrientationInterpolator,PixelTexture,% - PlaneSensor,PointLight,PointSet,PositionInterpolator,% - ProximitySensor,ScalarInterpolator,Script,Shape,Sound,Sphere,% - SphereSensor,SpotLight,Switch,Text,TextureCoordinate,% - TextureTransform,TimeSensor,TouchSensor,Transform,Viewpoint,% - VisibilitySensor,WorldInfo},% - morecomment=[l]\#,% bug: starts comment in the first column - morestring=[b]"% - }[keywords,comments,strings] -\endinput -%% -%% End of file `lstlang2.sty'. diff --git a/org.glite.lb.doc/src/lstlang3.sty b/org.glite.lb.doc/src/lstlang3.sty deleted file mode 100644 index b43bc9e..0000000 --- a/org.glite.lb.doc/src/lstlang3.sty +++ /dev/null @@ -1,1006 +0,0 @@ -%% -%% This is file `lstlang3.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% lstdrvrs-1.3.dtx (with options: `lang3') -%% -%% (w)(c) 1996/1997/1998/1999/2000/2001/2002/2003/2004 Carsten Heinz -%% and/or any other author listed elsewhere in this file. -%% -%% This file is distributed under the terms of the LaTeX Project Public -%% License from CTAN archives in directory macros/latex/base/lppl.txt. -%% Either version 1.0 or, at your option, any later version. -%% -%% This file is completely free and comes without any warranty. -%% -%% Send comments and ideas on the package, error reports and additional -%% programming languages to . -%% -\ProvidesFile{lstlang3.sty} - [2004/09/05 1.3 listings language file] -\lst@definelanguage[68]{Algol}% - {morekeywords={abs,and,arg,begin,bin,bits,bool,by,bytes,case,channel,% - char,co,comment,compl,conj,divab,do,down,elem,elif,else,empty,% - end,entier,eq,esac,exit,false,fi,file,flex,for,format,from,ge,% - goto,gt,heap,if,im,in,int,is,isnt,le,leng,level,loc,long,lt,lwb,% - minusab,mod,modab,mode,ne,nil,not,od,odd,of,op,or,ouse,out,over,% - overab,par,plusab,plusto,pr,pragmat,prio,proc,re,real,ref,repr,% - round,sema,shl,short,shorten,shr,sign,skip,string,struct,then,% - timesab,to,true,union,up,upb,void,while},% - sensitive=f,% ??? - morecomment=[s]{\#}{\#},% - keywordcomment={co,comment}% - }[keywords,comments,keywordcomments]% -\lst@definelanguage[60]{Algol}% - {morekeywords={array,begin,Boolean,code,comment,div,do,else,end,% - false,for,goto,if,integer,label,own,power,procedure,real,step,% - string,switch,then,true,until,value,while},% - sensitive=f,% ??? - keywordcommentsemicolon={end}{else,end}{comment}% - }[keywords,keywordcomments]% -%% -%% x86masm definition (c) 2002 Andrew Zabolotny -%% -\lst@definelanguage[x86masm]{Assembler}% - {morekeywords={al,ah,ax,eax,bl,bh,bx,ebx,cl,ch,cx,ecx,dl,dh,dx,edx,% - si,esi,di,edi,bp,ebp,sp,esp,cs,ds,es,ss,fs,gs,cr0,cr1,cr2,cr3,% - db0,db1,db2,db3,db4,db5,db6,db7,tr0,tr1,tr2,tr3,tr4,tr5,tr6,tr7,% - st,aaa,aad,aam,aas,adc,add,and,arpl,bound,bsf,bsr,bswap,bt,btc,% - btr,bts,call,cbw,cdq,clc,cld,cli,clts,cmc,cmp,cmps,cmpsb,cmpsw,% - cmpsd,cmpxchg,cwd,cwde,daa,das,dec,div,enter,hlt,idiv,imul,in,% - inc,ins,int,into,invd,invlpg,iret,ja,jae,jb,jbe,jc,jcxz,jecxz,% - je,jg,jge,jl,jle,jna,jnae,jnb,jnbe,jnc,jne,jng,jnge,jnl,jnle,% - jno,jnp,jns,jnz,jo,jp,jpe,jpo,js,jz,jmp,lahf,lar,lea,leave,lgdt,% - lidt,lldt,lmsw,lock,lods,lodsb,lodsw,lodsd,loop,loopz,loopnz,% - loope,loopne,lds,les,lfs,lgs,lss,lsl,ltr,mov,movs,movsb,movsw,% - movsd,movsx,movzx,mul,neg,nop,not,or,out,outs,pop,popa,popad,% - popf,popfd,push,pusha,pushad,pushf,pushfd,rcl,rcr,rep,repe,% - repne,repz,repnz,ret,retf,rol,ror,sahf,sal,sar,sbb,scas,seta,% - setae,setb,setbe,setc,sete,setg,setge,setl,setle,setna,setnae,% - setnb,setnbe,setnc,setne,setng,setnge,setnl,setnle,setno,setnp,% - setns,setnz,seto,setp,setpe,setpo,sets,setz,sgdt,shl,shld,shr,% - shrd,sidt,sldt,smsw,stc,std,sti,stos,stosb,stosw,stosd,str,sub,% - test,verr,verw,wait,wbinvd,xadd,xchg,xlatb,xor,fabs,fadd,fbld,% - fbstp,fchs,fclex,fcom,fcos,fdecstp,fdiv,fdivr,ffree,fiadd,ficom,% - fidiv,fidivr,fild,fimul,fincstp,finit,fist,fisub,fisubr,fld,fld1,% - fldl2e,fldl2t,fldlg2,fldln2,fldpi,fldz,fldcw,fldenv,fmul,fnop,% - fpatan,fprem,fprem1,fptan,frndint,frstor,fsave,fscale,fsetpm,% - fsin,fsincos,fsqrt,fst,fstcw,fstenv,fstsw,fsub,fsubr,ftst,fucom,% - fwait,fxam,fxch,fxtract,fyl2x,fyl2xp1,f2xm1},% - morekeywords=[2]{.align,.alpha,assume,byte,code,comm,comment,.const,% - .cref,.data,.data?,db,dd,df,dosseg,dq,dt,dw,dword,else,end,endif,% - endm,endp,ends,eq,equ,.err,.err1,.err2,.errb,.errdef,.errdif,% - .erre,.erridn,.errnb,.errndef,.errnz,event,exitm,extrn,far,% - .fardata,.fardata?,fword,ge,group,gt,high,if,if1,if2,ifb,ifdef,% - ifdif,ife,ifidn,ifnb,ifndef,include,includelib,irp,irpc,label,% - .lall,le,length,.lfcond,.list,local,low,lt,macro,mask,mod,.model,% - name,ne,near,offset,org,out,page,proc,ptr,public,purge,qword,.% - radix,record,rept,.sall,seg,segment,.seq,.sfcond,short,size,% - .stack,struc,subttl,tbyte,.tfcond,this,title,type,.type,width,% - word,.xall,.xcref,.xlist},% - alsoletter=.,alsodigit=?,% - sensitive=f,% - morestring=[b]",% - morestring=[b]',% - morecomment=[l];% - }[keywords,comments,strings] -%% -%% Clean definition (c) 1999 Jos\'e Romildo Malaquias -%% -%% Clean 1.3 : some standard functional language: pure, lazy, -%% polymorphic type system, modules, type classes, -%% garbage collection, functions as first class citizens -%% -\lst@definelanguage{Clean}% - {otherkeywords={:,::,=,:==,=:,=>,->,<-,<-:,\{,\},\{|,|\},\#,\#!,|,\&,% - [,],!,.,\\\\,;,_},% - morekeywords={from,definition,implementation,import,module,system,% - case,code,if,in,let,let!,of,where,with,infix,infixl,infixr},% - morendkeywords={True,False,Start,Int,Real,Char,Bool,String,World,% - File,ProcId},% - sensitive,% - morecomment=[l]//,% missing comma: Markus Pahlow - morecomment=[n]{/*}{*/},% - morestring=[b]"% - }[keywords,comments,strings]% -\lst@definelanguage{Comal 80}% - {morekeywords={AND,AUTO,CASE,DATA,DEL,DIM,DIV,DO,ELSE,ENDCASE,ENDIF,% - ENDPROC,ENDWHILE,EOD,EXEC,FALSE,FOR,GOTO,IF,INPUT,INT,LIST,LOAD,% - MOD,NEW,NEXT,NOT,OF,OR,PRINT,PROC,RANDOM,RENUM,REPEAT,RND,RUN,% - SAVE,SELECT,STOP,TAB,THEN,TRUE,UNTIL,WHILE,ZONE},% - sensitive=f,% ??? - morecomment=[l]//,% - morestring=[d]"% - }[keywords,comments,strings]% -\lst@definelanguage{Elan}% - {morekeywords={ABS,AND,BOOL,CAND,CASE,CAT,COLUMNS,CONCR,CONJ,CONST,% - COR,DECR,DEFINES,DET,DIV,DOWNTO,ELIF,ELSE,END,ENDIF,ENDOP,% - ENDPACKET,ENDPROC,ENDREP,ENDSELECT,FALSE,FI,FILE,FOR,FROM,IF,% - INCR,INT,INV,LEAVE,LENGTH,LET,MOD,NOT,OF,OP,OR,OTHERWISE,PACKET,% - PROC,REAL,REP,REPEAT,ROW,ROWS,SELECT,SIGN,STRUCT,SUB,TEXT,THEN,% - TRANSP,TRUE,TYPE,UNTIL,UPTO,VAR,WHILE,WITH,XOR,% - maxint,sign,abs,min,max,random,initializerandom,subtext,code,% - replace,text,laenge,pos,compress,change,maxreal,smallreal,floor,% - pi,e,ln,log2,log10,sqrt,exp,tan,tand,sin,sind,cos,cosd,arctan,% - arctand,int,real,lastconversionok,put,putline,line,page,get,% - getline,input,output,sequentialfile,maxlinelaenge,reset,eof,% - close,complexzero,complexone,complexi,complex,realpart,imagpart,% - dphi,phi,vector,norm,replace,matrix,idn,row,column,sub,% - replacerow,replacecolumn,replaceelement,transp,errorsstop,stop},% - sensitive,% - morestring=[d]"% - }[keywords,strings]% -%% -%% Erlang definition (c) 2003 Daniel Gazard -%% -\lst@definelanguage{erlang}% - {morekeywords={abs,after,and,apply,atom,atom_to_list,band,binary,% - binary_to_list,binary_to_term,bor,bsl,bsr,bxor,case,catch,% - date,div,element,erase,end,exit,export,float,float_to_list,% - get,halt,hash,hd,if,info,import,integer,integer_to_list,% - length,link,list,list_to_atom,list_to_float,list_to_integer,% - list_to_tuple,module,node,nodes,now,of,or,pid,port,ports,% - processes,put,receive,reference,register,registered,rem,% - round,self,setelement,size,spawn,throw,time,tl,trace,trunc,% - tuple,tuple_to_list,unlink,unregister,whereis,error,false,% - infinity,nil,ok,true,undefined,when},% - otherkeywords={->,!,[,],\{,\},},% - morecomment=[l]\%,% - morestring=[b]",% - morestring=[b]'% - }[keywords,comments,strings]% -\lst@definelanguage{ksh} - {morekeywords={alias,awk,cat,echo,else,elif,fi,exec,exit,% - for,in,do,done,select,case,esac,while,until,function,% - time,export,cd,eval,fc,fg,kill,let,pwd,read,return,rm,% - glob,goto,history,if,logout,nice,nohup,onintr,repeat,sed,% - set,setenv,shift,source,switch,then,umask,unalias,% - unset,wait,@,env,argv,child,home,ignoreeof,noclobber,% - noglob,nomatch,path,prompt,shell,status,verbose,print,printf,% - sqrt,BEGIN,END},% - morecomment=[l]\#,% - morestring=[d]",% - morestring=[d]',% - morestring=[d]`% - }[keywords,comments,strings]% -\lst@definelanguage{Logo}% - {morekeywords={and,atan,arctan,both,break,bf,bl,butfirst,butlast,% - cbreak, close,co,continue,cos,count,clearscreen,cs,debquit,% - describe,diff,difference,ed,edit,either,emptyp,equalp,er,erase,% - errpause,errquit,fifp,filefprint,fifty,fileftype,fip,fileprint,% - fird,fileread,fity,filetype,fiwd,fileword,f,first,or,fp,fprint,% - fput,fty,ftype,full,fullscreen,go,bye,goodbye,gprop,greaterp,% - help,if,iff,iffalse,ift,iftrue,nth,item,keyp,llast,lessp,list,% - local,lput,make,max,maximum,memberp,memtrace,min,minimum,namep,% - not,numberp,oflush,openr,openread,openw,openwrite,op,output,% - pause,plist,pots,pow,pprop,pps,pr,print,product,quotient,random,% - rc,readchar,rl,readlist,remprop,repcount,repeat,request,rnd,run,% - se,sentence,sentencep,setc,setcolor,setipause,setqpause,po,show,% - sin,split,splitscreen,sqrt,stop,sum,test,text,textscreen,thing,% - to,tone,top,toplevel,type,untrace,wait,word,wordp,yaccdebug,is,% - mod,remainder,trace,zerop,back,bk,bto,btouch,fd,forward,fto,% - ftouch,getpen,heading,hit,hitoot,ht,hideturtle,loff,lampoff,lon,% - lampon,lt,left,lot,lotoot,lto,ltouch,penc,pencolor,pd,pendown,pe,% - penerase,penmode,pu,penup,px,penreverse,rt,right,rto,rtouch,% - scrunch,seth,setheading,setscrun,setscrunch,setxy,shownp,st,% - showturtle,towardsxy,clean,wipeclean,xcor,ycor,tur,turtle,% - display,dpy},% - sensitive=f% ??? - }[keywords]% -%% -%% MetaPost definition (c) 2004 Brooks Moses -%% This definition is based on the language specifications -%% contained in the _User's Manual for Metapost_, with the core -%% language enhancements that are described in the _Drawing -%% Graphs with MetaPost_ documentation. -%% -\lst@definelanguage{MetaPost}% - {% keywords[1] = MetaPost primitives (not found in following tables) - morekeywords={end,begingroup,endgroup,beginfig,endfig,def,vardef,% - primary,secondary,tertiary,primarydef,secondarydef,tertiarydef,% - expr,suffix,text,enddef,if,fi,else,elseif,for,forsuffixes,% - forever,endfor,upto,downto,stop,until,tension,controls,on,off,% - btex,etex,within,input}, - % keywords[2] = Operators (Tables 6-9 in MetaPost User's manual) - morekeywords=[2]{abs,and,angle,arclength,arctime,ASCII,bbox,bluepart,% - boolean,bot,ceiling,center,char,color,cosd,cutafter,cutbefore,% - cycle,decimal,dir,direction,directionpoint,directiontime,div,% - dotprod,floor,fontsize,greenpart,hex,infont,intersectionpoint,% - intersectiontimes,inverse,known,length,lft,llcorner,lrcorner,% - makepath,makepen,mexp,mlog,mod,normaldeviate,not,numeric,oct,% - odd,or,pair,path,pen,penoffset,picture,point,postcontrol,% - precontrol,redpart,reverse,rotated,round,rt,scaled,shifted,% - sind,slanted,sqrt,str,string,subpath,substring,top,transform,% - transformed,ulcorner,uniformdeviate,unitvector,unknown,% - urcorner,whatever,xpart,xscaled,xxpart,xypart,ypart,yscaled,% - yxpart,yypart,zscaled,of,reflectedabout,rotatedaround,ulft,urt,% - llft,lrt,readfrom,write,stroked,filled,textual,clipped,bounded,% - pathpart,penpart,dashpart,textpart,fontpart},% - % keywords[3] = Commands (Table 10) - morekeywords=[3]{addto,clip,cutdraw,draw,drawarrow,drawdblarrow,% - fill,filldraw,interim,let,loggingall,newinternal,pickup,% - save,setbounds,shipout,show,showdependencies,showtoken,% - showvariable,special,tracingall,tracingnone,undraw,unfill,% - unfilldraw,to,also,contour,doublepath,withcolor,withpen,% - dashed,randomseed},% - % keywords[4] = Function-Like Macros (Table 11) - morekeywords=[4]{boxit,boxjoin,bpath,buildcycle,circleit,dashpattern,% - decr,dotlabel,dotlabels,drawboxed,drawboxes,drawoptions,% - drawunboxed,fixpos,fixsize,incr,interpath,label,labels,max,min,pic,% - thelabel,z,image},% - % keywords[5] = Internal and Predefined Variables (Tables 3, 4) - morekeywords=[5]{ahangle,ahlength,bboxmargin,charcode,circmargin,% - day,defaultdx,defaultdy,defaultpen,defaultscale,labeloffset,% - linecap,linejoin,miterlimit,month,pausing,prologues,showstopping,% - time,tracingcapsules,tracingchoices,tracingcommands,% - tracingequations,tracinglostchars,tracingmacros,tracingonline,% - tracingoutput,tracingrestores,tracingspecs,tracingstats,% - tracingtitles,truecorners,warningcheck,year}, - morekeywords=[5]{background,currentpen,currentpicture,cuttings,% - defaultfont},% - % keywords[6] = Predefined Constants (Table 5) - morekeywords=[6]{beveled,black,blue,bp,butt,cc,cm,dd,ditto,down,% - epsilon,evenly,false,fullcircle,green,halfcircle,identity,% - in,infinity,left,mitered,mm,nullpicture,origin,pc,pencircle,% - pt,quartercircle,red,right,rounded,squared,true,unitsquare,% - up,white,withdots}, - sensitive=false,% - alsoother={0123456789$},% - morecomment=[l]\%,% - morestring=[mf]{input\ },% - morestring=[b]"% - }[keywords,comments,strings,mf]% -%% -%% Mizar definition (c) 2003 Adam Grabowski -%% -%% Mizar is freely available at URL www.mizar.org for the Linux x86, -%% Solaris x86, and Windows operating systems. -%% -\lst@definelanguage{Mizar}% - {otherkeywords={->,(\#,\#),.=),\&},% - morekeywords={vocabulary,constructors,$1,$1,$2,$3,$4,$5,$6,$7,$8,% - @proof,according,aggregate,and,antonym,as,associativity,assume,% - asymmetry,attr,be,begin,being,by,canceled,case,cases,cluster,% - clusters,coherence,commutativity,compatibility,connectedness,% - consider,consistency,constructors,contradiction,correctness,def,% - deffunc,define,definition,definitions,defpred,end,environ,equals,% - ex,exactly,existence,for,from,func,given,hence,hereby,holds,% - idempotence,if,iff,implies,involutiveness,irreflexivity,is,it,% - let,means,mode,non,not,notation,now,of,or,otherwise,over,per,% - pred,prefix,projectivity,proof,provided,qua,reconsider,redefine,% - reflexivity,requirements,reserve,scheme,schemes,section,selector,% - set,st,struct,such,suppose,symmetry,synonym,take,that,the,then,% - theorem,theorems,thesis,thus,to,transitivity,uniqueness,% - vocabulary,where},% - sensitive=t,% - morecomment=[l]::% - }[keywords,comments]% -\lst@definelanguage{Modula-2}% - {morekeywords={AND,ARRAY,BEGIN,BY,CASE,CONST,DIV,DO,ELSE,ELSIF,END,% - EXIT,EXPORT,FOR,FROM,IF,IMPLEMENTATION,IMPORT,IN,MOD,MODULE,NOT,% - OF,OR,POINTER,PROCEDURE,QUALIFIED,RECORD,REPEAT,RETURN,SET,THEN,% - TYPE,UNTIL,VAR,WHILE,WITH,ABS,BITSET,BOOLEAN,CAP,CARDINAL,CHAR,% - CHR,DEC,EXCL,FALSE,FLOAT,HALT,HIGH,INC,INCL,INTEGER,LONGCARD,% - LONGINT,LONGREAL,MAX,MIN,NIL,ODD,ORD,PROC,REAL,SIZE,TRUE,TRUNC,% - VAL,DEFINITION,LOOP},% added keywords due to Peter Bartke 99/07/22 - sensitive,% - morecomment=[n]{(*}{*)},% - morestring=[d]',% - morestring=[d]"% - }[keywords,comments,strings]% -\lst@definelanguage{MuPAD}{% - morekeywords={end,next,break,if,then,elif,else,end_if,case,end_case,% - otherwise,for,from,to,step,downto,in,end_for,while,end_while,% - repeat,until,end_repeat,or,and,not,xor,div,mod,union,minus,% - intersect,subset,proc,begin,end_proc,domain,end_domain,category,% - end_category,axiom,end_axiom,quit,delete,frame},% - morekeywords=[2]{NIL,FAIL,TRUE,FALSE,UNKNOWN,I,RD_INF,RD_NINF,% - RD_NAN,name,local,option,save,inherits,of,do},% - otherkeywords={\%if,?,!,:=,<,>,=,<=,<>,>=,==>,<=>,::,..,...,->,% - @,@@,\$},% - sensitive=true,% - morecomment=[l]{//},% - morecomment=[n]{/*}{*/},% - morestring=[b]",% - morestring=[d]{`}% - }[keywords,comments,strings] -\lst@definelanguage{NASTRAN} - {morekeywords={ENDDATA},% - morecomment=[l]$,% - MoreSelectCharTable=% - \lst@CArgX BEGIN\ BULK\relax\lst@CDef{}% - {\lst@ifmode\else \ifnum\lst@length=\z@ - \lst@EnterMode{\lst@GPmode}{\lst@modetrue - \let\lst@currstyle\lst@gkeywords@sty}% - \fi \fi}% - {\ifnum\lst@mode=\lst@GPmode - \lst@XPrintToken \lst@LeaveMode - \fi}% - }[keywords,comments]% -\lst@definelanguage{Oberon-2}% - {morekeywords={ARRAY,BEGIN,BOOLEAN,BY,CASE,CHAR,CONST,DIV,DO,ELSE,% - ELSIF,END,EXIT,FALSE,FOR,IF,IMPORT,IN,INTEGER,IS,LONGINT,% - LONGREAL,LOOP,MOD,MODULE,NIL,OF,OR,POINTER,PROCEDURE,REAL,RECORD,% - REPEAT,RETURN,SET,SHORTINT,THEN,TO,TRUE,TYPE,UNTIL,VAR,WHILE,% - WITH,ABS,ASH,CAP,CHR,COPY,DEC,ENTIER,EXCL,HALT,INC,INCL,LEN,LONG,% - MAX,MIN,NEW,ODD,ORD,SHORT,SIZE},% - sensitive,% - morecomment=[n]{(*}{*)},% - morestring=[d]',% - morestring=[d]"% - }[keywords,comments,strings]% -%% -%% OCL definition (c) 2000 Achim D. Brucker -%% -%% You are allowed to use, modify and distribute this code either under -%% the terms of the LPPL (version 1.0 or later) or the GPL (version 2.0 -%% or later). -%% -\lst@definelanguage[decorative]{OCL}[OMG]{OCL} - {otherkeywords={@pre},% - morendkeywords={name,attributes,associatoinEnds,operations,% - supertypes,allSupertypes,allInstances,oclIsKindOf,oclIsTypeOf,% - oclAsType,oclInState,oclIsNew,evaluationType,abs,floor,round,max,% - min,div,mod,size,concat,toUpper,toLower,substring,includes,% - excludes,count,includesAll,exludesAll,isEmpty,notEmpty,sum,% - exists,forAll,isUnique,sortedBy,iterate,union,intersection,% - including,excluding,symmetricDifference,select,reject,collect,% - asSequence,asBag,asSequence,asSet,append,prepend,subSequence,at,% - first,last,true,false,isQuery}% - }% -\lst@definelanguage[OMG]{OCL}% - {morekeywords={context,pre,inv,post},% - ndkeywords={or,xor,and,not,implies,if,then,else,endif},% - morekeywords=[3]{Boolean,Integer,Real,String,Set,Sequence,Bag,% - OclType,OclAny,OclExpression,Enumeration,Collection,},% - sensitive=t,% - morecomment=[l]--,% - morestring=[d]'% - }[keywords,comments,strings]% -\lst@definelanguage{Plasm}% - {sensitive=false,% - morekeywords={aa,abs,ac,acolor,acos,actor,al,alias,align,and,% - animation,animation,appearance,apply,ar,arc,as,asin,assoc,atan,% - axialcamera,axialcameras,basehermite,bbox,bbox,bernstein,% - bernsteinbasis,bezier,beziercurve,beziermanifold,bezierstripe,% - beziersurface,bigger,biggest,bilinearsurface,binormal,% - biquadraticsurface,black,blend,blue,bottom,box,brown,bspize,% - bspline,bsplinebasis,c,cabinet,camera,cart,case,cat,catch,ceil,% - centeredcameras,centralcavalier,char,charseq,choose,circle,% - circumference,class,cmap,color,comp,computecoords,cone,% - conicalsurface,cons,control,convexcoords,convexhull,coonspatch,% - copy,cos,cosh,crease,crosspolytope,cube,cubiccardinal,% - cubiccardinalbasis,cubichermite,cubicubspline,cubicubsplinebasis,% - cuboid,curl,curvature,curve2cspath,curve2mapvect,cyan,cylinder,% - cylindricalsurface,d,deboor,def,depol,depth_sort,depth_test,% - derbernstein,derbernsteinbase,derbezier,determinant,difference,% - differencepr,dim,dimetric,dirproject,displaygraph,displaynubspline,% - displaynurbspline,distl,distr,div,divergence,dodecahedron,dot,down,% - dp,drawedges,drawforks,drawtree,ds,dsphere,dump,dumprep,ellipse,% - embed,end,eq,ex,exp,explode,export,extract_bodies,extract_polygons,% - extract_wires,extrude,extrusion,fact,false,feature,ff,fillcolor,% - filter,finitecone,first,flash,flashani,floor,fontcolor,fontheight,% - fontspacing,fontwidth,fractalsimplex,frame,frame,frameflash,fromto,% - gausscurvature,ge,grad,gradient,gradmap,gray,green,gt,help,hermite,% - hermitebasis,hermitesurface,hexahedron,icosahedron,id,idnt,if,in,% - inarcs,innerprod,inset,insl,insr,intersection,intersectionpr,% - intervals,intmax,intmin,intsto,inv,isa,isanimpol,isbool,ischar,% - isclosedshape,iscloseto,isempty,iseven,isfun,isfunvect,isge,isgt,% - isint,isintneg,isinto,isintpos,isle,islt,ismat,ismatof,isnat,% - isnull,isnum,isnumneg,isnumpos,isodd,isometric,isorthoshape,ispair,% - ispoint,ispointseq,ispol,ispoldim,ispolytope,ispurepol,isreal,% - isrealneg,isrealpos,isrealvect,isseq,isseqof,isshape,issimplex,% - issqrmat,isstring,isvect,iszero,jacobian,join,joints,k,last,le,% - left,leftcavalier,len,less,lesseq,lex,lift,light,linecolor,% - linesize,list,ln,load,loadlib,loop,lt,lxmy,magenta,map,mapshapes,% - markersize,mat,matdotprod,material,mathom,max,mean,meanpoint,med,% - merge,mesh,min,minkowski,mirror,mixedprod,mk,mkframe,mkpol,% - mkvector,mkversork,mod,model,move,mul,multextrude,mxby,mxmy,mxty,% - myfont,n,nat2string,neq,ngon,norm2,normalmap,not,nu_grid,nubspline,% - nubsplineknots,nurbspline,nurbsplineknots,octahedron,offset,% - onepoint,open,optimize,or,orange,ord,ortho,orthoproject,orthox,% - orthoy,orthoz,outarcs,outerloop,outerwarp,pairdiff,parallel,% - pascaltriangle,pdiff,pdifference,permutahedron,permutations,% - perspective,perspective,pi,pivotop,plane,planemapping,pmap,% - points2shape,polar,polyline,polymarker,polypoint,power,powerset,% - presort,principalnormal,print,prism,profileprodsurface,% - progressivesum,project,projection,purple,pyramid,q,quadarray,% - quadmesh,quote,r,raise,range,rationalbezier,rationalblend,% - rationalbspline,rationalize,red,rev,reverse,rgbacolor,right,% - rightcavalier,ring,rn,rotatedtext,rotationalsurface,rotn,rtail,% - ruledsurface,rxmy,s,save,scalarmatprod,scalarvectprod,schlegel2d,% - schlegel3d,sdifference,sdifferencepr,segment,sel,setand,setdiff,% - setfontcolor,setor,setxor,sex,shape_0,shape_1,shape2points,% - shape2pol,shapeclosed,shapecomb,shapediff,shapedist,% - shapeinbetweening,shapeinf,shapejoin,shapelen,shapenorm,% - shapenormal,shapeprod,shaperot,shapesum,shapesup,shapezero,shift,% - showprop,sign,signal,simplex,simplexpile,sin,sinh,size,skeleton,% - skew,smaller,smallest,solidifier,solidify,sort,sphere,spline,% - splinesampling,splitcells,splitpols,sqr,sqrt,star,string,% - stringtokens,struct,sub,svg,sweep,t,tail,tan,tangent,tanh,% - tensorprodsurface,tetrahedron,text,texture,textwithattributes,% - thinsolid,threepoints,time,tmax,tmin,top,torus,torusmap,trace,% - trans,tree,trianglefan,trianglestripe,trimetric,true,truncone,tt,% - tube,twopoints,uk,ukpol,ukpolf,union,unionpr,unitvect,unprune,up,% - vect2dtoangle,vect2mat,vectdiff,vectnorm,vectprod,vectsum,view,% - viewmodel,viewmodel,vrml,warp,warp,where,white,with,xcavalier,xor,% - xquadarray,xx,ycavalier,yellow},% - moredirectives={loadlib},% - otherkeywords={-,+,*,**,/,~,|,..,^,\&,\&\&,\#,\#\#},% - morecomment=[s]{\%}{\%},% - morestring=[b]',% - literate={~}{{$\sim$}}{1} {^}{$\wedge$}{1},% - }[keywords,directives,comments,strings]% -\lst@definelanguage{PL/I}% - {morekeywords={ABS,ATAN,AUTOMATIC,AUTO,ATAND,BEGIN,BINARY,BIN,BIT,% - BUILTIN,BY,CALL,CHARACTER,CHAR,CHECK,COLUMN,COL,COMPLEX,CPLX,% - COPY,COS,COSD,COSH,DATA,DATE,DECIMAL,DEC,DECLARE,DCL,DO,EDIT,% - ELSE,END,ENDFILE,ENDPAGE,ENTRY,EXP,EXTERNAL,EXT,FINISH,FIXED,% - FIXEDOVERFLOW,FOFL,FLOAT,FORMAT,GET,GO,GOTO,IF,IMAG,INDEX,% - INITIAL,INIT,INTERNAL,INT,LABEL,LENGTH,LIKE,LINE,LIST,LOG,LOG2,% - LOG10,MAIN,MAX,MIN,MOD,NOCHECK,NOFIXEDOVERFLOW,NOFOFL,NOOVERFLOW,% - NOOFL,NOSIZE,NOUNDERFLOW,NOUFL,NOZERODIVIDE,NOZDIV,ON,OPTIONS,% - OVERFLOW,OFL,PAGE,PICTURE,PROCEDURE,PROC,PUT,READ,REPEAT,RETURN,% - RETURNS,ROUND,SIN,SIND,SINH,SIZE,SKIP,SQRT,STATIC,STOP,STRING,% - SUBSTR,SUM,SYSIN,SYSPRINT,TAN,TAND,TANH,THEN,TO,UNDERFLOW,UFL,% - VARYING,WHILE,WRITE,ZERODIVIDE,ZDIV},% - sensitive=f,% - morecomment=[s]{/*}{*/},% - morestring=[d]'% - }[keywords,comments,strings]% -%% -%% Promela definition (c) 2004 William Thimbleby -%% -\lst@definelanguage{Promela} - {morekeywords={active,assert,atomic,bit,bool,break,byte,chan,d_step,% - Dproctype,do,else,empty,enabled,fi,full,goto,hidden,if,init,int,% - len,mtype,nempty,never,nfull,od,of,pcvalue,printf,priority,% - proctype,provided,run,short,skip,timeout,typedef,unless,unsigned,% - xr,xs,true,false,inline,eval},% - moredirectives={define,ifdef,ifndef,if,if,else,endif,undef,include},% - moredelim=*[directive]\#,% - morecomment=[s]{/*}{*/},% - morestring=[b]"% - }[keywords,comments,strings,directives]% -%% -%% Reduce definition (c) 2002 Geraint Paul Bevan -%% -\lst@definelanguage{Reduce}% - {morekeywords={% -%% reserved identifiers -abs,acos,acosh,acot,acoth,acsc,acsch,% -adjprec,algebraic,algint,allbranch,allfac,and,% -antisymmetric,append,arglength,array,asec,asech,% -asin,asinh,atan,atan2,atanh,begin,bfspace,bye,% -card_no,ceiling,clear,clearrules,coeff,coeffn,% -cofactor,combineexpt,combinelogs,comment,comp,% -complex,conj,cons,cont,cos,cosh,cot,coth,cramer,% -cref,csc,csch,decompose,define,defn,deg,demo,den,% -depend,det,df,difference,dilog,display,div,do,e,% -echo,ed,editdef,ei,end,eps,eq,equal,erf,errcont,% -evallhseqp,eval_mode,even,evenp,exp,expandlogs,% -expr,expt,ezgcd,factor,factorial,factorize,fexpr,% -first,fix,fixp,floor,for,forall,foreach,fort,% -fort_width,freeof,fullroots,g,gcd,geq,go,goto,% -greaterp,high_pow,hypot,i,if,ifactor,impart,in,% -index,infinity,infix,input,int,integer,interpol,% -intstr,k,korder,lambda,lcm,lcof,length,leq,lessp,% -let,lhs,linear,linelength,lisp,list,listargp,% -listargs,ln,load,load_package,log,log10,logb,% -low_pow,lterm,macro,mainvar,mass,mat,match,% -mateigen,matrix,max,mcd,member,memq,min,minus,mkid,% -modular,msg,mshell,multiplicities,nat,neq,nero,% -nextprime,nil,nodepend,noncom,nonzero,nosplit,% -nospur,nullspace,num,numberp,odd,off,on,operator,% -or,order,ordp,out,output,part,pause,period,pf,pi,% -plus,precedence,precise,precision,pret,pri,primep,% -print_precision,procedure,product,quit,quotient,% -random,random_new_seed,rank,rat,ratarg,rational,% -rationalize,ratpri,real,rederr,reduct,remainder,% -remfac,remind,repart,repeat,rest,resultant,retry,% -return,reverse,revpri,rhs,rlisp88,% -root_multiplicity,round,roundall,roundbf,rounded,% -saveas,savestructr,scalar,sec,sech,second,set,% -setmod,setq,share,showrules,showtime,shut,sign,sin,% -sinh,smacro,solve,solvesingular,spur,sqrt,structr,% -sub,sum,symbolic,symmetric,t,tan,tanh,third,time,% -times,tp,tra,trace,trfac,trigform,trint,until,% -varname,vecdim,vector,weight,when,where,while,% -write,ws,wtlevel,% -%% identifiers with spaces -%% for all,for each,go to,such that,% -},% - sensitive=false,% - morecomment=[l]\%,% - morecomment=[s]{COMMENT}{;},% - morecomment=[s]{COMMENT}{$},% - morestring="% - }[keywords,comments,strings]% -%% -%% RSL definition (c) 2004 Brian Christensen -%% -\lst@definelanguage{RSL}% - {morekeywords={Bool,Char,devt_relation,Int,Nat,Real,Text,Unit,abs,any,% - as,axiom,card,case,channel,chaos,class,do,dom,elems,else,elsif,end,% - extend,false,for,hd,hide,if,in,inds,initialise,int,len,let,local,% - object,of,out,post,pre,read,real,rng,scheme,skip,stop,swap,% - test_case,theory,then,tl,true,type,until,use,value,variable,while,% - with,write},% -literate=% -{<}{$<$}{1}% -{>}{$>$}{1}% -{[}{$[$}{1}%% -{]}{$]$}{1}%% -{^}{{\mbox{$\widehat{\;}$}}}{1}%% -{'}{{\raisebox{1ex}[1ex][0ex]{\protect\scriptsize$\prime$}}}{1}%% -{||}{{\mbox{$\parallel$}}}{2}%% -{|-}{$\vdash$}{1}%% -{|=|}{{\mbox{$\lceil\!\rceil\!\!\!\!\!\!\;\lfloor\!\rfloor$}}}{1}%% -{**}{$\uparrow$}{1}% -{/\\}{$\wedge$}{1}%% -{inter}{$\cap$}{1}%% -{-\\}{$\lambda$}{1}%% -{->}{$\rightarrow$}{1}%% -{-m->}{{\mbox{$\rightarrow \hspace{-2.5\lst@width} _{m}\;$}}}{1}% -{-~m->}{{\mbox{$\stackrel{\sim}{\mbox{$\rightarrow\hspace{-2.5\lst@width} _{m}\;$}}$}}}{1}% -{-~->}{{\mbox{$\stackrel{\sim}{\rightarrow}$}}}{1}%% -{-set}{\bf{-set}}{4}%% -{-list}{{$^{\ast}$}}{1}%% -{-inflist}{$^\omega$}{1}% -{-infset}{{\mbox{{\bf -infset}}}}{7}% -{\#}{$\circ$}{1}% -{:-}{{\raisebox{.4ex}{\tiny $\bullet$}}}{1}%% -{=}{$=$}{1}%% -{==}{$==$}{2}%% -{=>}{$\Rightarrow$}{1}%% -{\ is\protect\^^M}{{$\;\equiv$}}{2}% -{\ is\ }{{$\equiv$}}{3}%% -{\ isin\protect\^^M}{$\;\in$}{2}%% -{~}{$\sim$}{1}%% -{~=}{$\neq$}{1}%% -{~isin}{$\notin$}{1}%% -{+>}{$\mapsto$}{1}%% -{++}{}{1}% -{|^|}{{\mbox{$\lceil\!\rceil$}}}{1}%% -{\\/}{$\vee$}{1}%% -{exists}{$\exists$}{1}%% -{union}{$\cup$}{1}%% -{>=}{$\geq$}{1}%% -{><}{$\times$}{1}%% -{>>}{$\supset$}{1}% -{>>=}{$\supseteq$}{1}%% -{<=}{$\leq$}{1}%% -{<<}{$\subset$}{1}% -{<.}{$\langle$}{1}%% -{<<=}{$\subseteq$}{1}%% -{<->}{$\leftrightarrow$}{1}%% -{[=}{$\sqsubseteq$}{1}%% -{\{=}{$\preceq$}{1}%% -{\ all\protect\^^M}{$\forall$}{2}%% -{\ all\ }{$\forall$}{3}%% -{!!}{$\dagger$}{1}%% -{always}{$\Box$}{1}%% -{.>}{$\rangle$}{1}%% -{`alpha}{$\alpha$}{1}% -{`beta}{$\beta$}{1}% -{`gamma}{$\gamma$}{1}% -{`delta}{$\delta$}{1}% -{`epsilon}{$\epsilon$}{1}% -{`zeta}{$\zeta$}{1}% -{`eta}{$\eta$}{1}% -{`theta}{$\theta$}{1}% -{`iota}{$\iota$}{1}% -{`kappa}{$\kappa$}{1}% -{`mu}{$\mu$}{1}% -{`nu}{$\nu$}{1}% -{`xi}{$\xi$}{1}% -{`pi}{$\pi$}{1}% -{`rho}{$\rho$}{1}% -{`sigma}{$\sigma$}{1}% -{`tau}{$\tau$}{1}% -{`upsilon}{$\upsilon$}{1}% -{`phi}{$\phi$}{1}% -{`chi}{$\chi$}{1}% -{`psi}{$\psi$}{1}% -{`omega}{$\omega$}{1}% -{`Gamma}{$\Gamma$}{1}% -{`Delta}{$\Delta$}{1}% -{`Theta}{$\Theta$}{1}% -{`Lambda}{$\Lambda$}{1}% -{`Xi}{$\Xi$}{1}% -{`Pi}{$\Pi$}{1}% -{`Sigma}{$\Sigma$}{1}% -{`Upsilon}{$\Upsilon$}{1}% -{`Phi}{$\Phi$}{1}% -{`Psi}{$\Psi$}{1}% -{`Omega}{$\Omega$}{1},% - sensitive=true,% - morecomment=[l]{--},% - morecomment=[s]{/*}{*/}% - }[keywords,comments]% -\lst@definelanguage[IBM]{Simula}[DEC]{Simula}{}% -\lst@definelanguage[DEC]{Simula}[67]{Simula}% - {morekeywords={and,eq,eqv,ge,gt,hidden,imp,le,long,lt,ne,not,% - options,or,protected,short}% - }% -\lst@definelanguage[CII]{Simula}[67]{Simula}% - {morekeywords={and,equiv,exit,impl,not,or,stop}}% -\lst@definelanguage[67]{Simula}% - {morekeywords={activate,after,array,at,before,begin,boolean,% - character,class,comment,delay,detach,do,else,end,external,false,% - for,go,goto,if,in,inner,inspect,integer,is,label,name,new,none,% - notext,otherwise,prior,procedure,qua,reactivate,real,ref,resume,% - simset,simulation,step,switch,text,then,this,to,true,until,value,% - virtual,when,while},% - sensitive=f,% - keywordcommentsemicolon={end}{else,end,otherwise,when}{comment},% - morestring=[d]",% - morestring=[d]'% - }[keywords,keywordcomments,strings]% -\lst@definelanguage{S}[]{R}{} -\lst@definelanguage[PLUS]{S}[]{R}{} -\lst@definelanguage{R}% - {keywords={abbreviate,abline,abs,acos,acosh,action,add1,add,% - aggregate,alias,Alias,alist,all,anova,any,aov,aperm,append,apply,% - approx,approxfun,apropos,Arg,args,array,arrows,as,asin,asinh,% - atan,atan2,atanh,attach,attr,attributes,autoload,autoloader,ave,% - axis,backsolve,barplot,basename,besselI,besselJ,besselK,besselY,% - beta,binomial,body,box,boxplot,break,browser,bug,builtins,bxp,by,% - c,C,call,Call,case,cat,category,cbind,ceiling,character,char,% - charmatch,check,chol,chol2inv,choose,chull,class,close,cm,codes,% - coef,coefficients,co,col,colnames,colors,colours,commandArgs,% - comment,complete,complex,conflicts,Conj,contents,contour,% - contrasts,contr,control,helmert,contrib,convolve,cooks,coords,% - distance,coplot,cor,cos,cosh,count,fields,cov,covratio,wt,CRAN,% - create,crossprod,cummax,cummin,cumprod,cumsum,curve,cut,cycle,D,% - data,dataentry,date,dbeta,dbinom,dcauchy,dchisq,de,debug,% - debugger,Defunct,default,delay,delete,deltat,demo,de,density,% - deparse,dependencies,Deprecated,deriv,description,detach,% - dev2bitmap,dev,cur,deviance,off,prev,,dexp,df,dfbetas,dffits,% - dgamma,dgeom,dget,dhyper,diag,diff,digamma,dim,dimnames,dir,% - dirname,dlnorm,dlogis,dnbinom,dnchisq,dnorm,do,dotplot,double,% - download,dpois,dput,drop,drop1,dsignrank,dt,dummy,dump,dunif,% - duplicated,dweibull,dwilcox,dyn,edit,eff,effects,eigen,else,% - emacs,end,environment,env,erase,eval,equal,evalq,example,exists,% - exit,exp,expand,expression,External,extract,extractAIC,factor,% - fail,family,fft,file,filled,find,fitted,fivenum,fix,floor,for,% - For,formals,format,formatC,formula,Fortran,forwardsolve,frame,% - frequency,ftable,ftable2table,function,gamma,Gamma,gammaCody,% - gaussian,gc,gcinfo,gctorture,get,getenv,geterrmessage,getOption,% - getwd,gl,glm,globalenv,gnome,GNOME,graphics,gray,grep,grey,grid,% - gsub,hasTsp,hat,heat,help,hist,home,hsv,httpclient,I,identify,if,% - ifelse,Im,image,\%in\%,index,influence,measures,inherits,install,% - installed,integer,interaction,interactive,Internal,intersect,% - inverse,invisible,IQR,is,jitter,kappa,kronecker,labels,lapply,% - layout,lbeta,lchoose,lcm,legend,length,levels,lgamma,library,% - licence,license,lines,list,lm,load,local,locator,log,log10,log1p,% - log2,logical,loglin,lower,lowess,ls,lsfit,lsf,ls,machine,Machine,% - mad,mahalanobis,make,link,margin,match,Math,matlines,mat,matplot,% - matpoints,matrix,max,mean,median,memory,menu,merge,methods,min,% - missing,Mod,mode,model,response,mosaicplot,mtext,mvfft,na,nan,% - names,omit,nargs,nchar,ncol,NCOL,new,next,NextMethod,nextn,% - nlevels,nlm,noquote,NotYetImplemented,NotYetUsed,nrow,NROW,null,% - numeric,\%o\%,objects,offset,old,on,Ops,optim,optimise,optimize,% - options,or,order,ordered,outer,package,packages,page,pairlist,% - pairs,palette,panel,par,parent,parse,paste,path,pbeta,pbinom,% - pcauchy,pchisq,pentagamma,persp,pexp,pf,pgamma,pgeom,phyper,pico,% - pictex,piechart,Platform,plnorm,plogis,plot,pmatch,pmax,pmin,% - pnbinom,pnchisq,pnorm,points,poisson,poly,polygon,polyroot,pos,% - postscript,power,ppoints,ppois,predict,preplot,pretty,Primitive,% - print,prmatrix,proc,prod,profile,proj,prompt,prop,provide,% - psignrank,ps,pt,ptukey,punif,pweibull,pwilcox,q,qbeta,qbinom,% - qcauchy,qchisq,qexp,qf,qgamma,qgeom,qhyper,qlnorm,qlogis,qnbinom,% - qnchisq,qnorm,qpois,qqline,qqnorm,qqplot,qr,Q,qty,qy,qsignrank,% - qt,qtukey,quantile,quasi,quit,qunif,quote,qweibull,qwilcox,% - rainbow,range,rank,rbeta,rbind,rbinom,rcauchy,rchisq,Re,read,csv,% - csv2,fwf,readline,socket,real,Recall,rect,reformulate,regexpr,% - relevel,remove,rep,repeat,replace,replications,report,require,% - resid,residuals,restart,return,rev,rexp,rf,rgamma,rgb,rgeom,R,% - rhyper,rle,rlnorm,rlogis,rm,rnbinom,RNGkind,rnorm,round,row,% - rownames,rowsum,rpois,rsignrank,rstandard,rstudent,rt,rug,runif,% - rweibull,rwilcox,sample,sapply,save,scale,scan,scan,screen,sd,se,% - search,searchpaths,segments,seq,sequence,setdiff,setequal,set,% - setwd,show,sign,signif,sin,single,sinh,sink,solve,sort,source,% - spline,splinefun,split,sqrt,stars,start,stat,stem,step,stop,% - storage,strstrheight,stripplot,strsplit,structure,strwidth,sub,% - subset,substitute,substr,substring,sum,summary,sunflowerplot,svd,% - sweep,switch,symbol,symbols,symnum,sys,status,system,t,table,% - tabulate,tan,tanh,tapply,tempfile,terms,terrain,tetragamma,text,% - time,title,topo,trace,traceback,transform,tri,trigamma,trunc,try,% - ts,tsp,typeof,unclass,undebug,undoc,union,unique,uniroot,unix,% - unlink,unlist,unname,untrace,update,upper,url,UseMethod,var,% - variable,vector,Version,vi,warning,warnings,weighted,weights,% - which,while,window,write,\%x\%,x11,X11,xedit,xemacs,xinch,xor,% - xpdrows,xy,xyinch,yinch,zapsmall,zip},% - otherkeywords={!,!=,~,$,*,\&,\%/\%,\%*\%,\%\%,<-,<<-,_,/},% - alsoother={._$},% - sensitive,% - morecomment=[l]\#,% - morestring=[d]",% - morestring=[d]'% 2001 Robert Denham - }% -\lst@definelanguage{SAS}% - {procnamekeys={proc},% - morekeywords={DATA,AND,OR,NOT,EQ,GT,LT,GE,LE,NE,INFILE,INPUT,DO,BY,% - TO,SIN,COS,OUTPUT,END,PLOT,RUN,LIBNAME,VAR,TITLE,FIRSTOBS,OBS,% - DELIMITER,DLM,EOF,ABS,DIM,HBOUND,LBOUND,MAX,MIN,MOD,SIGN,SQRT,% - CEIL,FLOOR,FUZZ,INT,ROUND,TRUNC,DIGAMMA,ERF,ERFC,EXP,GAMMA,% - LGAMMA,LOG,LOG2,LOG10,ARCOS,ARSIN,ATAN,COSH,SINH,TANH,TAN,% - POISSON,PROBBETA,PROBBNML,PROBCHI,PROBF,PROBGAM,PROBHYPR,% - PROBNEGB,PROBNORM,PROBT,BETAINV,CINV,FINV,GAMINV,PROBIT,TINV,CSS,% - CV,KURTOSIS,MEAN,NMISS,RANGE,SKEWNESS,STD,STDERR,SUM,USS,NORMAL,% - RANBIN,RANCAU,RANEXP,RANGAM,RANNOR,RANPOI,RANTBL,RANTRI,RANUNI,% - UNIFORM,IF,THEN,ELSE,WHILE,UNTIL,DROP,KEEP,LABEL,DEFAULT,ARRAY,% - MERGE,CARDS,CARDS4,PUT,SET,UPDATE,ABORT,DELETE,DISPLAY,LIST,% - LOSTCARD,MISSING,STOP,WHERE,ARRAY,DROP,KEEP,WINDOW,LENGTH,RENAME,% - RETAIN,MEANS,UNIVARIATE,SUMMARY,TABULATE,CORR,FREQ,FOOTNOTE,NOTE,% - SHOW},% - otherkeywords={!,!=,~,$,*,\&,_,/,<,>=,=<,>},% - morestring=[d]'% - }[keywords,comments,strings,procnames]% -\lst@definelanguage[AlLaTeX]{TeX}[LaTeX]{TeX}% - {moretexcs={AtBeginDocument,AtBeginDvi,AtEndDocument,AtEndOfClass,% - AtEndOfPackage,ClassError,ClassInfo,ClassWarning,% - ClassWarningNoLine,CurrentOption,DeclareErrorFont,% - DeclareFixedFont,DeclareFontEncoding,DeclareFontEncodingDefaults,% - DeclareFontFamily,DeclareFontShape,DeclareFontSubstitution,% - DeclareMathAccent,DeclareMathAlphabet,DeclareMathAlphabet,% - DeclareMathDelimiter,DeclareMathRadical,DeclareMathSizes,% - DeclareMathSymbol,DeclareMathVersion,DeclareOldFontCommand,% - DeclareOption,DeclarePreloadSizes,DeclareRobustCommand,% - DeclareSizeFunction,DeclareSymbolFont,DeclareSymbolFontAlphabet,% - DeclareTextAccent,DeclareTextAccentDefault,DeclareTextCommand,% - DeclareTextCommandDefault,DeclareTextComposite,% - DeclareTextCompositeCommand,DeclareTextFontCommand,% - DeclareTextSymbol,DeclareTextSymbolDefault,ExecuteOptions,% - GenericError,GenericInfo,GenericWarning,IfFileExists,% - InputIfFileExists,LoadClass,LoadClassWithOptions,MessageBreak,% - OptionNotUsed,PackageError,PackageInfo,PackageWarning,% - PackageWarningNoLine,PassOptionsToClass,PassOptionsToPackage,% - ProcessOptionsProvidesClass,ProvidesFile,ProvidesFile,% - ProvidesPackage,ProvideTextCommand,RequirePackage,% - RequirePackageWithOptions,SetMathAlphabet,SetSymbolFont,% - TextSymbolUnavailable,UseTextAccent,UseTextSymbol},% - morekeywords={array,center,displaymath,document,enumerate,eqnarray,% - equation,flushleft,flushright,itemize,list,lrbox,math,minipage,% - picture,sloppypar,tabbing,tabular,trivlist,verbatim}% - }% -\lst@definelanguage[LaTeX]{TeX}[common]{TeX}% - {moretexcs={a,AA,aa,addcontentsline,addpenalty,addtocontents,% - addtocounter,addtolength,addtoversion,addvspace,alph,Alph,and,% - arabic,array,arraycolsep,arrayrulewidth,arraystretch,author,% - baselinestretch,begin,bezier,bfseries,bibcite,bibdata,bibitem,% - bibliography,bibliographystyle,bibstyle,bigskip,boldmath,% - botfigrule,bottomfraction,Box,caption,center,CheckCommand,circle,% - citation,cite,cleardoublepage,clearpage,cline,columnsep,% - columnseprule,columnwidth,contentsline,dashbox,date,dblfigrule,% - dblfloatpagefraction,dblfloatsep,dbltextfloatsep,dbltopfraction,% - defaultscriptratio,defaultscriptscriptratio,depth,Diamond,% - displaymath,document,documentclass,documentstyle,doublerulesep,% - em,emph,endarray,endcenter,enddisplaymath,enddocument,% - endenumerate,endeqnarray,endequation,endflushleft,endflushright,% - enditemize,endlist,endlrbox,endmath,endminipage,endpicture,% - endsloppypar,endtabbing,endtabular,endtrivlist,endverbatim,% - enlargethispage,ensuremath,enumerate,eqnarray,equation,% - evensidemargin,extracolsep,fbox,fboxrule,fboxsep,filecontents,% - fill,floatpagefraction,floatsep,flushbottom,flushleft,flushright,% - fnsymbol,fontencoding,fontfamily,fontseries,fontshape,fontsize,% - fontsubfuzz,footnotemark,footnotesep,footnotetext,footskip,frac,% - frame,framebox,fussy,glossary,headheight,headsep,height,hline,% - hspace,I,include,includeonly,index,inputlineno,intextsep,% - itemindent,itemize,itemsep,iterate,itshape,Join,kill,label,% - labelsep,labelwidth,LaTeX,LaTeXe,leadsto,lefteqn,leftmargin,% - leftmargini,leftmarginii,leftmarginiii,leftmarginiv,leftmarginv,% - leftmarginvi,leftmark,lhd,lim,linebreak,linespread,linethickness,% - linewidth,list,listfiles,listfiles,listparindent,lrbox,% - makeatletter,makeatother,makebox,makeglossary,makeindex,% - makelabel,MakeLowercase,MakeUppercase,marginpar,marginparpush,% - marginparsep,marginparwidth,markboth,markright,math,mathbf,% - mathellipsis,mathgroup,mathit,mathrm,mathsf,mathsterling,mathtt,% - mathunderscore,mathversion,mbox,mdseries,mho,minipage,% - multicolumn,multiput,NeedsTeXFormat,newcommand,newcounter,% - newenvironment,newfont,newhelp,newlabel,newlength,newline,% - newmathalphabet,newpage,newsavebox,newtheorem,nobreakspace,% - nobreakspace,nocite,nocorr,nocorrlist,nofiles,nolinebreak,% - nonumber,nopagebreak,normalcolor,normalfont,normalmarginpar,% - numberline,obeycr,oddsidemargin,oldstylenums,onecolumn,oval,% - pagebreak,pagenumbering,pageref,pagestyle,paperheight,paperwidth,% - paragraphmark,parbox,parsep,partopsep,picture,poptabs,pounds,% - protect,pushtabs,put,qbezier,qbeziermax,r,raggedleft,raisebox,% - ref,refstepcounter,renewcommand,renewenvironment,restorecr,% - reversemarginpar,rhd,rightmargin,rightmark,rmfamily,roman,Roman,% - rootbox,rule,samepage,sbox,scshape,secdef,section,sectionmark,% - selectfont,setcounter,settodepth,settoheight,settowidth,sffamily,% - shortstack,showoutput,showoverfull,sloppy,sloppypar,slshape,% - smallskip,sqsubset,sqsupset,SS,stackrel,stepcounter,stop,stretch,% - subparagraphmark,subsectionmark,subsubsectionmark,sum,% - suppressfloats,symbol,tabbing,tabbingsep,tabcolsep,tabular,% - tabularnewline,textasciicircum,textasciitilde,textbackslash,% - textbar,textbf,textbraceleft,textbraceright,textbullet,% - textcircled,textcompwordmark,textdagger,textdaggerdbl,textdollar,% - textellipsis,textemdash,textendash,textexclamdown,textfloatsep,% - textfraction,textgreater,textheight,textit,textless,textmd,% - textnormal,textparagraph,textperiodcentered,textquestiondown,% - textquotedblleft,textquotedblright,textquoteleft,textquoteright,% - textregistered,textrm,textsc,textsection,textsf,textsl,% - textsterling,textsuperscript,texttrademark,texttt,textunderscore,% - textup,textvisiblespace,textwidth,thanks,thefootnote,thempfn,% - thempfn,thempfootnote,thepage,thepage,thicklines,thinlines,% - thispagestyle,title,today,topfigrule,topfraction,topmargin,% - topsep,totalheight,tracingfonts,trivlist,ttfamily,twocolumn,% - typein,typeout,unboldmath,unitlength,unlhd,unrhd,upshape,usebox,% - usecounter,usefont,usepackage,value,vector,verb,verbatim,vline,% - vspace,width,% - normalsize,small,footnotesize,scriptsize,tiny,large,Large,LARGE,% - huge,Huge}% - }% -\lst@definelanguage[plain]{TeX}[common]{TeX}% - {moretexcs={advancepageno,beginsection,bf,bffam,bye,cal,cleartabs,% - columns,dosupereject,endinsert,eqalign,eqalignno,fiverm,fivebf,% - fivei,fivesy,folio,footline,hang,headline,it,itemitem,itfam,% - leqalignno,magnification,makefootline,makeheadline,midinsert,mit,% - mscount,nopagenumbers,normalbottom,of,oldstyle,pagebody,% - pagecontents,pageinsert,pageno,plainoutput,preloaded,proclaim,rm,% - settabs,sevenbf,seveni,sevensy,sevenrm,sl,slfam,supereject,% - tabalign,tabs,tabsdone,tabsyet,tenbf,tenex,teni,tenit,tenrm,% - tensl,tensy,tentt,textindent,topglue,topins,topinsert,tt,ttfam,% - ttraggedright,vfootnote}% - }% -\lst@definelanguage[common]{TeX}[primitive]{TeX} - {moretexcs={active,acute,ae,AE,aleph,allocationnumber,allowbreak,% - alpha,amalg,angle,approx,arccos,arcsin,arctan,arg,arrowvert,% - Arrowvert,ast,asymp,b,backslash,bar,beta,bgroup,big,Big,bigbreak,% - bigcap,bigcirc,bigcup,bigg,Bigg,biggl,Biggl,biggm,Biggm,biggr,% - Biggr,bigl,Bigl,bigm,Bigm,bigodot,bigoplus,bigotimes,bigr,Bigr,% - bigskip,bigskipamount,bigsqcup,bigtriangledown,bigtriangleup,% - biguplus,bigvee,bigwedge,bmod,bordermatrix,bot,bowtie,brace,% - braceld,bracelu,bracerd,braceru,bracevert,brack,break,breve,% - buildrel,bullet,c,cap,cases,cdot,cdotp,cdots,centering,% - centerline,check,chi,choose,circ,clubsuit,colon,cong,coprod,% - copyright,cos,cosh,cot,coth,csc,cup,d,dag,dagger,dashv,ddag,% - ddagger,ddot,ddots,deg,delta,Delta,det,diamond,diamondsuit,dim,% - displaylines,div,do,dospecials,dot,doteq,dotfill,dots,downarrow,% - Downarrow,downbracefill,egroup,eject,ell,empty,emptyset,endgraf,% - endline,enskip,enspace,epsilon,equiv,eta,exists,exp,filbreak,% - flat,fmtname,fmtversion,footins,footnote,footnoterule,forall,% - frenchspacing,frown,gamma,Gamma,gcd,ge,geq,gets,gg,goodbreak,% - grave,H,hat,hbar,heartsuit,hglue,hideskip,hidewidth,hom,% - hookleftarrow,hookrightarrow,hphantom,hrulefill,i,ialign,iff,Im,% - imath,in,inf,infty,int,interdisplaylinepenalty,% - interfootnotelinepenalty,intop,iota,item,j,jmath,joinrel,jot,% - kappa,ker,l,L,lambda,Lambda,land,langle,lbrace,lbrack,lceil,% - ldotp,ldots,le,leavevmode,leftarrow,Leftarrow,leftarrowfill,% - leftharpoondown,leftharpoonup,leftline,leftrightarrow,% - Leftrightarrow,leq,lfloor,lg,lgroup,lhook,lim,liminf,limsup,line,% - ll,llap,lmoustache,ln,lnot,log,longleftarrow,Longleftarrow,% - longleftrightarrow,Longleftrightarrow,longmapsto,longrightarrow,% - Longrightarrow,loop,lor,lq,magstep,magstep,magstephalf,mapsto,% - mapstochar,mathhexbox,mathpalette,mathstrut,matrix,max,maxdimen,% - medbreak,medskip,medskipamount,mid,min,models,mp,mu,multispan,% - nabla,narrower,natural,ne,nearrow,neg,negthinspace,neq,newbox,% - newcount,newdimen,newfam,newif,newinsert,newlanguage,newmuskip,% - newread,newskip,newtoks,newwrite,next,ni,nobreak,nointerlineskip,% - nonfrenchspacing,normalbaselines,normalbaselineskip,% - normallineskip,normallineskiplimit,not,notin,nu,null,nwarrow,o,O,% - oalign,obeylines,obeyspaces,odot,oe,OE,offinterlineskip,oint,% - ointop,omega,Omega,ominus,ooalign,openup,oplus,oslash,otimes,% - overbrace,overleftarrow,overrightarrow,owns,P,parallel,partial,% - perp,phantom,phi,Phi,pi,Pi,pm,pmatrix,pmod,Pr,prec,preceq,prime,% - prod,propto,psi,Psi,qquad,quad,raggedbottom,raggedright,rangle,% - rbrace,rbrack,rceil,Re,relbar,Relbar,removelastskip,repeat,% - rfloor,rgroup,rho,rhook,rightarrow,Rightarrow,rightarrowfill,% - rightharpoondown,rightharpoonup,rightleftharpoons,rightline,rlap,% - rmoustache,root,rq,S,sb,searrow,sec,setminus,sharp,showhyphens,% - sigma,Sigma,sim,simeq,sin,sinh,skew,slash,smallbreak,smallint,% - smallskip,smallskipamount,smash,smile,sp,space,spadesuit,sqcap,% - sqcup,sqrt,sqsubseteq,sqsupseteq,ss,star,strut,strutbox,subset,% - subseteq,succ,succeq,sum,sup,supset,supseteq,surd,swarrow,t,tan,% - tanh,tau,TeX,theta,Theta,thinspace,tilde,times,to,top,tracingall,% - triangle,triangleleft,triangleright,u,underbar,underbrace,% - uparrow,Uparrow,upbracefill,updownarrow,Updownarrow,uplus,% - upsilon,Upsilon,v,varepsilon,varphi,varpi,varrho,varsigma,% - vartheta,vdash,vdots,vec,vee,vert,Vert,vglue,vphantom,wedge,% - widehat,widetilde,wlog,wp,wr,xi,Xi,zeta}% - }% -\lst@definelanguage[primitive]{TeX}% - {moretexcs={above,abovedisplayshortskip,abovedisplayskip,aftergroup,% - abovewithdelims,accent,adjdemerits,advance,afterassignment,atop,% - atopwithdelims,badness,baselineskip,batchmode,begingroup,% - belowdisplayshortskip,belowdisplayskip,binoppenalty,botmark,box,% - boxmaxdepth,brokenpenalty,catcode,char,chardef,cleaders,closein,% - closeout,clubpenalty,copy,count,countdef,cr,crcr,csname,day,% - deadcycles,def,defaulthyphenchar,defaultskewchar,delcode,% - delimiter,delimiterfactor,delimitershortfall,dimen,dimendef,% - discretionary,displayindent,displaylimits,displaystyle,% - displaywidowpenalty,displaywidth,divide,doublehyphendemerits,dp,% - edef,else,emergencystretch,end,endcsname,endgroup,endinput,% - endlinechar,eqno,errhelp,errmessage,errorcontextlines,% - errorstopmode,escapechar,everycr,everydisplay,everyhbox,everyjob,% - everymath,everypar,everyvbox,exhyphenpenalty,expandafter,fam,fi,% - finalhypendemerits,firstmark,floatingpenalty,font,fontdimen,% - fontname,futurelet,gdef,global,globaldefs,halign,hangafter,% - hangindent,hbadness,hbox,hfil,hfill,hfilneg,hfuzz,hoffset,% - holdinginserts,hrule,hsize,hskip,hss,ht,hyphenation,hyphenchar,% - hyphenpenalty,if,ifcase,ifcat,ifdim,ifeof,iffalse,ifhbox,ifhmode,% - ifinner,ifmmode,ifnum,ifodd,iftrue,ifvbox,ifvmode,ifvoid,ifx,% - ignorespaces,immediate,indent,input,insert,insertpenalties,% - interlinepenalty,jobname,kern,language,lastbox,lastkern,% - lastpenalty,lastskip,lccode,leaders,left,lefthyphenmin,leftskip,% - leqno,let,limits,linepenalty,lineskip,lineskiplimits,long,% - looseness,lower,lowercase,mag,mark,mathaccent,mathbin,mathchar,% - mathchardef,mathchoice,mathclose,mathcode,mathinner,mathop,% - mathopen,mathord,mathpunct,mathrel,mathsurround,maxdeadcycles,% - maxdepth,meaning,medmuskip,message,mkern,month,moveleft,% - moveright,mskip,multiply,muskip,muskipdef,newlinechar,noalign,% - noboundary,noexpand,noindent,nolimits,nonscript,nonstopmode,% - nulldelimiterspace,nullfont,number,omit,openin,openout,or,outer,% - output,outputpenalty,over,overfullrule,overline,overwithdelims,% - pagedepth,pagefilllstretch,pagefillstretch,pagefilstretch,% - pagegoal,pageshrink,pagestretch,pagetotal,par,parfillskip,% - parindent,parshape,parskip,patterns,pausing,penalty,% - postdisplaypenalty,predisplaypenalty,predisplaysize,pretolerance,% - prevdepth,prevgraf,radical,raise,read,relax,relpenalty,right,% - righthyphenmin,rightskip,romannumeral,scriptfont,% - scriptscriptfont,scriptscriptstyle,scriptspace,scriptstyle,% - scrollmode,setbox,setlanguage,sfcode,shipout,show,showbox,% - showboxbreadth,showboxdepth,showlists,showthe,skewchar,skip,% - skipdef,spacefactor,spaceskip,span,special,splitbotmark,% - splitfirstmark,splitmaxdepth,splittopskip,string,tabskip,% - textfont,textstyle,the,thickmuskip,thinmuskip,time,toks,toksdef,% - tolerance,topmark,topskip,tracingcommands,tracinglostchars,% - tracingmacros,tracingonline,tracingoutput,tracingpages,% - tracingparagraphs,tracingrestores,tracingstats,uccode,uchyph,% - underline,unhbox,unhcopy,unkern,unpenalty,unskip,unvbox,unvcopy,% - uppercase,vadjust,valign,vbadness,vbox,vcenter,vfil,vfill,% - vfilneg,vfuzz,voffset,vrule,vsize,vskip,vsplit,vss,vtop,wd,% - widowpenalty,write,xdef,xleaders,xspaceskip,year},% - sensitive,% - alsoother={0123456789$_},% - morecomment=[l]\%% - }[keywords,tex,comments]% -%% -%% Verilog definition (c) 2003 Cameron H. G. Wright -%% Based on the IEEE 1364-2001 Verilog HDL standard -%% Ref: S. Palnitkar, "Verilog HDL: A Guide to Digital Design and Synthesis," -%% Prentice Hall, 2003. ISBN: 0-13-044911-3 -%% -\lst@definelanguage{Verilog}% - {morekeywords={% reserved keywords - always,and,assign,automatic,begin,buf,bufif0,bufif1,case,casex,% - casez,cell,cmos,config,deassign,default,defparam,design,disable,% - edge,else,end,endcase,endconfig,endfunction,endgenerate,% - endmodule,endprimitive,endspecify,endtable,endtask,event,for,% - force,forever,fork,function,generate,genvar,highz0,highz1,if,% - ifnone,incdir,include,initial,inout,input,instance,integer,join,% - large,liblist,library,localparam,macromodule,medium,module,nand,% - negedge,nmos,nor,noshowcancelled,not,notif0,notif1,or,output,% - parameter,pmos,posedge,primitive,pull0,pull1,pulldown,pullup,% - pulsestyle_onevent,pulsestyle_ondetect,rcmos,real,realtime,reg,% - release,repeat,rnmos,rpmos,rtran,rtranif0,rtranif1,scalared,% - showcancelled,signed,small,specify,specparam,strong0,strong1,% - supply0,supply1,table,task,time,tran,tranif0,tranif1,tri,tri0,% - tri1,triand,trior,trireg,unsigned,use,vectored,wait,wand,weak0,% - weak1,while,wire,wor,xnor,xor},% - morekeywords=[2]{% system tasks and functions - $bitstoreal,$countdrivers,$display,$fclose,$fdisplay,$fmonitor,% - $fopen,$fstrobe,$fwrite,$finish,$getpattern,$history,$incsave,% - $input,$itor,$key,$list,$log,$monitor,$monitoroff,$monitoron,% - $nokey},% - morekeywords=[3]{% compiler directives - `accelerate,`autoexpand_vectornets,`celldefine,`default_nettype,% - `define,`else,`elsif,`endcelldefine,`endif,`endprotect,% - `endprotected,`expand_vectornets,`ifdef,`ifndef,`include,% - `no_accelerate,`noexpand_vectornets,`noremove_gatenames,% - `nounconnected_drive,`protect,`protected,`remove_gatenames,% - `remove_netnames,`resetall,`timescale,`unconnected_drive},% - alsoletter=\`,% - sensitive,% - morecomment=[s]{/*}{*/},% - morecomment=[l]//,% nonstandard - morestring=[b]"% - }[keywords,comments,strings]% -\endinput -%% -%% End of file `lstlang3.sty'. diff --git a/org.glite.lb.doc/src/lstmisc.sty b/org.glite.lb.doc/src/lstmisc.sty deleted file mode 100644 index 9a4f12d..0000000 --- a/org.glite.lb.doc/src/lstmisc.sty +++ /dev/null @@ -1,2086 +0,0 @@ -%% -%% This is file `lstmisc.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% listings-1.3.dtx (with options: `misc,0.21') -%% -%% Please read the software license in listings-1.3.dtx or listings-1.3.pdf. -%% -%% (w)(c) 1996--2004 Carsten Heinz and/or any other author listed -%% elsewhere in this file. -%% -%% Send comments and ideas on the package, error reports and additional -%% programming languages to . -%% -\def\filedate{2004/09/07} -\def\fileversion{1.3} -\ProvidesFile{lstmisc.sty} - [\filedate\space\fileversion\space(Carsten Heinz)] -\lst@CheckVersion\fileversion - {\typeout{^^J% - ***^^J% - *** This file requires `listings.sty' version \fileversion.^^J% - *** You have a serious problem, so I'm exiting ...^^J% - ***^^J}% - \batchmode \@@end} -\lst@BeginAspect{writefile} -\newtoks\lst@WFtoken % global -\lst@AddToHook{InitVarsBOL}{\global\lst@WFtoken{}} -\newwrite\lst@WF -\global\let\lst@WFifopen\iffalse % init -\gdef\lst@WFWriteToFile{% - \begingroup - \let\lst@UM\@empty - \expandafter\edef\expandafter\lst@temp\expandafter{\the\lst@WFtoken}% - \immediate\write\lst@WF{\lst@temp}% - \endgroup - \global\lst@WFtoken{}} -\gdef\lst@WFAppend#1{% - \global\lst@WFtoken=\expandafter{\the\lst@WFtoken#1}} -\gdef\lst@BeginWriteFile{\lst@WFBegin\@gobble} -\gdef\lst@BeginAlsoWriteFile{\lst@WFBegin\lst@OutputBox} -\begingroup \catcode`\^^I=11 -\gdef\lst@WFBegin#1#2{% - \begingroup - \let\lst@OutputBox#1% - \def\lst@Append##1{% - \advance\lst@length\@ne - \expandafter\lst@token\expandafter{\the\lst@token##1}% - \ifx ##1\lst@outputspace \else - \lst@WFAppend##1% - \fi}% - \lst@lAddTo\lst@PreGotoTabStop{\lst@WFAppend{^^I}}% - \lst@lAddTo\lst@ProcessSpace{\lst@WFAppend{ }}% - \let\lst@DeInit\lst@WFDeInit - \let\lst@MProcessListing\lst@WFMProcessListing - \lst@WFifopen\else - \immediate\openout\lst@WF=#2\relax - \global\let\lst@WFifopen\iftrue - \@gobbletwo\fi\fi - \fi} -\endgroup -\gdef\lst@EndWriteFile{% - \immediate\closeout\lst@WF \endgroup - \global\let\lst@WFifopen\iffalse} -\global\let\lst@WFMProcessListing\lst@MProcessListing -\global\let\lst@WFDeInit\lst@DeInit -\lst@AddToAtTop\lst@WFMProcessListing{\lst@WFWriteToFile} -\lst@AddToAtTop\lst@WFDeInit{% - \ifnum\lst@length=\z@\else \lst@WFWriteToFile \fi} -\lst@EndAspect -\lst@BeginAspect{strings} -\gdef\lst@stringtypes{d,b,m,bd,db} -\gdef\lst@StringKey#1#2{% - \lst@Delim\lst@stringstyle #2\relax - {String}\lst@stringtypes #1% - {\lst@BeginString\lst@EndString}% - \@@end\@empty{}} -\lst@Key{string}\relax{\lst@StringKey\@empty{#1}} -\lst@Key{morestring}\relax{\lst@StringKey\relax{#1}} -\lst@Key{deletestring}\relax{\lst@StringKey\@nil{#1}} -\lst@Key{stringstyle}{}{\def\lst@stringstyle{#1}} -\lst@AddToHook{EmptyStyle}{\let\lst@stringstyle\@empty} -\lst@Key{showstringspaces}t[t]{\lstKV@SetIf{#1}\lst@ifshowstringspaces} -\gdef\lst@BeginString{% - \lst@DelimOpen - \lst@ifexstrings\else - {\lst@ifshowstringspaces - \lst@keepspacestrue - \let\lst@outputspace\lst@visiblespace - \fi}} -\lst@AddToHookExe{ExcludeDelims}{\let\lst@ifexstrings\iffalse} -\gdef\lst@EndString{\lst@DelimClose\lst@ifexstrings\else} -\gdef\lst@StringDM@d#1#2\@empty#3#4#5{% - \lst@CArg #2\relax\lst@DefDelimBE{}{}{}#3{#1}{#5}#4} -\gdef\lst@StringDM@b#1#2\@empty#3#4#5{% - \let\lst@ifbstring\iftrue - \lst@CArg #2\relax\lst@DefDelimBE - {\lst@ifletter \lst@Output \lst@letterfalse \fi}% - {\ifx\lst@lastother\lstum@backslash - \expandafter\@gobblethree - \fi}{}#3{#1}{#5}#4} -\global\let\lst@ifbstring\iffalse % init -\lst@AddToHook{SelectCharTable}{% - \lst@ifbstring - \lst@CArgX \\\\\relax \lst@CDefX{}% - {\lst@ProcessOther\lstum@backslash - \lst@ProcessOther\lstum@backslash - \let\lst@lastother\relax}% - {}% - \fi} -\global\let\lst@StringDM@bd\lst@StringDM@b -\global\let\lst@StringDM@db\lst@StringDM@bd -\gdef\lst@StringDM@a#1#2\@empty#3#4#5{% - \lst@CArg #2\relax\lst@DefDelimBE{}{}% - {\let\lst@next\@gobblethree - \lst@ifletter\else - \ifx\lst@lastother)\else \ifx\lst@lastother]\else - \let\lst@next\@empty - \fi \fi \fi - \lst@next}#3{#1}{#5}#4} -\gdef\lst@StringDM@m#1#2\@empty#3#4#5{% - \lst@CArg #2\relax\lst@DefDelimBE{}{}% - {\let\lst@next\@gobblethree - \lst@ifletter\else - \lst@IfLastOtherOneOf{)].0123456789\lstum@rbrace'}% - {}% - {\let\lst@next\@empty}% - \fi - \lst@next}#3{#1}{#5}#4} -\lst@SaveOutputDef{"7D}\lstum@rbrace -\lst@EndAspect -\lst@BeginAspect{mf} -\lst@AddTo\lst@stringtypes{,mf} -\lst@NewMode\lst@mfinputmode -\gdef\lst@String@mf#1\@empty#2#3#4{% - \lst@CArg #1\relax\lst@DefDelimB - {}{}{\lst@ifletter \expandafter\@gobblethree \fi}% - \lst@BeginStringMFinput\lst@mfinputmode{#4\lst@Lmodetrue}% - \@ifundefined{lsts@semicolon}% - {\lst@DefSaveDef{`\;}\lsts@semicolon{% ; and space end the filename - \ifnum\lst@mode=\lst@mfinputmode - \lst@XPrintToken - \expandafter\lst@LeaveMode - \fi - \lsts@semicolon}% - \lst@DefSaveDef{`\ }\lsts@space{% - \ifnum\lst@mode=\lst@mfinputmode - \lst@XPrintToken - \expandafter\lst@LeaveMode - \fi - \lsts@space}% - }{}} -\gdef\lst@BeginStringMFinput#1#2#3\@empty{% - \lst@TrackNewLines \lst@XPrintToken - \begingroup - \lst@mode\lst@nomode - #3\lst@XPrintToken - \endgroup - \lst@ResetToken - \lst@EnterMode{#1}{\def\lst@currstyle#2}% - \lst@ifshowstringspaces - \lst@keepspacestrue - \let\lst@outputspace\lst@visiblespace - \fi} -\lst@EndAspect -\lst@BeginAspect{comments} -\lst@NewMode\lst@commentmode -\gdef\lst@commenttypes{l,f,s,n} -\gdef\lst@CommentKey#1#2{% - \lst@Delim\lst@commentstyle #2\relax - {Comment}\lst@commenttypes #1% - {\lst@BeginComment\lst@EndComment}% - i\@empty{\lst@BeginInvisible\lst@EndInvisible}} -\lst@Key{comment}\relax{\lst@CommentKey\@empty{#1}} -\lst@Key{morecomment}\relax{\lst@CommentKey\relax{#1}} -\lst@Key{deletecomment}\relax{\lst@CommentKey\@nil{#1}} -\lst@Key{commentstyle}{}{\def\lst@commentstyle{#1}} -\lst@AddToHook{EmptyStyle}{\let\lst@commentstyle\itshape} -\gdef\lst@BeginComment{% - \lst@DelimOpen - \lst@ifexcomments\else - \lsthk@AfterBeginComment} -\gdef\lst@EndComment{\lst@DelimClose\lst@ifexcomments\else} -\lst@AddToHook{AfterBeginComment}{} -\lst@AddToHookExe{ExcludeDelims}{\let\lst@ifexcomments\iffalse} -\gdef\lst@BeginInvisible#1#2#3\@empty{% - \lst@TrackNewLines \lst@XPrintToken - \lst@BeginDropOutput{#1}} -\gdef\lst@EndInvisible#1\@empty{\lst@EndDropOutput} -\gdef\lst@CommentDM@l#1#2\@empty#3#4#5{% - \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}} -\gdef\lst@CommentDM@f#1{% - \@ifnextchar[{\lst@Comment@@f{#1}}% - {\lst@Comment@@f{#1}[0]}} -\gdef\lst@Comment@@f#1[#2]#3\@empty#4#5#6{% - \lst@CArg #3\relax\lst@DefDelimB{}{}% - {\lst@CalcColumn - \ifnum #2=\@tempcnta\else - \expandafter\@gobblethree - \fi}% - #4{#1}{#6\lst@Lmodetrue}} -\gdef\lst@CommentDM@s#1#2#3\@empty#4#5#6{% - \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}% - \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}} -\gdef\lst@CommentDM@n#1#2#3\@empty#4#5#6{% - \ifx\@empty#3\@empty\else - \def\@tempa{#2}\def\@tempb{#3}% - \ifx\@tempa\@tempb - \PackageError{Listings}{Identical delimiters}% - {These delimiters make no sense with nested comments.}% - \else - \lst@CArg #2\relax\lst@DefDelimB - {}% - {\ifnum\lst@mode=#1\relax \expandafter\@gobble \fi}% - {}#4{#1}{#6}% - \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}% - \fi - \fi} -\lst@EndAspect -\lst@BeginAspect{pod} -\lst@Key{printpod}{false}[t]{\lstKV@SetIf{#1}\lst@ifprintpod} -\lst@Key{podcomment}{false}[t]{\lstKV@SetIf{#1}\lst@ifpodcomment} -\lst@AddToHookExe{SetLanguage}{\let\lst@ifpodcomment\iffalse} -\lst@NewMode\lst@PODmode -\lst@AddToHook{SelectCharTable} - {\lst@ifpodcomment - \lst@CArgX =\relax\lst@DefDelimB{}{}% - {\ifnum\@tempcnta=\z@ - \lst@ifprintpod\else - \def\lst@bnext{\lst@BeginDropOutput\lst@PODmode}% - \expandafter\expandafter\expandafter\@gobblethree - \fi - \else - \expandafter\@gobblethree - \fi}% - \lst@BeginComment\lst@PODmode{{\lst@commentstyle}}% - \lst@CArgX =cut\^^M\relax\lst@DefDelimE - {\lst@CalcColumn}% - {\ifnum\@tempcnta=\z@\else - \expandafter\@gobblethree - \fi}% - {}% - \lst@EndComment\lst@PODmode - \fi} -\lst@EndAspect -\lst@BeginAspect[keywords]{html} -\gdef\lst@tagtypes{s} -\gdef\lst@TagKey#1#2{% - \lst@Delim\lst@tagstyle #2\relax - {Tag}\lst@tagtypes #1% - {\lst@BeginTag\lst@EndTag}% - \@@end\@empty{}} -\lst@Key{tag}\relax{\lst@TagKey\@empty{#1}} -\lst@Key{tagstyle}{}{\def\lst@tagstyle{#1}} -\lst@AddToHook{EmptyStyle}{\let\lst@tagstyle\@empty} -\gdef\lst@BeginTag{% - \lst@DelimOpen - \lst@ifextags\else - {\let\lst@ifkeywords\iftrue - \lst@ifmarkfirstintag \lst@firstintagtrue \fi}} -\lst@AddToHookExe{ExcludeDelims}{\let\lst@ifextags\iffalse} -\gdef\lst@EndTag{\lst@DelimClose\lst@ifextags\else} -\lst@Key{usekeywordsintag}t[t]{\lstKV@SetIf{#1}\lst@ifusekeysintag} -\lst@Key{markfirstintag}f[t]{\lstKV@SetIf{#1}\lst@ifmarkfirstintag} -\gdef\lst@firstintagtrue{\global\let\lst@iffirstintag\iftrue} -\global\let\lst@iffirstintag\iffalse -\lst@AddToHook{PostOutput}{\lst@tagresetfirst} -\lst@AddToHook{Output} - {\gdef\lst@tagresetfirst{\global\let\lst@iffirstintag\iffalse}} -\lst@AddToHook{OutputOther}{\gdef\lst@tagresetfirst{}} -\lst@AddToHook{Output} - {\ifnum\lst@mode=\lst@tagmode - \lst@iffirstintag \let\lst@thestyle\lst@gkeywords@sty \fi - \lst@ifusekeysintag\else \let\lst@thestyle\lst@gkeywords@sty\fi - \fi} -\lst@NewMode\lst@tagmode -\lst@AddToHook{Init}{\global\let\lst@ifnotag\iftrue} -\lst@AddToHook{SelectCharTable}{\let\lst@ifkeywords\lst@ifnotag} -\gdef\lst@Tag@s#1#2\@empty#3#4#5{% - \global\let\lst@ifnotag\iffalse - \lst@CArg #1\relax\lst@DefDelimB {}{}% - {\ifnum\lst@mode=\lst@tagmode \expandafter\@gobblethree \fi}% - #3\lst@tagmode{#5}% - \lst@CArg #2\relax\lst@DefDelimE {}{}{}#4\lst@tagmode}% -\gdef\lst@BeginCDATA#1\@empty{% - \lst@TrackNewLines \lst@PrintToken - \lst@EnterMode\lst@GPmode{}\let\lst@ifmode\iffalse - \lst@mode\lst@tagmode #1\lst@mode\lst@GPmode\relax\lst@modetrue} -\lst@EndAspect -\lst@BeginAspect{escape} -\lst@Key{texcl}{false}[t]{\lstKV@SetIf{#1}\lst@iftexcl} -\lst@AddToHook{TextStyle}{\let\lst@iftexcl\iffalse} -\lst@AddToHook{EOL} - {\ifnum\lst@mode=\lst@TeXLmode - \expandafter\lst@escapeend - \expandafter\lst@LeaveAllModes - \expandafter\lst@ReenterModes - \fi} -\lst@AddToHook{AfterBeginComment} - {\lst@iftexcl \lst@ifLmode \lst@ifdropinput\else - \lst@PrintToken - \lst@LeaveMode \lst@InterruptModes - \lst@EnterMode{\lst@TeXLmode}{\lst@modetrue\lst@commentstyle}% - \expandafter\expandafter\expandafter\lst@escapebegin - \fi \fi \fi} -\lst@NewMode\lst@TeXLmode -\gdef\lst@ActiveCDefX#1{\lst@ActiveCDefX@#1} -\gdef\lst@ActiveCDefX@#1#2#3{ - \catcode`#1\active\lccode`\~=`#1% - \lowercase{\lst@CDefIt~}{#2}{#3}{}} -\gdef\lst@Escape#1#2#3#4{% - \lst@CArgX #1\relax\lst@CDefX - {}% - {\lst@ifdropinput\else - \lst@TrackNewLines\lst@OutputLostSpace \lst@XPrintToken - \lst@InterruptModes - \lst@EnterMode{\lst@TeXmode}{\lst@modetrue}% - \ifx\^^M#2% - \lst@CArg #2\relax\lst@ActiveCDefX - {}% - {\lst@escapeend #4\lst@LeaveAllModes\lst@ReenterModes}% - {\lst@MProcessListing}% - \else - \lst@CArg #2\relax\lst@ActiveCDefX - {}% - {\lst@escapeend #4\lst@LeaveAllModes\lst@ReenterModes - \lst@whitespacefalse}% - {}% - \fi - #3\lst@escapebegin - \fi}% - {}} -\lst@NewMode\lst@TeXmode -\lst@Key{escapebegin}{}{\def\lst@escapebegin{#1}} -\lst@Key{escapeend}{}{\def\lst@escapeend{#1}} -\lst@Key{escapechar}{} - {\ifx\@empty#1\@empty - \let\lst@DefEsc\relax - \else - \def\lst@DefEsc{\lst@Escape{#1}{#1}{}{}}% - \fi} -\lst@AddToHook{TextStyle}{\let\lst@DefEsc\@empty} -\lst@AddToHook{SelectCharTable}{\lst@DefEsc} -\lst@Key{escapeinside}{}{\lstKV@TwoArg{#1}% - {\let\lst@DefEsc\@empty - \ifx\@empty##1@empty\else \ifx\@empty##2\@empty\else - \def\lst@DefEsc{\lst@Escape{##1}{##2}{}{}}% - \fi\fi}} -\lst@Key{mathescape}{false}[t]{\lstKV@SetIf{#1}\lst@ifmathescape} -\lst@AddToHook{SelectCharTable} - {\lst@ifmathescape \lst@Escape{\$}{\$}% - {\setbox\@tempboxa=\hbox\bgroup$}% - {$\egroup \lst@CalcLostSpaceAndOutput}\fi} -\lst@EndAspect -\lst@BeginAspect{keywords} -\global\let\lst@ifsensitive\iftrue % init -\global\let\lst@ifsensitivedefed\iffalse % init % \global -\lst@ifsavemem\else -\gdef\lst@KeywordTest#1#2#3{% - \begingroup \let\lst@UM\@empty - \global\expandafter\let\expandafter\@gtempa - \csname\@lst#1@\the\lst@token\endcsname - \endgroup - \ifx\@gtempa\relax\else - \let\lst@thestyle\@gtempa - \fi} -\gdef\lst@KEYWORDTEST{% - \uppercase\expandafter{\expandafter - \lst@KEYWORDTEST@\the\lst@token}\relax} -\gdef\lst@KEYWORDTEST@#1\relax#2#3#4{% - \begingroup \let\lst@UM\@empty - \global\expandafter\let\expandafter\@gtempa - \csname\@lst#2@#1\endcsname - \endgroup - \ifx\@gtempa\relax\else - \let\lst@thestyle\@gtempa - \fi} -\gdef\lst@WorkingTest#1#2#3{% - \begingroup \let\lst@UM\@empty - \global\expandafter\let\expandafter\@gtempa - \csname\@lst#1@\the\lst@token\endcsname - \endgroup - \@gtempa} -\gdef\lst@WORKINGTEST{% - \uppercase\expandafter{\expandafter - \lst@WORKINGTEST@\the\lst@token}\relax} -\gdef\lst@WORKINGTEST@#1\relax#2#3#4{% - \begingroup \let\lst@UM\@empty - \global\expandafter\let\expandafter\@gtempa - \csname\@lst#2@#1\endcsname - \endgroup - \@gtempa} -\gdef\lst@DefineKeywords#1#2#3{% - \lst@ifsensitive - \def\lst@next{\lst@for#2}% - \else - \def\lst@next{\uppercase\expandafter{\expandafter\lst@for#2}}% - \fi - \lst@next\do - {\expandafter\ifx\csname\@lst#1@##1\endcsname\relax - \global\expandafter\let\csname\@lst#1@##1\endcsname#3% - \fi}} -\gdef\lst@UndefineKeywords#1#2#3{% - \lst@ifsensitivedefed - \def\lst@next{\lst@for#2}% - \else - \def\lst@next{\uppercase\expandafter{\expandafter\lst@for#2}}% - \fi - \lst@next\do - {\expandafter\ifx\csname\@lst#1@##1\endcsname#3% - \global\expandafter\let\csname\@lst#1@##1\endcsname\relax - \fi}} -\fi -\lst@ifsavemem -\gdef\lst@IfOneOutOf#1\relax#2{% - \def\lst@temp##1,#1,##2##3\relax{% - \ifx\@empty##2\else \expandafter\lst@IOOOfirst \fi}% - \def\lst@next{\lst@IfOneOutOf@#1\relax}% - \expandafter\lst@next#2\relax\relax} -\gdef\lst@IfOneOutOf@#1\relax#2#3{% - \ifx#2\relax - \expandafter\@secondoftwo - \else - \expandafter\lst@temp\expandafter,#2,#1,\@empty\relax - \expandafter\lst@next - \fi} -\ifx\iffalse\else\fi -\gdef\lst@IOOOfirst#1\relax#2#3{\fi#2} -\gdef\lst@IFONEOUTOF#1\relax#2{% - \uppercase{\def\lst@temp##1,#1},##2##3\relax{% - \ifx\@empty##2\else \expandafter\lst@IOOOfirst \fi}% - \def\lst@next{\lst@IFONEOUTOF@#1\relax}% - \expandafter\lst@next#2\relax} -\gdef\lst@IFONEOUTOF@#1\relax#2#3{% - \ifx#2\relax - \expandafter\@secondoftwo - \else - \uppercase - {\expandafter\lst@temp\expandafter,#2,#1,\@empty\relax}% - \expandafter\lst@next - \fi} -\gdef\lst@KWTest{% - \begingroup \let\lst@UM\@empty - \expandafter\xdef\expandafter\@gtempa\expandafter{\the\lst@token}% - \endgroup - \expandafter\lst@IfOneOutOf\@gtempa\relax} -\gdef\lst@KeywordTest#1#2#3{\lst@KWTest #2{\let\lst@thestyle#3}{}} -\global\let\lst@KEYWORDTEST\lst@KeywordTest -\gdef\lst@WorkingTest#1#2#3{\lst@KWTest #2#3{}} -\global\let\lst@WORKINGTEST\lst@WorkingTest -\fi -\lst@Key{sensitive}\relax[t]{\lstKV@SetIf{#1}\lst@ifsensitive} -\lst@AddToHook{SetLanguage}{\let\lst@ifsensitive\iftrue} -\lst@AddToHook{Init} - {\lst@ifsensitive\else - \let\lst@KeywordTest\lst@KEYWORDTEST - \let\lst@WorkingTest\lst@WORKINGTEST - \let\lst@IfOneOutOf\lst@IFONEOUTOF - \fi} -\gdef\lst@MakeMacroUppercase#1{% - \ifx\@undefined#1\else \uppercase\expandafter - {\expandafter\def\expandafter#1\expandafter{#1}}% - \fi} -\gdef\lst@InstallTest#1#2#3#4#5#6#7#8{% - \lst@AddToHook{TrackKeywords}{\lst@TrackKeywords{#1}#2#4#6#7#8}% - \lst@AddToHook{PostTrackKeywords}{\lst@PostTrackKeywords#2#3#4#5}} -\lst@AddToHook{Init}{\lsthk@TrackKeywords\lsthk@PostTrackKeywords} -\lst@AddToHook{TrackKeywords} - {\global\let\lst@DoDefineKeywords\@empty}% init -\lst@AddToHook{PostTrackKeywords} - {\lst@DoDefineKeywords - \global\let\lst@DoDefineKeywords\@empty}% init -\lst@AddToHook{Output}{\lst@ifkeywords \lsthk@DetectKeywords \fi} -\lst@AddToHook{DetectKeywords}{}% init -\lst@AddToHook{ModeTrue}{\let\lst@ifkeywords\iffalse} -\lst@AddToHookExe{Init}{\let\lst@ifkeywords\iftrue} -\gdef\lst@InstallTestNow#1#2#3#4#5{% - \@ifundefined{\string#2#1}% - {\global\@namedef{\string#2#1}{}% - \edef\@tempa{% - \noexpand\lst@AddToHook{\ifx#5dDetectKeywords\else Output\fi}% - {\ifx #4w\noexpand\lst@WorkingTest - \else\noexpand\lst@KeywordTest \fi - {#1}\noexpand#2\noexpand#3}}% - \lst@ifsavemem - \@tempa - \else - \@ifundefined{\@lst#1@if@ins}% - {\@tempa \global\@namedef{\@lst#1@if@ins}{}}% - {}% - \fi} - {}} -\gdef\lst@TrackKeywords#1#2#3#4#5#6{% - \lst@false - \def\lst@arg{{#1}#4}% - \expandafter\expandafter\expandafter\lst@TK@ - \expandafter\lst@arg#2\relax\relax - \lst@ifsavemem\else - \def\lst@arg{{#1}#4#2}% - \expandafter\expandafter\expandafter\lst@TK@@ - \expandafter\lst@arg#3\relax\relax - \fi - \lst@if \lst@InstallTestNow{#1}#2#4#5#6\fi} -\gdef\lst@TK@#1#2#3#4{% - \ifx\lst@ifsensitive\lst@ifsensitivedefed - \ifx#3#4\else - \lst@true - \lst@ifsavemem\else - \lst@UndefineKeywords{#1}#4#2% - \lst@AddTo\lst@DoDefineKeywords{\lst@DefineKeywords{#1}#3#2}% - \fi - \fi - \else - \ifx#3\relax\else - \lst@true - \lst@ifsavemem\else - \lst@UndefineKeywords{#1}#4#2% - \lst@AddTo\lst@DoDefineKeywords{\lst@DefineKeywords{#1}#3#2}% - \fi - \fi - \fi - \lst@ifsavemem \ifx#3\relax\else - \lst@ifsensitive\else \lst@MakeMacroUppercase#3\fi - \fi \fi - \ifx#3\relax - \expandafter\@gobblethree - \fi - \lst@TK@{#1}#2} -\gdef\lst@TK@@#1#2#3#4#5{% - \ifx#4\relax - \expandafter\@gobblefour - \else - \lst@IfSubstring{#4#5}#3{}{\lst@UndefineKeywords{#1}#5#2}% - \fi - \lst@TK@@{#1}#2#3} -\lst@AddToHook{InitVars} - {\global\let\lst@ifsensitivedefed\lst@ifsensitive} -\gdef\lst@PostTrackKeywords#1#2#3#4{% - \lst@ifsavemem\else - \global\let#3#1% - \global\let#4#2% - \fi} -\lst@Key{classoffset}\z@{\def\lst@classoffset{#1}} -\gdef\lst@InstallFamily#1#2#3#4#5{% - \lst@Key{#2}\relax{\lst@UseFamily{#2}##1\relax\lst@MakeKeywords}% - \lst@Key{more#2}\relax - {\lst@UseFamily{#2}##1\relax\lst@MakeMoreKeywords}% - \lst@Key{delete#2}\relax - {\lst@UseFamily{#2}##1\relax\lst@DeleteKeywords}% - \ifx\@empty#3\@empty\else - \lst@Key{#3}{#4}{\lstKV@OptArg[\@ne]{##1}% - {\@tempcnta\lst@classoffset \advance\@tempcnta####1\relax - \@namedef{lst@#3\ifnum\@tempcnta=\@ne\else \the\@tempcnta - \fi}{####2}}}% - \fi - \expandafter\lst@InstallFamily@ - \csname\@lst @#2@data\expandafter\endcsname - \csname\@lst @#5\endcsname {#1}{#2}{#3}} -\gdef\lst@InstallFamily@#1#2#3#4#5#6#7#8{% - \gdef#1{{#3}{#4}{#5}#2#7}% - \long\def\lst@temp##1{#6}% - \ifx\lst@temp\@gobble - \lst@AddTo#1{s#8}% - \else - \lst@AddTo#1{w#8}% - \global\@namedef{lst@g#4@wp}##1{#6}% - \fi} -\gdef\lst@UseFamily#1{% - \def\lst@family{#1}% - \@ifnextchar[\lst@UseFamily@{\lst@UseFamily@[\@ne]}} -\gdef\lst@UseFamily@[#1]{% - \@tempcnta\lst@classoffset \advance\@tempcnta#1\relax - \lst@ProvideFamily\lst@family - \lst@UseFamily@a - {\lst@family\ifnum\@tempcnta=\@ne\else \the\@tempcnta \fi}} -\gdef\lst@UseFamily@a#1{% - \expandafter\lst@UseFamily@b - \csname\@lst @#1@list\expandafter\endcsname - \csname\@lst @#1\expandafter\endcsname - \csname\@lst @#1@also\expandafter\endcsname - \csname\@lst @g#1\endcsname} -\gdef\lst@UseFamily@b#1#2#3#4#5\relax#6{\lstKV@XOptArg[]{#5}#6#1#2#3#4} -\gdef\lst@ProvideFamily#1{% - \@ifundefined{lstfam@#1\ifnum\@tempcnta=\@ne\else\the\@tempcnta\fi}% - {\global\@namedef{lstfam@#1\ifnum\@tempcnta=\@ne\else - \the\@tempcnta\fi}{}% - \expandafter\expandafter\expandafter\lst@ProvideFamily@ - \csname\@lst @#1@data\endcsname - {\ifnum\@tempcnta=\@ne\else \the\@tempcnta \fi}}% - {}}% -\gdef\lst@ProvideFamily@#1#2#3#4#5#6#7#8{% - \expandafter\xdef\csname\@lst @g#2#8@sty\endcsname - {\if #6w% - \expandafter\noexpand\csname\@lst @g#2@wp\endcsname{#8}% - \else - \expandafter\noexpand\csname\@lst @#3#8\endcsname - \fi}% - \ifx\@empty#3\@empty\else - \edef\lst@temp{\noexpand\lst@AddToHook{Init}{% - \noexpand\lst@ProvideStyle\expandafter\noexpand - \csname\@lst @#3#8\endcsname\noexpand#4}}% - \lst@temp - \fi - \expandafter\lst@ProvideFamily@@ - \csname\@lst @#2#8@list\expandafter\endcsname - \csname\@lst @#2#8\expandafter\endcsname - \csname\@lst @#2#8@also\expandafter\endcsname - \csname\@lst @g#2#8@list\expandafter\endcsname - \csname\@lst @g#2#8\expandafter\endcsname - \csname\@lst @g#2#8@sty\expandafter\endcsname - {#1}#5#6#7} -\gdef\lst@ProvideFamily@@#1#2#3#4#5#6#7#8{% - \gdef#1{#2#5}\global\let#2\@empty \global\let#3\@empty % init - \gdef#4{#2#5}\global\let#5\@empty % init - \if #8l\relax - \lst@AddToHook{SetLanguage}{\def#1{#2#5}\let#2\@empty}% - \fi - \lst@InstallTest{#7}#1#2#4#5#6} -\gdef\lst@InstallKeywords#1#2#3#4#5{% - \lst@Key{#2}\relax - {\lst@UseFamily{#2}[\@ne]##1\relax\lst@MakeKeywords}% - \lst@Key{more#2}\relax - {\lst@UseFamily{#2}[\@ne]##1\relax\lst@MakeMoreKeywords}% - \lst@Key{delete#2}\relax - {\lst@UseFamily{#2}[\@ne]##1\relax\lst@DeleteKeywords}% - \ifx\@empty#3\@empty\else - \lst@Key{#3}{#4}{\@namedef{lst@#3}{##1}}% - \fi - \expandafter\lst@InstallFamily@ - \csname\@lst @#2@data\expandafter\endcsname - \csname\@lst @#5\endcsname {#1}{#2}{#3}} -\gdef\lst@ProvideStyle#1#2{% - \ifx#1\@undefined \let#1#2% - \else\ifx#1\relax \let#1#2\fi\fi} -\gdef\lst@BuildClassList#1#2,{% - \ifx\relax#2\@empty\else - \ifx\@empty#2\@empty\else - \lst@lExtend#1{\csname\@lst @#2\expandafter\endcsname - \csname\@lst @g#2\endcsname}% - \fi - \expandafter\lst@BuildClassList\expandafter#1 - \fi} -\gdef\lst@DeleteClassesIn#1#2{% - \expandafter\lst@DCI@\expandafter#1#2\relax\relax} -\gdef\lst@DCI@#1#2#3{% - \ifx#2\relax - \expandafter\@gobbletwo - \else - \def\lst@temp##1#2#3##2{% - \lst@lAddTo#1{##1}% - \ifx ##2\relax\else - \expandafter\lst@temp - \fi ##2}% - \let\@tempa#1\let#1\@empty - \expandafter\lst@temp\@tempa#2#3\relax - \fi - \lst@DCI@#1} -\gdef\lst@MakeKeywords[#1]#2#3#4#5#6{% - \def#3{#4#6}\let#4\@empty \let#5\@empty - \lst@MakeMoreKeywords[#1]{#2}#3#4#5#6} -\gdef\lst@MakeMoreKeywords[#1]#2#3#4#5#6{% - \lst@BuildClassList#3#1,\relax,% - \lst@DefOther\lst@temp{,#2}\lst@lExtend#4\lst@temp} -\gdef\lst@DeleteKeywords[#1]#2#3#4#5#6{% - \lst@MakeKeywords[#1]{#2}\@tempa\@tempb#5#6% - \lst@DeleteClassesIn#3\@tempa - \lst@DeleteKeysIn#4\@tempb} -\lst@InstallFamily k{keywords}{keywordstyle}\bfseries{keywordstyle}{}ld -\gdef\lst@DefKeywordstyle#1#2\@nil@{% - \@namedef{lst@keywordstyle\ifnum\@tempcnta=\@ne\else\the\@tempcnta - \fi}{#1#2}}% -\lst@Key{keywordstyle}{\bfseries}{\lstKV@OptArg[\@ne]{#1}% - {\@tempcnta\lst@classoffset \advance\@tempcnta##1\relax - \@ifstar{\lst@DefKeywordstyle{\uppercase\expandafter{% - \expandafter\lst@token - \expandafter{\the\lst@token}}}}% - {\lst@DefKeywordstyle{}}##2\@nil@}} -\lst@Key{ndkeywords}\relax - {\lst@UseFamily{keywords}[\tw@]#1\relax\lst@MakeKeywords}% -\lst@Key{morendkeywords}\relax - {\lst@UseFamily{keywords}[\tw@]#1\relax\lst@MakeMoreKeywords}% -\lst@Key{deletendkeywords}\relax - {\lst@UseFamily{keywords}[\tw@]#1\relax\lst@DeleteKeywords}% -\lst@Key{ndkeywordstyle}\relax{\@namedef{lst@keywordstyle2}{#1}}% -\lst@Key{keywordsprefix}\relax{\lst@DefActive\lst@keywordsprefix{#1}} -\global\let\lst@keywordsprefix\@empty -\lst@AddToHook{SelectCharTable} - {\ifx\lst@keywordsprefix\@empty\else - \expandafter\lst@CArg\lst@keywordsprefix\relax - \lst@CDef{}% - {\lst@ifletter\else - \global\let\lst@prefixkeyword\@empty - \fi}% - {}% - \fi} -\lst@AddToHook{Init}{\global\let\lst@prefixkeyword\relax} -\lst@AddToHook{Output} - {\ifx\lst@prefixkeyword\@empty - \let\lst@thestyle\lst@gkeywords@sty - \global\let\lst@prefixkeyword\relax - \fi}% -\lst@Key{otherkeywords}{}{% - \let\lst@otherkeywords\@empty - \lst@for{#1}\do{% - \lst@MakeActive{##1}% - \lst@lExtend\lst@otherkeywords{% - \expandafter\lst@CArg\lst@temp\relax\lst@CDef - {}\lst@PrintOtherKeyword\@empty}}} -\lst@AddToHook{SelectCharTable}{\lst@otherkeywords} -\gdef\lst@PrintOtherKeyword#1\@empty{% - \lst@XPrintToken - \begingroup - \lst@modetrue \lsthk@TextStyle - \let\lst@ProcessDigit\lst@ProcessLetter - \let\lst@ProcessOther\lst@ProcessLetter - \lst@lettertrue - #1% - \lst@SaveToken - \endgroup -\lst@RestoreToken -\global\let\lst@savedcurrstyle\lst@currstyle -\let\lst@currstyle\lst@gkeywords@sty - \lst@Output -\let\lst@currstyle\lst@savedcurrstyle} -\lst@EndAspect -\lst@BeginAspect[keywords]{emph} -\lst@InstallFamily e{emph}{emphstyle}{}{emphstyle}{}od -\lst@EndAspect -\lst@BeginAspect[keywords]{tex} -\lst@InstallFamily {cs}{texcs}{texcsstyle}\relax{keywordstyle} - {\ifx\lst@lastother\lstum@backslash - \expandafter\let\expandafter\lst@thestyle - \csname lst@texcsstyle#1\endcsname - \fi} - ld -\lst@Key{texcsstyle}\relax - {\@ifstar{\lst@true\lst@DefTexcsstyle}% - {\lst@false\lst@DefTexcsstyle}#1\@nil@} -\gdef\lst@DefTexcsstyle#1\@nil@{% - \let\lst@iftexcsincludebs\lst@if - \lstKV@OptArg[\@ne]{#1}% - {\@tempcnta\lst@classoffset \advance\@tempcnta##1\relax - \@namedef{lst@texcsstyle\ifnum\@tempcnta=\@ne\else - \the\@tempcnta \fi}{##2}}}% -\global\let\lst@iftexcsincludebs\iffalse -\let\lst@iftexcsincludebs\iffalse -\lst@AddToHook{SelectCharTable} -{\lst@iftexcsincludebs \ifx\@empty\lst@texcs\else - \lst@DefSaveDef{`\\}\lsts@texcsbs - {\ifx\lst@lastother\lstum@backslash - \lsts@texcsbs\lst@XPrintToken - \else - \lst@Merge\lsts@texcsbs - \fi}% - \fi \fi} -\lst@EndAspect -\lst@BeginAspect[keywords]{directives} -\lst@NewMode\lst@CDmode -\lst@AddToHook{EOL}{\ifnum\lst@mode=\lst@CDmode \lst@LeaveMode \fi} -\lst@InstallKeywords{d}{directives}{directivestyle}\relax{keywordstyle} - {\ifnum\lst@mode=\lst@CDmode - \let\lst@thestyle\lst@directivestyle - \fi} - ld -\global\let\lst@directives\@empty % init -\lst@AddTo\lst@delimtypes{,directive} -\gdef\lst@Delim@directive#1\@empty#2#3#4{% - \lst@CArg #1\relax\lst@DefDelimB - {\lst@CalcColumn}% - {}% - {\ifnum\@tempcnta=\z@ - \def\lst@bnext{#2\lst@CDmode{#4\lst@Lmodetrue}% - \let\lst@currstyle\lst@directivestyle}% - \fi - \@gobblethree}% - #2\lst@CDmode{#4\lst@Lmodetrue}} -\lst@AddTo\lst@stringtypes{,directive} -\gdef\lst@StringDM@directive#1#2#3\@empty{% - \lst@CArg #2\relax\lst@CDef - {}% - {\let\lst@bnext\lst@CArgEmpty - \ifnum\lst@mode=\lst@CDmode - \def\lst@bnext{\lst@BeginString{#1}}% - \fi - \lst@bnext}% - \@empty - \lst@CArg #3\relax\lst@CDef - {}% - {\let\lst@enext\lst@CArgEmpty - \ifnum #1=\lst@mode - \let\lst@bnext\lst@EndString - \fi - \lst@bnext}% - \@empty} -\lst@EndAspect -\lst@BeginAspect[keywords,comments]{keywordcomments} -\lst@NewMode\lst@KCmode \lst@NewMode\lst@KCSmode -\gdef\lst@BeginKC{\aftergroup\aftergroup\aftergroup\lst@BeginKC@}% -\gdef\lst@BeginKC@{% - \lst@ResetToken - \lst@BeginComment\lst@KCmode{{\lst@commentstyle}\lst@modetrue}% - \@empty}% -\gdef\lst@BeginKCS{\aftergroup\aftergroup\aftergroup\lst@BeginKCS@}% -\gdef\lst@BeginKCS@{% - \lst@ResetToken - \lst@BeginComment\lst@KCSmode{{\lst@commentstyle}\lst@modetrue}% - \@empty}% -\lst@AddToHook{PostOutput}{\lst@KCpost \global\let\lst@KCpost\@empty} -\global\let\lst@KCpost\@empty % init -\gdef\lst@EndKC{\lst@SaveToken \lst@LeaveMode \lst@RestoreToken - \let\lst@thestyle\lst@identifierstyle \lsthk@Output} -\lst@InstallKeywords{kc}{keywordcomment}{}\relax{} - {\ifnum\lst@mode=\lst@KCmode - \edef\lst@temp{\the\lst@token}% - \ifx\lst@temp\lst@KCmatch - \lst@EndKC - \fi - \else - \lst@ifmode\else - \xdef\lst@KCmatch{\the\lst@token}% - \global\let\lst@KCpost\lst@BeginKC - \fi - \fi} - lo -\lst@Key{keywordcommentsemicolon}{}{\lstKV@ThreeArg{#1}% - {\def\lst@KCAkeywordsB{##1}% - \def\lst@KCAkeywordsE{##2}% - \def\lst@KCBkeywordsB{##3}% - \def\lst@KCkeywords{##1##2##3}}} -\lst@AddToHook{SetLanguage}{% - \let\lst@KCAkeywordsB\@empty \let\lst@KCAkeywordsE\@empty - \let\lst@KCBkeywordsB\@empty \let\lst@KCkeywords\@empty} -\lst@AddToHook{SelectCharTable} - {\ifx\lst@KCkeywords\@empty\else - \lst@DefSaveDef{`\;}\lsts@EKC - {\lst@XPrintToken - \ifnum\lst@mode=\lst@KCmode \lst@EndComment\@empty \else - \ifnum\lst@mode=\lst@KCSmode \lst@EndComment\@empty - \fi \fi - \lsts@EKC}% - \fi} -\gdef\lst@KCAWorkB{% - \lst@ifmode\else \global\let\lst@KCpost\lst@BeginKC \fi} -\gdef\lst@KCBWorkB{% - \lst@ifmode\else \global\let\lst@KCpost\lst@BeginKCS \fi} -\gdef\lst@KCAWorkE{\ifnum\lst@mode=\lst@KCmode \lst@EndKC \fi} -\lst@ProvideFamily@@ - \lst@KCAkeywordsB@list\lst@KCAkeywordsB \lst@KC@also - \lst@gKCAkeywordsB@list\lst@gKCAkeywordsB \lst@KCAWorkB - {kcb}owo % prefix, other key, working procedure, Output hook -\lst@ProvideFamily@@ - \lst@KCAkeywordsE@list\lst@KCAkeywordsE \lst@KC@also - \lst@gKCAkeywordsE@list\lst@gKCAkeywordsE \lst@KCAWorkE - {kce}owo -\lst@ProvideFamily@@ - \lst@KCBkeywordsB@list\lst@KCBkeywordsB \lst@KC@also - \lst@gKCBkeywordsB@list\lst@gKCBkeywordsB \lst@KCBWorkB - {kcs}owo -\lst@EndAspect -\lst@BeginAspect[keywords]{index} -\lst@InstallFamily w{index}{indexstyle}\lstindexmacro{indexstyle} - {\csname\@lst @indexstyle#1\expandafter\endcsname - \expandafter{\the\lst@token}} - od -\lst@UserCommand\lstindexmacro#1{\index{{\ttfamily#1}}} -\lst@EndAspect -\lst@BeginAspect[keywords]{procnames} -\gdef\lst@procnametrue{\global\let\lst@ifprocname\iftrue} -\gdef\lst@procnamefalse{\global\let\lst@ifprocname\iffalse} -\lst@AddToHook{Init}{\lst@procnamefalse} -\lst@AddToHook{DetectKeywords} - {\lst@ifprocname - \let\lst@thestyle\lst@procnamestyle - \lst@ifindexproc \csname\@lst @gindex@sty\endcsname \fi - \lst@procnamefalse - \fi} -\lst@Key{procnamestyle}{}{\def\lst@procnamestyle{#1}} -\lst@Key{indexprocnames}{false}[t]{\lstKV@SetIf{#1}\lst@ifindexproc} -\lst@AddToHook{Init}{\lst@ifindexproc \lst@indexproc \fi} -\gdef\lst@indexproc{% - \@ifundefined{lst@indexstyle1}% - {\@namedef{lst@indexstyle1}##1{}}% - {}} -\lst@InstallKeywords w{procnamekeys}{}\relax{} - {\global\let\lst@PNpost\lst@procnametrue} - od -\lst@AddToHook{PostOutput}{\lst@PNpost\global\let\lst@PNpost\@empty} -\global\let\lst@PNpost\@empty % init -\lst@EndAspect -\lst@BeginAspect{style} -\@ifundefined{lststylefiles} - {\lst@UserCommand\lststylefiles{lststy0.sty}}{} -\lst@UserCommand\lstdefinestyle{\lst@DefStyle\iftrue} -\lst@UserCommand\lst@definestyle{\lst@DefStyle\iffalse} -\gdef\lst@DefStyle{\lst@DefDriver{style}{sty}\lstset} -\global\@namedef{lststy@$}{\lsthk@EmptyStyle} -\lst@AddToHook{EmptyStyle}{}% init -\lst@Key{style}\relax{% - \lst@LAS{style}{sty}{[]{#1}}\lst@NoAlias\lststylefiles - \lsthk@SetStyle - {}} -\lst@AddToHook{SetStyle}{}% init -\lst@EndAspect -\lst@BeginAspect{language} -\@ifundefined{lstdriverfiles} - {\lst@UserCommand\lstlanguagefiles{lstlang0.sty}}{} -\lst@UserCommand\lstdefinelanguage{\lst@DefLang\iftrue} -\lst@UserCommand\lst@definelanguage{\lst@DefLang\iffalse} -\gdef\lst@DefLang{\lst@DefDriver{language}{lang}\lstset} -\lstdefinelanguage{}{} -\lst@Key{language}\relax{\lstKV@OptArg[]{#1}% - {\lst@LAS{language}{lang}{[##1]{##2}}\lst@FindAlias\lstlanguagefiles - \lsthk@SetLanguage - {\lst@FindAlias[##1]{##2}% - \let\lst@language\lst@malias - \let\lst@dialect\lst@oalias}}} -\lst@Key{alsolanguage}\relax{\lstKV@OptArg[]{#1}% - {\lst@LAS{language}{lang}{[##1]{##2}}\lst@FindAlias\lstlanguagefiles - {}% - {\lst@FindAlias[##1]{##2}% - \let\lst@language\lst@malias - \let\lst@dialect\lst@oalias}}} -\lst@AddToHook{SetLanguage}{}% init -\lst@UserCommand\lstalias{\@ifnextchar[\lstalias@\lstalias@@} -\gdef\lstalias@[#1]#2{\lstalias@b #2$#1} -\gdef\lstalias@b#1[#2]#3{\lst@NormedNameDef{lsta@#1}{#3$#2}} -\gdef\lstalias@@#1#2{\lst@NormedNameDef{lsta@#1}{#2}} -\lst@Key{defaultdialect}\relax - {\lstKV@OptArg[]{#1}{\lst@NormedNameDef{lstdd@##2}{##1}}} -\gdef\lst@FindAlias[#1]#2{% - \lst@NormedDef\lst@oalias{#1}% - \lst@NormedDef\lst@malias{#2}% - \@ifundefined{lsta@\lst@malias}{}% - {\edef\lst@malias{\csname\@lst a@\lst@malias\endcsname}}% - \ifx\@empty\lst@oalias \@ifundefined{lstdd@\lst@malias}{}% - {\edef\lst@oalias{\csname\@lst dd@\lst@malias\endcsname}}% - \fi - \edef\lst@temp{\lst@malias $\lst@oalias}% - \@ifundefined{lsta@\lst@temp}{}% - {\edef\lst@temp{\csname\@lst a@\lst@temp\endcsname}}% - \expandafter\lst@FindAlias@\lst@temp $} -\gdef\lst@FindAlias@#1$#2${% - \def\lst@malias{#1}\def\lst@oalias{#2}% - \ifx\@empty\lst@oalias \@ifundefined{lstdd@\lst@malias}{}% - {\edef\lst@oalias{\csname\@lst dd@\lst@malias\endcsname}}% - \fi} -\gdef\lst@RequireLanguages#1{% - \lst@Require{language}{lang}{#1}\lst@FindAlias\lstlanguagefiles - \ifx\lst@loadaspects\@empty\else - \lst@RequireAspects\lst@loadaspects - \fi} -\global\let\lstloadlanguages\lst@RequireLanguages -\lst@EndAspect -\lst@BeginAspect{formats} -\@ifundefined{lstformatfiles} - {\lst@UserCommand\lstformatfiles{lstfmt0.sty}}{} -\lst@UserCommand\lstdefineformat{\lst@DefFormat\iftrue} -\lst@UserCommand\lst@defineformat{\lst@DefFormat\iffalse} -\gdef\lst@DefFormat{\lst@DefDriver{format}{fmt}\lst@UseFormat} -\lstdefineformat{}{} -\lst@Key{format}\relax{% - \lst@LAS{format}{fmt}{[]{#1}}\lst@NoAlias\lstformatfiles - \lsthk@SetFormat - {}} -\lst@AddToHook{SetFormat}{\let\lst@fmtformat\@empty}% init -\gdef\lst@fmtSplit#1#2{% - \def\lst@temp##1#2##2\relax##3{% - \ifnum##3=\z@ - \ifx\@empty##2\@empty - \lst@false - \let\lst@fmta#1% - \let\lst@fmtb\@empty - \else - \expandafter\lst@temp#1\relax\@ne - \fi - \else - \def\lst@fmta{##1}\def\lst@fmtb{##2}% - \fi}% - \lst@true - \expandafter\lst@temp#1#2\relax\z@} -\gdef\lst@IfNextCharWhitespace#1#2#3{% - \lst@IfSubstring#3\lst@whitespaces{#1}{#2}#3} -\begingroup -\catcode`\^^I=12\catcode`\^^J=12\catcode`\^^M=12\catcode`\^^L=12\relax% -\lst@DefActive\lst@whitespaces{\ ^^I^^J^^M}% add ^^L -\global\let\lst@whitespaces\lst@whitespaces% -\endgroup -\gdef\lst@fmtIfIdentifier#1{% - \ifx\relax#1\@empty - \expandafter\@secondoftwo - \else - \expandafter\lst@fmtIfIdentifier@\expandafter#1% - \fi} -\gdef\lst@fmtIfIdentifier@#1#2\relax{% - \let\lst@next\@secondoftwo - \ifnum`#1=`_\else - \ifnum`#1<64\else - \ifnum`#1<91\let\lst@next\@firstoftwo\else - \ifnum`#1<97\else - \ifnum`#1<123\let\lst@next\@firstoftwo\else - \fi \fi \fi \fi \fi - \lst@next} -\gdef\lst@fmtIfNextCharIn#1{% - \ifx\@empty#1\@empty \expandafter\@secondoftwo \else - \def\lst@next{\lst@fmtIfNextCharIn@{#1}}% - \expandafter\lst@next\fi} -\gdef\lst@fmtIfNextCharIn@#1#2#3#4{% - \def\lst@temp##1#4##2##3\relax{% - \ifx \@empty##2\expandafter\@secondoftwo - \else \expandafter\@firstoftwo \fi}% - \lst@temp#1#4\@empty\relax{#2}{#3}#4} -\gdef\lst@fmtCDef#1{\lst@fmtCDef@#1} -\gdef\lst@fmtCDef@#1#2#3#4#5#6#7{% - \lst@CDefIt#1{#2}{#3}% - {\lst@fmtIfNextCharIn{#5}{#4#2#3}{#6#4#2#3#7}}% - #4% - {}{}{}} -\gdef\lst@fmtCDefX#1{\lst@fmtCDefX@#1} -\gdef\lst@fmtCDefX@#1#2#3#4#5#6#7{% - \let#4#1% - \ifx\@empty#2\@empty - \def#1{\lst@fmtIfNextCharIn{#5}{#4}{#6#7}}% - \else \ifx\@empty#3\@empty - \def#1##1{% - \ifx##1#2% - \def\lst@next{\lst@fmtIfNextCharIn{#5}{#4##1}% - {#6#7}}% - \else - \def\lst@next{#4##1}% - \fi - \lst@next}% - \else - \def#1{% - \lst@IfNextCharsArg{#2#3}% - {\lst@fmtIfNextCharIn{#5}{\expandafter#4\lst@eaten}% - {#6#7}}% - {\expandafter#4\lst@eaten}}% - \fi \fi} -\gdef\lst@UseFormat#1{% - \def\lst@fmtwhole{#1}% - \lst@UseFormat@} -\gdef\lst@UseFormat@{% - \lst@fmtSplit\lst@fmtwhole,% - \let\lst@fmtwhole\lst@fmtb - \ifx\lst@fmta\@empty\else - \lst@fmtSplit\lst@fmta=% - \ifx\@empty\lst@fmta\else - \expandafter\lstKV@XOptArg\expandafter[\expandafter]% - \expandafter{\lst@fmtb}\lst@UseFormat@b - \fi - \fi - \ifx\lst@fmtwhole\@empty\else - \expandafter\lst@UseFormat@ - \fi} -\gdef\lst@UseFormat@b[#1]#2{% - \def\lst@fmtc{{#1}}\lst@lExtend\lst@fmtc{\expandafter{\lst@fmta}}% - \def\lst@fmtb{#2}% - \lst@fmtSplit\lst@fmtb\string - \ifx\@empty\lst@fmta - \lst@lAddTo\lst@fmtc{{}}% - \else - \lst@lExtend\lst@fmtc{\expandafter - {\expandafter\lst@fmtPre\expandafter{\lst@fmta}}}% - \fi - \ifx\@empty\lst@fmtb - \lst@lAddTo\lst@fmtc{{}}% - \else - \lst@lExtend\lst@fmtc{\expandafter - {\expandafter\lst@fmtPost\expandafter{\lst@fmtb}}}% - \fi - \expandafter\lst@UseFormat@c\lst@fmtc} -\gdef\lst@UseFormat@c#1#2#3#4{% - \lst@fmtIfIdentifier#2\relax - {\lst@fmtIdentifier{#2}% - \lst@if\else \PackageWarning{Listings}% - {Cannot drop identifier in format definition}% - \fi}% - {\lst@if - \lst@lAddTo\lst@fmtformat{\lst@CArgX#2\relax\lst@fmtCDef}% - \else - \lst@lAddTo\lst@fmtformat{\lst@CArgX#2\relax\lst@fmtCDefX}% - \fi - \lst@DefActive\lst@fmtc{#1}% - \lst@lExtend\lst@fmtformat{\expandafter{\lst@fmtc}{#3}{#4}}}} -\lst@AddToHook{SelectCharTable}{\lst@fmtformat} -\global\let\lst@fmtformat\@empty -\gdef\lst@fmtPre#1{% - \lst@PrintToken - \begingroup - \let\newline\lst@fmtEnsureNewLine - \let\space\lst@fmtEnsureSpace - \let\indent\lst@fmtIndent - \let\noindent\lst@fmtNoindent - #1% - \endgroup} -\gdef\lst@fmtPost#1{% - \global\let\lst@fmtPostOutput\@empty - \begingroup - \def\newline{\lst@AddTo\lst@fmtPostOutput\lst@fmtEnsureNewLine}% - \def\space{\aftergroup\lst@fmtEnsurePostSpace}% - \def\indent{\lst@AddTo\lst@fmtPostOutput\lst@fmtIndent}% - \def\noindent{\lst@AddTo\lst@fmtPostOutput\lst@fmtNoindent}% - \aftergroup\lst@PrintToken - #1% - \endgroup} -\lst@AddToHook{Init}{\global\let\lst@fmtPostOutput\@empty} -\lst@AddToHook{PostOutput} - {\lst@fmtPostOutput \global\let\lst@fmtPostOutput\@empty} -\gdef\lst@fmtEnsureSpace{% - \lst@ifwhitespace\else \expandafter\lst@ProcessSpace \fi} -\gdef\lst@fmtEnsurePostSpace{% - \lst@IfNextCharWhitespace{}{\lst@ProcessSpace}} -\lst@Key{fmtindent}{20pt}{\def\lst@fmtindent{#1}} -\newdimen\lst@fmtcurrindent -\lst@AddToHook{InitVars}{\global\lst@fmtcurrindent\z@} -\gdef\lst@fmtIndent{\global\advance\lst@fmtcurrindent\lst@fmtindent} -\gdef\lst@fmtNoindent{\global\advance\lst@fmtcurrindent-\lst@fmtindent} -\gdef\lst@fmtEnsureNewLine{% - \global\advance\lst@newlines\@ne - \global\advance\lst@newlinesensured\@ne - \lst@fmtignoretrue} -\lst@AddToAtTop\lst@DoNewLines{% - \ifnum\lst@newlines>\lst@newlinesensured - \global\advance\lst@newlines-\lst@newlinesensured - \fi - \global\lst@newlinesensured\z@} -\newcount\lst@newlinesensured % global -\lst@AddToHook{Init}{\global\lst@newlinesensured\z@} -\gdef\lst@fmtignoretrue{\let\lst@fmtifignore\iftrue} -\gdef\lst@fmtignorefalse{\let\lst@fmtifignore\iffalse} -\lst@AddToHook{InitVars}{\lst@fmtignorefalse} -\lst@AddToHook{Output}{\lst@fmtignorefalse} -\gdef\lst@fmtUseLostSpace{% - \lst@ifnewline \kern\lst@fmtcurrindent \global\lst@lostspace\z@ - \else - \lst@OldOLS - \fi} -\lst@AddToHook{Init} - {\lst@true - \ifx\lst@fmtformat\@empty \ifx\lst@fmt\@empty \lst@false \fi\fi - \lst@if - \let\lst@OldOLS\lst@OutputLostSpace - \let\lst@OutputLostSpace\lst@fmtUseLostSpace - \let\lst@ProcessSpace\lst@fmtProcessSpace - \fi} -\gdef\lst@fmtProcessSpace{% - \lst@ifletter - \lst@Output - \lst@fmtifignore\else - \lst@AppendOther\lst@outputspace - \fi - \else \lst@ifkeepspaces - \lst@AppendOther\lst@outputspace - \else \ifnum\lst@newlines=\z@ - \lst@AppendSpecialSpace - \else \ifnum\lst@length=\z@ - \global\advance\lst@lostspace\lst@width - \global\advance\lst@pos\m@ne - \else - \lst@AppendSpecialSpace - \fi - \fi \fi \fi - \lst@whitespacetrue} -\lst@InstallTest{f} - \lst@fmt@list\lst@fmt \lst@gfmt@list\lst@gfmt - \lst@gfmt@wp - wd -\gdef\lst@fmt@list{\lst@fmt\lst@gfmt}\global\let\lst@fmt\@empty -\gdef\lst@gfmt@list{\lst@fmt\lst@gfmt}\global\let\lst@gfmt\@empty -\gdef\lst@gfmt@wp{% - \begingroup \let\lst@UM\@empty - \let\lst@PrintToken\@empty - \csname\@lst @fmt$\the\lst@token\endcsname - \endgroup} -\gdef\lst@fmtIdentifier#1#2#3#4{% - \lst@DefOther\lst@fmta{#2}\edef\lst@fmt{\lst@fmt,\lst@fmta}% - \@namedef{\@lst @fmt$\lst@fmta}{#3#4}} -\lst@EndAspect -\lst@BeginAspect{labels} -\lst@Key{numbers}{none}{% - \let\lst@PlaceNumber\@empty - \lstKV@SwitchCases{#1}% - {none&\\% - left&\def\lst@PlaceNumber{\llap{\normalfont - \lst@numberstyle{\thelstnumber}\kern\lst@numbersep}}\\% - right&\def\lst@PlaceNumber{\rlap{\normalfont - \kern\linewidth \kern\lst@numbersep - \lst@numberstyle{\thelstnumber}}}% - }{\PackageError{Listings}{Numbers #1 unknown}\@ehc}} -\lst@Key{numberstyle}{}{\def\lst@numberstyle{#1}} -\lst@Key{numbersep}{10pt}{\def\lst@numbersep{#1}} -\lst@Key{stepnumber}{1}{\def\lst@stepnumber{#1\relax}} -\lst@AddToHook{EmptyStyle}{\let\lst@stepnumber\@ne} -\lst@Key{numberblanklines}{true}[t] - {\lstKV@SetIf{#1}\lst@ifnumberblanklines} -\lst@Key{numberfirstline}{f}[t]{\lstKV@SetIf{#1}\lst@ifnumberfirstline} -\gdef\lst@numberfirstlinefalse{\let\lst@ifnumberfirstline\iffalse} -\lst@Key{firstnumber}{auto}{% - \lstKV@SwitchCases{#1}% - {auto&\let\lst@firstnumber\@undefined\\% - last&\let\lst@firstnumber\c@lstnumber - }{\def\lst@firstnumber{#1\relax}}} -\lst@AddToHook{PreSet}{\let\lst@advancenumber\z@} -\lst@AddToHook{PreInit} - {\ifx\lst@firstnumber\@undefined - \let\lst@firstnumber\lst@firstline - \fi} -\gdef\lst@SetFirstNumber{% - \ifx\lst@firstnumber\@undefined - \@tempcnta 0\csname\@lst no@\lst@intname\endcsname\relax - \ifnum\@tempcnta=\z@ \@tempcnta\lst@firstline - \else \lst@nololtrue \fi - \advance\@tempcnta\lst@advancenumber - \edef\lst@firstnumber{\the\@tempcnta\relax}% - \fi} -\gdef\lst@SaveFirstNumber{% - \expandafter\xdef - \csname\@lst no\ifx\lst@intname\@empty @ \else @\lst@intname\fi - \endcsname{\the\c@lstnumber}} -\newcounter{lstnumber}% \global -\global\c@lstnumber\@ne % init -\renewcommand*\thelstnumber{\@arabic\c@lstnumber} -\lst@AddToHook{EveryPar} - {\global\advance\c@lstnumber\lst@advancelstnum - \global\advance\c@lstnumber\m@ne \refstepcounter{lstnumber}% - \lst@SkipOrPrintLabel}% -\global\let\lst@advancelstnum\@ne -\lst@AddToHook{Init}{\def\@currentlabel{\thelstnumber}} -\lst@AddToHook{InitVars} - {\global\c@lstnumber\lst@firstnumber - \global\advance\c@lstnumber\lst@advancenumber - \global\advance\c@lstnumber-\lst@advancelstnum - \ifx \lst@firstnumber\c@lstnumber - \global\advance\c@lstnumber-\lst@advancelstnum - \fi} -\lst@AddToHook{ExitVars} - {\global\advance\c@lstnumber\lst@advancelstnum} -\AtBeginDocument{% - \def\theHlstnumber{\ifx\lst@@caption\@empty \lst@neglisting - \else \thelstlisting \fi - .\thelstnumber}} -\newcount\lst@skipnumbers % \global -\lst@AddToHook{Init} - {\ifnum \z@>\lst@stepnumber - \let\lst@advancelstnum\m@ne - \edef\lst@stepnumber{-\lst@stepnumber}% - \fi - \ifnum \z@<\lst@stepnumber - \global\lst@skipnumbers\lst@firstnumber - \global\divide\lst@skipnumbers\lst@stepnumber - \global\multiply\lst@skipnumbers-\lst@stepnumber - \global\advance\lst@skipnumbers\lst@firstnumber - \ifnum\lst@skipnumbers>\z@ - \global\advance\lst@skipnumbers -\lst@stepnumber - \fi - \else - \let\lst@SkipOrPrintLabel\relax - \fi} -\gdef\lst@SkipOrPrintLabel{% - \ifnum\lst@skipnumbers=\z@ - \global\advance\lst@skipnumbers-\lst@stepnumber\relax - \lst@PlaceNumber - \lst@numberfirstlinefalse - \else - \lst@ifnumberfirstline - \lst@PlaceNumber - \lst@numberfirstlinefalse - \fi - \fi - \global\advance\lst@skipnumbers\@ne}% -\lst@AddToHook{OnEmptyLine}{% - \lst@ifnumberblanklines\else \ifnum\lst@skipnumbers=\z@ - \global\advance\lst@skipnumbers-\lst@stepnumber\relax - \fi\fi} -\lst@EndAspect -\lst@BeginAspect{lineshape} -\lst@Key{xleftmargin}{\z@}{\def\lst@xleftmargin{#1}} -\lst@Key{xrightmargin}{\z@}{\def\lst@xrightmargin{#1}} -\lst@Key{resetmargins}{false}[t]{\lstKV@SetIf{#1}\lst@ifresetmargins} -\lst@AddToHook{BoxUnsafe}{\let\lst@xleftmargin\z@ - \let\lst@xrightmargin\z@} -\lst@AddToHook{TextStyle}{% - \let\lst@xleftmargin\z@ \let\lst@xrightmargin\z@ - \let\lst@ifresetmargins\iftrue} -\lst@Key{linewidth}\linewidth{\def\lst@linewidth{#1}} -\lst@AddToHook{PreInit}{\linewidth\lst@linewidth\relax} -\gdef\lst@parshape{% - \parshape\@ne \@totalleftmargin \linewidth} -\lst@AddToHook{Init} - {\lst@ifresetmargins - \advance\linewidth\@totalleftmargin - \advance\linewidth\rightmargin - \@totalleftmargin\z@ - \fi - \advance\linewidth-\lst@xleftmargin - \advance\linewidth-\lst@xrightmargin - \advance\@totalleftmargin\lst@xleftmargin\relax} -\lst@Key{lineskip}{\z@}{\def\lst@lineskip{#1\relax}} -\lst@AddToHook{Init} - {\parskip\z@ - \ifdim\z@=\lst@lineskip\else - \@tempdima\baselineskip - \advance\@tempdima\lst@lineskip - \multiply\@tempdima\@cclvi - \divide\@tempdima\baselineskip\relax - \multiply\@tempdima\@cclvi - \edef\baselinestretch{\strip@pt\@tempdima}% - \selectfont - \fi} -\lst@Key{breaklines}{false}[t]{\lstKV@SetIf{#1}\lst@ifbreaklines} -\lst@Key{breakindent}{20pt}{\def\lst@breakindent{#1}} -\lst@Key{breakautoindent}{t}[t]{\lstKV@SetIf{#1}\lst@ifbreakautoindent} -\lst@Key{breakatwhitespace}{false}[t]% - {\lstKV@SetIf{#1}\lst@ifbreakatwhitespace} -\lst@Key{prebreak}{}{\def\lst@prebreak{#1}} -\lst@Key{postbreak}{}{\def\lst@postbreak{#1}} -\lst@AddToHook{Init} - {\lst@ifbreaklines - \hbadness\@M \pretolerance\@M - \@rightskip\@flushglue \rightskip\@rightskip % \raggedright - \leftskip\z@skip \parindent\z@ - \def\lst@parshape{\parshape\tw@ \@totalleftmargin\linewidth - \lst@breakshape}% - \else - \let\lst@discretionary\@empty - \fi} -\lst@AddToHook{OnNewLine} - {\lst@ifbreaklines \lst@breakNewLine \fi} -\gdef\lst@discretionary{% - \lst@ifbreakatwhitespace - \lst@ifwhitespace \lst@@discretionary \fi - \else - \lst@@discretionary - \fi}% -\gdef\lst@@discretionary{% - \discretionary{\let\space\lst@spacekern\lst@prebreak}% - {\llap{\lsthk@EveryLine - \kern\lst@breakcurrindent \kern-\@totalleftmargin}% - \let\space\lst@spacekern\lst@postbreak}{}} -\lst@AddToHook{PostOutput}{\lst@discretionary} -\gdef\lst@spacekern{\kern\lst@width} -\gdef\lst@breakNewLine{% - \@tempdima\lst@breakindent\relax - \lst@ifbreakautoindent \advance\@tempdima\lst@lostspace \fi - \@tempdimc-\@tempdima \advance\@tempdimc\linewidth - \advance\@tempdima\@totalleftmargin - \xdef\lst@breakshape{\noexpand\lst@breakcurrindent \the\@tempdimc}% - \xdef\lst@breakcurrindent{\the\@tempdima}} -\global\let\lst@breakcurrindent\z@ % init -\gdef\lst@breakshape{\@totalleftmargin \linewidth} -\gdef\lst@breakProcessOther#1{\lst@ProcessOther#1\lst@OutputOther} -\lst@AddToHook{SelectCharTable} - {\lst@ifbreaklines \lst@Def{`)}{\lst@breakProcessOther)}\fi} -\lst@EndAspect -\lst@BeginAspect[lineshape]{frames} -\lst@Key{framexleftmargin}{\z@}{\def\lst@framexleftmargin{#1}} -\lst@Key{framexrightmargin}{\z@}{\def\lst@framexrightmargin{#1}} -\lst@Key{framextopmargin}{\z@}{\def\lst@framextopmargin{#1}} -\lst@Key{framexbottommargin}{\z@}{\def\lst@framexbottommargin{#1}} -\lst@Key{backgroundcolor}{}{\def\lst@bkgcolor{#1}} -\lst@Key{fillcolor}{}{\def\lst@fillcolor{#1}} -\lst@Key{rulecolor}{}{\def\lst@rulecolor{#1}} -\lst@Key{rulesepcolor}{}{\def\lst@rulesepcolor{#1}} -\lst@AddToHook{Init}{% - \ifx\lst@fillcolor\@empty - \let\lst@fillcolor\lst@bkgcolor - \fi - \ifx\lst@rulesepcolor\@empty - \let\lst@rulesepcolor\lst@fillcolor - \fi} -\lst@Key{rulesep}{2pt}{\def\lst@rulesep{#1}} -\lst@Key{framerule}{.4pt}{\def\lst@framerulewidth{#1}} -\lst@Key{framesep}{3pt}{\def\lst@frametextsep{#1}} -\lst@Key{frameshape}{}{% - \let\lst@xrulecolor\@empty - \lstKV@FourArg{#1}% - {\uppercase{\def\lst@frametshape{##1}}% - \uppercase{\def\lst@framelshape{##2}}% - \uppercase{\def\lst@framershape{##3}}% - \uppercase{\def\lst@framebshape{##4}}% - \let\lst@ifframeround\iffalse - \lst@IfSubstring R\lst@frametshape{\let\lst@ifframeround\iftrue}{}% - \lst@IfSubstring R\lst@framebshape{\let\lst@ifframeround\iftrue}{}% - \def\lst@frame{##1##2##3##4}}} -\lst@Key{frameround}\relax - {\uppercase{\def\lst@frameround{#1}}% - \expandafter\lstframe@\lst@frameround ffff\relax} -\global\let\lst@frameround\@empty -\lst@Key{frame}\relax{% - \let\lst@xrulecolor\@empty - \lstKV@SwitchCases{#1}% - {none&\let\lst@frame\@empty\\% - leftline&\def\lst@frame{l}\\% - topline&\def\lst@frame{t}\\% - bottomline&\def\lst@frame{b}\\% - lines&\def\lst@frame{tb}\\% - single&\def\lst@frame{trbl}\\% - shadowbox&\def\lst@frame{tRBl}% - \def\lst@xrulecolor{\lst@rulesepcolor}% - \def\lst@rulesep{\lst@frametextsep}% - }{\def\lst@frame{#1}}% - \expandafter\lstframe@\lst@frameround ffff\relax} -\gdef\lstframe@#1#2#3#4#5\relax{% - \lst@IfSubstring T\lst@frame{\edef\lst@frame{t\lst@frame}}{}% - \lst@IfSubstring R\lst@frame{\edef\lst@frame{r\lst@frame}}{}% - \lst@IfSubstring B\lst@frame{\edef\lst@frame{b\lst@frame}}{}% - \lst@IfSubstring L\lst@frame{\edef\lst@frame{l\lst@frame}}{}% - \let\lst@frametshape\@empty \let\lst@framebshape\@empty - \lst@frameCheck - ltr\lst@framelshape\lst@frametshape\lst@framershape #4#1% - \lst@frameCheck - LTR\lst@framelshape\lst@frametshape\lst@framershape #4#1% - \lst@frameCheck - lbr\lst@framelshape\lst@framebshape\lst@framershape #3#2% - \lst@frameCheck - LBR\lst@framelshape\lst@framebshape\lst@framershape #3#2% - \let\lst@ifframeround\iffalse - \lst@IfSubstring R\lst@frametshape{\let\lst@ifframeround\iftrue}{}% - \lst@IfSubstring R\lst@framebshape{\let\lst@ifframeround\iftrue}{}% - \let\lst@framelshape\@empty \let\lst@framershape\@empty - \lst@IfSubstring L\lst@frame - {\def\lst@framelshape{YY}}% - {\lst@IfSubstring l\lst@frame{\def\lst@framelshape{Y}}{}}% - \lst@IfSubstring R\lst@frame - {\def\lst@framershape{YY}}% - {\lst@IfSubstring r\lst@frame{\def\lst@framershape{Y}}{}}} -\gdef\lst@frameCheck#1#2#3#4#5#6#7#8{% - \lst@IfSubstring #1\lst@frame - {\if #7T\def#4{R}\else \def#4{Y}\fi}% - {\def#4{N}}% - \lst@IfSubstring #3\lst@frame - {\if #8T\def#6{R}\else \def#6{Y}\fi}% - {\def#6{N}}% - \lst@IfSubstring #2\lst@frame{\edef#5{#5#4Y#6}}{}} -\lst@AddToHook{TextStyle} - {\let\lst@frame\@empty - \let\lst@frametshape\@empty - \let\lst@framershape\@empty - \let\lst@framebshape\@empty - \let\lst@framelshape\@empty} -\gdef\lst@frameMakeBoxV#1#2#3{% - \setbox#1\hbox{% - \color@begingroup \lst@rulecolor - \llap{\setbox\z@\hbox{\vrule\@width\z@\@height#2\@depth#3% - \lst@frameL}% - \rlap{\lst@frameBlock\lst@rulesepcolor{\wd\z@}% - {\ht\z@}{\dp\z@}}% - \box\z@ - \ifx\lst@framelshape\@empty - \kern\lst@frametextsep\relax - \else - \lst@frameBlock\lst@fillcolor\lst@frametextsep{#2}{#3}% - \fi - \kern\lst@framexleftmargin}% - \rlap{\kern-\lst@framexleftmargin - \@tempdima\linewidth - \advance\@tempdima\lst@framexleftmargin - \advance\@tempdima\lst@framexrightmargin - \lst@frameBlock\lst@bkgcolor\@tempdima{#2}{#3}% - \ifx\lst@framershape\@empty - \kern\lst@frametextsep\relax - \else - \lst@frameBlock\lst@fillcolor\lst@frametextsep{#2}{#3}% - \fi - \setbox\z@\hbox{\vrule\@width\z@\@height#2\@depth#3% - \lst@frameR}% - \rlap{\lst@frameBlock\lst@rulesepcolor{\wd\z@}% - {\ht\z@}{\dp\z@}}% - \box\z@}% - \color@endgroup}} -\gdef\lst@frameBlock#1#2#3#4{% - \color@begingroup - #1% - \setbox\z@\hbox{\vrule\@height#3\@depth#4% - \ifx#1\@empty \@width\z@ \kern#2\relax - \else \@width#2\relax \fi}% - \box\z@ - \color@endgroup} -\gdef\lst@frameR{% - \expandafter\lst@frameR@\lst@framershape\relax - \kern-\lst@rulesep} -\gdef\lst@frameR@#1{% - \ifx\relax#1\@empty\else - \if #1Y\lst@framevrule \else \kern\lst@framerulewidth \fi - \kern\lst@rulesep - \expandafter\lst@frameR@b - \fi} -\gdef\lst@frameR@b#1{% - \ifx\relax#1\@empty - \else - \if #1Y\color@begingroup - \lst@xrulecolor - \lst@framevrule - \color@endgroup - \else - \kern\lst@framerulewidth - \fi - \kern\lst@rulesep - \expandafter\lst@frameR@ - \fi} -\gdef\lst@frameL{% - \kern-\lst@rulesep - \expandafter\lst@frameL@\lst@framelshape\relax} -\gdef\lst@frameL@#1{% - \ifx\relax#1\@empty\else - \kern\lst@rulesep - \if#1Y\lst@framevrule \else \kern\lst@framerulewidth \fi - \expandafter\lst@frameL@ - \fi} -\gdef\lst@frameH#1#2{% - \global\let\lst@framediml\z@ \global\let\lst@framedimr\z@ - \setbox\z@\hbox{}\@tempcntb\z@ - \expandafter\lst@frameH@\expandafter#1#2\relax\relax\relax - \@tempdimb\lst@frametextsep\relax - \advance\@tempdimb\lst@framerulewidth\relax - \@tempdimc-\@tempdimb - \advance\@tempdimc\ht\z@ - \advance\@tempdimc\dp\z@ - \setbox\z@=\hbox{% - \lst@frameHBkg\lst@fillcolor\@tempdimb\@firstoftwo - \if#1T\rlap{\raise\dp\@tempboxa\box\@tempboxa}% - \else\rlap{\lower\ht\@tempboxa\box\@tempboxa}\fi - \lst@frameHBkg\lst@rulesepcolor\@tempdimc\@secondoftwo - \advance\@tempdimb\ht\@tempboxa - \if#1T\rlap{\raise\lst@frametextsep\box\@tempboxa}% - \else\rlap{\lower\@tempdimb\box\@tempboxa}\fi - \rlap{\box\z@}% - }} -\gdef\lst@frameH@#1#2#3#4{% - \ifx\relax#4\@empty\else - \lst@frameh \@tempcntb#1#2#3#4% - \advance\@tempcntb\@ne - \expandafter\lst@frameH@\expandafter#1% - \fi} -\gdef\lst@frameHBkg#1#2#3{% - \setbox\@tempboxa\hbox{% - \kern-\lst@framexleftmargin - #3{\kern-\lst@framediml\relax}{\@tempdima\z@}% - \ifdim\lst@framediml>\@tempdimb - #3{\@tempdima\lst@framediml \advance\@tempdima-\@tempdimb - \lst@frameBlock\lst@rulesepcolor\@tempdima\@tempdimb\z@}% - {\kern-\lst@framediml - \advance\@tempdima\lst@framediml\relax}% - \fi - #3{\@tempdima\z@ - \ifx\lst@framelshape\@empty\else - \advance\@tempdima\@tempdimb - \fi - \ifx\lst@framershape\@empty\else - \advance\@tempdima\@tempdimb - \fi}% - {\ifdim\lst@framedimr>\@tempdimb - \advance\@tempdima\lst@framedimr\relax - \fi}% - \advance\@tempdima\linewidth - \advance\@tempdima\lst@framexleftmargin - \advance\@tempdima\lst@framexrightmargin - \lst@frameBlock#1\@tempdima#2\z@ - #3{\ifdim\lst@framedimr>\@tempdimb - \@tempdima-\@tempdimb - \advance\@tempdima\lst@framedimr\relax - \lst@frameBlock\lst@rulesepcolor\@tempdima\@tempdimb\z@ - \fi}{}% - }} -\gdef\lst@frameh#1#2#3#4#5{% - \lst@frameCalcDimA#1% - \lst@ifframeround \@getcirc\@tempdima \fi - \setbox\z@\hbox{% - \begingroup - \setbox\z@\hbox{% - \kern-\lst@framexleftmargin - \color@begingroup - \ifnum#1=\z@ \lst@rulecolor \else \lst@xrulecolor \fi - \lst@frameCornerX\llap{#2L}#3#1% - \ifdim\lst@framediml<\@tempdimb - \xdef\lst@framediml{\the\@tempdimb}% - \fi - \begingroup - \if#4Y\else \let\lst@framerulewidth\z@ \fi - \@tempdima\lst@framexleftmargin - \advance\@tempdima\lst@framexrightmargin - \advance\@tempdima\linewidth - \vrule\@width\@tempdima\@height\lst@framerulewidth \@depth\z@ - \endgroup - \lst@frameCornerX\rlap{#2R}#5#1% - \ifdim\lst@framedimr<\@tempdimb - \xdef\lst@framedimr{\the\@tempdimb}% - \fi - \color@endgroup}% - \if#2T\rlap{\raise\dp\z@\box\z@}% - \else\rlap{\lower\ht\z@\box\z@}\fi - \endgroup - \box\z@}} -\gdef\lst@frameCornerX#1#2#3#4{% - \setbox\@tempboxa\hbox{\csname\@lst @frame\if#3RR\fi #2\endcsname}% - \@tempdimb\wd\@tempboxa - \if #3R% - #1{\box\@tempboxa}% - \else - \if #3Y\expandafter#1\else - \@tempdimb\z@ \expandafter\vphantom \fi - {\box\@tempboxa}% - \fi} -\gdef\lst@frameCalcDimA#1{% - \@tempdima\lst@rulesep - \advance\@tempdima\lst@framerulewidth - \multiply\@tempdima#1\relax - \advance\@tempdima\lst@frametextsep - \advance\@tempdima\lst@framerulewidth - \multiply\@tempdima\tw@} -\lst@AddToHook{Init}{\lst@frameInit} -\newbox\lst@framebox -\gdef\lst@frameInit{% - \ifx\lst@framelshape\@empty \let\lst@frameL\@empty \fi - \ifx\lst@framershape\@empty \let\lst@frameR\@empty \fi - \def\lst@framevrule{\vrule\@width\lst@framerulewidth\relax}% - \lst@ifframeround - \lst@frameCalcDimA\z@ \@getcirc\@tempdima - \@tempdimb\@tempdima \divide\@tempdimb\tw@ - \advance\@tempdimb -\@wholewidth - \edef\lst@frametextsep{\the\@tempdimb}% - \edef\lst@framerulewidth{\the\@wholewidth}% - \lst@frameCalcDimA\@ne \@getcirc\@tempdima - \@tempdimb\@tempdima \divide\@tempdimb\tw@ - \advance\@tempdimb -\tw@\@wholewidth - \advance\@tempdimb -\lst@frametextsep - \edef\lst@rulesep{\the\@tempdimb}% - \fi - \lst@frameMakeBoxV\lst@framebox{\ht\strutbox}{\dp\strutbox}% - \def\lst@framelr{\copy\lst@framebox}% - \ifx\lst@frametshape\@empty\else - \lst@frameH T\lst@frametshape - \ifvoid\z@\else - \par\lst@parshape - \@tempdima-\baselineskip \advance\@tempdima\ht\z@ - \ifdim\prevdepth<\@cclvi\p@\else - \advance\@tempdima\prevdepth - \fi - \ifdim\@tempdima<\z@ - \vskip\@tempdima\vskip\lineskip - \fi - \noindent\box\z@\par - \lineskiplimit\maxdimen \lineskip\z@ - \fi - \lst@frameSpreadV\lst@framextopmargin - \fi} -\lst@AddToHook{EveryLine}{\lst@framelr} -\global\let\lst@framelr\@empty -\lst@AddToHook{DeInit} - {\ifx\lst@framebshape\@empty\else \lst@frameExit \fi} -\gdef\lst@frameExit{% - \lst@frameSpreadV\lst@framexbottommargin - \lst@frameH B\lst@framebshape - \ifvoid\z@\else - \everypar{}\par\lst@parshape\nointerlineskip\noindent\box\z@ - \fi} -\gdef\lst@frameSpreadV#1{% - \ifdim\z@=#1\else - \everypar{}\par\lst@parshape\nointerlineskip\noindent - \lst@frameMakeBoxV\z@{#1}{\z@}% - \box\z@ - \fi} -\gdef\lst@frameTR{% - \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@ - \kern-\lst@framerulewidth - \raise\lst@framerulewidth\hbox{% - \vrule\@width\lst@framerulewidth\@height\z@\@depth.5\@tempdima}} -\gdef\lst@frameBR{% - \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@ - \kern-\lst@framerulewidth - \vrule\@width\lst@framerulewidth\@height.5\@tempdima\@depth\z@} -\gdef\lst@frameBL{% - \vrule\@width\lst@framerulewidth\@height.5\@tempdima\@depth\z@ - \kern-\lst@framerulewidth - \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@} -\gdef\lst@frameTL{% - \raise\lst@framerulewidth\hbox{% - \vrule\@width\lst@framerulewidth\@height\z@\@depth.5\@tempdima}% - \kern-\lst@framerulewidth - \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@} -\gdef\lst@frameRoundT{% - \setbox\@tempboxa\hbox{\@circlefnt\char\@tempcnta}% - \ht\@tempboxa\lst@framerulewidth - \box\@tempboxa} -\gdef\lst@frameRoundB{% - \setbox\@tempboxa\hbox{\@circlefnt\char\@tempcnta}% - \dp\@tempboxa\z@ - \box\@tempboxa} -\gdef\lst@frameRTR{% - \hb@xt@.5\@tempdima{\kern-\lst@framerulewidth - \kern.5\@tempdima \lst@frameRoundT \hss}} -\gdef\lst@frameRBR{% - \hb@xt@.5\@tempdima{\kern-\lst@framerulewidth - \advance\@tempcnta\@ne \kern.5\@tempdima \lst@frameRoundB \hss}} -\gdef\lst@frameRBL{% - \advance\@tempcnta\tw@ \lst@frameRoundB - \kern-.5\@tempdima} -\gdef\lst@frameRTL{% - \advance\@tempcnta\thr@@\lst@frameRoundT - \kern-.5\@tempdima} -\lst@EndAspect -\lst@BeginAspect[keywords]{make} -\lst@NewMode\lst@makemode -\lst@AddToHook{Output}{% - \ifnum\lst@mode=\lst@makemode - \ifx\lst@thestyle\lst@gkeywords@sty - \lst@makekeytrue - \fi - \fi} -\gdef\lst@makekeytrue{\let\lst@ifmakekey\iftrue} -\gdef\lst@makekeyfalse{\let\lst@ifmakekey\iffalse} -\global\lst@makekeyfalse % init -\lst@Key{makemacrouse}f[t]{\lstKV@SetIf{#1}\lst@ifmakemacrouse} -\gdef\lst@MakeSCT{% - \lst@ifmakemacrouse - \lst@ReplaceInput{$(}{% - \lst@PrintToken - \lst@EnterMode\lst@makemode{\lst@makekeyfalse}% - \lst@Merge{\lst@ProcessOther\$\lst@ProcessOther(}}% - \lst@ReplaceInput{)}{% - \ifnum\lst@mode=\lst@makemode - \lst@PrintToken - \begingroup - \lst@ProcessOther)% - \lst@ifmakekey - \let\lst@currstyle\lst@gkeywords@sty - \fi - \lst@OutputOther - \endgroup - \lst@LeaveMode - \else - \expandafter\lst@ProcessOther\expandafter)% - \fi}% - \else - \lst@ReplaceInput{$(}{\lst@ProcessOther\$\lst@ProcessOther(}% - \fi} -\lst@EndAspect -\lst@BeginAspect{0.21} -\lst@Key{labelstyle}{}{\def\lst@numberstyle{#1}} -\lst@Key{labelsep}{10pt}{\def\lst@numbersep{#1}} -\lst@Key{labelstep}{0}{% - \ifnum #1=\z@ \KV@lst@numbers{none}% - \else \KV@lst@numbers{left}\fi - \def\lst@stepnumber{#1\relax}} -\lst@Key{firstlabel}\relax{\def\lst@firstnumber{#1\relax}} -\lst@Key{advancelabel}\relax{\def\lst@advancenumber{#1\relax}} -\let\c@lstlabel\c@lstnumber -\lst@AddToHook{Init}{\def\thelstnumber{\thelstlabel}} -\newcommand*\thelstlabel{\@arabic\c@lstlabel} -\lst@Key{first}\relax{\def\lst@firstline{#1\relax}} -\lst@Key{last}\relax{\def\lst@lastline{#1\relax}} -\lst@Key{framerulewidth}{.4pt}{\def\lst@framerulewidth{#1}} -\lst@Key{framerulesep}{2pt}{\def\lst@rulesep{#1}} -\lst@Key{frametextsep}{3pt}{\def\lst@frametextsep{#1}} -\lst@Key{framerulecolor}{}{\lstKV@OptArg[]{#1}% - {\ifx\@empty##2\@empty - \let\lst@rulecolor\@empty - \else - \ifx\@empty##1\@empty - \def\lst@rulecolor{\color{##2}}% - \else - \def\lst@rulecolor{\color[##1]{##2}}% - \fi - \fi}} -\lst@Key{backgroundcolor}{}{\lstKV@OptArg[]{#1}% - {\ifx\@empty##2\@empty - \let\lst@bkgcolor\@empty - \else - \ifx\@empty##1\@empty - \def\lst@bkgcolor{\color{##2}}% - \else - \def\lst@bkgcolor{\color[##1]{##2}}% - \fi - \fi}} -\lst@Key{framespread}{\z@}{\def\lst@framespread{#1}} -\lst@AddToHook{PreInit} - {\@tempdima\lst@framespread\relax \divide\@tempdima\tw@ - \edef\lst@framextopmargin{\the\@tempdima}% - \let\lst@framexrightmargin\lst@framextopmargin - \let\lst@framexbottommargin\lst@framextopmargin - \advance\@tempdima\lst@xleftmargin\relax - \edef\lst@framexleftmargin{\the\@tempdima}} -\newdimen\lst@innerspread \newdimen\lst@outerspread -\lst@Key{spread}{\z@,\z@}{\lstKV@CSTwoArg{#1}% - {\lst@innerspread##1\relax - \ifx\@empty##2\@empty - \divide\lst@innerspread\tw@\relax - \lst@outerspread\lst@innerspread - \else - \lst@outerspread##2\relax - \fi}} -\lst@AddToHook{BoxUnsafe}{\lst@outerspread\z@ \lst@innerspread\z@} -\lst@Key{wholeline}{false}[t]{\lstKV@SetIf{#1}\lst@ifresetmargins} -\lst@Key{indent}{\z@}{\def\lst@xleftmargin{#1}} -\lst@AddToHook{PreInit} - {\lst@innerspread=-\lst@innerspread - \lst@outerspread=-\lst@outerspread - \ifodd\c@page \advance\lst@innerspread\lst@xleftmargin - \else \advance\lst@outerspread\lst@xleftmargin \fi - \ifodd\c@page - \edef\lst@xleftmargin{\the\lst@innerspread}% - \edef\lst@xrightmargin{\the\lst@outerspread}% - \else - \edef\lst@xleftmargin{\the\lst@outerspread}% - \edef\lst@xrightmargin{\the\lst@innerspread}% - \fi} -\lst@Key{defaultclass}\relax{\def\lst@classoffset{#1}} -\lst@Key{stringtest}\relax{}% dummy -\lst@Key{outputpos}\relax{\lst@outputpos#1\relax\relax} -\lst@Key{stringspaces}\relax[t]{\lstKV@SetIf{#1}\lst@ifshowstringspaces} -\lst@Key{visisblespaces}\relax[t]{\lstKV@SetIf{#1}\lst@ifshowspaces} -\lst@Key{visibletabs}\relax[t]{\lstKV@SetIf{#1}\lst@ifshowtabs} -\lst@EndAspect -\lst@BeginAspect{fancyvrb} -\@ifundefined{FancyVerbFormatLine} - {\typeout{^^J% - ***^^J% - *** `listings.sty' needs `fancyvrb.sty' right now.^^J% - *** Please ensure its availability and try again.^^J% - ***^^J}% - \batchmode \@@end}{} -\gdef\lstFV@fancyvrb{% - \lst@iffancyvrb - \ifx\FancyVerbFormatLine\lstFV@FancyVerbFormatLine\else - \let\lstFV@FVFL\FancyVerbFormatLine - \let\FancyVerbFormatLine\lstFV@FancyVerbFormatLine - \fi - \else - \ifx\lstFV@FVFL\@undefined\else - \let\FancyVerbFormatLine\lstFV@FVFL - \let\lstFV@FVFL\@undefined - \fi - \fi} -\gdef\lstFV@VerbatimBegin{% - \ifx\FancyVerbFormatLine\lstFV@FancyVerbFormatLine - \lsthk@TextStyle \lsthk@BoxUnsafe - \lsthk@PreSet - \lst@activecharsfalse - \let\normalbaselines\relax -\xdef\lstFV@RestoreData{\noexpand\linewidth\the\linewidth\relax}% - \lst@Init\relax - \lst@ifresetmargins \advance\linewidth-\@totalleftmargin \fi -\lstFV@RestoreData - \everypar{}\global\lst@newlines\z@ - \lst@mode\lst@nomode \let\lst@entermodes\@empty - \lst@InterruptModes -%% D.G. modification begin - Nov. 25, 1998 - \let\@noligs\relax -%% D.G. modification end - \fi} -\gdef\lstFV@VerbatimEnd{% - \ifx\FancyVerbFormatLine\lstFV@FancyVerbFormatLine - \global\setbox\lstFV@gtempboxa\box\@tempboxa - \global\let\@gtempa\FV@ProcessLine - \lst@mode\lst@Pmode - \lst@DeInit - \let\FV@ProcessLine\@gtempa - \setbox\@tempboxa\box\lstFV@gtempboxa - \par - \fi} -\newbox\lstFV@gtempboxa -\lst@AddTo\FV@VerbatimBegin\lstFV@VerbatimBegin -\lst@AddToAtTop\FV@VerbatimEnd\lstFV@VerbatimEnd -\lst@AddTo\FV@LVerbatimBegin\lstFV@VerbatimBegin -\lst@AddToAtTop\FV@LVerbatimEnd\lstFV@VerbatimEnd -\lst@AddTo\FV@BVerbatimBegin\lstFV@VerbatimBegin -\lst@AddToAtTop\FV@BVerbatimEnd\lstFV@VerbatimEnd -\gdef\lstFV@FancyVerbFormatLine#1{% - \let\lst@arg\@empty \lst@FVConvert#1\@nil - \global\lst@newlines\z@ - \vtop{\noindent\lst@parshape - \lst@ReenterModes - \lst@arg \lst@PrintToken\lst@EOLUpdate\lsthk@InitVarsBOL - \lst@InterruptModes}} -\lst@Key{fvcmdparams}% - {\overlay\@ne}% - {\def\lst@FVcmdparams{,#1}} -\lst@Key{morefvcmdparams}\relax{\lst@lAddTo\lst@FVcmdparams{,#1}} -\gdef\lst@FVConvert{\@tempcnta\z@ \lst@FVConvertO@}% -\gdef\lst@FVConvertO@{% - \ifcase\@tempcnta - \expandafter\futurelet\expandafter\@let@token - \expandafter\lst@FVConvert@@ - \else - \expandafter\lst@FVConvertO@a - \fi} -\gdef\lst@FVConvertO@a#1{% - \lst@lAddTo\lst@arg{{#1}}\advance\@tempcnta\m@ne - \lst@FVConvertO@}% -\gdef\lst@FVConvert@@{% - \ifcat\noexpand\@let@token\bgroup \expandafter\lst@FVConvertArg - \else \expandafter\lst@FVConvert@ \fi} -\gdef\lst@FVConvertArg#1{% - {\let\lst@arg\@empty - \lst@FVConvert#1\@nil - \global\let\@gtempa\lst@arg}% - \lst@lExtend\lst@arg{\expandafter{\@gtempa\lst@PrintToken}}% - \lst@FVConvert} -\gdef\lst@FVConvert@#1{% - \ifx \@nil#1\else - \if\relax\noexpand#1% - \lst@lAddTo\lst@arg{\lst@OutputLostSpace\lst@PrintToken#1}% - \else - \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}% - \fi - \expandafter\lst@FVConvert - \fi} -\gdef\lst@FVConvert@#1{% - \ifx \@nil#1\else - \if\relax\noexpand#1% - \lst@lAddTo\lst@arg{\lst@OutputLostSpace\lst@PrintToken#1}% - \def\lst@temp##1,#1##2,##3##4\relax{% - \ifx##3\@empty \else \@tempcnta##2\relax \fi}% - \expandafter\lst@temp\lst@FVcmdparams,#1\z@,\@empty\relax - \else - \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}% - \fi - \expandafter\lst@FVConvertO@ - \fi} -\lst@EndAspect -\lst@BeginAspect[keywords,comments,strings,language]{lgrind} -\gdef\lst@LGGetNames#1:#2\relax{% - \lst@NormedDef\lstlang@{#1}\lst@ReplaceInArg\lstlang@{|,}% - \def\lst@arg{:#2}} -\gdef\lst@LGGetValue#1{% - \lst@false - \def\lst@temp##1:#1##2##3\relax{% - \ifx\@empty##2\else \lst@LGGetValue@{#1}\fi} - \expandafter\lst@temp\lst@arg:#1\@empty\relax} -\gdef\lst@LGGetValue@#1{% - \lst@true - \def\lst@temp##1:#1##2:##3\relax{% - \@ifnextchar=\lst@LGGetValue@@{\lst@LGGetValue@@=}##2\relax - \def\lst@arg{##1:##3}}% - \expandafter\lst@temp\lst@arg\relax} -\gdef\lst@LGGetValue@@=#1\relax{\def\lst@LGvalue{#1}} -\gdef\lst@LGGetComment#1#2{% - \let#2\@empty - \lst@LGGetValue{#1b}% - \lst@if - \let#2\lst@LGvalue - \lst@LGGetValue{#1e}% - \ifx\lst@LGvalue\lst@LGEOL - \edef\lstlang@{\lstlang@,commentline={#2}}% - \let#2\@empty - \else - \edef#2{{#2}{\lst@LGvalue}}% - \fi - \fi} -\gdef\lst@LGGetString#1#2{% - \lst@LGGetValue{#1b}% - \lst@if - \let#2\lst@LGvalue - \lst@LGGetValue{#1e}% - \ifx\lst@LGvalue\lst@LGEOL - \edef\lstlang@{\lstlang@,morestringizer=[l]{#2}}% - \else - \ifx #2\lst@LGvalue - \edef\lstlang@{\lstlang@,morestringizer=[d]{#2}}% - \else - \edef\lst@temp{\lst@LGe#2}% - \ifx \lst@temp\lst@LGvalue - \edef\lstlang@{\lstlang@,morestringizer=[b]{#2}}% - \else - \PackageWarning{Listings}% - {String #2...\lst@LGvalue\space not supported}% - \fi - \fi - \fi - \fi} -\gdef\lst@LGDefLang{% - \lst@LGReplace - \let\lstlang@\empty - \lst@LGGetValue{kw}% - \lst@if - \lst@ReplaceInArg\lst@LGvalue{{ },}% - \edef\lstlang@{\lstlang@,keywords={\lst@LGvalue}}% - \fi - \lst@LGGetValue{oc}% - \lst@if - \edef\lstlang@{\lstlang@,sensitive=f}% - \fi - \lst@LGGetValue{id}% - \lst@if - \edef\lstlang@{\lstlang@,alsoletter=\lst@LGvalue}% - \fi - \lst@LGGetComment a\lst@LGa - \lst@LGGetComment c\lst@LGc - \ifx\lst@LGa\@empty - \ifx\lst@LGc\@empty\else - \edef\lstlang@{\lstlang@,singlecomment=\lst@LGc}% - \fi - \else - \ifx\lst@LGc\@empty - \edef\lstlang@{\lstlang@,singlecomment=\lst@LGa}% - \else - \edef\lstlang@{\lstlang@,doublecomment=\lst@LGc\lst@LGa}% - \fi - \fi - \lst@LGGetString s\lst@LGa - \lst@LGGetString l\lst@LGa - \lst@LGGetValue{tc}% - \lst@if - \edef\lstlang@{\lstlang@,lgrindef=\lst@LGvalue}% - \fi - \expandafter\xdef\csname\@lst LGlang@\lst@language@\endcsname - {\noexpand\lstset{\lstlang@}}% - \lst@ReplaceInArg\lst@arg{{: :}:}\let\lst@LGvalue\@empty - \expandafter\lst@LGDroppedCaps\lst@arg\relax\relax - \ifx\lst@LGvalue\@empty\else - \PackageWarningNoLine{Listings}{Ignored capabilities for - \space `\lst@language@' are\MessageBreak\lst@LGvalue}% - \fi} -\gdef\lst@LGDroppedCaps#1:#2#3{% - \ifx#2\relax - \lst@RemoveCommas\lst@LGvalue - \else - \edef\lst@LGvalue{\lst@LGvalue,#2#3}% - \expandafter\lst@LGDroppedCaps - \fi} -\begingroup -\catcode`\/=0 -\lccode`\z=`\:\lccode`\y=`\^\lccode`\x=`\$\lccode`\v=`\| -\catcode`\\=12\relax -/lowercase{% -/gdef/lst@LGReplace{/lst@ReplaceInArg/lst@arg - {{\:}{z }{\^}{y}{\$}{x}{\|}{v}{ \ }{ }{:\ :}{:}{\ }{ }{\(}({\)})}} -/gdef/lst@LGe{\e} -} -/endgroup -\gdef\lst@LGRead#1\par{% - \lst@LGGetNames#1:\relax - \def\lst@temp{endoflanguagedefinitions}% - \ifx\lstlang@\lst@temp - \let\lst@next\endinput - \else - \expandafter\lst@IfOneOf\lst@language@\relax\lstlang@ - {\lst@LGDefLang \let\lst@next\endinput}% - {\let\lst@next\lst@LGRead}% - \fi - \lst@next} -\lst@Key{lgrindef}\relax{% - \lst@NormedDef\lst@language@{#1}% - \begingroup - \@ifundefined{lstLGlang@\lst@language@}% - {\everypar{\lst@LGRead}% - \catcode`\\=12\catcode`\{=12\catcode`\}=12\catcode`\%=12% - \catcode`\#=14\catcode`\$=12\catcode`\^=12\catcode`\_=12\relax - \input{\lstlgrindeffile}% - }{}% - \endgroup - \@ifundefined{lstLGlang@\lst@language@}% - {\PackageError{Listings}% - {LGrind language \lst@language@\space undefined}% - {The language is not loadable. \@ehc}}% - {\lsthk@SetLanguage - \csname\@lst LGlang@\lst@language@\endcsname}} -\@ifundefined{lstlgrindeffile} - {\lst@UserCommand\lstlgrindeffile{lgrindef.}}{} -\lst@EndAspect -\lst@BeginAspect[keywords]{hyper} -\lst@Key{hyperanchor}\hyper@@anchor{\let\lst@hyperanchor#1} -\lst@Key{hyperlink}\hyperlink{\let\lst@hyperlink#1} -\lst@InstallKeywords{h}{hyperref}{}\relax{} - {\begingroup - \let\lst@UM\@empty \xdef\@gtempa{\the\lst@token}% - \endgroup - \lst@GetFreeMacro{lstHR@\@gtempa}% - \global\expandafter\let\lst@freemacro\@empty - \@tempcntb\@tempcnta \advance\@tempcntb\m@ne - \edef\lst@alloverstyle##1{% - \let\noexpand\lst@alloverstyle\noexpand\@empty - \noexpand\smash{\raise\baselineskip\hbox - {\noexpand\lst@hyperanchor{lst.\@gtempa\the\@tempcnta}% - {\relax}}}% - \ifnum\@tempcnta=\z@ ##1\else - \noexpand\lst@hyperlink{lst.\@gtempa\the\@tempcntb}{##1}% - \fi}% - } - od -\lst@EndAspect -\endinput -%% -%% End of file `lstmisc.sty'. diff --git a/org.glite.lb.doc/src/lstpatch.sty b/org.glite.lb.doc/src/lstpatch.sty deleted file mode 100644 index b07de3e..0000000 --- a/org.glite.lb.doc/src/lstpatch.sty +++ /dev/null @@ -1,393 +0,0 @@ -%% -%% This is file `lstpatch.sty', generated manually. -%% -%% (w)(c) 2004 Carsten Heinz -%% -%% This file may be distributed under the terms of the LaTeX Project Public -%% License from CTAN archives in directory macros/latex/base/lppl.txt. -%% Either version 1.0 or, at your option, any later version. -%% -%% Send comments and ideas on the package, error reports and additional -%% programming languages to . -%% -%% This patch file will remove the following bugs from the listings package. -%% Each item contains the bug finder with date of report and first bug fix -%% version, a short description of the problem, and the reason for the bug -%% in parenthesis. -%% -%% 1) Frank Atanassow, 2004/10/07, 1.3b -%% -%% space after mathescape is not preserved -%% (\lst@newlines>0) -%% -%% 2) Benjamin Lings, 2004/10/15, 1.3b (2004/10/17) -%% -%% \usepackage{xy,listings} yields: -%% "Forbidden control sequence found while scanning use of \lst@lExtend" -%% (xy-pic correctly resets catcode of ^^L (to active), which is \outer) -%% -%% -%% The following features are added to the base package. -%% -%% 1.3a (2004/09/07) -%% -%% a) H I G H L Y E X P E R I M E N T A L -%% -%% Use the options -%% rangeprefix= -%% rangesuffix= -%% -%% rangebeginprefix= -%% rangebeginsuffix= -%% -%% rangeendprefix= -%% rangeendsuffix= -%% -%% includerangemarker=true|false -%% together with -%% firstline= -%% lastline= -%% or -%% linerange={-, -%% -, ...} -%% The according markers in the source code are -%% -%% for begin respectively end of range. Moreover, one can use -%% includerangemarker=true|false -%% to show or hide the range markers in the output. -%% -%% 1.3b (2004/10/17) -%% -%% b) multicols= (requires loaded multicol package) -%% -%% -\lst@CheckVersion{1.3} -{\typeout{^^J% - ***^^J% - *** This is a patch for listings 1.3, but you're using^^J% - *** version \lst@version.^^J% - ***^^J - *** Patch file not loaded.^^J% - ***^^J}% - \endinput -} -\def\fileversion{1.3b} -\def\filedate{2004/10/17} -\ProvidesFile{lstpatch.sty}[\filedate\space\fileversion\space (Carsten Heinz)] -% -% 0) Insert % after #1. -\def\@@xbitor #1{\@tempcntb \count#1% - \ifnum \@tempcnta =\z@ - \else - \divide\@tempcntb\@tempcnta - \ifodd\@tempcntb \@testtrue\fi - \fi} -% -% 1) Reset \lst@newlines at end of escape. -\def\lstpatch@escape{% -\gdef\lst@Escape##1##2##3##4{% - \lst@CArgX ##1\relax\lst@CDefX - {}% - {\lst@ifdropinput\else - \lst@TrackNewLines\lst@OutputLostSpace \lst@XPrintToken - \lst@InterruptModes - \lst@EnterMode{\lst@TeXmode}{\lst@modetrue}% - \ifx\^^M##2% - \lst@CArg ##2\relax\lst@ActiveCDefX - {}% - {\lst@escapeend ##4\lst@LeaveAllModes\lst@ReenterModes}% - {\lst@MProcessListing}% - \else - \lst@CArg ##2\relax\lst@ActiveCDefX - {}% - {\lst@escapeend ##4\lst@LeaveAllModes\lst@ReenterModes - \lst@newlines\z@ \lst@whitespacefalse}% - {}% - \fi - ##3\lst@escapebegin - \fi}% - {}}% -} -% -% 2) Deactivate \outer definition of ^^L temporarily (inside and outside -% of \lst@ScanChars) and restore \catcode at end of package. -\begingroup \catcode12=\active\let^^L\@empty -\gdef\lst@ScanChars{% - \let\lsts@ssL^^L% - \def^^L{\par}% - \lst@GetChars\lst@RestoreOrigCatcodes\@ne {128}% - \let^^L\lsts@ssL - \lst@GetChars\lst@RestoreOrigExtendedCatcodes{128}{256}} -\endgroup -\lst@lAddTo\lst@RestoreCatcodes{\catcode12\active} -% -% a) Let's start with the options: -\lst@Key{rangeprefix}\relax{\def\lst@rangebeginprefix{#1}% - \def\lst@rangeendprefix{#1}} -\lst@Key{rangesuffix}\relax{\def\lst@rangebeginsuffix{#1}% - \def\lst@rangeendsuffix{#1}} -\lst@Key{rangebeginprefix}{}{\def\lst@rangebeginprefix{#1}} -\lst@Key{rangebeginsuffix}{}{\def\lst@rangebeginsuffix{#1}} -\lst@Key{rangeendprefix}{}{\def\lst@rangeendprefix{#1}} -\lst@Key{rangeendsuffix}{}{\def\lst@rangeendsuffix{#1}} -\lst@Key{includerangemarker}{true}[t]{\lstKV@SetIf{#1}\lst@ifincluderangemarker} -% -% The key is a redefinition of \lst@GLI@ checking for numbers. -\def\lst@GLI@#1-#2-#3\@nil{% - \lst@IfNumber{#1}% - {\ifx\@empty#1\@empty - \let\lst@firstline\@ne - \else - \def\lst@firstline{#1\relax}% - \fi - \ifx\@empty#3\@empty - \def\lst@lastline{9999999\relax}% - \else - \ifx\@empty#2\@empty - \let\lst@lastline\lst@firstline - \else - \def\lst@lastline{#2\relax}% - \fi - \fi}% -% -% If we've found a general marker, we set firstline and lastline to 9999999. -% This prevents (almost) anything to be printed for now. - {\def\lst@firstline{9999999\relax}% - \let\lst@lastline\lst@firstline -% -% We add the prefixes and suffixes to the markers. - \let\lst@rangebegin\lst@rangebeginprefix - \lst@AddTo\lst@rangebegin{#1}\lst@Extend\lst@rangebegin\lst@rangebeginsuffix - \ifx\@empty#3\@empty - \let\lst@rangeend\lst@rangeendprefix - \lst@AddTo\lst@rangeend{#1}\lst@Extend\lst@rangeend\lst@rangeendsuffix - \else - \ifx\@empty#2\@empty - \let\lst@rangeend\@empty - \else - \let\lst@rangeend\lst@rangeendprefix - \lst@AddTo\lst@rangeend{#2}\lst@Extend\lst@rangeend\lst@rangeendsuffix - \fi - \fi -% The following definition will be executed in the SelectCharTable hook -% and here right now if we are already processing a listing. - \global\def\lst@DefRange{\expandafter\lst@CArgX\lst@rangebegin\relax\lst@DefRangeB}% - \ifnum\lst@mode=\lst@Pmode \expandafter\lst@DefRange \fi}} -% \lst@DefRange is not inserted via a hook anymore. Instead it is now called -% directly from \lst@SelectCharTable. This was necessary to get rid of an -% interference with the escape-to-LaTeX-feature. The bug was reported by -% \lsthelper{Michael~Bachmann}{2004/07/21}{Keine label-Referenzierung -% m\"oglich...}. Another chance is due to the same bug: \lst@DefRange is -% redefined globally when the begin of code is found, see below. The bug was -% reported by \lsthelper{Tobias~Rapp}{2004/04/06}{undetected end of range if -% listing crosses page break} \lsthelper{Markus~Luisser}{2004/08/13}{Bug mit -% 'linerangemarker' in umgebrochenen listings} -%\lst@AddToHook{SelectCharTable}{\lst@DefRange} -\lst@AddToHookExe{DeInit}{\global\let\lst@DefRange\@empty} -% -% Actually defining the marker (via \lst@GLI@, \lst@DefRange, \lst@CArgX as -% seen above) is similar to \lst@DefDelimB---except that we unfold the first -% parameter and use different ,

    , and  statements.
    -\def\lst@DefRangeB#1#2{\lst@DefRangeB@#1#2}
    -\def\lst@DefRangeB@#1#2#3#4{%
    -    \lst@CDef{#1{#2}{#3}}#4{}%
    -    {\lst@ifincluderangemarker
    -         \lst@LeaveMode
    -         \let#1#4%
    -         \lst@DefRangeEnd
    -         \lst@InitLstNumber
    -     \else
    -         \@tempcnta\lst@lineno \advance\@tempcnta\@ne
    -         \edef\lst@firstline{\the\@tempcnta\relax}%
    -         \gdef\lst@OnceAtEOL{\let#1#4\lst@DefRangeEnd}%
    -         \lst@InitLstNumber
    -     \fi
    -	 \global\let\lst@DefRange\lst@DefRangeEnd
    -     \lst@CArgEmpty}%
    -    \@empty}
    -%
    -% Modify labels and define |\lst@InitLstNumber| used above.
    -% \lsthelper{Omair-Inam~Abdul-Matin}{2004/05/10}{experimental linerange
    -% feature does not work with firstnumber}
    -\def\lstpatch@labels{%
    -\gdef\lst@SetFirstNumber{%
    -    \ifx\lst@firstnumber\@undefined
    -        \@tempcnta 0\csname\@lst no@\lst@intname\endcsname\relax
    -        \ifnum\@tempcnta=\z@ \else
    -            \lst@nololtrue
    -            \advance\@tempcnta\lst@advancenumber
    -            \edef\lst@firstnumber{\the\@tempcnta\relax}%
    -        \fi
    -    \fi}%
    -}
    -\lst@AddToAtTop\lsthk@PreInit
    -    {\ifx\lst@firstnumber\@undefined
    -         \def\lst@firstnumber{\lst@lineno}%
    -     \fi}
    -\def\lst@InitLstNumber{%
    -     \global\c@lstnumber\lst@firstnumber
    -     \global\advance\c@lstnumber\lst@advancenumber
    -     \global\advance\c@lstnumber-\lst@advancelstnum
    -     \ifx \lst@firstnumber\c@lstnumber
    -         \global\advance\c@lstnumber-\lst@advancelstnum
    -     \fi}
    -%
    -%    The end-marker is defined if and only if it's not empty. The definition is
    -%    similar to \lst@DefDelimE---with the above exceptions and except that we
    -%    define the re-entry point \lst@DefRangeE@@ as it is defined in the new
    -%    version of \lst@MProcessListing above.
    -\def\lst@DefRangeEnd{%
    -    \ifx\lst@rangeend\@empty\else
    -        \expandafter\lst@CArgX\lst@rangeend\relax\lst@DefRangeE
    -    \fi}
    -\def\lst@DefRangeE#1#2{\lst@DefRangeE@#1#2}
    -\def\lst@DefRangeE@#1#2#3#4{%
    -    \lst@CDef{#1#2{#3}}#4{}%
    -    {\let#1#4%
    -     \edef\lst@lastline{\the\lst@lineno\relax}%
    -     \lst@DefRangeE@@}%
    -    \@empty}
    -\def\lst@DefRangeE@@#1\@empty{%
    -    \lst@ifincluderangemarker
    -        #1\lst@XPrintToken
    -    \fi
    -    \lst@LeaveModeToPmode
    -    \lst@BeginDropInput{\lst@Pmode}}
    -%
    -\def\lst@LeaveModeToPmode{%
    -    \ifnum\lst@mode=\lst@Pmode
    -        \expandafter\lsthk@EndGroup
    -    \else
    -        \expandafter\egroup\expandafter\lst@LeaveModeToPmode
    -    \fi}
    -%
    -%    Eventually we shouldn't forget to install \lst@OnceAtEOL, which must
    -%    also be called in \lst@MSkipToFirst.
    -\lst@AddToHook{EOL}{\lst@OnceAtEOL\global\let\lst@OnceAtEOL\@empty}
    -\gdef\lst@OnceAtEOL{}% Init
    -\def\lst@MSkipToFirst{%
    -    \global\advance\lst@lineno\@ne
    -    \ifnum \lst@lineno=\lst@firstline
    -        \def\lst@next{\lst@LeaveMode \global\lst@newlines\z@
    -        \lst@OnceAtEOL \global\let\lst@OnceAtEOL\@empty
    -        \lst@InitLstNumber % Added to work with modified \lsthk@PreInit.
    -        \lsthk@InitVarsBOL
    -        \lst@BOLGobble}%
    -        \expandafter\lst@next
    -    \fi}
    -\def\lst@SkipToFirst{%
    -    \ifnum \lst@lineno<\lst@firstline
    -        \def\lst@next{\lst@BeginDropInput\lst@Pmode
    -        \lst@Let{13}\lst@MSkipToFirst
    -        \lst@Let{10}\lst@MSkipToFirst}%
    -        \expandafter\lst@next
    -    \else
    -        \expandafter\lst@BOLGobble
    -    \fi}
    -%
    -%    Finally the service macro \lst@IfNumber:
    -\def\lst@IfNumber#1{%
    -    \ifx\@empty#1\@empty
    -        \let\lst@next\@firstoftwo
    -    \else
    -        \lst@IfNumber@#1\@nil
    -    \fi
    -    \lst@next}
    -\def\lst@IfNumber@#1#2\@nil{%
    -    \let\lst@next\@secondoftwo
    -    \ifnum`#1>47\relax \ifnum`#1>57\relax\else
    -        \let\lst@next\@firstoftwo
    -    \fi\fi}
    -%
    -% b) The following is known to fail with some keys.
    -\lst@Key{multicols}{}{\@tempcnta=0#1\relax\def\lst@multicols{#1}}
    -\def\lst@Init#1{%
    -    \begingroup
    -    \ifx\lst@float\relax\else
    -        \edef\@tempa{\noexpand\lst@beginfloat{lstlisting}[\lst@float]}%
    -        \expandafter\@tempa
    -    \fi
    -% chmod begin
    -    \ifx\lst@multicols\@empty\else
    -        \edef\lst@next{\noexpand\multicols{\lst@multicols}}
    -        \expandafter\lst@next
    -    \fi
    -% chmod end
    -    \ifhmode\ifinner \lst@boxtrue \fi\fi
    -    \lst@ifbox
    -        \lsthk@BoxUnsafe
    -        \hbox to\z@\bgroup
    -             $\if t\lst@boxpos \vtop
    -        \else \if b\lst@boxpos \vbox
    -        \else \vcenter \fi\fi
    -        \bgroup \par\noindent
    -    \else
    -        \lst@ifdisplaystyle
    -            \lst@EveryDisplay
    -            \par\penalty-50\relax
    -            \vspace\lst@aboveskip
    -        \fi
    -    \fi
    -    \normalbaselines
    -    \abovecaptionskip\lst@abovecaption\relax
    -    \belowcaptionskip\lst@belowcaption\relax
    -    \lst@MakeCaption t%
    -    \lsthk@PreInit \lsthk@Init
    -    \lst@ifdisplaystyle
    -        \global\let\lst@ltxlabel\@empty
    -        \if@inlabel
    -            \lst@ifresetmargins
    -                \leavevmode
    -            \else
    -                \xdef\lst@ltxlabel{\the\everypar}%
    -                \lst@AddTo\lst@ltxlabel{%
    -                    \global\let\lst@ltxlabel\@empty
    -                    \everypar{\lsthk@EveryLine\lsthk@EveryPar}}%
    -            \fi
    -        \fi
    -        \everypar\expandafter{\lst@ltxlabel
    -                              \lsthk@EveryLine\lsthk@EveryPar}%
    -    \else
    -        \everypar{}\let\lst@NewLine\@empty
    -    \fi
    -    \lsthk@InitVars \lsthk@InitVarsBOL
    -    \lst@Let{13}\lst@MProcessListing
    -    \let\lst@Backslash#1%
    -    \lst@EnterMode{\lst@Pmode}{\lst@SelectCharTable}%
    -    \lst@InitFinalize}
    -\def\lst@DeInit{%
    -    \lst@XPrintToken \lst@EOLUpdate
    -    \global\advance\lst@newlines\m@ne
    -    \lst@ifshowlines
    -        \lst@DoNewLines
    -    \else
    -        \setbox\@tempboxa\vbox{\lst@DoNewLines}%
    -    \fi
    -    \lst@ifdisplaystyle \par\removelastskip \fi
    -    \lsthk@ExitVars\everypar{}\lsthk@DeInit\normalbaselines\normalcolor
    -    \lst@MakeCaption b%
    -    \lst@ifbox
    -        \egroup $\hss \egroup
    -        \vrule\@width\lst@maxwidth\@height\z@\@depth\z@
    -    \else
    -        \lst@ifdisplaystyle
    -            \par\penalty-50\vspace\lst@belowskip
    -        \fi
    -    \fi
    -% chmod begin
    -    \ifx\lst@multicols\@empty\else
    -        \def\lst@next{\global\let\@checkend\@gobble
    -                      \endmulticols
    -                      \global\let\@checkend\lst@@checkend}
    -        \expandafter\lst@next
    -    \fi
    -% chmod end
    -    \ifx\lst@float\relax\else
    -        \expandafter\lst@endfloat
    -    \fi
    -    \endgroup}
    -\let\lst@@checkend\@checkend
    -%%
    -\endinput
    -%%
    -%% End of file `lstpatch.sty'.
    diff --git a/org.glite.lb.doc/src/notification_api.tex b/org.glite.lb.doc/src/notification_api.tex
    deleted file mode 100644
    index 6a1717e..0000000
    --- a/org.glite.lb.doc/src/notification_api.tex
    +++ /dev/null
    @@ -1,226 +0,0 @@
    -%
    -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -%% See http://www.eu-egee.org/partners for details on the copyright holders.
    -%% 
    -%% Licensed under the Apache License, Version 2.0 (the "License");
    -%% you may not use this file except in compliance with the License.
    -%% You may obtain a copy of the License at
    -%% 
    -%%     http://www.apache.org/licenses/LICENSE-2.0
    -%% 
    -%% Unless required by applicable law or agreed to in writing, software
    -%% distributed under the License is distributed on an "AS IS" BASIS,
    -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -%% See the License for the specific language governing permissions and
    -%% limitations under the License.
    -%
    -% -*- mode: latex -*-
    -
    -\section{\LB\ Notification API}
    -\label{s:Notification-API}
    -
    -The \LB\ notification API is another kind of \LB\ consumer API which
    -provides streaming publish/subscribe model instead of query/response
    -model. It is designed to provide the same information and use the same
    -query conditions encoding as the consumer API described in
    -sec.~\ref{s:Consumer-API}
    -
    -Basic usage of the \LB\ notification API is described in the \LB
    -user's guide (\cite{lbug}) in section ``Tools'' as there is described
    -a tool called \verb'glite-lb-notify' which is a command line interface
    -wrapper around the \LB\ notification API. Its source code can also
    -serve as a complete exaple of the \LB\ notification API usage.
    -
    -The \LB\ notification API have currently fully implemented C language
    -binding and partially implemented C++ binding.
    -
    -\subsection{Header files}
    -\begin{table}[h]
    -\begin{tabularx}{\textwidth}{>{\tt}lX}
    -glite/lb/notification.h & Prototypes for all notification API functions. \\
    -\end{tabularx}
    -\end{table}
    -
    -\subsection{Call semantics}
    -The API have two main parts: notification subscription management and
    -receiving data. Each subscription (registration of notification) have
    -its unique identifier called \emph{Notification ID} represented by
    -type \verb'edg_wll_NotifId'. This ID is returned to the caller when
    -creating a new notification and it is used by receiver to get data
    -from the notification.
    -
    -The API uses \verb'EDG_WLL_NOTIF_SERVER' context parameter to set the
    -source server (\LB server name and port). 
    -
    -The typical notification workflow consist of 3 tasks:
    -\begin{itemize}
    - \item Create a new notification registration based on given conditions.
    - \item Refresh the registration. Each notification registration is
    -  soft-state registration and must be regullarly refreshed by the
    -  owner.
    - \item Receiving the data from notification. The \LB infrastructure
    -  provides data queuing and garanteed delivery (while the registration
    -  is valid). 
    -\end{itemize}
    -
    -The client notification library contains a code providing a pool of
    -receiving sockets/connections to optimize a parallel receiving of
    -notifications.
    -
    -For complete reference of all API funcions please see the header
    -file. The next sessions briefly describe main facts about API
    -funcions.
    -
    -\subsection{Notification subscription and management}
    -\begin{itemize}
    - \item \emph{New notification} is created using
    -  \verb'edg_wll_NotifNew' call. The call needs properly initialized
    -  context and returns a unique notification ID. To create a new
    -  notification the same encoding of conditions as for the \LB
    -  query/response API is used (sec.~\ref{s:queryrec}). 
    -
    -  \marginpar{\LB 2.0 only}%
    -  In version 1.x there is a restriction that at least one particular
    -  JobId must be defined. In \LB 2.0 you can make a registration based
    -  on other attributes without referencing a particular JobId (you can
    -  select owner, VO, network server).  It is also a feature of \LB 2.0
    -  only, that you can use attributes derived from JDL (VO).
    -
    - \item \emph {Refresh of a notification}. When a new notification is
    -  created using \verb'edg_wll_NotifNew' call, the notification
    -  validity parameter is intended to set the refresh period, not the
    -  lifetime of the notification itself. The owner of notification must
    -  periodically call \verb'edg_wll_NotifRefresh' to ensure validity of
    -  the notification. See also next sections.
    -
    - \item It is possible to \emph{change existing notification} (its conditions) by
    -  \verb'edg_wll_NotifChange' call.
    -
    - \item If the user does not want to receive notifications anymore,
    -  \verb'edg_wll_NotifDrop' call \emph{removes the registration} for
    -  notifications from \LB server.
    -\end{itemize}
    -
    -\subsection{Receive data}
    -To receive data from a notificaton the API provides
    -\verb'edg_wll_NotifReceive' call. It returns first incoming
    -notification if at least one is available or waits for a new one. The
    -maximal waiting time is limited to a specified timeout. You can also set the
    -timeout to zero if you want to poll.
    -
    -If the user wants to move the client receiving the notifications to a different
    -machine than where the registration was done, it is possible. The
    -client must use the \verb'edg_wll_NotifBind' call to inform the
    -notification infrastructure (interlogger) about its location change.
    -
    -The notification API cleanup procedure should be called when
    -finalizing the client (\verb'edg_wll_NotifClosePool' and 
    -\verb'edg_wll_NotifCloseFd' calls -- where the later is optional 
    --- see the next section).
    -
    -\subsection{Advanced aspects}
    -
    -\subsubsection{External versus internal management of notification socket}
    -A notification socket used by \verb'edg_wll_NotifReceive' call to
    -receive the notifications is automatically created during the
    -\verb'edg_wll_NotifNew' or \verb'edg_wll_NotifBind' calls.
    -
    -It the user wants to use its own socket (for example to be used in
    -main select() call) it can be created and closed by the user and set
    -as a parameter (fd) to all calls mentioned above.
    -
    -When using automatically created socket it must be closed explicitly
    -by calling \verb'edg_wll_CloseFd'.
    -
    -\subsubsection{Multiple registrations}
    -Each user can register for multiple notifications (call
    -\verb'edg_wll_NotifNew' function more than once). Every registration
    -gets its own notification ID and must be managed separately (refresh,
    -change, drop). But the \verb'edg_wll_NotifReceive' call is common for
    -all the registrations created in the same context (all previous
    -\verb'edg_wll_NotifNew' calls). 
    -
    -If the user wants to distinguish between multiple registrations it is
    -needed to inspect a notification ID value of each received notification.
    -
    -A \verb'edg_wll_NotifBind' works in similar way like
    -\verb'edg_wll_NotifNew'. For each notification ID it must be called
    -once and subsequent \verb'edg_wll_NotifReceive' call will work with
    -the whole set of registrations. Will receive a first notification from
    -any of registations.
    -
    -\subsubsection{Operator CHANGED}
    -\marginpar{\LB 2.0 only}%
    -The notification events are generated by LB server based on primary
    -events send by grid components. Each of the primary events (called LB
    -events) generates one notification event to be possibly sent to the
    -client but not each LB event for example changes the job state. You
    -can use notification conditions to filter only the notification
    -events you want to receive, for example $job status = done$. If you
    -want to receive all job status changes you need to setup a condition
    -on job status attribute using special unary operator
    -\verb'CHANGED'. Otherwise (without any condition) you will receive
    -more events that you want -- even events where job state was not
    -changed. Operator \verb'CHANGED' is available only in \LB 2.0.
    -
    -\subsubsection{Returned attributes}
    -\marginpar{\LB 2.0 only}%
    -Each LB notification contains a structure describing job state
    -including job's JDL. For optimization purposes the API user can set
    -the JDL flag in \verb'edg_wll_NotifNew' flags parameter to prevent
    -sending of unnecessary JDL data with each notification.
    -
    -\subsubsection{Timeouts}
    -A user of the notification API should distinguish between various timeouts:
    -\begin{itemize}
    -\item \emph{Registration validity timeout.} Each registration is
    -soft-state entity which must be refreshed in a given timeout. If there
    -is no refresh received by the LB server in validity timeout period the
    -registration is dropped. On the other hand for that timeout all events
    -are queued in the LB infrastructure for the case of client's temporary
    -unavailability.
    -
    -The registration validity timeout can be set by the user when creating
    -a new registration but only to a reasonably short time period. The
    -validity of a registration is driven by the refresh process not the
    -timeout itself. For a exaple of registration management via the
    -refresh calls please see the \verb'glite-lb-notify' source code as
    -mentioned above.
    -
    -\item \emph{Receive call timeout.} The timeout used in the
    -\verb'edg_wll_NotifReceive' call is inteded just to control the
    -receiving loop. It is the maximum time the API can spend in the call
    -before returning the control to user code.
    -
    -\end{itemize}
    -
    -\subsection{Registering and receiving notification example}
    -
    -The following example registers on \LB\ server to receive
    -notifications triggered by any event belonging to a
    -given user and waits for notification (until \verb'timeout').
    -
    -%The glite-lb-bkserverd and glite-lb-notif-interlogd daemons have to be running. The first one user registers to, the second one delivers notifications to the example program (as described in \ref{notification}).
    -
    -First we have to include neccessary headers:
    -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=headers-end\ headers]{notif_example.c}
    -
    -Define and initialize variables and context. During context
    -initialization user's credentials are loaded and environment variable
    -\verb'GLITE_WMS_NOTIF_SERVER' is used as a LB notification server:
    -\lstinputlisting[title={\bf File:}\lstname,numbers=left,linerange=variables-end\ variables]{notif_example.c} 
    -
    -
    -Set the query record to \emph{all user's jobs}:
    -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=queryrec-end\ queryrec]{notif_example.c}
    -
    -New registration based on prepared query record is created and a
    -unique notification ID is returned: 
    -\lstinputlisting[title={\bf File:}\lstname,numbers=left,linerange=register-end\ register]{notif_example.c}
    -
    -The \verb'edg_wll_NotifReceive' call returns one notification. If no notification is 
    -ready for delivery, the call waits until some notification arrival or timeout:
    -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=receive-end\ receive]{notif_example.c}
    -
    -% Finalizing the client
    -
    diff --git a/org.glite.lb.doc/src/notify.tex b/org.glite.lb.doc/src/notify.tex
    deleted file mode 100644
    index 1d6154f..0000000
    --- a/org.glite.lb.doc/src/notify.tex
    +++ /dev/null
    @@ -1,276 +0,0 @@
    -%
    -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -%% See http://www.eu-egee.org/partners for details on the copyright holders.
    -%% 
    -%% Licensed under the Apache License, Version 2.0 (the "License");
    -%% you may not use this file except in compliance with the License.
    -%% You may obtain a copy of the License at
    -%% 
    -%%     http://www.apache.org/licenses/LICENSE-2.0
    -%% 
    -%% Unless required by applicable law or agreed to in writing, software
    -%% distributed under the License is distributed on an "AS IS" BASIS,
    -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -%% See the License for the specific language governing permissions and
    -%% limitations under the License.
    -%
    -\subsection{glite-lb-notify}
    -\label{s:lb-notify}
    -
    -\verb'glite-lb-notify' is a fairly simple wrapper on the \LB notification API
    -(see also \cite{lbdg}).
    -It allows to create a notification (with a restricted richness of specifying 
    -conditions), bind to it for receiving notifications, and drop it finally.
    -
    -\LB notification is a user-initiated trigger at the server.
    -Whenever a job enters a state matching conditions specified with the notification,
    -the current state of the job is sent to the notification client.
    -On the other hand, the notification client is a network listener
    -which receives server-initiated connections to get the notifications.
    -Unless \verb'-s' is specified, the notification library creates the listener
    -socket.
    -
    -Within the notification validity, clients can disappear and even migrate.
    -However, only a single active client for a notification is allowed.
    -
    -\LB server and port to contact must be specified with GLITE\_WMS\_NOTIF\_SERVER 
    -environment variable.
    -
    -\verb'glite-lb-notify' is supported on in \LBver{2.x}. In \LBver{1.x}, \verb'glite-lb-notify' 
    -with very limited functionality can be found in \verb'examples' directory.
    -
    -\verb'glite-lb-notify' support these actions:
    -
    -\begin{tabularx}{\textwidth}{lX}
    -\texttt{new} & Create new notification registration.\\
    -\texttt{bind} &  Binds an notification registration to a client.\\
    -\texttt{refresh} &  Enlarge notification registration validity.\\
    -\texttt{receive}  & Binds to an existing notification registration and listen to
    -server.\\
    -\texttt{drop}     & Drop the notification registration.\\
    -\end{tabularx}
    -
    -For action \verb'new', command usage is:
    -
    -\begin{verbatim}
    -  glite-lb-notify new [ { -s socket_fd | -a fake_addr } -t requested_validity
    -           -j jobid  { -o owner | -O }  -n network_server 
    -           -v virtual_organization --states state1,state2,... -c -f flags]
    -\end{verbatim}
    -
    -For action \verb'bind', command usage is:
    -\begin{verbatim}
    -  glite-lb-notify bind [ { -s socket_fd | -a fake_addr } -t requested_validity ] 
    -           notifid
    -\end{verbatim}
    -
    -For action \verb'refresh', command usage is:
    -\begin{verbatim}
    -  glite-lb-notify refresh [-t requested_validity ] notifid
    -\end{verbatim}
    -
    -For action \verb'receive', command usage is:
    -\begin{verbatim}
    -  glite-lb-notify receive  [ { -s socket_fd | -a fake_addr } ] [-t requested_validity ] [-i timeout] [-r ] [-f field1,field2,...] [notifid]
    -\end{verbatim}
    -
    -For action \verb'drop', command usage is:
    -\begin{verbatim}
    -   glite-lb-notify drop notifid
    -\end{verbatim}
    -
    -where
    -
    -\begin{tabularx}{\textwidth}{lX}
    -\texttt{  notifid} & Notification ID \\
    -\texttt{  -s socket\_fd} &  allows  to  pass  a opened listening socket  \\
    -\texttt{  -a fake\_addr} &  fake the client address \\
    -\texttt{  -t requested\_validity} & requested validity of the notification (in seconds)   \\
    -\texttt{  -j jobid} & job ID to connect notification registration with   \\
    -\texttt{  -o owner} & match this owner DN   \\
    -\texttt{  -O} & match owner on current user's DN \\
    -\texttt{  -n network\_server} &  match only this network server (WMS entry point)  \\
    -\texttt{  -v virtual\_organization} & match only jobs of this Virtual Organization  \\
    -\texttt{  -i timeout} & timeout to receive operation in seconds   \\
    -\texttt{  -f field1,field2,...} & list of status fields to print (only owner by default)   \\
    -\texttt{  -c} & notify only on job state change \\
    -\texttt{  -S, --state state1,state2,...} & match on events resulting in listed states   \\
    -\texttt{  -r} & refresh automatically the notification registration while receiving data\\
    -\end{tabularx}
    -
    -For additional information see also manual page glite-lb-notify(1).
    -
    -\subsubsection{Example: Registration and waiting for simple notification}
    -\label{e:notify}
    -
    -Following steps describe basic testing procedure of the notification
    -system by registering a notification on any state change of this job
    -and waiting for notification.
    -
    -Register notification for a given jobid
    -%(\verb'https://skurut68-2.cesnet.cz:9100/D1qbFGwvXLnd927JOcja1Q'), 
    -with validity 2 hours (7200 seconds):
    -
    -\begin{verbatim}
    -  GLITE_WMS_NOTIF_SERVER=skurut68-2.cesnet.cz:9100 glite-lb-notify new \
    -   -j https://skurut68-2.cesnet.cz:9100/D1qbFGwvXLnd927JOcja1Q -t 7200
    -\end{verbatim}
    -
    -returns:
    -
    -\begin{verbatim}
    -  notification ID: https://skurut68-2.cesnet.cz:9100/NOTIF:tOsgB19Wz-M884anZufyUw 
    -\end{verbatim}
    -
    -
    -Wait for notification (with timeout 120 seconds):
    -\begin{verbatim}
    -  GLITE_WMS_NOTIF_SERVER=skurut68-2.cesnet.cz:9100 glite-lb-notify receive \
    -   -i 120 https://skurut68-2.cesnet.cz:9100/NOTIF:tOsgB19Wz-M884anZufyUw 
    -\end{verbatim}
    -
    -returns:
    -\begin{verbatim}
    -  notification is valid until: '2008-07-29 15:04:41' (1217343881)
    -  https://skurut68-2.cesnet.cz:9100/D1qbFGwvXLnd927JOcja1Q        Waiting
    -      /DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Miroslav Ruda
    -  https://skurut68-2.cesnet.cz:9100/D1qbFGwvXLnd927JOcja1Q        Ready
    -      /DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Miroslav Ruda
    -  https://skurut68-2.cesnet.cz:9100/D1qbFGwvXLnd927JOcja1Q        Scheduled
    -      /DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Miroslav Ruda
    -  https://skurut68-2.cesnet.cz:9100/D1qbFGwvXLnd927JOcja1Q        Running
    -      /DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Miroslav Ruda
    -\end{verbatim}
    -
    -Destroy notification:
    -\begin{verbatim}
    -  GLITE_WMS_NOTIF_SERVER=skurut68-2.cesnet.cz:9100 glite-lb-notify drop \
    -    https://skurut68-2.cesnet.cz:9100/NOTIF:tOsgB19Wz-M884anZufyUw
    -\end{verbatim}
    -
    -\subsubsection{Example: Waiting for notifications on all user's jobs}
    -
    -Instead of waiting for one job, user may want to accept notification about 
    -state changes of all his jobs.
    -
    -Register notification for actual user:
    -\begin{verbatim}
    -  GLITE_WMS_NOTIF_SERVER=skurut68-2.cesnet.cz:9100 glite-lb-notify new -O
    -\end{verbatim}
    -
    -returns:
    -
    -\begin{verbatim}
    -  notification ID: https://skurut68-2.cesnet.cz:9100/NOTIF:tOsgB19Wz-M884anZufyUw 
    -\end{verbatim}
    -
    -And continue with \verb'glite-lb-notify receive' similarly to previous example.
    -But in this case, we want to display also other information about job --
    -not job owner, but destination (where job is running) and location (which component is 
    -serving job):
    -
    -\begin{verbatim}
    -  GLITE_WMS_NOTIF_SERVER=skurut68-2.cesnet.cz:9100 glite-lb-notify receive \
    -   -i 240 -f destination,location \
    -   https://skurut68-2.cesnet.cz:9100/NOTIF:tOsgB19Wz-M884anZufyUw
    -\end{verbatim}
    -
    -returns:
    -
    -\begin{verbatim}
    -  notification is valid until: '2008-07-29 15:43:41' (1217346221)
    -
    - https://skurut68-2.cesnet.cz:9100/qbRFxDFCg2qO4-9WYBiiig        Waiting
    -   (null) NetworkServer/erebor.ics.muni.cz/
    - https://skurut68-2.cesnet.cz:9100/qbRFxDFCg2qO4-9WYBiiig        Waiting
    -   (null)  destination queue/erebor.ics.muni.cz/
    - https://skurut68-2.cesnet.cz:9100/qbRFxDFCg2qO4-9WYBiiig        Waiting
    -   (null) WorkloadManager/erebor.ics.muni.cz/
    - https://skurut68-2.cesnet.cz:9100/qbRFxDFCg2qO4-9WYBiiig        Waiting
    -   (null)  name of the called component/erebor.ics.muni.cz/
    - https://skurut68-2.cesnet.cz:9100/qbRFxDFCg2qO4-9WYBiiig        Waiting
    -   destination CE/queue WorkloadManager/erebor.ics.muni.cz/
    - https://skurut68-2.cesnet.cz:9100/qbRFxDFCg2qO4-9WYBiiig        Waiting
    -   destination CE/queue WorkloadManager/erebor.ics.muni.cz/
    - https://skurut68-2.cesnet.cz:9100/qbRFxDFCg2qO4-9WYBiiig        Ready
    -   destination CE/queue destination queue/erebor.ics.muni.cz/
    - https://skurut68-2.cesnet.cz:9100/qbRFxDFCg2qO4-9WYBiiig        Ready
    -   destination CE/queue JobController/erebor.ics.muni.cz/
    - https://skurut68-2.cesnet.cz:9100/qbRFxDFCg2qO4-9WYBiiig        Ready
    -   destination CE/queue LRMS/destination hostname/destination instance
    - https://skurut68-2.cesnet.cz:9100/qbRFxDFCg2qO4-9WYBiiig        Ready
    -   destination CE/queue LogMonitor/erebor.ics.muni.cz/
    - https://skurut68-2.cesnet.cz:9100/qbRFxDFCg2qO4-9WYBiiig        Scheduled
    -   destination CE/queue LRMS/destination hostname/destination instance
    - https://skurut68-2.cesnet.cz:9100/qbRFxDFCg2qO4-9WYBiiig        Running
    -   destination CE/queue LRMS/worknode/worker node
    -
    -\end{verbatim}
    -
    -
    -\subsubsection{Example: Waiting for more notifications on one socket}
    -
    -The foloving example demonstrates possibility to reuse existing socket for receiving
    -multiple notifications. Perl script \verb'notify.pl' (available in 
    -examples directory) creates socket, which is then reused for all
    -\verb'glite-lb-notify' commands.
    -
    -\begin{verbatim}
    -GLITE_WMS_NOTIF_SERVER=skurut68-2.cesnet.cz:9100 NOTIFY_CMD=glite-lb-notify \
    - ./notify.pl -O
    -\end{verbatim}
    -
    -returns:
    -
    -\begin{verbatim}
    -notification ID: https://skurut68-2.cesnet.cz:9100/NOTIF:EO73rjsmexEZJXuSoSZVDg
    -valid: '2008-07-29 15:14:06' (1217344446)
    -got connection
    -https://skurut68-2.cesnet.cz:9100/ANceuj5fXdtaCCkfnhBIXQ        Submitted
    -/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Miroslav Ruda
    -glite-lb-notify: Connection timed out (read message)
    -got connection
    -https://skurut68-2.cesnet.cz:9100/p2jBsy5WkFItY284lW2o8A        Submitted
    -/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Miroslav Ruda
    -glite-lb-notify: Connection timed out (read message)
    -got connection
    -https://skurut68-2.cesnet.cz:9100/p2jBsy5WkFItY284lW2o8A        Waiting
    -/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Miroslav Ruda
    -\end{verbatim}
    -
    -
    -\subsubsection{Example: Waiting for notifications on jobs reaching terminal states}
    -
    -This example shows how to set up notifications for jobs reaching state \emph{done} or \emph {aborted}. Since we prefer to receive just one notification per job, we will also use the \texttt{-c} option, which makes sure that notifications will be generated only on actual job state change.
    -
    -
    -\begin{verbatim}
    -  GLITE_WMS_NOTIF_SERVER=skurut68-2.cesnet.cz:9100 glite-lb-notify new \
    -   --state done,aborted -c
    -\end{verbatim}
    -
    -returns:
    -
    -\begin{verbatim}
    -  notification ID: https://skurut68-2.cesnet.cz:9100/NOTIF:6krjMRshTouH2n7D9t-xdg 
    -  valid: '2009-04-30 06:59:18 UTC' (1241074758)	
    -\end{verbatim}
    -
    -Wait for notification (with timeout 120 seconds):
    -\begin{verbatim}
    -  GLITE_WMS_NOTIF_SERVER=skurut68-2.cesnet.cz:9100 glite-lb-notify receive \
    -   -i 120 https://skurut68-2.cesnet.cz:9100/NOTIF:6krjMRshTouH2n7D9t-xdg 
    -\end{verbatim}
    -
    -returns:
    -\begin{verbatim}
    -https://skurut68-2.cesnet.cz:9100/eIbQNz3oHpv-OkYVu-cXNg	Done
    -    /DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Miroslav Ruda
    -https://skurut68-2.cesnet.cz:9100/GpBy2gfIZOAXR2hKOAYGgg	Aborted
    -    /DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Miroslav Ruda
    -https://skurut68-2.cesnet.cz:9100/KWXmsqvsTQKizQ4OMiXItA	Done
    -    /DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Miroslav Ruda
    -https://skurut68-2.cesnet.cz:9100/O1zs50Nm1r03vx2GLyaxQw	Done
    -    /DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Miroslav Ruda
    -\end{verbatim}
    -
    diff --git a/org.glite.lb.doc/src/producer_api.tex b/org.glite.lb.doc/src/producer_api.tex
    deleted file mode 100644
    index 4042f55..0000000
    --- a/org.glite.lb.doc/src/producer_api.tex
    +++ /dev/null
    @@ -1,201 +0,0 @@
    -%
    -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -%% See http://www.eu-egee.org/partners for details on the copyright holders.
    -%% 
    -%% Licensed under the Apache License, Version 2.0 (the "License");
    -%% you may not use this file except in compliance with the License.
    -%% You may obtain a copy of the License at
    -%% 
    -%%     http://www.apache.org/licenses/LICENSE-2.0
    -%% 
    -%% Unless required by applicable law or agreed to in writing, software
    -%% distributed under the License is distributed on an "AS IS" BASIS,
    -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -%% See the License for the specific language governing permissions and
    -%% limitations under the License.
    -%
    -% -*- mode: latex -*-
    -
    -\section{\LB\ Logging (Producer) API}
    -\label{s:Producer-API}
    -
    -\subsection{C Language Binding}
    -The \LB\ logging API (or producer API) is used to create and deliver
    -events to the \LB\ server and/or proxy, depending on the function
    -used:
    -
    -\TODO{kouril: verify ChangeACL}
    -
    -\begin{table}[h]
    -\begin{tabularx}{\textwidth}{lX}
    -\bf Function & \bf Delivers to \\
    -\hline
    -\small\verb'edg_wll_LogEvent(...)' & asynchronously through
    -locallogger/interlogger to the \LB\ server \\
    -\small\verb'edg_wll_LogEventSync(...)' & synchronously through
    -locallogger/interlogger to the \LB\ server \\
    -\small\verb'edg_wll_LogEventProxy(...)' & through \LB\ proxy to the \LB\ server \\
    -\small\verb'edg_wll_Register*(...)' & directly to both \LB\ server and proxy \\
    -\small\verb'edg_wll_ChangeACL(...)' & synchronously to the \LB\ server \\
    -\end{tabularx}
    -\end{table}
    -
    -These general functions take as an argument event format (which
    -defines the ULM string used) and variable number of arguments corresponding
    -to the given format. For each defined event there is predefined format
    -string in the form \verb'EDG_WLL_FORMAT_'\textit{EventType}, \eg\
    -\verb'EDG_WLL_FORMAT_UserTag', as well as three convenience functions
    -\verb'edg_wll_LogUserTag(...)', \verb'edg_wll_LogUserTagSync(...)',
    -\verb'edg_wll_LogUserTagProxy(...)'.
    -
    -For most developers (\ie\ those not developing the WMS itself) the
    -\verb'edg_wll_LogUserTag*(...)' and \verb'edg_wll_ChangeACL(...)' are
    -the only functions of interest.
    -
    -\subsubsection{Call semantics}
    -\LB producer calls generally do not have transaction semantics, the
    -query following succesful logging call is not guaranteed to see
    -updated \LB server state. The typical call -- loging an event -- is
    -returned immediatelly and the success of the call means that the first
    -\LB infrastructure component takes over the event and queues it for
    -delivery. If you require transaction semantics, you have to use
    -synchronous \verb'edg_wll_LogEventSync(...)' call.
    -
    -The \LB proxy on the other hand provides a \emph{local view}
    -semantics, events logged into proxy using
    -\verb'edg_wll_LogEventProxy(...)' are guaranteed to by accessible by
    -subsequent queries \emph{on that proxy}.
    -
    -Job registrations are all synchronous.
    -
    -\subsubsection{Header files}
    -
    -\begin{table}[h]
    -\begin{tabularx}{\textwidth}{>{\tt}lX}
    -%glite/lb/context.h & Definition of context structure and parameters. \\
    -glite/lb/producer.h & Prototypes for all event logging functions. \\
    -\end{tabularx}
    -\end{table}
    -
    -\subsubsection{Context parameters}
    -The table~\ref{t:pcontext} summarizes context parameters relevant to the
    -event logging. If  parameter is not set in the context explicitly, the
    -\LB\ library will search for value of corresponding environment
    -variable.
    -
    -\begin{table}[h]
    -\begin{tabularx}{\textwidth}{lX}
    -{\bf Name} & {\bf Description} \\
    -\hline
    -\lstinline'EDG_WLL_PARAM_HOST' &
    -Hostname that appears as event origin.
    -\par {\it Type: } \lstinline'char*'
    -\par {\it Environment: } \\
    -\lstinline'EDG_WLL_PARAM_SOURCE'  &
    -Event source component.
    -\par {\it Type: }\lstinline'edg_wll_Source'
    -\par {\it Environment: } \\
    -\lstinline'EDG_WLL_PARAM_DESTINATION'  &
    -Hostname of machine running locallogger/interlogger.
    -\par {\it Type: }\lstinline'char*'
    -\par {\it Environment: }\lstinline'GLITE_WMS_LOG_DESTINATION' \\
    -\lstinline'EDG_WLL_PARAM_DESTINATION_PORT' &
    -Port the locallogger is listening on.
    -\par {\it Type: } \lstinline'int'
    -\par {\it Environment: }\lstinline'GLITE_WMS_LOG_DESTINATION' \\
    -\lstinline'EDG_WLL_LOG_TIMEOUT'  &
    -Logging timeout for asynchronous logging.
    -\par {\it Type: }\lstinline'struct timeval'
    -\par {\it Environment: }\lstinline'GLITE_WMS_LOG_TIMEOUT' \\
    -\lstinline'EDG_WLL_LOG_SYNC_TIMEOUT'  &
    -Logging timeout for synchronous logging.
    -\par {\it Type: }\lstinline'struct timeval'
    -\par {\it Environment: }\lstinline'GLITE_WMS_LOG_SYNC_TIMEOUT' \\
    -\lstinline'EDG_WLL_LBPROXY_STORE_SOCK'  &
    -\LB\ Proxy store socket path (if logging through \LB\ Proxy)
    -\par {\it Type: }\lstinline'char*'
    -\par {\it Environment: }\lstinline'GLITE_WMS_LBPROXY_STORE_SOCK' \\
    -\lstinline'EDG_WLL_LBPROXY_USER' &
    -Certificate subject of the user (if logging through \LB\ proxy).
    -\par {\it Type: }\lstinline'char*'
    -\par {\it Environment: }\lstinline'GLITE_WMS_LBPROXY_USER' \\
    -\end{tabularx}
    -\caption{Producer specific context parameters}
    -\label{t:pcontext}
    -\end{table}
    -The \verb'GLITE_WMS_LOG_DESTINATION' environment variable contains
    -both locallogger host and port separated by colon (\ie\ ``host:port'').
    -
    -\marginpar{Logging job and sequence numbers}%
    -In addition to the above list, there are two more parameters that must
    -be set before logging call is made: \jobid of the logging job and
    -\emph{sequence number}. There is a special call for this task:
    -\begin{lstlisting}
    -extern int edg_wll_SetLoggingJob(
    -        edg_wll_Context context,	//* \emph{context to work with}
    -        glite_jobid_const_t     job,	//* \emph{jobid of the job}
    -        const char *            code,	//* \emph{sequence code}
    -        int                     flags	//* \emph{flags on code handling}
    -);
    -\end{lstlisting}
    -After setting the logging job identity, all the following logging
    -calls refer to this \jobid and the sequence code is incremented
    -according to the source component. See \cite{lbug} for information
    -about sequence codes and event numbering, especially the description,
    -how the sequence codes are updated.
    -
    -\subsubsection{Return values}
    -The logging functions return 0 on success and one of \texttt{EINVAL,
    -ENOSPC, ENOMEM, ECONNREFUSED, EAGAIN} on error. If \texttt{EAGAIN} is
    -returned, the function should be called again to retry the delivery;
    -it is not guaranteed, however, that the event was not delivered by the
    -first call. Possibly duplicated events are discarded by the \LB\
    -server or proxy.
    -
    -\TODO{ljocha: check these}
    -The synchronous variants of logging functions can in addition return
    -\verb'EDG_WLL_ERROR_NOJOBID' or \verb'EDG_WLL_ERROR_DB_DUP_KEY'.
    -
    -\subsubsection{Logging event example}
    -In this section we will give commented example how to log an UserTag event to
    -the \LB.
    -
    -First we have to include neccessary headers:
    -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=headers-end\ headers]{prod_example1.c}
    -
    -Initialize context and set parameters:
    -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=context-end\ context]{prod_example1.c}
    -
    -\TODO{honik: proper setting of sequence codes}
    -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=sequence-end\ sequence]{prod_example1.c}
    -
    -Log the event:
    -\lstinputlisting[title={\bf File: }\lstname,numbers=left,linerange=log-end\ log]{prod_example1.c}
    -
    -The \verb'edg_wll_LogEvent()' function is defined as follows:
    -\begin{lstlisting}[numbers=none]
    -extern int edg_wll_LogEvent(
    -        edg_wll_Context context,
    -        edg_wll_EventCode event,
    -        char *fmt, ...);
    -\end{lstlisting}
    -If you use this function, you have to provide event code, format
    -string and corresponding arguments yourself. The UserTag event has
    -only two arguments, tag name and value, but other events require more
    -arguments.
    -
    -Instead of using the generic \verb'edg_wll_LogEvent()' at line~\ref{l:logevent}, we could also
    -write:
    -\begin{lstlisting}
    -err = edg_wll_LogUserTag(ctx, name, value);
    -\end{lstlisting}
    -
    -
    -\subsubsection{Change ACL example}
    -\TODO{kouril}
    -
    -
    -
    -\subsection{Java binding}
    -\TODO{mirek}
    -
    diff --git a/org.glite.lb.doc/src/status.tex.T b/org.glite.lb.doc/src/status.tex.T
    deleted file mode 100644
    index 5a1d0e5..0000000
    --- a/org.glite.lb.doc/src/status.tex.T
    +++ /dev/null
    @@ -1,19 +0,0 @@
    -@@@{
    -gen qq{
    -%  !! Automatically generated file. Do not edit.
    -%  !! Change the corresponding template file $ARGV
    -};
    -@@@}
    -
    -\begin{tabularx}{\textwidth}{>{\bfseries}lX}
    -@@@{
    -for my $stat ($status->getTypesOrdered) {
    -	my $c = getTypeComment $status $stat;
    -
    -        gen "$stat: \& $c \\\\ \n";
    -        }
    -@@@}
    -\end{tabularx}
    -
    -\endinput
    -
    diff --git a/org.glite.lb.doc/src/versions.tex b/org.glite.lb.doc/src/versions.tex
    deleted file mode 100644
    index fffe99d..0000000
    --- a/org.glite.lb.doc/src/versions.tex
    +++ /dev/null
    @@ -1,61 +0,0 @@
    -%
    -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -%% See http://www.eu-egee.org/partners for details on the copyright holders.
    -%% 
    -%% Licensed under the Apache License, Version 2.0 (the "License");
    -%% you may not use this file except in compliance with the License.
    -%% You may obtain a copy of the License at
    -%% 
    -%%     http://www.apache.org/licenses/LICENSE-2.0
    -%% 
    -%% Unless required by applicable law or agreed to in writing, software
    -%% distributed under the License is distributed on an "AS IS" BASIS,
    -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -%% See the License for the specific language governing permissions and
    -%% limitations under the License.
    -%
    -\def\lbdoc{\LB Documentation and versions overview}
    -\section*{\lbdoc}
    -\addcontentsline{toc}{section}{\texorpdfstring{\uppercase{\lbdoc}}{\lbdoc}}
    -\def\lbdoc{}
    -
    -The Logging and Bookkeeping service (\LB\ for short) was initially developed in
    -the EU DataGrid
    -project\footnote{\url{http://eu-datagrid.web.cern.ch/eu-datagrid/}} as a~part
    -of the Workload Management System (WMS). The development continued in the EGEE,
    -EGEE-II and EGEE-III projects,\footnote{\url{http://www.eu-egee.org/}} where
    -\LB became an independent part of the
    -gLite\footnote{\url{http://www.glite.org}} middleware~\cite{glite}.
    -
    -The complete \LB Documentation consists of the following parts:
    -\begin{itemize}
    -\item \textbf{\LB User's Guide} 
    -   \ifx\insideUG\undefined{\cite{lbug}}\else{- this document}\fi. 
    -   \input{LBUG-Abstract}
    -\item \textbf{\LB Administrator's Guide} 
    -   \ifx\insideAG\undefined{\cite{lbag}}\else{- this document}\fi. 
    -   \input{LBAG-Abstract}
    -\item \textbf{\LB Developer's Guide} 
    -   \ifx\insideDG\undefined{\cite{lbdg}}\else{- this document}\fi. 
    -   \input{LBDG-Abstract}
    -\item \textbf{\LB Test Plan} 
    -   \ifx\insideTP\undefined{\cite{lbtp}}\else{- this document}\fi. 
    -   \input{LBTP-Abstract}
    -\end{itemize}
    -
    -\textbf{The following versions of \LB service are covered by these documents:}
    -\begin{itemize}
    -\item \LBver{2.2}: current development version, available through CVS only,
    -\item \LBver{2.1}: currently in certification, to be released in April 2010,
    -\item \LBver{2.0}: current stable version, in production as part of gLite 3.2,
    -\item \LBver{1.x}: old stable version, in production as part of gLite 3.1.
    -\end{itemize}
    -\textbf{The older version of \LB that appeared in gLite 3.0 became obsolete and is not maintained anymore.}
    -
    -
    -Updated information about \LB service (including the \LB service roadmap) is available at the
    -\LB homepage:
    -\begin{center}
    -\href{http://egee.cesnet.cz/en/JRA1/LB}{http://egee.cesnet.cz/en/JRA1/LB}
    -\end{center}
    -
    diff --git a/org.glite.lb.doc/src/web_services.tex b/org.glite.lb.doc/src/web_services.tex
    deleted file mode 100644
    index 013d86e..0000000
    --- a/org.glite.lb.doc/src/web_services.tex
    +++ /dev/null
    @@ -1,42 +0,0 @@
    -%
    -%% Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -%% See http://www.eu-egee.org/partners for details on the copyright holders.
    -%% 
    -%% Licensed under the Apache License, Version 2.0 (the "License");
    -%% you may not use this file except in compliance with the License.
    -%% You may obtain a copy of the License at
    -%% 
    -%%     http://www.apache.org/licenses/LICENSE-2.0
    -%% 
    -%% Unless required by applicable law or agreed to in writing, software
    -%% distributed under the License is distributed on an "AS IS" BASIS,
    -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -%% See the License for the specific language governing permissions and
    -%% limitations under the License.
    -%
    -% -*- mode: latex -*-
    -
    -\section{Using \LB\ Web Service}
    -\TODO{ljocha}
    -
    -\TODO{Presunout do consumera}
    -
    -\TODO{Complete review, list of all relevant (WSDL) files, their location, etc.}
    -
    -The \LB\ web service interface currently reflects the functionality of legacy
    -\LB\ Querying API (Sect.~\ref{Consumer-API}).
    -
    -The following sections describe the operations defined in the \LB\ WSDL
    -file as well as its custom types.
    -
    -For the sake of readability this documentation does not follow the structure
    -of WSDL strictly, avoiding to duplicate information which is already present
    -here. Consequently, the SOAP messages are not documented, for example, as they
    -are derived from operation inputs and outputs mechanically.
    -The same holds for types: \eg\ we do not document defined elements
    -which correspond 1:1 to types but are required due to the literal SOAP
    -encoding.
    -
    -For exact definition of the operations and types see the WSDL file.
    -
    -\TODO{Add fully functional WS examples - in Java, Python, C?}
    diff --git a/org.glite.lb.glite-LB/Makefile b/org.glite.lb.glite-LB/Makefile
    deleted file mode 100644
    index 4b1a25b..0000000
    --- a/org.glite.lb.glite-LB/Makefile
    +++ /dev/null
    @@ -1,30 +0,0 @@
    -top_srcdir=..
    -stagedir=.
    -package=glite-lb-yaim
    -version=0.0.0
    -PREFIX=/opt/glite
    -
    --include Makefile.inc
    --include ../project/version.properties
    -
    -default all:
    -	echo -e "${gLiteCopyrightText}\n\n${gLiteLicenseText}" > LICENSE
    -	cp LICENSE COPYRIGHT
    -	echo ${module.version}-${module.age} > node-version
    -	echo ${platformArch} > arch
    -	echo "NA" > service
    -	echo "NA" > update
    -
    -install:
    -	mkdir -p ${PREFIX}/release/glite-LB
    -	cp -fp LICENSE COPYRIGHT node-version arch service update ${PREFIX}/release/glite-LB/
    -
    -stage:
    -	$(MAKE) install PREFIX=${stagedir}
    -
    -check:
    -
    -clean:
    -	rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/
    -
    -.PHONY: default all check install stage clean
    diff --git a/org.glite.lb.glite-LB/configure b/org.glite.lb.glite-LB/configure
    deleted file mode 100755
    index 0ef21e0..0000000
    --- a/org.glite.lb.glite-LB/configure
    +++ /dev/null
    @@ -1,834 +0,0 @@
    -#!/usr/bin/perl
    -
    -# WARNING: Don't edit this file unless it is the master copy in org.glite.lb
    -#
    -# For the purpose of standalone builds of lb/jobid/lbjp-common components
    -# it is copied on tagging 
    -
    -# $Header$
    -#
    -# Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -# See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -# 
    -# Licensed under the Apache License, Version 2.0 (the "License");
    -# you may not use this file except in compliance with the License.
    -# You may obtain a copy of the License at
    -# 
    -#     http://www.apache.org/licenses/LICENSE-2.0
    -# 
    -# Unless required by applicable law or agreed to in writing, software
    -# distributed under the License is distributed on an "AS IS" BASIS,
    -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -# See the License for the specific language governing permissions and
    -# limitations under the License.
    -#
    -
    -use Getopt::Long;
    -
    -my $pwd = `pwd`; chomp $pwd;
    -my $prefix = $pwd.'/stage';
    -my $stagedir;
    -my $staged;
    -my $module;
    -my $thrflavour = 'gcc64dbgpthr';
    -my $nothrflavour = 'gcc64dbg';
    -my $mode = 'build';
    -my $help = 0;
    -my $listmodules;
    -my $version;
    -my $branch;
    -my $output;
    -my $lb_tag = '';
    -my $lbjp_tag = '';
    -my $jp_tag = '';
    -my $sec_tag = '';
    -my $jobid_tag = '';
    -my $libdir = getlibdir();
    -
    -my @nodes = qw/client server logger utils client-java doc ws-test db jpprimary jpindex jpclient harvester/;
    -my %enable_nodes;
    -my %disable_nodes;
    -
    -my %extern_prefix = (
    -	cares => '/opt/c-ares',
    -	classads => '/opt/classads',
    -	cppunit => '/usr',
    -	expat => '/usr',
    -	globus => '/opt/globus',
    -	gsoap => '/usr',
    -	mysql => '/usr',
    -	'mysql-devel' => '',
    -	'mysql-server' => '',
    -	voms => '/opt/glite',
    -	gridsite => '/opt/glite',
    -	lcas => '/opt/glite',
    -	trustmanager => '/opt/glite',
    -	utiljava => '/opt/glite',
    -	ant => '/usr',
    -	jdk => '/usr',
    -	libtar => '/usr',
    -	axis => '/usr',
    -	log4c => '/usr',
    -	postgresql => '/usr'
    -);
    -
    -my %jar = (
    -	'commons-codec' => '/usr/share/java/commons-codec.jar',
    -	'commons-lang' => '/usr/share/java/commons-lang.jar',
    -);
    -
    -
    -my %glite_prefix;
    -my %need_externs;
    -my %need_externs_type;
    -my %need_jars;
    -my %extrafull;
    -my %extranodmod;
    -my %deps;
    -my %deps_type;
    -my %topbuild;
    -
    -my %lbmodules = (
    -	'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim glite-LB/], 
    -	'security' => [qw/gss gsoap-plugin/],
    -	'lbjp-common' => [qw/db log maildir server-bones trio jp-interface/],
    -	'jobid' => [qw/api-c api-cpp api-java/],
    -	'jp' => [ qw/client doc index primary server-common ws-interface/ ],
    -	);
    -
    -
    -my @opts = (
    -	'prefix=s' => \$prefix,
    -	'staged=s' => \$staged,
    -	'module=s' => \$module,
    -	'thrflavour=s' => \$thrflavour,
    -	'nothrflavour=s' => \$nothrflavour,
    -	'mode=s' => \$mode,
    -	'listmodules=s' => \$listmodules,
    -	'version=s' => \$version,
    -	'branch=s' => \$branch,
    -	'output=s' => \$output,
    -	'stage=s' => \$stagedir,
    -	'lb-tag=s' => \$lb_tag,
    -	'lbjp-common-tag=s' => \$lbjp_tag,
    -	'jp-tag=s' => \$jp_tag,
    -	'security-tag=s' => \$sec_tag,
    -	'jobid-tag=s' => \$jobid_tag,
    -	'help' => \$help,
    -	'libdir=s' => \$libdir,
    -);
    -
    -for (@nodes) {
    -	$enable_nodes{$_} = 0;
    -	$disable_nodes{$_} = 0;
    -	
    -	push @opts,"disable-$_",\$disable_nodes{$_};
    -	push @opts,"enable-$_",\$enable_nodes{$_};
    -}
    -
    -push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix;
    -push @opts,"with-$_=s",\$jar{$_} for keys %jar;
    -
    -my @keeparg = @ARGV;
    -
    -GetOptions @opts or die "Errors parsing command line\n";
    -
    -$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq '';
    -$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq '';
    -
    -if ($help) { usage(); exit 0; }
    -
    -if ($listmodules) {
    -	my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}};
    -	print "@m\n";
    -	exit 0;
    -}
    -
    -warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
    -	if ($version || $output || $branch) && $mode ne 'etics';
    -
    -my $en;
    -for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; }
    -
    -my $dis;
    -for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; }
    -
    -die "--enable-* and --disable-* are mutually exclusive\n"
    -	if $en && $dis;
    -
    -die "--module cannot be used with --enable-* or --disable-*\n"
    -	if $module && ($en || $dis);
    -
    -die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}};
    -
    -if ($dis) {
    -	for (@nodes) {
    -		$enable_nodes{$_} = 1 unless $disable_nodes{$_};
    -	}
    -}
    -
    -if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ;
    -
    -for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; }
    -
    -$stagedir = $prefix unless $stagedir;
    -
    -if ($mode eq 'build') {
    -	print "Writing config.status\n";
    -	open CONF,">config.status" or die "config.status: $!\n";
    -	print CONF "$0 @keeparg\n";
    -	close CONF;
    -}
    -
    -
    -my @modules;
    -my %aux;
    -
    -if ($module) {
    -#	push @modules,split(/[,.]+/,$module);
    -	push @modules,$module;
    -}
    -else {
    -	@modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes));
    -	
    -	my $n;
    -
    -	do {
    -		local $"="\n";
    - 		$n = $#modules;
    -		push @modules,(map @{$deps{$_}},@modules);
    -
    -		undef %aux; @aux{@modules} = (1) x ($#modules+1);
    -		@modules = keys %aux;
    -	} while ($#modules > $n);
    -}
    -
    -@aux{@modules} = (1) x ($#modules+1);
    -delete $aux{$_} for (split /,/,$staged);
    -@modules = keys %aux;
    -
    -mode_build() if $mode eq 'build';
    -mode_checkout() if $mode eq 'checkout';
    -mode_etics($module) if $mode eq 'etics';
    -
    -sub mode_build {
    -	print "\nBuilding modules: @modules\n";
    -	
    -	my @ext = map @{$need_externs{$_}},@modules;
    -	my @myjars = map @{$need_jars{$_}},@modules;
    -	undef %aux; @aux{@ext} = 1;
    -	@ext = keys %aux;
    -	undef %aux; @aux{@myjars} = (1) x ($#myjars+1);
    -	@myjars = keys %aux;
    -	
    -	print "\nRequired externals:\n";
    -	print "\t$_: $extern_prefix{$_}\n" for @ext;
    -	print "\t$_: $jar{$_}\n" for @myjars;
    -	print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n";
    -	
    -	mkinc($_) for @modules;
    -	
    -	print "Creating Makefile\n";
    -	
    -	open MAK,">Makefile" or die "Makefile: $!\n";
    -	
    -	print MAK "all: @modules\n\nclean:\n";
    -	
    -	for (@modules) {
    -		my $full = full($_);
    -		my $build = $topbuild{$_} ? '': '/build';
    -		print MAK "\tcd $full$build && \${MAKE} clean\n"
    -	}
    -	
    -	print MAK "\ndistclean:\n";
    -	
    -	for (@modules) {
    -		my $full = full($_);
    -		print MAK $topbuild{$_} ?
    -			"\tcd $full$build && \${MAKE} distclean\n" :
    -			"\trm -rf $full$build\n"
    -	}
    -	
    -	print MAK "\n";
    -	
    -	for (@modules) {
    -		my %ldeps; undef %ldeps;  
    -		@ldeps{@{$deps{$_}}} = 1;
    -		for my $x (split /,/,$staged) { delete $ldeps{$x}; }
    -		my @dnames = $module ? () : keys %ldeps;
    -	
    -		my $full = full($_);
    -		my $build = $topbuild{$_} ? '': '/build';
    -	
    -		print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n";
    -	}
    -	
    -	close MAK;
    -}
    -	
    -sub mode_checkout() {
    -	for (@modules) {
    -		my $module = $_;
    -		my $tag = "";
    -		if ($lb_tag){
    -			for (@{$lbmodules{lb}}){
    -				if ("lb.".$_ eq $module){
    -					$tag = '-r '.$lb_tag;
    -				}
    -			}	
    -		}
    -		if ($lbjp_tag){
    -			for (@{$lbmodules{'lbjp-common'}}){
    -				if ("lbjp-common.".$_ eq $module){
    -                                        $tag = '-r '.$lbjp_tag;
    -                                }
    -			}
    -		}
    -		if ($jp_tag){
    -			for (@{$lbmodules{'jp'}}){
    -	                        if ("jp.".$_ eq $module){
    -                                        $tag = '-r '.$jp_tag;
    -	                        }
    -                        }
    -		}
    -		if ($sec_tag){
    -			for (@{$lbmodules{security}}){
    -				if ("security.".$_ eq $module){
    -                                        $tag = '-r '.$sec_tag;
    -                                }
    -			}
    -		}
    -		if ($jobid_tag){
    -			for (@{$lbmodules{jobid}}){
    -				if ("jobid.".$_ eq $module){
    -                                        $tag = '-r '.$jobid_tag;
    -                                }
    -			}
    -		}
    -		#if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){
    -		#	print "found";
    -		#}
    -		$_ = full($_);
    -		print "\n*** Checking out $_\n";
    -		system("cvs checkout  $tag $_") == 0 or die "cvs checkout $tag $_: $?\n";
    -	}
    -}
    -
    -BEGIN{
    -%need_externs_aux = (
    -	'lb.client' => [ qw/cppunit:B classads/ ],
    -	'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava/ ],
    -	'lb.common' => [ qw/expat cares:B cppunit:B classads/ ],
    -	'lb.doc' => [],
    -	'lb.logger' => [ qw/cppunit:B/ ],
    -	'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ],
    -	'lb.state-machine' => [ qw/classads/ ],
    -	'lb.utils' => [ qw/cppunit:B/ ],
    -	'lb.ws-interface' => [],
    -	'lb.ws-test' => [ qw/gsoap:B/ ],
    -	'lb.types' => [ qw// ],
    -	'lb.harvester' => [ qw/postgresql:R/ ],
    -	'lb.yaim' => [ qw/yaim_core:R/ ],
    -	'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ],
    -	'lbjp-common.db' => [ qw/mysql:B mysql-devel:B postgresql:B/ ],
    -	'lbjp-common.log' => [ qw/log4c/ ],
    -	'lbjp-common.maildir' => [ qw// ],
    -	'lbjp-common.server-bones' => [ qw// ],
    -	'lbjp-common.trio' => [ qw/cppunit:B/ ],
    -	'lbjp-common.jp-interface' => [ qw/cppunit:B log4c:B/ ],
    -	'security.gss' =>  [ qw/globus_essentials:R globus:B cares cppunit:B/ ],
    -	'security.gsoap-plugin' =>  [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap:B/ ],
    -	'jobid.api-c' =>  [ qw/cppunit:B/ ],
    -	'jobid.api-cpp' =>  [ qw/cppunit:B/ ],
    -	'jobid.api-java' =>  [ qw/ant:B jdk:B/ ],
    -	'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ],
    -        'jp.doc' => [],
    -        'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ],
    -        'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ],
    -        'jp.server-common' => [],
    -        'jp.ws-interface' => [],
    -);
    -
    -for my $ext (keys %need_externs_aux) {
    -	for (@{$need_externs_aux{$ext}}) {
    -		/([^:]*)(?::(.*))?/;
    -		push @{$need_externs{$ext}},$1;
    -		my $type = $2 ? $2 : 'BR';
    -		$need_externs_type{$ext}->{$1} = $type;
    -	}
    -}
    -
    -%need_jars = (
    -	'jobid.api-java' => [ qw/commons-codec/ ],
    -	'lb.client-java' => [ qw/commons-lang/ ],
    -);
    -
    -for my $jar (keys %need_jars) {
    -	for (@{$need_jars{$jar}}) {
    -		$need_externs_type{$jar}->{$_} = 'BR'; 	# XXX
    -	}
    -}
    -
    -%deps_aux = (
    -	'lb.client' => [ qw/
    -		lb.types:B lb.common
    -		lbjp-common.trio
    -		jobid.api-cpp:B jobid.api-c
    -		security.gss
    -	/ ],
    -	'lb.client-java' => [ qw/
    -		lb.types:B
    -		lb.ws-interface:B
    -		jobid.api-java
    -	/ ],
    -	'lb.common' => [ qw/
    -		jobid.api-cpp:B jobid.api-c
    -		lb.types:B lbjp-common.trio security.gss
    -	/ ],
    -	'lb.doc' => [ qw/lb.types:B/ ],
    -	'lb.logger' => [ qw/
    -		lbjp-common.trio
    -		lbjp-common.log
    -		jobid.api-c
    -		lb.common
    -		security.gss
    -	/ ],
    -	'lb.server' => [ qw/
    -		lb.ws-interface lb.types:B lb.common lb.state-machine
    -		lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log
    -		jobid.api-c
    -		security.gsoap-plugin security.gss
    -	/ ],
    -	'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ],
    -	'lb.utils' => [ qw/
    -		lbjp-common.jp-interface
    -		jobid.api-c
    -		lbjp-common.trio lbjp-common.maildir
    -		lb.client lb.state-machine
    -	/ ],
    -	'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ],
    -	'lb.ws-interface' => [ qw/lb.types:B/ ],
    -	'lb.types' => [ qw// ],
    -	'lb.harvester' => [ qw/
    -		jobid.api-c lbjp-common.trio lbjp-common.db lb.common lb.client
    -		security.gss lbjp-common.log
    -	/ ],
    -	'lb.yaim' => [ qw// ],
    -	'lb.glite-LB' => [ qw/
    -		lb.logger:R lb.server:R lb.utils:R lb.doc:R
    -		lb.ws-test:R lb.harvester:R lb.yaim:R
    -	/ ],
    -	'lbjp-common.db' => [ qw/lbjp-common.trio lbjp-common.log/ ],
    -	'lbjp-common.maildir' => [ qw// ],
    -	'lbjp-common.server-bones' => [ qw/lbjp-common.log/ ],
    -	'lbjp-common.trio' => [ qw// ],
    -	'security.gss' =>  [ qw// ],
    -	'security.gsoap-plugin' =>  [ qw/security.gss/ ],
    -	'jobid.api-c' =>  [ qw// ],
    -	'jobid.api-cpp' =>  [ qw/jobid.api-c/ ],
    -	'jobid.api-java' =>  [ qw// ],
    -
    -	'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ],
    -
    -	'jp.client' => [ qw/
    -                jp.ws-interface
    -                lbjp-common.jp-interface lbjp-common.maildir
    -                jobid.api-c
    -                security.gsoap-plugin
    -        / ],
    -	'jp.doc' => [ qw// ],
    -	'jp.index' => [ qw/
    -                jp.server-common jp.ws-interface
    -                lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones
    -                security.gsoap-plugin
    -        / ],
    -	'jp.primary' => [ qw/
    -                jobid.api-c
    -                jp.server-common jp.ws-interface
    -                lb.state-machine
    -                lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones
    -                security.gsoap-plugin
    -        / ],
    -	'jp.server-common' => [ qw/ 
    -                lbjp-common.jp-interface lbjp-common.db
    -        / ],
    -	'jp.ws-interface' => [ qw// ],
    -);
    -
    -for my $ext (keys %deps_aux) {
    -	for (@{$deps_aux{$ext}}) {
    -		/([^:]*)(?::(.*))?/;
    -		push @{$deps{$ext}},$1;
    -		my $type = $2 ? $2 : 'BR';
    -		$deps_type{$ext}->{$1} = $type;
    -	}
    -}
    -
    -
    -%extrafull = ( gridsite=>'org.gridsite.core');
    -
    -#( java => 'client-java' );
    -%extranodmod = (
    -	db => 'lbjp-common.db',
    -	jpprimary => 'jp.primary',
    -	jpindex => 'jp.index',
    -	jpclient => 'jp.client',
    -);
    -
    -my @t = qw/lb.client-java jobid.api-java lb.types/;
    -@topbuild{@t} = (1) x ($#t+1);
    -}
    -
    -sub full
    -{
    -	my $short = shift;
    -	return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short;
    -}
    -
    -sub mkinc
    -{
    -	my %aux;
    -	undef %aux;
    -	my @m=qw/
    -lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB
    -security.gss security.gsoap-plugin
    -jobid.api-c jobid.api-cpp jobid.api-java
    -lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface
    -jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface
    -/;
    -	@aux{@m} = (1) x ($#m+1);
    -
    -	my $short = shift;
    -	my $full = full $short;
    -
    -	unless ($aux{$short}) {
    -		print "Makefile.inc not needed in $full\n";
    -		return;
    -	}
    -
    -	my $build = '';
    -	
    -	unless ($topbuild{$_}) {
    -		$build = '/build';
    -		unless (-d "$full/build") {
    -			mkdir "$full/build" or die "mkdir $full/build: $!\n";
    -		}
    -		unlink "$full/build/Makefile";
    -		symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n";
    -	}
    -
    -	open MKINC,">$full$build/Makefile.inc"
    -		or die "$full$build/Makefile.inc: $!\n";
    -
    -	print "Creating $full$build/Makefile.inc\n";
    -
    -	print MKINC qq{
    -PREFIX = $prefix
    -stagedir = $stagedir
    -thrflavour = $thrflavour
    -nothrflavour = $nothrflavour
    -libdir = $libdir
    -};
    -
    -	for (@{$need_externs{$short}}) {
    -		print MKINC "${_}_prefix = $extern_prefix{$_}\n"
    -	}
    -
    -	for (@{$need_jars{$short}}) {
    -		print MKINC "${_}_jar = $jar{$_}\n"
    -	}
    -
    -	my $need_gsoap = 0;
    -	for (@{$need_externs{$short}})  { $need_gsoap = 1 if $_ eq 'gsoap'; }
    -
    -	print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
    -
    -	close MKINC;
    -}
    -
    -my %etics_externs;
    -my %etics_projects;
    -BEGIN{
    -	%etics_externs = (
    -		globus_essentials=>'vdt_globus_essentials',
    -		globus=>'globus',
    -		cares=>'c-ares',
    -		voms=>'org.glite.security.voms-api-cpp',
    -		gridsite=>'org.gridsite.shared',
    -		lcas=>'org.glite.security.lcas',
    -		trustmanager=>'org.glite.security.trustmanager',
    -		utiljava=>'org.glite.security.util-java',
    -		gpt=>'gpt',
    -		fetchcrl=>'fetch-crl',
    -		gip_release=>'glite-info-provider-release',
    -		gip_service=>'glite-info-provider-service',
    -		bdii=>'bdii',
    -		glite_version=>'glite-version',
    -		glite_info_templates=>'glite-info-templates',
    -		glue_schema=>'glue-schema',
    -		yaim_core=>'org.glite.yaim.core',
    -	);
    -	%etics_projects = (
    -		vdt=>[qw/globus globus_essentials/],
    -		'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/],
    -	);
    -};
    -
    -sub mode_etics {
    -	$fmod = shift;
    -
    -	die "$0: --module required with --etics\n" unless $fmod;
    -	
    -	my ($subsys,$module) = split /\./,$fmod;
    -
    -	my ($major,$minor,$rev,$age);
    -
    -	if ($version) {
    -		$version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
    -		($major,$minor,$rev,$age) = ($1,$2,$3,$4);
    -	}
    -	else { 
    -		open V,"org.glite.$subsys.$module/project/version.properties"
    -			or die "org.glite.$subsys.$module/project/version.properties: $!\n";
    -	
    -		while ($_ = ) {
    -			chomp;
    -			($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/;
    -			$age = $1 if /module\.age\s*=\s*([[:digit:]]+)/;
    -		}
    -		close V;
    -	}
    -
    -	my @copts = ();
    -	my %ge;
    -	@ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1);
    -
    -	for (@{$need_externs{"$subsys.$module"}}) {
    -	    if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) {
    -		my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
    -		push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}";
    -	    }
    -	}
    -
    -	for (@{$need_jars{"$subsys.$module"}}) {
    -		my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
    -
    -		push @copts,"--with-$_ \${$eext.location}/$_*.jar";
    -	}
    -
    -	my $conf;
    -	my $conftag;
    -
    -	if ($branch) {
    -		$conf = "glite-${subsys}-${module}_$branch"; 
    -		$conftag = $branch; 
    -		$dwpath = ""; }
    -	else {
    -		$conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
    -		$conftag = $conf; 
    -		$dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n"; }
    -#	my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}";
    -	my $file = $output ? $output : "$conf.ini";
    -	open C,">$file" or die "$file: $!\n";
    -
    -	my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build";
    -
    -	my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..';
    -
    -	my $package_description = "";
    -	my $package_summary = "";
    -
    -	if (-e "org.glite.$subsys.$module/project/package.description") {
    -		open V, "org.glite.$subsys.$module/project/package.description";
    -		$package_description = join ("", );
    -		close V;
    -		chomp $package_description;
    -		$package_description =~ s/\n/\\n/g; 
    -		$package_description = "package.description = $package_description";
    -	} 
    -	else { 
    -		print STDERR "package.description not found for $subsys.$module!\n"; }
    -
    -	if (-e "org.glite.$subsys.$module/project/package.summary") {
    -		open V, "org.glite.$subsys.$module/project/package.summary";
    -		$package_summary = join ("", );
    -		close V;
    -		chomp $package_summary;
    -		$package_summary =~ s/\n/\\n/g; 
    -		$package_summary = "package.summary = $package_summary";
    -	} 
    -	else { 
    -		print STDERR "package.summary not found for $subsys.$module!\n"; }
    -
    -
    -	print STDERR "Writing $file\n";
    -	print C qq{
    -[Configuration-$conf]
    -profile = None
    -moduleName = org.glite.$subsys.$module
    -displayName = $conf
    -description = org.glite.$subsys.$module
    -projectName = org.glite
    -age = $age
    -deploymentType = None
    -tag = $conftag
    -version = $major.$minor.$rev
    -$dwpath
    -[Platform-default:VcsCommand]
    -displayName = None
    -description = None
    -tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName}
    -branch = None
    -commit = None
    -checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName}
    -
    -[Platform-default:BuildCommand]
    -postpublish = None
    -packaging = None
    -displayName = None
    -description = None
    -doc = None
    -prepublish = None
    -publish = None
    -compile = make
    -init = None
    -install = make install
    -clean = make clean
    -test = make check
    -configure = cd $confdir && \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts
    -checkstyle = None
    -
    -[Platform-default:Property]
    -$buildroot
    -$package_description
    -$package_summary
    -
    -[Platform-default:DynamicDependency]
    -
    -};
    -	for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) {
    -		my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
    -
    -		my $proj = 'externals';
    -		for my $p (keys %etics_projects) {
    -			for $m (@{$etics_projects{$p}}) {
    -				$proj = $p if $m eq $_;
    -			}
    -		}
    -
    -		my $type = $need_externs_type{"$subsys.$module"}->{$_};
    -		print C "$proj|$eext = $type\n";
    -	}
    -
    -	for (@{$deps{"$subsys.$module"}}) {
    -		my $type = $deps_type{"$subsys.$module"}->{$_};
    -		print C "org.glite|org.glite.$_ = $type\n";
    -	}
    -
    -	close C;
    -}
    -
    -sub gsoap_version {
    -	local $_;
    -	my $gsoap_version;
    -	open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n";
    -
    -	while ($_ = ) {
    -		chomp;
    -
    -		$gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/;
    -	}
    -	close S;
    -	return $gsoap_version;
    -}
    -
    -sub getlibdir {
    -	if ( -e "/etc/debian_version") { # We are on Debian
    -		$lib64="lib";
    -		$lib32="lib32";	}
    -	else { # Another distribution
    -		$lib64="lib64";
    -		$lib32="lib";	}
    -        $libdir=$lib32;
    -
    -        open INP, "uname -s | "; # Check kernel name
    -        $kname= ;
    -        chomp($kname);
    -        close INP;
    -
    -        if ( $kname == "Linux") {
    -                $arch = ("x86_64\npowerpc\nppc64\n");
    -
    -                open INP, "uname -p | "; # Check processor type
    -                $procname= ;
    -                chomp($procname);
    -                close INP;
    -
    -                if ($arch =~/^$procname\n/) {
    -                        return ($lib64); }
    -
    -                open INP, "uname -m | "; # Check machine hardware
    -                $machname= ;
    -                chomp($machname);
    -                close INP;
    -
    -                if ($arch =~/^$machname\n/) {
    -                        return ($lib64); }
    -
    -                # special cases (hyperlink lib64, Debian)
    -                if (-l "/usr/lib64") {
    -                        $libdir=$lib32; }
    -
    -                # if /usr/lib64 doesn't exist at all (AIX)
    -                unless ( -e "/usr/lib64" ) {
    -                        $libdir=$lib32; }
    -        }
    -
    -        if ( $kname == "SunOS") {
    -                if (-e "/usr/lib/64") {
    -                $libdir="lib/64"; }
    -        }
    -
    -        return $libdir;
    -}
    -
    -sub usage {
    -	my @ext = keys %extern_prefix;
    -	my @myjars, keys %jar;
    -
    -	print STDERR qq{
    -usage: $0 options
    -
    -General options (defaults in []):
    -  --prefix=PREFIX		destination directory [./stage]
    -  --staged=module,module,...	what is already in PREFIX (specify without org.glite.)
    -  --thrflavour=flavour
    -  --nothrflavour=flavour	threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg]
    -  --listmodules=subsys          list modules of a subsystem
    -  --libdir=libdir		typically [lib,lib64] postfix
    -  
    -Mode of operation:
    -  --mode={checkout|build|etics}	what to do [build]
    -  
    -What to build:
    -  --module=module		build this module only (mostly in-Etics operation)
    -  --enable-NODE			build this "node" (set of modules) only. Available nodes are
    -					@{$lbmodules{lb}},@{$lbmodules{security}}
    -  --disable-NODE		don't build this node
    -  --lb-tag=tag			checkout LB modules with specific tag
    -  --jp-tag=tag			checkout JP modules with specific tag
    -  --lbjp-common-tag=tag         checkout lbjp-common modules with specific tag
    -  --security-tag=tag		checkout security modules with specific tag
    -  --jobid-tag=tag		checkout jobid modules with specific tag
    -
    -Dependencies:
    -  --with-EXTERNAL=PATH		where to look for an external. Required externals
    - 				(not all for all modules) are:
    -					@ext
    -  --with-JAR=JAR		where to look for jars. Required jars are:
    -					@myjars
    -				Summary of what will be used is always printed
    -
    -};
    -
    -}
    diff --git a/org.glite.lb.glite-LB/project/ChangeLog b/org.glite.lb.glite-LB/project/ChangeLog
    deleted file mode 100644
    index 579161c..0000000
    --- a/org.glite.lb.glite-LB/project/ChangeLog
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -3.2.10-1
    -- glite-LB Metapackage module now CVS-based
    -- compile and build by make rather than inline commands
    -
    diff --git a/org.glite.lb.glite-LB/project/package.description b/org.glite.lb.glite-LB/project/package.description
    deleted file mode 100644
    index ebc46ce..0000000
    --- a/org.glite.lb.glite-LB/project/package.description
    +++ /dev/null
    @@ -1 +0,0 @@
    -Metapackage to install the L&B service on an LB node
    diff --git a/org.glite.lb.glite-LB/project/package.summary b/org.glite.lb.glite-LB/project/package.summary
    deleted file mode 100644
    index ebc46ce..0000000
    --- a/org.glite.lb.glite-LB/project/package.summary
    +++ /dev/null
    @@ -1 +0,0 @@
    -Metapackage to install the L&B service on an LB node
    diff --git a/org.glite.lb.glite-LB/project/version.properties b/org.glite.lb.glite-LB/project/version.properties
    deleted file mode 100644
    index e31e71c..0000000
    --- a/org.glite.lb.glite-LB/project/version.properties
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -# $Header
    -module.version=3.2.10
    -module.age=1
    diff --git a/org.glite.lb.harvester/Makefile b/org.glite.lb.harvester/Makefile
    deleted file mode 100644
    index ccfa702..0000000
    --- a/org.glite.lb.harvester/Makefile
    +++ /dev/null
    @@ -1,89 +0,0 @@
    -top_srcdir=..
    -stagedir=.
    -package=glite-lb-harvester
    -module.version=0.0.0
    -PREFIX=/opt/glite
    -globus_prefix=/opt/globus
    -
    -archlib:=lib
    -thrflavour:=gcc32dbgpthr
    -host_cpu:=${shell uname -m}
    -ifeq (${host_cpu},x86_64) 
    -        archlib:=lib64
    -	thrflavour:=gcc64dbgpthr
    -endif   
    -
    --include Makefile.inc
    --include ../project/version.properties
    -version:=${module.version}
    -
    -CC=gcc
    -VPATH=${top_srcdir}/src:${top_srcdir}/doc
    -
    -GLOBUS_CPPFLAGS:=-I${globus_prefix}/include/${thrflavour}
    -CPPFLAGS:=-I${stagedir}/include -D_GNU_SOURCE -D_REENTRANT ${CPPFLAGS}
    -CFLAGS:=-W -Wall -g -O2 ${CFLAGS}
    -LDFLAGS:=${LDFLAGS} 
    -LIBS:=-L${stagedir}/${archlib} -L${stagedir}/lib \
    -	-lglite_lb_common_${thrflavour} \
    -	-lglite_lb_client_${thrflavour} \
    -	-lpthread -lglite_security_gss_${thrflavour}
    -
    -ifneq ($(GLITE_LB_HARVESTER_WITH_LBU_DB),no)
    -CPPFLAGS:=$(CPPFLAGS) -DWITH_LBU_DB=1
    -LIBS:=$(LIBS) -lglite_lbu_db
    -endif
    -ifeq ($(GLITE_LB_HARVESTER_WITH_OLD_LB),yes)
    -CPPFLAGS:=${GLOBUS_CPPFLAGS} $(CPPFLAGS) -DWITH_OLD_LB=1
    -LIBS:=$(LIBS) -lglite_wmsutils_cjobid
    -else
    -LIBS:=$(LIBS) -lglite_jobid -lglite_lbu_trio -lglite_lbu_log
    -endif
    -
    -COMPILE:=libtool --mode=compile ${CC} ${CPPFLAGS} ${CFLAGS}
    -LINK:=libtool --mode=link ${CC} ${LDFLAGS}
    -INSTALL:=libtool --mode=install install
    -
    -default: all
    -
    -compile all: harvester doc debug
    -
    -check:
    -
    -debug: harvester-dbg
    -
    -doc: glite-lb-harvester.8
    -
    -stage: compile
    -	$(MAKE) install PREFIX=${stagedir}
    -
    -install: compile
    -	-mkdir -p ${PREFIX}/bin ${PREFIX}/examples ${PREFIX}/share/doc/${package}-${version} ${PREFIX}/share/man/man8
    -	${INSTALL} -m 755 harvester ${PREFIX}/bin/glite-lb-harvester
    -	${INSTALL} -m 755 harvester-dbg ${PREFIX}/examples/glite-lb-harvester-dbg
    -	${INSTALL} -m 755 ../examples/test.sh ${PREFIX}/examples/glite-lb-harvester-test.sh
    -	${INSTALL} -m 444 ../doc/README ${PREFIX}/share/doc/${package}-${version}
    -	${INSTALL} -m 444 glite-lb-harvester.8 ${PREFIX}/share/man/man8
    -
    -clean:
    -	rm -rfv *.o *.lo *.loT .libs/ manpage.links manpage.refs
    -	rm -rvf harvester harvester-dbg glite-lb-harvester.*
    -	rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/
    -
    -harvester: harvester.o
    -	${LINK} -o $@ $+ ${LIBS}
    -
    -harvester-dbg: harvester-dbg.o
    -	${LINK} -o $@ $+ ${LIBS}
    -
    -harvester-dbg.o: harvester.c
    -	${COMPILE} -DLOG=1 -DWITH_RTM_SQL_STORAGE=1 -c $< -o $@
    -
    -%.o: %.c
    -	${COMPILE} -c $<
    -
    -%.8: %.sgml
    -	docbook2man $<
    -	mv $(@:.8=.1) $@
    -
    -.PHONY: default all compile debug check doc stage install clean
    diff --git a/org.glite.lb.harvester/configure b/org.glite.lb.harvester/configure
    deleted file mode 100755
    index 71ff6f0..0000000
    --- a/org.glite.lb.harvester/configure
    +++ /dev/null
    @@ -1,843 +0,0 @@
    -#!/usr/bin/perl
    -
    -# WARNING: Don't edit this file unless it is the master copy in org.glite.lb
    -#
    -# For the purpose of standalone builds of lb/jobid/lbjp-common components
    -# it is copied on tagging 
    -
    -# $Header$
    -#
    -# Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -# See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -# 
    -# Licensed under the Apache License, Version 2.0 (the "License");
    -# you may not use this file except in compliance with the License.
    -# You may obtain a copy of the License at
    -# 
    -#     http://www.apache.org/licenses/LICENSE-2.0
    -# 
    -# Unless required by applicable law or agreed to in writing, software
    -# distributed under the License is distributed on an "AS IS" BASIS,
    -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -# See the License for the specific language governing permissions and
    -# limitations under the License.
    -#
    -
    -use Getopt::Long;
    -
    -my $pwd = `pwd`; chomp $pwd;
    -my $prefix = $pwd.'/stage';
    -my $stagedir;
    -my $staged;
    -my $module;
    -my $thrflavour = 'gcc64dbgpthr';
    -my $nothrflavour = 'gcc64dbg';
    -my $mode = 'build';
    -my $help = 0;
    -my $listmodules;
    -my $version;
    -my $branch;
    -my $output;
    -my $lb_tag = '';
    -my $lbjp_tag = '';
    -my $jp_tag = '';
    -my $sec_tag = '';
    -my $jobid_tag = '';
    -my $libdir = getlibdir();
    -
    -my @nodes = qw/client server logger utils client-java doc ws-test db jpprimary jpindex jpclient harvester/;
    -my %enable_nodes;
    -my %disable_nodes;
    -
    -my %extern_prefix = (
    -	cares => '/opt/c-ares',
    -	classads => '/opt/classads',
    -	cppunit => '/usr',
    -	expat => '/usr',
    -	globus => '/opt/globus',
    -	gsoap => '/usr',
    -	mysql => '/usr',
    -	'mysql-devel' => '',
    -	'mysql-server' => '',
    -	voms => '/opt/glite',
    -	gridsite => '/opt/glite',
    -	lcas => '/opt/glite',
    -	trustmanager => '/opt/glite',
    -	utiljava => '/opt/glite',
    -	ant => '/usr',
    -	jdk => '/usr',
    -	libtar => '/usr',
    -	axis => '/usr',
    -	log4c => '/usr',
    -	postgresql => '/usr'
    -);
    -
    -my %jar = (
    -	'commons-codec' => '/usr/share/java/commons-codec.jar',
    -	'commons-lang' => '/usr/share/java/commons-lang.jar',
    -);
    -
    -
    -my %glite_prefix;
    -my %need_externs;
    -my %need_externs_type;
    -my %need_jars;
    -my %extrafull;
    -my %extranodmod;
    -my %deps;
    -my %deps_type;
    -my %topbuild;
    -
    -my %lbmodules = (
    -	'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim glite-LB/], 
    -	'security' => [qw/gss gsoap-plugin/],
    -	'lbjp-common' => [qw/db log maildir server-bones trio jp-interface/],
    -	'jobid' => [qw/api-c api-cpp api-java/],
    -	'jp' => [ qw/client doc index primary server-common ws-interface/ ],
    -	);
    -
    -
    -my @opts = (
    -	'prefix=s' => \$prefix,
    -	'staged=s' => \$staged,
    -	'module=s' => \$module,
    -	'thrflavour=s' => \$thrflavour,
    -	'nothrflavour=s' => \$nothrflavour,
    -	'mode=s' => \$mode,
    -	'listmodules=s' => \$listmodules,
    -	'version=s' => \$version,
    -	'branch=s' => \$branch,
    -	'output=s' => \$output,
    -	'stage=s' => \$stagedir,
    -	'lb-tag=s' => \$lb_tag,
    -	'lbjp-common-tag=s' => \$lbjp_tag,
    -	'jp-tag=s' => \$jp_tag,
    -	'security-tag=s' => \$sec_tag,
    -	'jobid-tag=s' => \$jobid_tag,
    -	'help' => \$help,
    -	'libdir=s' => \$libdir,
    -);
    -
    -for (@nodes) {
    -	$enable_nodes{$_} = 0;
    -	$disable_nodes{$_} = 0;
    -	
    -	push @opts,"disable-$_",\$disable_nodes{$_};
    -	push @opts,"enable-$_",\$enable_nodes{$_};
    -}
    -
    -push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix;
    -push @opts,"with-$_=s",\$jar{$_} for keys %jar;
    -
    -my @keeparg = @ARGV;
    -
    -GetOptions @opts or die "Errors parsing command line\n";
    -
    -$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq '';
    -$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq '';
    -
    -if ($help) { usage(); exit 0; }
    -
    -if ($listmodules) {
    -	my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}};
    -	print "@m\n";
    -	exit 0;
    -}
    -
    -warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
    -	if ($version || $output || $branch) && $mode ne 'etics';
    -
    -my $en;
    -for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; }
    -
    -my $dis;
    -for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; }
    -
    -die "--enable-* and --disable-* are mutually exclusive\n"
    -	if $en && $dis;
    -
    -die "--module cannot be used with --enable-* or --disable-*\n"
    -	if $module && ($en || $dis);
    -
    -die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}};
    -
    -if ($dis) {
    -	for (@nodes) {
    -		$enable_nodes{$_} = 1 unless $disable_nodes{$_};
    -	}
    -}
    -
    -if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ;
    -
    -for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; }
    -
    -$stagedir = $prefix unless $stagedir;
    -
    -if ($mode eq 'build') {
    -	print "Writing config.status\n";
    -	open CONF,">config.status" or die "config.status: $!\n";
    -	print CONF "$0 @keeparg\n";
    -	close CONF;
    -}
    -
    -
    -my @modules;
    -my %aux;
    -
    -if ($module) {
    -#	push @modules,split(/[,.]+/,$module);
    -	push @modules,$module;
    -}
    -else {
    -	@modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes));
    -	
    -	my $n;
    -
    -	do {
    -		local $"="\n";
    - 		$n = $#modules;
    -		push @modules,(map @{$deps{$_}},@modules);
    -
    -		undef %aux; @aux{@modules} = (1) x ($#modules+1);
    -		@modules = keys %aux;
    -	} while ($#modules > $n);
    -}
    -
    -@aux{@modules} = (1) x ($#modules+1);
    -delete $aux{$_} for (split /,/,$staged);
    -@modules = keys %aux;
    -
    -mode_build() if $mode eq 'build';
    -mode_checkout() if $mode eq 'checkout';
    -mode_etics($module) if $mode eq 'etics';
    -
    -sub mode_build {
    -	print "\nBuilding modules: @modules\n";
    -	
    -	my @ext = map @{$need_externs{$_}},@modules;
    -	my @myjars = map @{$need_jars{$_}},@modules;
    -	undef %aux; @aux{@ext} = 1;
    -	@ext = keys %aux;
    -	undef %aux; @aux{@myjars} = (1) x ($#myjars+1);
    -	@myjars = keys %aux;
    -	
    -	print "\nRequired externals:\n";
    -	print "\t$_: $extern_prefix{$_}\n" for @ext;
    -	print "\t$_: $jar{$_}\n" for @myjars;
    -	print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n";
    -	
    -	mkinc($_) for @modules;
    -	
    -	print "Creating Makefile\n";
    -	
    -	open MAK,">Makefile" or die "Makefile: $!\n";
    -	
    -	print MAK "all: @modules\n\nclean:\n";
    -	
    -	for (@modules) {
    -		my $full = full($_);
    -		my $build = $topbuild{$_} ? '': '/build';
    -		print MAK "\tcd $full$build && \${MAKE} clean\n"
    -	}
    -	
    -	print MAK "\ndistclean:\n";
    -	
    -	for (@modules) {
    -		my $full = full($_);
    -		print MAK $topbuild{$_} ?
    -			"\tcd $full$build && \${MAKE} distclean\n" :
    -			"\trm -rf $full$build\n"
    -	}
    -	
    -	print MAK "\n";
    -	
    -	for (@modules) {
    -		my %ldeps; undef %ldeps;  
    -		@ldeps{@{$deps{$_}}} = 1;
    -		for my $x (split /,/,$staged) { delete $ldeps{$x}; }
    -		my @dnames = $module ? () : keys %ldeps;
    -	
    -		my $full = full($_);
    -		my $build = $topbuild{$_} ? '': '/build';
    -	
    -		print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n";
    -	}
    -	
    -	close MAK;
    -}
    -	
    -sub mode_checkout() {
    -	for (@modules) {
    -		my $module = $_;
    -		my $tag = "";
    -		if ($lb_tag){
    -			for (@{$lbmodules{lb}}){
    -				if ("lb.".$_ eq $module){
    -					$tag = '-r '.$lb_tag;
    -				}
    -			}	
    -		}
    -		if ($lbjp_tag){
    -			for (@{$lbmodules{'lbjp-common'}}){
    -				if ("lbjp-common.".$_ eq $module){
    -                                        $tag = '-r '.$lbjp_tag;
    -                                }
    -			}
    -		}
    -		if ($jp_tag){
    -			for (@{$lbmodules{'jp'}}){
    -	                        if ("jp.".$_ eq $module){
    -                                        $tag = '-r '.$jp_tag;
    -	                        }
    -                        }
    -		}
    -		if ($sec_tag){
    -			for (@{$lbmodules{security}}){
    -				if ("security.".$_ eq $module){
    -                                        $tag = '-r '.$sec_tag;
    -                                }
    -			}
    -		}
    -		if ($jobid_tag){
    -			for (@{$lbmodules{jobid}}){
    -				if ("jobid.".$_ eq $module){
    -                                        $tag = '-r '.$jobid_tag;
    -                                }
    -			}
    -		}
    -		#if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){
    -		#	print "found";
    -		#}
    -		$_ = full($_);
    -		print "\n*** Checking out $_\n";
    -		system("cvs checkout  $tag $_") == 0 or die "cvs checkout $tag $_: $?\n";
    -	}
    -}
    -
    -BEGIN{
    -%need_externs_aux = (
    -	'lb.client' => [ qw/cppunit:B classads/ ],
    -	'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava/ ],
    -	'lb.common' => [ qw/expat cares:B cppunit:B classads/ ],
    -	'lb.doc' => [],
    -	'lb.logger' => [ qw/cppunit:B/ ],
    -	'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ],
    -	'lb.state-machine' => [ qw/classads/ ],
    -	'lb.utils' => [ qw/cppunit:B/ ],
    -	'lb.ws-interface' => [],
    -	'lb.ws-test' => [ qw/gsoap:B/ ],
    -	'lb.types' => [ qw// ],
    -	'lb.harvester' => [ qw// ],
    -	'lb.yaim' => [ qw/yaim_core:R/ ],
    -	'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ],
    -	'lbjp-common.db' => [ qw/mysql:B mysql-devel:B postgresql:B/ ],
    -	'lbjp-common.log' => [ qw/log4c/ ],
    -	'lbjp-common.maildir' => [ qw// ],
    -	'lbjp-common.server-bones' => [ qw// ],
    -	'lbjp-common.trio' => [ qw/cppunit:B/ ],
    -	'lbjp-common.jp-interface' => [ qw/cppunit:B log4c:B/ ],
    -	'security.gss' =>  [ qw/globus_essentials:R globus:B cares cppunit:B/ ],
    -	'security.gsoap-plugin' =>  [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap:B/ ],
    -	'jobid.api-c' =>  [ qw/cppunit:B/ ],
    -	'jobid.api-cpp' =>  [ qw/cppunit:B/ ],
    -	'jobid.api-java' =>  [ qw/ant:B jdk:B/ ],
    -	'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ],
    -        'jp.doc' => [],
    -        'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ],
    -        'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ],
    -        'jp.server-common' => [],
    -        'jp.ws-interface' => [],
    -);
    -
    -for my $ext (keys %need_externs_aux) {
    -	for (@{$need_externs_aux{$ext}}) {
    -		/([^:]*)(?::(.*))?/;
    -		push @{$need_externs{$ext}},$1;
    -		my $type = $2 ? $2 : 'BR';
    -		$need_externs_type{$ext}->{$1} = $type;
    -	}
    -}
    -
    -%need_jars = (
    -	'jobid.api-java' => [ qw/commons-codec/ ],
    -	'lb.client-java' => [ qw/commons-lang/ ],
    -);
    -
    -for my $jar (keys %need_jars) {
    -	for (@{$need_jars{$jar}}) {
    -		$need_externs_type{$jar}->{$_} = 'BR'; 	# XXX
    -	}
    -}
    -
    -%deps_aux = (
    -	'lb.client' => [ qw/
    -		lb.types:B lb.common
    -		lbjp-common.trio
    -		jobid.api-cpp:B jobid.api-c
    -		security.gss
    -	/ ],
    -	'lb.client-java' => [ qw/
    -		lb.types:B
    -		lb.ws-interface:B
    -		jobid.api-java
    -	/ ],
    -	'lb.common' => [ qw/
    -		jobid.api-cpp:B jobid.api-c
    -		lb.types:B lbjp-common.trio security.gss
    -	/ ],
    -	'lb.doc' => [ qw/lb.types:B/ ],
    -	'lb.logger' => [ qw/
    -		lbjp-common.trio
    -		lbjp-common.log
    -		jobid.api-c
    -		lb.common
    -		security.gss
    -	/ ],
    -	'lb.server' => [ qw/
    -		lb.ws-interface lb.types:B lb.common lb.state-machine
    -		lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log
    -		jobid.api-c
    -		security.gsoap-plugin security.gss
    -	/ ],
    -	'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ],
    -	'lb.utils' => [ qw/
    -		lbjp-common.jp-interface
    -		jobid.api-c
    -		lbjp-common.trio lbjp-common.maildir
    -		lb.client lb.state-machine
    -	/ ],
    -	'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ],
    -	'lb.ws-interface' => [ qw/lb.types:B/ ],
    -	'lb.types' => [ qw// ],
    -	'lb.harvester' => [ qw/
    -		jobid.api-c lbjp-common.trio lbjp-common.db lb.common lb.client
    -		security.gss lbjp-common.log
    -	/ ],
    -	'lb.yaim' => [ qw// ],
    -	'lb.glite-LB' => [ qw/
    -		lb.logger:R lb.server:R lb.utils:R lb.doc:R
    -		lb.ws-test:R lb.harvester:R lb.yaim:R
    -	/ ],
    -	'lbjp-common.db' => [ qw/lbjp-common.trio lbjp-common.log/ ],
    -	'lbjp-common.maildir' => [ qw// ],
    -	'lbjp-common.server-bones' => [ qw/lbjp-common.log/ ],
    -	'lbjp-common.trio' => [ qw// ],
    -	'security.gss' =>  [ qw// ],
    -	'security.gsoap-plugin' =>  [ qw/security.gss/ ],
    -	'jobid.api-c' =>  [ qw// ],
    -	'jobid.api-cpp' =>  [ qw/jobid.api-c/ ],
    -	'jobid.api-java' =>  [ qw// ],
    -
    -	'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ],
    -
    -	'jp.client' => [ qw/
    -                jp.ws-interface
    -                lbjp-common.jp-interface lbjp-common.maildir
    -                jobid.api-c
    -                security.gsoap-plugin
    -        / ],
    -	'jp.doc' => [ qw// ],
    -	'jp.index' => [ qw/
    -                jp.server-common jp.ws-interface
    -                lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones
    -                security.gsoap-plugin
    -        / ],
    -	'jp.primary' => [ qw/
    -                jobid.api-c
    -                jp.server-common jp.ws-interface
    -                lb.state-machine
    -                lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones
    -                security.gsoap-plugin
    -        / ],
    -	'jp.server-common' => [ qw/ 
    -                lbjp-common.jp-interface lbjp-common.db
    -        / ],
    -	'jp.ws-interface' => [ qw// ],
    -);
    -
    -for my $ext (keys %deps_aux) {
    -	for (@{$deps_aux{$ext}}) {
    -		/([^:]*)(?::(.*))?/;
    -		push @{$deps{$ext}},$1;
    -		my $type = $2 ? $2 : 'BR';
    -		$deps_type{$ext}->{$1} = $type;
    -	}
    -}
    -
    -
    -%extrafull = ( gridsite=>'org.gridsite.core');
    -
    -#( java => 'client-java' );
    -%extranodmod = (
    -	db => 'lbjp-common.db',
    -	jpprimary => 'jp.primary',
    -	jpindex => 'jp.index',
    -	jpclient => 'jp.client',
    -);
    -
    -%obsoletes = (
    -	'lb.yaim' => [ qq/glite-yaim-lb/ ],
    -);
    -
    -my @t = qw/lb.client-java jobid.api-java lb.types/;
    -@topbuild{@t} = (1) x ($#t+1);
    -}
    -
    -sub full
    -{
    -	my $short = shift;
    -	return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short;
    -}
    -
    -sub mkinc
    -{
    -	my %aux;
    -	undef %aux;
    -	my @m=qw/
    -lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB
    -security.gss security.gsoap-plugin
    -jobid.api-c jobid.api-cpp jobid.api-java
    -lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface
    -jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface
    -/;
    -	@aux{@m} = (1) x ($#m+1);
    -
    -	my $short = shift;
    -	my $full = full $short;
    -
    -	unless ($aux{$short}) {
    -		print "Makefile.inc not needed in $full\n";
    -		return;
    -	}
    -
    -	my $build = '';
    -	
    -	unless ($topbuild{$_}) {
    -		$build = '/build';
    -		unless (-d "$full/build") {
    -			mkdir "$full/build" or die "mkdir $full/build: $!\n";
    -		}
    -		unlink "$full/build/Makefile";
    -		symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n";
    -	}
    -
    -	open MKINC,">$full$build/Makefile.inc"
    -		or die "$full$build/Makefile.inc: $!\n";
    -
    -	print "Creating $full$build/Makefile.inc\n";
    -
    -	print MKINC qq{
    -PREFIX = $prefix
    -stagedir = $stagedir
    -thrflavour = $thrflavour
    -nothrflavour = $nothrflavour
    -libdir = $libdir
    -};
    -
    -	for (@{$need_externs{$short}}) {
    -		print MKINC "${_}_prefix = $extern_prefix{$_}\n"
    -	}
    -
    -	for (@{$need_jars{$short}}) {
    -		print MKINC "${_}_jar = $jar{$_}\n"
    -	}
    -
    -	my $need_gsoap = 0;
    -	for (@{$need_externs{$short}})  { $need_gsoap = 1 if $_ eq 'gsoap'; }
    -
    -	print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
    -
    -	close MKINC;
    -}
    -
    -my %etics_externs;
    -my %etics_projects;
    -BEGIN{
    -	%etics_externs = (
    -		globus_essentials=>'vdt_globus_essentials',
    -		globus=>'globus',
    -		cares=>'c-ares',
    -		voms=>'org.glite.security.voms-api-cpp',
    -		gridsite=>'org.gridsite.shared',
    -		lcas=>'org.glite.security.lcas',
    -		trustmanager=>'org.glite.security.trustmanager',
    -		utiljava=>'org.glite.security.util-java',
    -		gpt=>'gpt',
    -		fetchcrl=>'fetch-crl',
    -		gip_release=>'glite-info-provider-release',
    -		gip_service=>'glite-info-provider-service',
    -		bdii=>'bdii',
    -		glite_version=>'glite-version',
    -		glite_info_templates=>'glite-info-templates',
    -		glue_schema=>'glue-schema',
    -		yaim_core=>'org.glite.yaim.core',
    -	);
    -	%etics_projects = (
    -		vdt=>[qw/globus globus_essentials/],
    -		'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/],
    -	);
    -};
    -
    -sub mode_etics {
    -	$fmod = shift;
    -
    -	die "$0: --module required with --etics\n" unless $fmod;
    -	
    -	my ($subsys,$module) = split /\./,$fmod;
    -
    -	my ($major,$minor,$rev,$age);
    -
    -	if ($version) {
    -		$version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
    -		($major,$minor,$rev,$age) = ($1,$2,$3,$4);
    -	}
    -	else { 
    -		open V,"org.glite.$subsys.$module/project/version.properties"
    -			or die "org.glite.$subsys.$module/project/version.properties: $!\n";
    -	
    -		while ($_ = ) {
    -			chomp;
    -			($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/;
    -			$age = $1 if /module\.age\s*=\s*([[:digit:]]+)/;
    -		}
    -		close V;
    -	}
    -
    -	my @copts = ();
    -	my %ge;
    -	@ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1);
    -
    -	for (@{$need_externs{"$subsys.$module"}}) {
    -	    if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) {
    -		my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
    -		push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}";
    -	    }
    -	}
    -
    -	for (@{$need_jars{"$subsys.$module"}}) {
    -		my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
    -
    -		push @copts,"--with-$_ \${$eext.location}/$_*.jar";
    -	}
    -
    -	my $conf;
    -	my $conftag;
    -
    -	if ($branch) {
    -		$conf = "glite-${subsys}-${module}_$branch"; 
    -		$conftag = $branch; 
    -		$dwpath = ""; }
    -	else {
    -		$conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
    -		$conftag = $conf; 
    -		$dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n"; }
    -#	my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}";
    -	my $file = $output ? $output : "$conf.ini";
    -	open C,">$file" or die "$file: $!\n";
    -
    -	my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build";
    -
    -	my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..';
    -
    -	my $package_description = "";
    -	my $package_summary = "";
    -
    -	if (-e "org.glite.$subsys.$module/project/package.description") {
    -		open V, "org.glite.$subsys.$module/project/package.description";
    -		$package_description = join ("", );
    -		close V;
    -		chomp $package_description;
    -		$package_description =~ s/\n/\\n/g; 
    -		$package_description = "package.description = $package_description";
    -	} 
    -	else { 
    -		print STDERR "package.description not found for $subsys.$module!\n"; }
    -
    -	if (-e "org.glite.$subsys.$module/project/package.summary") {
    -		open V, "org.glite.$subsys.$module/project/package.summary";
    -		$package_summary = join ("", );
    -		close V;
    -		chomp $package_summary;
    -		$package_summary =~ s/\n/\\n/g; 
    -		$package_summary = "package.summary = $package_summary";
    -	} 
    -	else { 
    -		print STDERR "package.summary not found for $subsys.$module!\n"; }
    -
    -
    -	print STDERR "Writing $file\n";
    -	print C qq{
    -[Configuration-$conf]
    -profile = None
    -moduleName = org.glite.$subsys.$module
    -displayName = $conf
    -description = org.glite.$subsys.$module
    -projectName = org.glite
    -age = $age
    -deploymentType = None
    -tag = $conftag
    -version = $major.$minor.$rev
    -$dwpath
    -[Platform-default:VcsCommand]
    -displayName = None
    -description = None
    -tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName}
    -branch = None
    -commit = None
    -checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName}
    -
    -[Platform-default:BuildCommand]
    -postpublish = None
    -packaging = None
    -displayName = None
    -description = None
    -doc = None
    -prepublish = None
    -publish = None
    -compile = make
    -init = None
    -install = make install
    -clean = make clean
    -test = make check
    -configure = cd $confdir && /usr/bin/perl \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts
    -checkstyle = None
    -
    -[Platform-default:Property]
    -$buildroot
    -$package_description
    -$package_summary
    -};
    -	for (@{$obsoletes{"$subsys.$module"}}) {
    -		print C "package.obsoletes = $_\n";
    -		print C "package.replaces = $_\n";
    -	}
    -
    -	print C qq{
    -[Platform-default:DynamicDependency]
    -};
    -	for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) {
    -		my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
    -
    -		my $proj = 'externals';
    -		for my $p (keys %etics_projects) {
    -			for $m (@{$etics_projects{$p}}) {
    -				$proj = $p if $m eq $_;
    -			}
    -		}
    -
    -		my $type = $need_externs_type{"$subsys.$module"}->{$_};
    -		print C "$proj|$eext = $type\n";
    -	}
    -
    -	for (@{$deps{"$subsys.$module"}}) {
    -		my $type = $deps_type{"$subsys.$module"}->{$_};
    -		print C "org.glite|org.glite.$_ = $type\n";
    -	}
    -
    -	close C;
    -}
    -
    -sub gsoap_version {
    -	local $_;
    -	my $gsoap_version;
    -	open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n";
    -
    -	while ($_ = ) {
    -		chomp;
    -
    -		$gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/;
    -	}
    -	close S;
    -	return $gsoap_version;
    -}
    -
    -sub getlibdir {
    -	if ( -e "/etc/debian_version") { # We are on Debian
    -		$lib64="lib";
    -		$lib32="lib32";	}
    -	else { # Another distribution
    -		$lib64="lib64";
    -		$lib32="lib";	}
    -        $libdir=$lib32;
    -
    -        open INP, "uname -s | "; # Check kernel name
    -        $kname= ;
    -        chomp($kname);
    -        close INP;
    -
    -        if ( $kname == "Linux") {
    -                $arch = ("x86_64\npowerpc\nppc64\n");
    -
    -                open INP, "uname -p | "; # Check processor type
    -                $procname= ;
    -                chomp($procname);
    -                close INP;
    -
    -                if ($arch =~/^$procname\n/) {
    -                        return ($lib64); }
    -
    -                open INP, "uname -m | "; # Check machine hardware
    -                $machname= ;
    -                chomp($machname);
    -                close INP;
    -
    -                if ($arch =~/^$machname\n/) {
    -                        return ($lib64); }
    -
    -                # special cases (hyperlink lib64, Debian)
    -                if (-l "/usr/lib64") {
    -                        $libdir=$lib32; }
    -
    -                # if /usr/lib64 doesn't exist at all (AIX)
    -                unless ( -e "/usr/lib64" ) {
    -                        $libdir=$lib32; }
    -        }
    -
    -        if ( $kname == "SunOS") {
    -                if (-e "/usr/lib/64") {
    -                $libdir="lib/64"; }
    -        }
    -
    -        return $libdir;
    -}
    -
    -sub usage {
    -	my @ext = keys %extern_prefix;
    -	my @myjars, keys %jar;
    -
    -	print STDERR qq{
    -usage: $0 options
    -
    -General options (defaults in []):
    -  --prefix=PREFIX		destination directory [./stage]
    -  --staged=module,module,...	what is already in PREFIX (specify without org.glite.)
    -  --thrflavour=flavour
    -  --nothrflavour=flavour	threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg]
    -  --listmodules=subsys          list modules of a subsystem
    -  --libdir=libdir		typically [lib,lib64] postfix
    -  
    -Mode of operation:
    -  --mode={checkout|build|etics}	what to do [build]
    -  
    -What to build:
    -  --module=module		build this module only (mostly in-Etics operation)
    -  --enable-NODE			build this "node" (set of modules) only. Available nodes are
    -					@{$lbmodules{lb}},@{$lbmodules{security}}
    -  --disable-NODE		don't build this node
    -  --lb-tag=tag			checkout LB modules with specific tag
    -  --jp-tag=tag			checkout JP modules with specific tag
    -  --lbjp-common-tag=tag         checkout lbjp-common modules with specific tag
    -  --security-tag=tag		checkout security modules with specific tag
    -  --jobid-tag=tag		checkout jobid modules with specific tag
    -
    -Dependencies:
    -  --with-EXTERNAL=PATH		where to look for an external. Required externals
    - 				(not all for all modules) are:
    -					@ext
    -  --with-JAR=JAR		where to look for jars. Required jars are:
    -					@myjars
    -				Summary of what will be used is always printed
    -
    -};
    -
    -}
    diff --git a/org.glite.lb.harvester/doc/INSTALL b/org.glite.lb.harvester/doc/INSTALL
    deleted file mode 100644
    index f5ff9c9..0000000
    --- a/org.glite.lb.harvester/doc/INSTALL
    +++ /dev/null
    @@ -1,42 +0,0 @@
    -Requirements
    -============
    -
    -1) gLite
    -- client L&B libraries:
    -  - glite-jobid-api-c
    -  - glite-lb-common
    -  - glite-lb-client
    -  - glite-security-gss
    -  - globus essential libraries (threaded flavour),
    -    use the vesion with the external SSL, not with bundled SSL (!)
    - - glite-lbjp-common-db (build only)
    - - mysql-devel (build only)
    -2) postgresql-devel
    -
    -
    -Steps
    -=====
    -
    -./configure
    -make
    -make install
    -
    -Use './configure --help' for the options.
    -
    -
    -Manual way
    -==========
    -
    -configure is simple script generating Makefile.inc. You can build harvester
    -straight away by make defining the variables manually. For example with gLite
    -installed in ~/glite/stage:
    -
    -(rm Makefile.inc)
    -make stagedir=$HOME/glite/stage
    -
    -
    -Testing
    -=======
    -
    -Test for basic functionality covered by 'test.sh' script in sources.
    -See './test.sh --help'.
    diff --git a/org.glite.lb.harvester/doc/README b/org.glite.lb.harvester/doc/README
    deleted file mode 100644
    index f1c393d..0000000
    --- a/org.glite.lb.harvester/doc/README
    +++ /dev/null
    @@ -1,81 +0,0 @@
    -Introduction
    -============
    -
    -L&B Harvester gathers information about jobs from L&B servers using effective
    -L&B notification mechanism. It manages notifications and keeps them in
    -a persistent storage (file or database table) to reuse later on next launch.
    -It takes care about refreshing notifications and queries L&B servers back when
    -some notification on expires.
    -
    -The tool was initially written for Real Time Monitor (project at Imperial
    -College in London), later was extended with messaging mechanism for WLCG.
    -
    -
    -Requirements
    -============
    -
    -- lastUpdateTime index on L&B servers
    -- harvester identity in super users file on L&B servers
    -
    -
    -Launch (with msg-publish sending messages)
    -=========================================
    -
    -Harvester is sending notifications via msg-publish infrastructure. List of the
    -L&B server to harvest is specified via -c option.
    -
    -1) with newer LB 2.0 servers:
    -
    -  glite-lb-harvester -c servers.txt -C certfile -K keyfile --wlcg
    -
    -2) with older LB servers (backward compatible but greedy notifications):
    -
    -  glite-lb-harvester -c servers.txt -C certfile -K keyfile --wlcg --old
    -
    -Custom configuration of messaging:
    -	--wlcg-binary $HOME/bin/msg-publish
    -	--wlcg-topic org.wlcg.usage.JobStatus2
    -	--wlcg-config $HOME/etc/msg-publish.conf.wlcg
    -
    -
    -Launch (Real Time Monitor and storing to the database)
    -======================================================
    -
    -Harvester is using postgres database. Table 'lb20' with L&B servers to
    -harvest (read-only), table 'jobs' with result job states (read/write). It's
    -possible to specify L&B servers list by file instead of 'lb20' table,
    -via -c option.
    -
    -  glite-lb-harvester -C certfile -K keyfile --pg rtm/@:rtm
    -
    -The connection string after '--pg' is in format:
    -  USER/PASSWORD@HOST:DATABASE
    -Database schema in 'test.sql'.
    -
    -
    -Other recommended options
    -=========================
    -
    -Use 'glite-lb-harvester --help' for additional options.
    -
    -For example:
    - - deamonizing and using syslog:
    -	'--daemonize --pidfile /var/run/glite-lb-harvester.pid'
    - - decreasing verbosity:
    -	'-d 2' (2 for errors and warnings only)
    -
    -
    -Stop
    -====
    -
    -In non-daemon mode CTRL-C can be used, in daemon mode using specified
    -pidfile:
    -
    - kill `cat /var/run/glite-lb-harvester.pid`
    -
    -pidfile will vanish after exit.
    -
    -All notifications are preserved on LB servers, and will expire later. You can
    -purge them now, if they won't be needed:
    -
    - glite-lb-harvester --cleanup
    diff --git a/org.glite.lb.harvester/doc/glite-lb-harvester.sgml b/org.glite.lb.harvester/doc/glite-lb-harvester.sgml
    deleted file mode 100644
    index 5d9f75a..0000000
    --- a/org.glite.lb.harvester/doc/glite-lb-harvester.sgml
    +++ /dev/null
    @@ -1,480 +0,0 @@
    -
    -
    -
    -
    -	
    -		glite-lb-harvester
    -		1
    -		EU EGEE Project
    -	
    -
    -	
    -		glite-lb-harvester
    -		daemon for processing L&B notifications
    -	
    -
    -	
    -		
    -			glite-lb-harvester
    -
    -			
    -				-h
    -				--help
    -			
    -
    -			
    -				-v
    -				--version
    -			
    -
    -			
    -				-d
    -				--debug
    -			 LEVEL
    -
    -			
    -				-D
    -				--daemon
    -			
    -
    -			
    -				-i
    -				--pidfile
    -			 PIDFILE
    -
    -			
    -				-s
    -				--threads
    -			 N
    -
    -			
    -				-t
    -				--ttl
    -			 TIME
    -
    -			
    -				-H
    -				--history
    -			 TIME
    -
    -			
    -				-c
    -				--config
    -			
    -
    -			
    -				-m
    -				--pg
    -			 USER/PWD@SERVER:DBNAME
    -
    -			
    -				-n
    -				--notifs
    -			 FILE
    -
    -			
    -				-p
    -				--port
    -			 PORT
    -
    -			
    -				-C
    -				--cert
    -			 FILE
    -
    -			
    -				-K
    -				--key
    -			 FILE
    -
    -			
    -				-o
    -				--old
    -			
    -
    -			
    -				-l
    -				--cleanup
    -			
    -
    -			
    -				-u
    -				--no-purge
    -			
    -
    -			
    -				-w
    -				--wlcg
    -			
    -
    -			
    -				--wlcg-binary
    -			 EXECUTABLE
    -
    -			
    -				--wlcg-topic
    -			 TOPIC
    -
    -			
    -				--wlcg-config
    -			 FILENAME
    -
    -			
    -				--wlcg-flush
    -			
    -		
    -	
    -
    -	
    -		DESCRIPTION
    -		
    -L&B Harvester gathers information about jobs from L&B servers using efficient
    -L&B notification mechanism. It manages notifications and keeps them in
    -a persistent storage (file or database table) to reuse later on next launch.
    -It takes care about refreshing notifications and queries L&B servers back when
    -some notification expires.
    -
    -The tool was initially written for Real Time Monitor (project at Imperial
    -College in London), later was extended by MSG publish messaging mechanism for WLCG.
    -		
    -	
    -
    -	
    -		Requirements
    -		
    -It is required on L&B servers side:
    -			
    -				
    -lastUpdateTime index, see "Changing Index Configuration" section in L&B Admin Guide
    -				
    -				
    -L&B harvester identity (certification subject) in super users file
    -				
    -			
    -		
    -	
    -
    -	
    -		OPTIONS
    -	
    -		
    -			
    -				|
    -				
    -Print short usage.
    -				
    -			
    -		
    -
    -		
    -			
    -			|
    -			
    -Print harvester version identifier.
    -			
    -			
    -
    -			
    -			|
    -			
    -			Verbosity level:
    -				
    -					0error only
    -					1warnings
    -					2info/progress
    -					3debug
    -					4insane
    -					+8 (8,9,10,11,12)don't fork and no preventive restarts
    -				
    -			
    -			
    -
    -			
    -			|
    -			
    -Daemonize and detach from console. Error messages are directed to syslog.
    -			
    -			
    -
    -			
    -			|
    -			
    -The file with process ID. Automatically removed on shutdown.
    -			
    -			
    -
    -			
    -			|
    -			
    -Number of threads (slaves). Configured L&B servers are equally distributed between threads.
    -			
    -			
    -
    -			
    -			|
    -			
    -Validity (time to live) of the notifications. Daemon regularly refreshes notification in advance as needed.
    -			
    -			
    -
    -			
    -			|
    -			
    -Historic dive limit in seconds. <= means unlimited.
    -			
    -			When staring, the L&B harvester queries the L&B servers for existing jobs. It queries L&B server when notification expires too and can't be refreshed on time. This parameter is used for limit, how deep into history L&B harvester should go.
    -			
    -			Another usage of this parameter is for derivation of the maximal time of retries. When some L&B server is inaccessible or it is in error condition, harvester linearly increases retry time. The maximal retry time is half of this parameter.
    -			
    -			
    -
    -			
    -			|
    -			
    -			Config file name with list of L&B servers. When used together with database option  (), this parameter has precedence before lb20 table.
    -				
    -			
    -
    -			
    -				|
    -				
    -Database connection string in the USER/PWD@SERVER:DBNAME form. There are used following tables in database:
    -					
    -						
    -	lb20 - the list of L&B servers is taken from this table. But when is specified option  () too, the file has precedence before this table.
    -						
    -There is kept a column monitored in too: if there is any inactive notification because of errors on given L&B server (one expired or it was unable to create a new one), the false value is set. After refreshing or creating the notification, the value is set back to true.
    -						
    -						
    -	jobs - table for storing job states. Each record is updated for each incoming notification - when state of the job changes in L&B server.
    -						
    -					
    -Database schema can be found in source code of org.glite.lb.harvester: examples/test.sql
    -					
    -Developer note: information about notifications are kept in a file. It is possible to compile a binary keeping states in the database. It is used in the test in examples source directory.
    -				
    -			
    -
    -			
    -				|
    -				
    -File for internal usage in L&B harvester. There is kept persistent information about active notifications or errors on L&B servers. Default is /var/tmp/notifs.txt.
    -				
    -			
    -
    -			
    -				|
    -				
    -Specifies the port for listening and requests L&B nodes to send notification messages only to this port. May be needed for networks behind NAT or behind firewalls.
    -				
    -			
    -
    -			
    -				|
    -				
    -X509 certificate file.
    -				
    -			
    -
    -			
    -				|
    -				
    -X509 key file.
    -				
    -			
    -
    -			
    -				|
    -				
    -"silly" mode for L&B servers < 2.0. In this mode transfer of the notification is not optimized at all. On the other hand it will work with older L&B servers.
    -				
    -			
    -
    -			
    -				|
    -				
    -Cleans up all active notifications and quits.
    -				
    -Each  notification automatically expires. But if you know, than notifications used in previous run of L&B harvester won;t be needed, it is recommended to clean up the notifications and spare the resources on L&B servers (queue with undelivered notification messages and matching rules).
    -				
    -			
    -
    -			
    -				|
    -				
    -By default jobs are purged from local database when purged on L&B server. This option forces keeping all jobs in database, only with changed state to 'Purged'.
    -				
    -For using together with  ().
    -				
    -			
    -
    -			
    -				|
    -				
    -Enables delivery to MSG publish. Messages are sent by executing a binary with proper parameters.
    -				
    -			
    -
    -			
    -				
    -				
    -Full path to msg-publish binary executable, which is called for sending messages. Default is /usr/bin/msg-publish.
    -				
    -			
    -
    -			
    -				
    -				
    -Topic used in MSG publish messages. Default is org.wlcg.usage.jobStatus.
    -				
    -			
    -
    -			
    -				
    -				
    -Config file used in MSG publish. Default is /etc/msg-publish/msg-publish.conf.
    -				
    -			
    -
    -			
    -				
    -				
    -Messages are sent to MSG publish in batches by default. This option enforce sending the messages one by one on each notification from L&B server - for each job state change.
    -				
    -			
    -
    -		
    -	
    -
    -	
    -		ENVIRONMENT
    -
    -		
    -			
    -				GLITE_LB_HARVESTER_NO_REMOVE
    -				
    -0 or false instructs L&B harvester to not remove temporary files with sent messages for MSG publish. By default temporary files with successfully sent messages are removed. Files with failed messages are always preserved.
    -				
    -Intended for debugging purposes.
    -				
    -			
    -		
    -	
    -
    -	
    -		EXAMPLES
    -
    -		
    -			MSG publish infrastructure
    -			
    -Harvester will send notifications using msg-publish infrastructure. List of the L&B servers to harvest is specified in config file specified by  option:
    -			
    -			
    -				
    -					glite-lb-harvester -c servers.txt -C certfile -K keyfile --wlcg
    -					
    -With newer L&B servers >= 2.0.
    -					
    -				
    -				
    -					glite-lb-harvester -c servers.txt -C certfile -K keyfile --wlcg --old
    -					
    -With older L&B servers < 2.0 (backward compatible but greedy notifications).
    -					
    -				
    -			
    -
    -			
    -Custom configuration examples for MSG publish:
    -				
    -					
    - $HOME/bin/msg-publish
    -					
    - org.wlcg.usage.JobStatus2
    -					
    - $HOME/etc/msg-publish.conf.wlcg
    -					
    -				
    -			
    -		
    -
    -		
    -			Real Time Monitor
    -			
    -Harvester will use postgres database. Table lb20 with L&B servers to harvest (read-only), table jobs for result job states (read/write):
    -			
    -			
    -				
    -					glite-lb-harvester -C certfile -K keyfile --pg rtm/@:rtm -p 9004
    -					
    -In this case the L&B harvester will connect to database rtm on localhost as user rtm. For incoming notification it will request and listen only on port 9004.
    -					
    -				
    -			
    -		
    -
    -		
    -			Other recommended options
    -			
    -Use glite-lb-harvester --help for the whole summary.
    -			
    -For example:
    -				
    -					
    -						
    -						
    -Daemonizing and using syslog.
    -						
    -					
    -
    -					
    -						
    -						
    -Decreasing verbosity (2 for errors and warnings only).
    -						
    -					
    -				
    -			
    -		
    -	
    -
    -	
    -		EXIT
    -		
    -In non-daemon mode CTRL-C can be used.
    -		
    -Use the pidfile in daemon mode (pidfile will vanish after exit):
    -		
    -kill `cat /var/run/glite-lb-harvester.pid`
    -		
    -All notifications are preserved on LB servers, and will expire later. You can
    -purge them at once, if they won't be needed:
    -		
    -glite-lb-harvester --cleanup
    -		
    -	
    -
    -	
    -		EXIT STATUS
    -		
    -			
    -				0
    -				Success.
    -			
    -			
    -				1
    -				Reloading, used only internally for preventive restarts.
    -			
    -			
    -				2
    -				Error occurred. Messages go on console (foreground run) or into syslog (daemon run), depending on verbosity.
    -			
    -		
    -	
    -
    -	
    -		AUTHOR
    -		gLite L&B product team, CESNET.
    -	
    -
    -
    diff --git a/org.glite.lb.harvester/examples/test.sh b/org.glite.lb.harvester/examples/test.sh
    deleted file mode 100755
    index b9130f1..0000000
    --- a/org.glite.lb.harvester/examples/test.sh
    +++ /dev/null
    @@ -1,898 +0,0 @@
    -#! /bin/sh
    -#
    -# Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -# See http://www.eu-egee.org/partners for details on the copyright holders.
    -# 
    -# Licensed under the Apache License, Version 2.0 (the "License");
    -# you may not use this file except in compliance with the License.
    -# You may obtain a copy of the License at
    -# 
    -#     http://www.apache.org/licenses/LICENSE-2.0
    -# 
    -# Unless required by applicable law or agreed to in writing, software
    -# distributed under the License is distributed on an "AS IS" BASIS,
    -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -# See the License for the specific language governing permissions and
    -# limitations under the License.
    -#
    -
    -
    -usage() {
    -cat <&1| \
    -				grep timeleft| sed 's/^.* //'`
    -			if [ "$timeleft" = "0:00:00" -o -z "$timeleft" ]; then 
    -				echo "Proxy certificate check failed."\
    -				" Aborting."
    -				exit 1
    -			fi
    -		else
    -			echo "Can't check proxy cert (grid-proxy-info not found). If you do not have valid proxy certificate, set GLITE_HOST_KEY/GLITE_HOST_KEY - otherwise tests will fail!"
    -		fi
    -#	fi
    -	identity=`X509_USER_KEY=${X509_USER_KEY} X509_USER_CERT=${X509_USER_CERT} $GLOBUS_LOCATION/bin/grid-proxy-info 2>&1| \
    -		grep identity| sed 's/^[^/]*//'`
    -
    -	if [ -z "$GLITE_LB_TEST_DB" ]; then
    -		GLITE_LB_TEST_DB="lbserver/@localhost:lbserver20test"
    -       		need_new_lb_db=1;
    -	fi
    -	DB_USER=`echo $GLITE_LB_TEST_DB| sed 's!/.*$!!'`
    -	DB_HOST=`echo $GLITE_LB_TEST_DB| sed 's!^.*@!!' | sed 's!:.*!!'`
    -	DB_NAME=`echo $GLITE_LB_TEST_DB| sed 's!^.*:!!'`
    -	MYSQL_ARGS="-u ${GLITE_MYSQL_ROOT_USER:-root}"
    -	[ -z "$GLITE_MYSQL_ROOT_PASSWORD" ] || MYSQL_ARGS="--password=${GLITE_MYSQL_ROOT_PASSWORD} $MYSQL_ARGS"
    -
    -	if [ -z "$GLITE_RTM_TEST_DB" ]; then
    -		GLITE_RTM_TEST_DB="rtm/@localhost:rtmtest"
    -       		need_new_rtm_db=1;
    -	fi
    -	RTM_USER=`echo $GLITE_RTM_TEST_DB| sed 's!/.*$!!'`
    -	RTM_HOST=`echo $GLITE_RTM_TEST_DB| sed 's!^.*@!!' | sed 's!:.*!!'`
    -	RTM_NAME=`echo $GLITE_RTM_TEST_DB| sed 's!^.*:!!'`
    -	PG_ARGS="-U ${GLITE_PG_ROOT_USER:-postgres}"
    -
    -	#other stuff
    -	GLITE_LB_TEST_SERVER_PORT=${GLITE_LB_TEST_SERVER_PORT:-"10000"}
    -	GLITE_LB_TEST_PIDFILE=${GLITE_LB_TEST_PIDFILE:-"/tmp/glite-lb-test.pid"}
    -	GLITE_LB_NOTIF_IL_PIDFILE=${GLITE_LB_NOTIF_IL_PIDFILE:-"/tmp/glite-lb-notif-il-test.pid"}
    -	GLITE_LB_PROXY_IL_PIDFILE=${GLITE_LB_PROXY_IL_PIDFILE:-"/tmp/glite-lb-proxy-il-test.pid"}
    -	GLITE_RTM_TEST_PIDFILE=${GLITE_RTM_TEST_PIDFILE:-"/tmp/glite-rtm-test.pid"}
    -	GLITE_RTM_TEST_TTL=${GLITE_RTM_TEST_TTL:-"60"}
    -
    -	jobreg="$GLITE_LOCATION/examples/glite-lb-job_reg -m `hostname -f`:${GLITE_LB_TEST_SERVER_PORT} -s UserInterface"
    -	logev="$GLITE_LOCATION/bin/glite-lb-logevent -x -S `pwd`/LB/proxy.sockstore.sock -U localhost"
    -	purge="$GLITE_LOCATION/bin/glite-lb-purge"
    -	[ -x "$purge" ] || purge="$GLITE_LOCATION/sbin/glite-lb-purge"
    -	for dir in "$GLITE_LOCATION/examples" "`pwd`/../build" "`pwd`"; do
    -		if [ -x "$dir/glite-lb-harvester-dbg" ]; then
    -			rtm="$dir/glite-lb-harvester-dbg"
    -		fi
    -		if [ -x "$dir/harvester-dbg" ]; then
    -			rtm="$dir/harvester-dbg"
    -		fi
    -	done
    -	if [ -z "$rtm" ]; then
    -		echo "glite-lb-harvester-dbg not found"
    -		return 1
    -	fi
    -
    -	if echo "$GLITE_RTM_TEST_ADDITIONAL_ARGS" | grep -- '[^-]\?\(--old\>\|-o\>\)' >/dev/null; then
    -		n_notifs=1
    -	else
    -		n_notifs=2
    -	fi
    -
    -	rm -f log
    -}
    -
    -
    -drop_db() {
    -return 0
    -	[ -z "$lb_db_created" ] || mysqladmin -f $MYSQL_ARGS drop "$DB_NAME"
    -	[ -z "$rtm_db_created" ] || dropdb $PG_ARGS "$RTM_NAME"
    -}
    -
    -
    -create_db() {
    -	echo -n "mysql."
    -	# create database when needed
    -	if [ "x$need_new_lb_db" = "x1" ]; then
    -		mysqladmin -f $MYSQL_ARGS drop $DB_NAME > /dev/null 2>&1
    -		echo -n "."
    -		mysqladmin -f $MYSQL_ARGS create $DB_NAME && \
    -		echo -n "."
    -		mysql $MYSQL_ARGS -e "GRANT ALL on $DB_NAME.* to $DB_USER@$DB_HOST" && \
    -		echo -n "."
    -		mysql -u $DB_USER $DB_NAME -h $DB_HOST < $GLITE_LOCATION/etc/glite-lb/glite-lb-dbsetup.sql || return $?
    -		echo -n "."
    -		mkdir -p `pwd`/LB
    -		cat > `pwd`/LB/glite-lb-index.conf << EOF
    -[
    -	JobIndices = {
    -		[ type = "system"; name = "lastUpdateTime" ]
    -	}
    -]
    -EOF
    -		LBDB="$GLITE_LB_TEST_DB" $GLITE_LOCATION/bin/glite-lb-bkindex -r `pwd`/LB/glite-lb-index.conf || return $?
    -		lb_db_created="1"
    -		echo -n "."
    -	else
    -		cleanup_mysql || return $?
    -	fi
    -	echo -n "OK psql."
    -	if [ "x$need_new_rtm_db" = "x1" ]; then
    -		dropdb $PG_ARGS "$RTM_NAME" >/dev/null 2>&1
    -		echo -n "."
    -#		createuser $PG_ARGS -A -D "$RTM_NAME" >/dev/null 2>&1
    -#		echo -n "."
    -		createdb $PG_ARGS --encoding "UTF-8" --owner "$RTM_USER" "$RTM_NAME" >psql-create.log 2>&1 || return $?
    -		rm psql-create.log
    -		echo -n "."
    -		rtm_db_created="1"
    -		echo "\i test.sql" | psql -AtF ',' -U "$RTM_USER" "$RTM_NAME" >/dev/null || return $?
    -		echo -n "."
    -	else
    -		cleanup_pg || return $?
    -	fi
    -	echo "OK"
    -}
    -
    -
    -cleanup_mysql() {
    -	cat << EOF | mysql -u $DB_USER $DB_NAME -h $DB_HOST || return $?
    -DELETE FROM acls;
    -DELETE FROM events;
    -DELETE FROM events_flesh;
    -DELETE FROM jobs;
    -DELETE FROM long_fields;
    -DELETE FROM notif_jobs;
    -DELETE FROM notif_registrations;
    -DELETE FROM server_state;
    -DELETE FROM short_fields;
    -DELETE FROM states;
    -DELETE FROM status_tags;
    -DELETE FROM users;
    -DELETE FROM zombie_jobs;
    -DELETE FROM zombie_prefixes;
    -DELETE FROM zombie_suffixes;
    -EOF
    -	echo -n "."
    -}
    -
    -
    -cleanup_pg() {
    -		cat << EOF | psql -AtF ',' -U "$RTM_USER" "$RTM_NAME" >/dev/null || return $?
    -DELETE FROM jobs;
    -DELETE FROM notifs;
    -EOF
    -	echo -n "."
    -}
    -
    -
    -run_daemons() {
    -	mkdir -p LB/dump LB/purge LB/voms 2>/dev/null
    -
    -	# checks
    -	if [ -f "${GLITE_LB_TEST_PIDFILE}" ]; then
    -		echo "L&B server already running (${GLITE_LB_TEST_PIDFILE}, `cat ${GLITE_LB_TEST_PIDFILE}`)"
    -		quit=1
    -	fi
    -	if [ -f "${GLITE_RTM_TEST_PIDFILE}" ]; then
    -		echo "L&B harvester already running (${GLITE_RTM_TEST_PIDFILE}, `cat ${GLITE_RTM_TEST_PIDFILE}`)"
    -		quit=1
    -	fi
    -	if [ -e "`pwd`/LB/notif.sock" ]; then
    -		if [ "`lsof -t $(pwd)/LB/notif.sock | wc -l`" != "0" ]; then
    -			echo "Notification interlogger already running (using LB/notif.sock, `lsof -t $(pwd)/LB/notif.sock`)"
    -			quit=1
    -		fi
    -	fi
    -	if [ -e "`pwd`/LB/proxy-il.sock" ]; then
    -		if [ "`lsof -t $(pwd)/LB/proxy-il.sock | wc -l`" != "0" ]; then
    -			echo "Proxy interlogger already running (using LB/proxy-il.sock, `lsof -t $(pwd)/LB/proxy-il.sock`)"
    -			quit=1
    -		fi
    -	fi
    -	[ -z "$quit" ] || exit 1
    -
    -	# run L&B server
    -	echo -n "L"
    -	X509_USER_KEY=${X509_USER_KEY} X509_USER_CERT=${X509_USER_CERT} \
    -	$GLITE_LOCATION/bin/glite-lb-bkserverd \
    -	  -m $GLITE_LB_TEST_DB \
    -	  -p $GLITE_LB_TEST_SERVER_PORT -w $(($GLITE_LB_TEST_SERVER_PORT + 3))\
    -	  -i ${GLITE_LB_TEST_PIDFILE} \
    -	  --withproxy -o `pwd`/LB/proxy.sock\
    -	  --proxy-il-sock `pwd`/LB/proxy-il.sock --proxy-il-fprefix `pwd`/LB/proxy-data \
    -	  -D `pwd`/LB/dump -S `pwd`/LB/purge \
    -	  -V `pwd`/LB/voms \
    -	  --notif-il-sock `pwd`/LB/notif.sock --notif-il-fprefix `pwd`/LB/notif-data \
    -	> `pwd`/LB/glite-lb-test-pre.log 2>&1
    -	if [ x"$?" != x"0" ]; then
    -		cat `pwd`/LB/glite-lb-test-pre.log
    -		echo FAILED
    -		drop_db;
    -		exit 1
    -	fi
    -	echo -n "B "
    -
    -	# run L&B interlogger
    -	echo -n "L"
    -	X509_USER_KEY=${X509_USER_KEY} X509_USER_CERT=${X509_USER_CERT} \
    -	$GLITE_LOCATION/bin/glite-lb-interlogd \
    -	  --file-prefix `pwd`/LB/proxy-data --socket `pwd`/LB/proxy-il.sock \
    -	  --pidfile $GLITE_LB_PROXY_IL_PIDFILE > `pwd`/LB/glite-interlog-test-pre.log 2>&1
    -	if [ x"$?" != x"0" ]; then
    -		cat `pwd`/LB/glite-interlog-test-pre.log
    -		echo FAILED
    -		kill_bkserver
    -		drop_db;
    -		exit 1
    -	fi
    -	echo -n "I "
    -
    -	# run L&B notification interlogger
    -	echo -n "N"
    -	X509_USER_KEY=${X509_USER_KEY} X509_USER_CERT=${X509_USER_CERT} \
    -	$GLITE_LOCATION/bin/glite-lb-notif-interlogd \
    -	  --file-prefix `pwd`/LB/notif-data --socket `pwd`/LB/notif.sock \
    -	  --pidfile $GLITE_LB_NOTIF_IL_PIDFILE > `pwd`/LB/glite-notif-test-pre.log 2>&1
    -	if [ x"$?" != x"0" ]; then
    -		cat `pwd`/LB/glite-notif-test-pre.log
    -		echo FAILED
    -		kill_daemons
    -		drop_db;
    -		exit 1
    -	fi
    -	echo -n "I "
    -
    -	if ! start_harvester; then
    -		kill_daemons;
    -		drop_db;
    -		exit 1
    -	fi
    -
    -	# wait for pidfiles
    -	i=0
    -	while [ ! -s "${GLITE_LB_TEST_PIDFILE}" -a $i -lt 20 ]; do
    -		sleep 0.1
    -		i=$(($i+1))
    -	done
    -	if [ ! -s "${GLITE_LB_TEST_PIDFILE}" ]; then
    -		echo "Can't startup L&B server."
    -		kill_daemons;
    -		drop_db;
    -		exit 1
    -	fi
    -
    -	echo -n "notifs."
    -	pg_wait 20 "SELECT refresh FROM notifs WHERE notifid IS NOT NULL" $n_notifs || return $?
    -	refresh=`echo "$result" | head -n 1`
    -	if [ -z "$refresh" ]; then
    -		echo "FAIL"
    -		return 1
    -	fi
    -}
    -
    -
    -start_harvester() {
    -	# run L&B harvester server
    -	echo -n "R"
    -	rm -Rf RTM
    -	mkdir RTM 2>/dev/null
    -	echo "`hostname -f`:${GLITE_LB_TEST_SERVER_PORT}" > `pwd`/RTM/config.txt
    -	X509_USER_KEY=${X509_USER_KEY} X509_USER_CERT=${X509_USER_CERT} \
    -	${rtm} \
    -	  -m $GLITE_RTM_TEST_DB \
    -	  --pidfile ${GLITE_RTM_TEST_PIDFILE} \
    -	  --ttl ${GLITE_RTM_TEST_TTL} \
    -	  --history $((GLITE_RTM_TEST_TTL / 2)) \
    -	  --debug 12 \
    -	  --config `pwd`/RTM/config.txt \
    -	  --daemonize ${GLITE_RTM_TEST_ADDITIONAL_ARGS} 2>`pwd`/RTM/glite-rtm-test-pre.log >`pwd`/RTM/notifs.log
    -	if [ x"$?" != x"0" ]; then
    -		cat `pwd`/RTM/glite-rtm-test-pre.log
    -		echo FAILED
    -		return 1
    -	fi
    -
    -	i=0
    -	while [ ! -s "${GLITE_RTM_TEST_PIDFILE}" -a $i -lt 20 ]; do
    -		sleep 0.1
    -		i=$(($i+1))
    -	done
    -	if [ ! -s "${GLITE_RTM_TEST_PIDFILE}" ]; then
    -		echo "Can't startup L&B harvester."
    -		kill_daemons;
    -		drop_db;
    -		exit 1
    -	fi
    -
    -	echo -n "M "
    -}
    -
    -
    -cleanup_harvester() {
    -	echo -n "cleaning up..."
    -	X509_USER_KEY=${X509_USER_KEY} X509_USER_CERT=${X509_USER_CERT} \
    -	${rtm} \
    -	  -m $GLITE_RTM_TEST_DB \
    -	  --cleanup \
    -	  --debug 12 ${GLITE_RTM_TEST_ADDITIONAL_ARGS} >`pwd`/RTM/glite-rtm-test-cleanup.log 2>&1
    -	if [ x"$?" != x"0" ]; then
    -		cat `pwd`/RTM/glite-rtm-test-cleanup.log
    -		echo FAILED
    -		return 1
    -	fi
    -	echo -n "OK "
    -}
    -
    -
    -kill_daemons() {
    -	pid1=`cat ${GLITE_LB_TEST_PIDFILE} 2>/dev/null`
    -	[ -f "${GLITE_RTM_TEST_PIDFILE}" ] && pid2=`cat ${GLITE_RTM_TEST_PIDFILE}`
    -	pid3=`lsof -t $(pwd)/LB/notif.sock 2>/dev/null`
    -	pid4=`lsof -t $(pwd)/LB/proxy-il.sock 2>/dev/null`
    -	[ ! -z "$pid1" ] && kill $pid1
    -	[ ! -z "$pid2" ] && kill -2 $pid2
    -	[ ! -z "$pid3" ] && kill $pid3
    -	[ ! -z "$pid4" ] && kill $pid4
    -	sleep 1;
    -	[ ! -z "$pid1" ] && kill -9 $pid1 2>/dev/null
    -	[ ! -z "$pid2" ] && kill -9 $pid2 2>/dev/null
    -	[ ! -z "$pid3" ] && kill -9 $pid3 2>/dev/null
    -	[ ! -z "$pid4" ] && kill -9 $pid4 2>/dev/null
    -	rm -f "${GLITE_LB_TEST_PIDFILE}" "${GLITE_RTM_TEST_PIDFILE}" "${GLITE_LB_NOTIF_IL_PIDFILE}" "${GLITE_LB_PROXY_IL_PIDFILE}"
    -	rm -f `pwd`/LB/*.sock
    -}
    -
    -
    -kill_bkserver() {
    -	pid=`cat ${GLITE_LB_TEST_PIDFILE} 2>/dev/null`
    -	if [ ! -z "$pid1" ]; then
    -		kill $pid;
    -		sleep 1;
    -		kill -9 $pid
    -	fi
    -	rm -f "${GLITE_LB_TEST_PIDFILE}"
    -}
    -
    -
    -kill_harvester() {
    -	pid=`cat ${GLITE_RTM_TEST_PIDFILE} 2>/dev/null`
    -	if [ ! -z "$pid1" ]; then
    -		kill $pid
    -		sleep 1;
    -		kill -9 $pid 2>/dev/null
    -	fi
    -	rm -f "${GLITE_RTM_TEST_PIDFILE}"
    -}
    -
    -
    -reg() {
    -	echo -n "R"
    -	echo $jobreg $@ >> log
    -	$jobreg $@ > jobreg.tmp
    -	if [ $? -ne 0 ]; then
    -		cat jobreg.tmp
    -		rm -f jobreg.tmp
    -		echo " FAIL!"
    -		return 1;
    -	fi
    -	script=`cat jobreg.tmp | tail -n 2`
    -	rm -f jobreg.tmp
    -	EDG_JOBID=
    -	EDG_WL_SEQUENCE=
    -	eval $script
    -	if [ -z "$EDG_JOBID" -o -z "$EDG_WL_SEQUENCE" ]; then
    -		echo " FAIL!"
    -		return 1;
    -	fi
    -	echo -n "G "
    -}
    -
    -
    -ev() {
    -	echo -n "E"
    -	echo $logev -j "$EDG_JOBID" -c "$EDG_WL_SEQUENCE" "$@" >> log
    -	$logev -j "$EDG_JOBID" -c "$EDG_WL_SEQUENCE" "$@" 2> logev-err.tmp >logev.tmp
    -	if [ $? -ne 0 ]; then
    -		echo " FAIL!"
    -		return 2;
    -	fi
    -	EDG_WL_SEQUENCE=`cat logev.tmp`
    -	rm logev.tmp logev-err.tmp
    -	echo -n "V "
    -}
    -
    -
    -pg_get() {
    -	result=
    -	lines=
    -	echo "$1" | psql -AtF ',' -U "$RTM_USER" "$RTM_NAME" > psql.tmp
    -	if [ $? != 0 ]; then
    -		return $?
    -	fi
    -	result="`cat psql.tmp`"
    -	lines=`wc -l psql.tmp | sed 's/^[ ]*//' | cut -f1 -d' '`
    -#	rm psql.tmp
    -	return 0
    -}
    -
    -
    -pg_wait() {
    -	timeout=$(($1*2))
    -	sql="$2"
    -	n="$3"
    -
    -	i=0
    -	found=0
    -	result=
    -	echo -n "S"
    -	echo "`date '+%Y-%m-%d %H:%M:%S'` $sql" >> log
    -	while [ "$found" = "0" -a $i -lt $timeout ]; do
    -		pg_get "$sql" || return $?
    -		echo -n "."
    -		if [ -z "$n" ]; then
    -			if [ "$lines" != "0" ]; then found=1; fi
    -		else
    -			if [ "$lines" = "$n" ]; then found=1; fi
    -		fi
    -		if [ "$found" = "0" ]; then sleep 0.5; fi
    -		i=$(($i+1))
    -	done
    -	echo -n "Q "
    -	result="$result"
    -	echo "`date '+%Y-%m-%d %H:%M:%S'` $lines lines" >> log
    -	if [ ! -z "$result" ]; then
    -		echo "$result" | sed -e 's/\(.*\)/\t\1/' >> log
    -	fi
    -	return 0
    -}
    -
    -
    -my_get() {
    -	result=
    -	lines=
    -	echo "`date '+%Y-%m-%d %H:%M:%S'` $1" >> log
    -	echo "$1" | mysql -B -u "$DB_USER" "$DB_NAME" > mysql.tmp
    -	if [ $? != 0 ]; then
    -		return $?
    -	fi
    -	result=`cat mysql.tmp | tail -n +2`
    -	lines=`echo "$result" | grep -v '^$' | wc -l | sed 's/^[ ]*//'`
    -	echo "`date '+%Y-%m-%d %H:%M:%S'` $lines lines" >> log
    -	if [ ! -z "$result" ]; then
    -		echo "$result" | sed -e 's/\(.*\)/\t\1/' >> log
    -	fi
    -#	rm -f mysql.tmp
    -	return 0
    -}
    -
    -
    -# notif propagation
    -test_basic() {
    -	ok=0
    -
    -	# submited
    -	echo -n "submitted..."
    -	reg || return $?
    -	pg_wait 10 "SELECT jobid, state FROM jobs WHERE state='Submitted'" || return $?
    -	if [ -z "$result" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -
    -	# waiting
    -	echo -n "waiting..."
    -	ev -s NetworkServer -e Accepted --from='UserInterface' --from_host=`hostname -f` --from_instance="pid$$" || return $?
    -	pg_wait 10 "SELECT jobid, state FROM jobs WHERE state='Waiting'" || return $?
    -	if [ -z "$result" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -
    -	# running
    -	echo -n "running..."
    -	ev -s LogMonitor -e Running --node="worker node" || return $?
    -	pg_wait 10 "SELECT jobid, state FROM jobs WHERE state='Running'" || return $?
    -	if [ -z "$result" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -
    -	ok=1
    -	echo "OK"
    -}
    -
    -
    -# proper notif registration cleanup
    -test_rebind() {
    -	ok=0
    -
    -	# ---- active ---
    -	echo -n "$n_notifs notifications "
    -	my_get "SELECT notifid FROM notif_registrations" || return $?
    -	# STATUS and JDL
    -	if [ "$lines" != "$n_notifs" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -	echo -n "OK "
    -
    -	# ---- store & stop ---
    -	echo -n "store&quit"
    -	pid=`cat ${GLITE_RTM_TEST_PIDFILE}`
    -	kill $pid
    -	i=0
    -	while [ -s "${GLITE_RTM_TEST_PIDFILE}" -a $i -lt 200 ]; do
    -		echo -n "."
    -		sleep 0.5
    -		i=$(($i+1))
    -	done
    -	if [ -s "${GLITE_RTM_TEST_PIDFILE}" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -	echo -n "OK notifs "
    -	my_get "SELECT notifid FROM notif_registrations" || return $?
    -	if [ "$lines" != "$n_notifs" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -	echo -n "OK "
    -
    -	# ---- launch & rebind ---
    -	if ! start_harvester; then
    -		kill_daemons;
    -		drop_db;
    -		exit 1
    -	fi
    -
    -	echo -n "bind"
    -	pg_wait 20 "SELECT notifid FROM notifs WHERE notifid IS NOT NULL" $n_notifs || return $?
    -	if [ x"$lines" != x"$n_notifs" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -
    -	echo -n "Done "
    -	ev -s LogMonitor -e Done --status_code=OK --reason="Finished, yeah!" --exit_code=0 || return $?
    -	pg_wait 20 "SELECT jobid, state FROM jobs WHERE state='Done'"
    -	if [ -z "$result" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -
    -	ok=1
    -	echo "OK"
    -}
    -
    -
    -test_cleanup() {
    -	ok=0
    -
    -	# ---- deep stop ---
    -	echo -n "deep quit"
    -	pid=`cat ${GLITE_RTM_TEST_PIDFILE}`
    -	kill -2 $pid
    -	i=0
    -	while [ -s "${GLITE_RTM_TEST_PIDFILE}" -a $i -lt 200 ]; do
    -		echo -n "."
    -		sleep 0.5
    -		i=$(($i+1))
    -	done
    -	if [ -s "${GLITE_RTMTESTPIDFILE}" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -
    -	echo -n "$n_notifs notifications..."
    -	my_get "SELECT notifid FROM notif_registrations" || return 1
    -	if [ "$lines" != "$n_notifs" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -
    -	cleanup_harvester || return $?
    -	echo -n "0 notifications..."
    -	my_get "SELECT notifid FROM notif_registrations" || return 1
    -	if [ "$lines" != "0" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -
    -	echo -n "cleandb."
    -	cleanup_pg || return $?
    -	start_harvester || return $?
    -
    -	echo -n "notifs."
    -	pg_wait 20 "SELECT refresh FROM notifs WHERE notifid IS NOT NULL" $n_notifs || return $?
    -	refresh=`echo "$result" | head -n 1`
    -	if [ -z "$refresh" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -
    -	ok=1
    -	echo "OK"
    -}
    -
    -
    -test_refresh() {
    -	ok=0
    -
    -	echo -n "refresh."
    -	pg_wait $((GLITE_RTM_TEST_TTL * 3 / 4)) "SELECT notifid FROM notifs WHERE notifid IS NOT NULL AND refresh>'$refresh'" $n_notifs || return $?
    -	if [ -z "$result" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -
    -	ok=1
    -	echo "OK"
    -}
    -
    -
    -test_jdl() {
    -	ok=0
    -
    -#	kill_daemons
    -#	cleanup_mysql && cleanup_pg || return $?
    -#	run_daemons || return $?
    -
    -	# need to wait for notifications to avoid bootstrap
    -	echo -n "notifs."
    -	pg_wait 20 "SELECT refresh FROM notifs WHERE notifid IS NOT NULL" $n_notifs || return $?
    -	refresh=`echo "$result" | head -n 1`
    -	if [ -z "$refresh" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -	echo -n "OK "
    -
    -	echo -n "submitted..."
    -	reg || return $?
    -	pg_wait 10 "SELECT jobid, state FROM jobs WHERE state='Submitted'" || return $?
    -	if [ -z "$result" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -	echo -n "OK "
    -
    -	echo -n "waiting..."
    -	cat > jdl.txt << EOF
    -[
    - VirtualOrganisation = "TestingVO";
    -]
    -EOF
    -	ev -s NetworkServer -e Accepted --from='UserInterface' --from_host=`hostname -f` --from_instance="pid$$" || return $?
    -	ev -s NetworkServer -e EnQueued --queue "very long and chaotic queue" --job=`pwd`/jdl.txt --result START || return $?
    -	ev -s NetworkServer -e EnQueued --queue "very long and chaotic queue" --job="`cat jdl.txt`" --result OK || return $?
    -	pg_wait 10 "SELECT jobid, state FROM jobs WHERE state='Waiting'" || return $?
    -	if [ -z "$result" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -	echo -n "OK "
    -
    -	echo -n "waiting and VO..."
    -	pg_wait 10 "SELECT jobid, state FROM jobs WHERE state='Waiting' AND vo='TestingVO'" || return $?
    -	if [ -z "$result" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -	echo -n "OK "
    -
    -	#
    -	# test JDL via VO change
    -	#
    -	# never do it at home ;-)
    -	#
    -
    -	echo -n "changed JDL..."
    -	ev -s NetworkServer -e EnQueued --queue "very long and chaotic queue" --job="[ VirtualOrganisation=\"TestingVO2\";]" --result OK || return $?
    -	pg_wait 10 "SELECT jobid, state FROM jobs WHERE state='Waiting' AND vo='TestingVO2'" || return $?
    -	if [ -z "$result" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -	echo -n "OK "
    -
    -	echo -n "changed after waiting..."
    -	ev -s WorkloadManager -e EnQueued --queue "very long and chaotic queue" --destination LogMonitor --dest_host localhost --dest_instance pid$$ --job "(car 'testing=true)"  --result=OK || return $?
    -	pg_wait 10 "SELECT jobid, state FROM jobs WHERE state='Ready' AND vo='TestingVO2'" || return $?
    -	if [ -z "$result" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -	echo -n "ready..."
    -	ev -s NetworkServer -e EnQueued --queue "very long and chaotic queue" --job="[ VirtualOrganisation=\"TestingVO3\";]" --result OK || return $?
    -	pg_wait 10 "SELECT jobid, state FROM jobs WHERE state='Waiting' AND vo='TestingVO3'" || return $?
    -	if [ -z "$result" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -
    -	ok=1
    -	echo "OK"
    -}
    -
    -
    -test_purge() {
    -	ok=0
    -
    -	echo -n "purge."
    -	pg_get "SELECT jobid FROM jobs" || return $?
    -	if [ -z "$lines" -o $lines -le 0  ]; then
    -		echo "no jobs! FAIL"
    -		return 0
    -	fi
    -	echo -n "P"
    -	jobunique=`echo "$result" | head -n 1 | tr -d '\n'`
    -	jobid="https://`hostname -f`:${GLITE_LB_TEST_SERVER_PORT}/$jobunique"
    -	echo $jobid > jobs
    -	echo "${purge} -a1 -c1 -n1 -e1 -o1 -m "`hostname -f`:${GLITE_LB_TEST_SERVER_PORT}" -j jobs" >> log
    -	echo "  jobs = `cat jobs` | tr -d '\n'" >> log
    -	X509_USER_KEY=${X509_USER_KEY} X509_USER_CERT=${X509_USER_CERT} ${purge} -l -a1 -c1 -n1 -e1 -o1 -m "`hostname -f`:${GLITE_LB_TEST_SERVER_PORT}" -j jobs 2> purge-err.tmp >purge.tmp
    -	if [ $? -ne 0 ]; then
    -		echo " FAIL!"
    -		return 2;
    -	fi
    -	rm -f jobs
    -	echo -n "R "
    -
    -	pg_wait 10 "SELECT * FROM jobs WHERE jobid='$jobunique'" 0 || return $?
    -	if [ x"$lines" != x"0" ]; then
    -		echo "FAIL"
    -		return 0
    -	fi
    -
    -	ok=1
    -	echo "OK"
    -}
    -
    -
    -quit() {
    -	if [ x"$started" = x"" ]; then
    -		kill_daemons
    -		drop_db
    -	fi
    -	exit 1
    -}
    -
    -
    -fatal() {
    -	echo "Fatal error, end"
    -	quit
    -}
    -
    -
    -start() {
    -	echo -n "Launch: "
    -	create_db || fatal
    -	run_daemons || fatal
    -	echo "OK"
    -	started=1
    -}
    -
    -
    -stop() {
    -	kill_daemons
    -	drop_db
    -}
    -
    -
    -test() {
    -	echo -n "Basic: "
    -	test_basic || fatal
    -	if [ $ok != 1 ]; then quit; fi
    -
    -	echo -n "Rebind: "
    -	test_rebind || fatal
    -	if [ $ok != 1 ]; then quit; fi
    -
    -	echo -n "Cleanup: "
    -	test_cleanup || fatal
    -	if [ $ok != 1 ]; then quit; fi
    -
    -	echo -n "Refresh: "
    -	test_refresh || fatal
    -	if [ $ok != 1 ]; then quit; fi
    -
    -	echo -n "JDL: "
    -	test_jdl || fatal
    -	if [ $ok != 1 ]; then quit; fi
    -
    -#	echo -n "Purge: "
    -#	test_purge || fatal
    -#	if [ $ok != 1]; then quit; fi
    -}
    -
    -
    -case x"$1" in
    -xstart)
    -	init
    -	start
    -	;;
    -
    -xstop)
    -	init
    -	stop
    -	;;
    -
    -xtest)
    -	init
    -	test
    -	;;
    -
    -x)
    -	init
    -	start
    -	test
    -	stop
    -	;;
    -
    -*)
    -	usage
    -	exit 1
    -esac
    diff --git a/org.glite.lb.harvester/examples/test.sql b/org.glite.lb.harvester/examples/test.sql
    deleted file mode 100644
    index 15736f6..0000000
    --- a/org.glite.lb.harvester/examples/test.sql
    +++ /dev/null
    @@ -1,55 +0,0 @@
    ---
    --- Inicialization (replace pgsql by actual postgres superuser):
    ---
    --- 1) grant privileges, someting like this in $data/pg_hba.conf:
    ---     local all all trust
    ---
    --- 2) create user:
    ---     createuser -U pgsql rtm
    ---
    --- 3) crate database:
    ---     createuser -U pgsql rtm
    ---
    --- 4) create tables:
    ---     psql -U rtm rtm < test.sql
    ---
    -
    -CREATE TABLE "jobs" (
    -	jobid VARCHAR PRIMARY KEY,
    -	lb VARCHAR,
    -	ce VARCHAR,
    -	queue VARCHAR,
    -	rb VARCHAR,
    -	ui VARCHAR,
    -	state VARCHAR,
    -	state_entered TIMESTAMP,
    -	rtm_timestamp TIMESTAMP,
    -	active BOOLEAN,
    -	state_changed BOOLEAN,
    -	registered TIMESTAMP,
    -	vo VARCHAR
    -);
    -
    -CREATE TABLE "lb20" (
    -	ip TEXT NOT NULL,
    -	branch TEXT NOT NULL,
    -	serv_version TEXT NOT NULL,
    -	monitored BOOLEAN DEFAULT FALSE,
    -	last_seen DATE,
    -	first_seen DATE,
    -
    -	PRIMARY KEY(ip)
    -);
    -
    -CREATE TABLE "notifs" (
    -	lb VARCHAR,
    -	port INTEGER,
    -	notifid VARCHAR,
    -	notiftype VARCHAR,
    -	valid TIMESTAMP,
    -	refresh TIMESTAMP,
    -	last_update TIMESTAMP,
    -	errors INTEGER,
    -
    -	PRIMARY KEY(lb, port, notiftype)
    -);
    diff --git a/org.glite.lb.harvester/project/ChangeLog b/org.glite.lb.harvester/project/ChangeLog
    deleted file mode 100644
    index d6438b7..0000000
    --- a/org.glite.lb.harvester/project/ChangeLog
    +++ /dev/null
    @@ -1,28 +0,0 @@
    -1.0.0-1
    -- Initial version
    -
    -1.0.1-1
    -- Changes for Real Time Monitor
    -- Workaround for older Globus
    -- Minor memleak fixes
    -
    -1.0.2-1
    -- Less verbosity in reporting single notifications
    -- Fixed postgres dependency
    -
    -1.0.3-1
    -- Extended documentation
    -- Fixed purging
    -- Fixed build issues
    -
    -1.0.4-1
    -- Fixed 'nodb' build issues
    -
    -1.0.5-1
    -- Adopted the Common logging format
    -- First release of the harvester module integrated into the L&B subsystem (2.1 and later)
    -
    -1.0.6-1
    -- Resource Broker from JDL for CREAM jobs
    -- For CE stripping protocol from destination
    -- Test script updates
    diff --git a/org.glite.lb.harvester/project/package.description b/org.glite.lb.harvester/project/package.description
    deleted file mode 100644
    index c35cd6c..0000000
    --- a/org.glite.lb.harvester/project/package.description
    +++ /dev/null
    @@ -1 +0,0 @@
    -L&B Harvester gathers job info from L&B servers using efficient L&B notifications. It manages notifications and keeps track of them for reuse on next launch. It takes care of refreshing notifications and querying L&B back once a notification expires.
    diff --git a/org.glite.lb.harvester/project/package.summary b/org.glite.lb.harvester/project/package.summary
    deleted file mode 100644
    index 062972a..0000000
    --- a/org.glite.lb.harvester/project/package.summary
    +++ /dev/null
    @@ -1 +0,0 @@
    -Enhanced L&B notification client.
    diff --git a/org.glite.lb.harvester/project/version.properties b/org.glite.lb.harvester/project/version.properties
    deleted file mode 100644
    index 4c7fea2..0000000
    --- a/org.glite.lb.harvester/project/version.properties
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -module.version=1.0.6
    -module.age=1
    diff --git a/org.glite.lb.harvester/src/harvester.c b/org.glite.lb.harvester/src/harvester.c
    deleted file mode 100644
    index da0ec6b..0000000
    --- a/org.glite.lb.harvester/src/harvester.c
    +++ /dev/null
    @@ -1,2766 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -/*
    - * Real time monitor.
    - */
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#ifdef WITH_OLD_LB
    -#include 
    -#endif
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#ifdef WITH_LBU_DB
    -#include 
    -#include 
    -#endif
    -#include 
    -#ifndef WITH_OLD_LB
    -#include 
    -#include 
    -#endif
    -#include 
    -#include 
    -
    -
    -// default number of the threads/sockets
    -#define RTM_THREADS 5
    -// requested notification life in seconds
    -#define RTM_NOTIF_TTL 86400
    -// consider end of the notification life sooner
    -#define RTM_NOTIF_TTL_TO_DEAD 2
    -// poll timeout in seconds
    -#define RTM_NOTIF_READ_TIMEOUT 5
    -// recheck LB server after error in seconds
    -#define RTM_ERROR_REPEAT_RATE 120
    -// initial read loop time (can be infinity)
    -#define RTM_NOTIF_LOOP_MAX_TIME 1800
    -// idle "quit" poll
    -#define RTM_IDLE_POLL_TIME 0.5
    -// purge & summary jobs poll time
    -#define RTM_SUMMARY_POLL_TIME 600
    -// preventive suicide against memleaks and ugly things (12 h)
    -#define RTM_SUICIDE_TIME 43200
    -
    -#define RTM_SUMMARY_JOBS 100
    -
    -#define RTM_DB_TABLE_JOBS "jobs"
    -#define RTM_DB_TABLE_LBS "lb20"
    -#define DBPAR(N) ("$" (N))
    -#define DBAMP "\""
    -
    -// debug message level: insane, debug, progress, warning, error
    -#define INS 4
    -#define DBG 3
    -#define INF 2
    -#define WRN 1
    -#define ERR 0
    -#define DEBUG_LEVEL_MASK 7
    -#define DEBUG_GUARD_MASK 8
    -
    -// internal quit codes
    -#define RTM_QUIT_RUN 0
    -#define RTM_QUIT_CLEANUP 1
    -#define RTM_QUIT_PRESERVE 2
    -#define RTM_QUIT_RELOAD 3
    -
    -// exit codes
    -#define RTM_EXIT_OK 0
    -#define RTM_EXIT_RELOAD 1
    -#define RTM_EXIT_ERROR 2
    -
    -#define RTM_NOTIF_TYPE_STATUS 1
    -#define RTM_NOTIF_TYPE_JDL 2
    -#define RTM_NOTIF_TYPE_OLD 3
    -#define RTM_NOTIF_TYPE_DONE 4
    -
    -#ifdef RTM_NO_COLORS
    -#define RTM_TTY_RED ""
    -#define RTM_TTY_GREEN ""
    -#define RTM_TTY_RST ""
    -#else
    -#define RTM_TTY_RED "\e[1;31m"
    -#define RTM_TTY_GREEN "\e[1;32m"
    -#define RTM_TTY_RST "\e[0;39m"
    -#endif
    -
    -#ifndef LINE_MAX
    -#define LINE_MAX 1023
    -#endif
    -
    -#define RTM_FILE_NOTIFS "/var/tmp/notifs.txt"
    -#define RTM_FILE_NOTIF_PRINTF "%s\t%s\t%s\t%s\t%s\t%d\n"
    -#define RTM_FILE_NOTIF_SCANF "%511[^\t]\t%511[^\t]\t%511[^\t]\t%511[^\t]\t%511[^\t]\t%511[^\t\r\n]\n"
    -#define RTM_FILE_NOTIF_NUM 6
    -
    -#define WLCG_FILENAME_TEMPLATE "/tmp/wlcg_%02d_XXXXXX"
    -#define WLCG_COMMAND_MESSAGE "/opt/lcg/bin/msg-publish -c /opt/lcg/etc/msg-publish.conf org.wlcg.usage.jobStatus %s"
    -#define WLCG_BINARY "/usr/bin/msg-publish"
    -#define WLCG_CONFIG "/etc/msg-publish/msg-publish.conf"
    -#define WLCG_TOPIC "org.wlcg.usage.jobStatus"
    -
    -
    -#ifdef WITH_OLD_LB
    -#define glite_jobid_t edg_wlc_JobId
    -#define glite_jobid_create edg_wlc_JobIdCreate
    -#define glite_jobid_recreate edg_wlc_JobIdRecreate
    -#define glite_jobid_dup edg_wlc_JobIdDup
    -#define glite_jobid_free edg_wlc_JobIdFree
    -#define glite_jobid_parse edg_wlc_JobIdParse
    -#define glite_jobid_unparse edg_wlc_JobIdUnparse
    -#define glite_jobid_getServer edg_wlc_JobIdGetServer
    -#define glite_jobid_getServerParts edg_wlc_JobIdGetServerParts
    -#define glite_jobid_getUnique edg_wlc_JobIdGetUnique
    -#define edg_wll_NotifNew(CTX, CONDS, FLAGS, SOCK, LADDR, ID, VALID) edg_wll_NotifNew((CTX), (CONDS), (SOCK), (LADDR), (ID), (VALID))
    -#define edg_wll_JDLField(STAT, NAME) NULL
    -#ifndef GLITE_JOBID_DEFAULT_PORT
    -#define GLITE_JOBID_DEFAULT_PORT GLITE_WMSC_JOBID_DEFAULT_PORT
    -#endif
    -#endif
    -
    -// TODO: ipv6? :-)
    -
    -typedef struct {
    -	edg_wll_NotifId id;  // notification context (after bootstrap/rebind)
    -	char *id_str;        // notification id string
    -	int type;            // for distinguish various notifications on one LB
    -	char *server;        // LB server hostname
    -	unsigned int port;   // LB server port
    -	time_t valid;        // maximal validity of the notification
    -	time_t refresh;      // when try to refresh (before expiration),
    -	                     // used for retry time after error too
    -	double last_update;  // last change from the server
    -	int active;          // helper (compare LB servers and notifications,
    -	                     // if to save to the persistent storage)
    -	int error;           // errors counter
    -} notif_t;
    -
    -typedef struct {
    -	int id;
    -	pthread_t thread;
    -	notif_t *notifs;
    -	int nservers;
    -	time_t next_refresh;
    -	char time_s[100];
    -	char *dash_filename;
    -	int dash_fd;
    -#ifdef WITH_LBU_DB
    -	glite_lbu_DBContext dbctx;
    -	glite_lbu_Statement insertcmd, updatecmd, updatecmd_vo, updatecmd_rb, updatecmd_mon, deletecmd;
    -	int dbcaps;
    -#endif
    -} thread_t;
    -
    -typedef struct {
    -	char *local_address;
    -	int nthreads;
    -	char *config_file;
    -	char *notif_file;
    -	int debug;
    -	int guard;
    -	int daemonize;
    -	char *pidfile;
    -	int dive;
    -	char *dbcs;  // DB connection string
    -	char *cert, *key;
    -	int ttl;     // requested time to live (validity) of the notifications
    -	int cleanup;        // if to clean up notifications on LB servers
    -	int wlcg;           // dashboard messaging
    -	int wlcg_no_remove; // don't remove temporary files (for debugging)
    -	char *wlcg_binary;  // path msg-publish binary
    -	char *wlcg_config;  // msg config file
    -	char *wlcg_topic;   // msg topic
    -	int wlcg_flush;     // send message for eachnotification
    -	int silly;          // old LB 1.9 mode
    -	int no_purge;       // disabled reaction on purge state
    -
    -	int nservers;
    -	notif_t *notifs;
    -} config_t;
    -
    -typedef struct {
    -	notif_t *notifs;
    -	int n, maxn;
    -	pthread_mutex_t lock;
    -	double last_check;
    -	int was_summary; // flag for debugging
    -#ifdef WITH_LBU_DB
    -	glite_lbu_DBContext dbctx;
    -#endif
    -} db_t;
    -
    -
    -static const char rcsid[] = "@(#)$Id$";
    -
    -#ifdef WITH_OLD_LB
    -static int rtm2syslog[] = {
    -	LOG_ERR,
    -	LOG_WARNING,
    -	LOG_INFO,
    -	LOG_DEBUG,
    -	LOG_DEBUG,
    -};
    -#else
    -static int rtm2log4c[] = {
    -	LOG_PRIORITY_ERROR, // errors
    -	LOG_PRIORITY_WARN,  // warnings
    -	LOG_PRIORITY_INFO,  // progress
    -	LOG_PRIORITY_DEBUG, // debugging
    -	LOG_PRIORITY_NOTSET // insane logging
    -};
    -#endif
    -
    -static const struct option opts[] = {
    -	{ "wlcg-binary", required_argument, 	NULL,   0},
    -	{ "wlcg-config", required_argument, 	NULL,   0},
    -	{ "wlcg-topic", required_argument, 	NULL,   0},
    -	{ "wlcg-flush", no_argument,	 	NULL,   0},
    -	{ "help", 	no_argument, 		NULL,	'h'},
    -	{ "version",	no_argument,		NULL,	'v'},
    -	{ "threads",	required_argument,	NULL,	's'},
    -	{ "debug",	required_argument,	NULL,	'd'},
    -	{ "daemonize",	no_argument,		NULL,	'D'},
    -	{ "pidfile",	required_argument,	NULL,	'i'},
    -	{ "ttl",	required_argument,	NULL,	't'},
    -	{ "history",	required_argument,	NULL,	'H'},
    -	{ "config",	required_argument,	NULL,	'c'},
    -	{ "notifs",	required_argument,	NULL,	'n'},
    -	{ "port",	required_argument,	NULL,	'p'},
    -	{ "pg",		required_argument,	NULL,	'm'},
    - 	{ "cert",	required_argument,	NULL,	'C'},
    - 	{ "key",	required_argument,	NULL,	'K'},
    -	{ "wlcg",	no_argument,		NULL,	'w'},
    -	{ "old",	no_argument,		NULL,	'o'},
    -	{ "cleanup",	no_argument,		NULL,	'l'},
    -	{ "no-purge",	no_argument,		NULL,	'u'},
    -	{ NULL, 	no_argument, 		NULL, 	0}
    -};
    -
    -static const char *opts_line = "hvs:d:Di:t:H:c:n:p:m:C:K:wolu";
    -
    -config_t config = {
    -	local_address: NULL,
    -	nthreads: RTM_THREADS,
    -	config_file: NULL,
    -	notif_file: NULL,
    -	debug: DBG,
    -	guard: 1,
    -	dive: 10800,
    -	dbcs: NULL,
    -	cert: NULL,
    -	key: NULL,
    -	ttl: RTM_NOTIF_TTL,
    -	cleanup: 0,
    -	wlcg: 0,
    -	silly: 0,
    -	no_purge: 0,
    -
    -	nservers: 0,
    -	notifs: NULL,
    -};
    -db_t db = {
    -	notifs: NULL,
    -	n: 0,
    -	maxn: 0,
    -	lock: PTHREAD_MUTEX_INITIALIZER,
    -#ifdef WITH_LBU_DB
    -	dbctx: NULL
    -#endif
    -};
    -thread_t *threads = NULL;
    -volatile sig_atomic_t quit = RTM_QUIT_RUN;
    -
    -static int listen_port = 0;
    -
    -#define lprintf(T, LEVEL, FMT, ARGS...) \
    -	if ((LEVEL) <= config.debug) lprintf_func((T), (LEVEL), (FMT), ##ARGS)
    -#define lprintf_ctx(T, LEVEL, CTX, FMT, ARGS...) \
    -	if ((LEVEL) <= config.debug) lprintf_ctx_func((T), (CTX), (LEVEL), (FMT), ##ARGS)
    -#define lprintf_dbctx(T, LEVEL, FMT, ARGS...) \
    -	if ((LEVEL) <= config.debug) lprintf_dbctx_func((T), (LEVEL), (FMT), ##ARGS)
    -
    -#ifdef WITH_OLD_LB
    -int edg_wll_gss_initialize() {
    -	if (globus_module_activate(GLOBUS_GSI_GSSAPI_MODULE) != GLOBUS_SUCCESS) return EINVAL;
    -	return 0;
    -}
    -#endif
    -
    -void lvprintf_func(thread_t *t, const char *description, int level, const char *fmt, va_list ap) {
    -	char prefix[10];
    -	char *msg, *line;
    -	
    -	if (t) snprintf(prefix, sizeof prefix, "[%02d]", t->id);
    -	else memcpy(prefix, "[main]", 8);
    -	vasprintf(&msg, fmt, ap);
    -	if (description) asprintf(&line, "%s %s, %s\n", prefix, msg, description);
    -	else asprintf(&line, "%s %s\n", prefix, msg);
    -	free(msg);
    -
    -	if (level <= WRN && !config.daemonize) fprintf(stderr, RTM_TTY_RED);
    -	if (config.daemonize) {
    -#ifdef WITH_OLD_LB
    -		openlog(NULL, LOG_PID | LOG_CONS, LOG_DAEMON);
    -		syslog(rtm2syslog[level], "%s", line);
    -		closelog();
    -#else
    -		glite_common_log(LOG_CATEGORY_LB_HARVESTER, rtm2log4c[level], line);
    -#endif
    -	} else {
    -		fputs(line, stderr);
    -	}
    -	if (level <= WRN && !config.daemonize) fprintf(stderr, RTM_TTY_RST);
    -
    -	free(line);
    -}
    -
    -
    -void lprintf_func(thread_t *t, int level, const char *fmt, ...) {
    -	va_list ap;
    -
    -	va_start(ap, fmt);
    -	lvprintf_func(t, NULL, level, fmt, ap);
    -	va_end(ap);
    -}
    -
    -
    -void lprintf_ctx_func(thread_t *t, edg_wll_Context ctx, int level, const char *fmt, ...) {
    -	va_list ap;
    -	char *errText, *errDesc, *s;
    -
    -	va_start(ap, fmt);
    -	edg_wll_Error(ctx, &errText, &errDesc);
    -	asprintf(&s, "%s: %s", errText, errDesc);
    -	lvprintf_func(t, s, level, fmt, ap);
    -	free(errText);
    -	free(errDesc);
    -	free(s);
    -	va_end(ap);
    -}
    -
    -
    -#ifdef WITH_LBU_DB
    -void lprintf_dbctx_func(thread_t *t, int level, const char *fmt, ...) {
    -	va_list ap;
    -	char *errText = NULL, *errDesc = NULL, *s = NULL;
    -	glite_lbu_DBContext dbctx = t ? t->dbctx : db.dbctx;
    -
    -	va_start(ap, fmt);
    -	if (dbctx) {
    -		glite_lbu_DBError(dbctx, &errText, &errDesc);
    -		asprintf(&s, "%s: %s", errText, errDesc);
    -	}
    -	lvprintf_func(t, s, level, fmt, ap);
    -	free(errText);
    -	free(errDesc);
    -	free(s);
    -	va_end(ap);
    -}
    -#endif
    -
    -#ifndef WITH_LBU_DB
    -time_t glite_lbu_StrToTime(const char *str) {
    -	struct tm       tm;
    -
    -	memset(&tm,0,sizeof(tm));
    -	putenv("TZ=UTC"); tzset();
    -	sscanf(str,"%4d-%02d-%02d %02d:%02d:%02d",
    -	        &tm.tm_year,&tm.tm_mon,&tm.tm_mday,
    -        	&tm.tm_hour,&tm.tm_min,&tm.tm_sec);
    -	tm.tm_year -= 1900;
    -	tm.tm_mon--;
    -
    -	return mktime(&tm);
    -}
    -
    -double glite_lbu_StrToTimestamp(const char *str) {
    -	struct tm	tm;
    -	double	sec;
    -
    -	memset(&tm,0,sizeof(tm));
    -	putenv("TZ=UTC"); tzset();
    -	sscanf(str,"%4d-%02d-%02d %02d:%02d:%lf",
    -		&tm.tm_year,&tm.tm_mon,&tm.tm_mday,
    -		&tm.tm_hour,&tm.tm_min,&sec);
    -	tm.tm_year -= 1900;
    -	tm.tm_mon--;
    -	tm.tm_sec = sec;
    -
    -	return (sec - tm.tm_sec) + mktime(&tm);
    -}
    -#endif
    -
    -
    -// hacky time->string conversion
    -char *time2str(thread_t *t, time_t time) {
    -	struct tm tm;
    -
    -	if ((int)time <= 0) memcpy(t->time_s, "-", sizeof("-"));
    -	else {
    -		localtime_r(&time, &tm);
    -		strftime(t->time_s, sizeof(t->time_s), "%F %T", &tm);
    -	}
    -	return t->time_s;
    -}
    -
    -
    -double rtm_gettimeofday() {
    -	struct timeval tv;
    -
    -	gettimeofday(&tv, NULL);
    -	return tv.tv_sec + tv.tv_usec / 1000000.0;
    -}
    -
    -
    -void rtm_time2str(time_t t, char **str) {
    -	struct tm	*tm;
    -
    -	if (t) {
    -		tm = gmtime(&t);
    -		asprintf(str,"%4d-%02d-%02d %02d:%02d:%02d",tm->tm_year+1900,tm->tm_mon+1,
    -			tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
    -	} else
    -		*str = strdup("-");
    -}
    -
    -
    -void rtm_timestamp2str(double t, char **str) {
    -	time_t tsec = t;
    -	struct tm *tm = gmtime(&tsec);
    -
    -	if (t) {
    -		t = t - tsec + tm->tm_sec;
    -		asprintf(str,"%4d-%02d-%02d %02d:%02d:%02.09f",tm->tm_year+1900,tm->tm_mon+1,
    -	        	 tm->tm_mday,tm->tm_hour,tm->tm_min,t);
    -	} else
    -		*str = strdup("-");
    -}
    -
    -
    -int rtm_str2time(const char *s) {
    -	time_t t;
    -
    -	if (s && memcmp(s, "-", 2) != 0) {
    -		t = glite_lbu_StrToTime(s);
    -		if (t == (time_t)-1) return 0;
    -	} else
    -		t = 0;
    -
    -	return t;
    -}
    -
    -
    -int rtm_str2timestamp(const char *s) {
    -	double t;
    -
    -	if (s && memcmp(s, "-", 2) != 0) {
    -		t = glite_lbu_StrToTimestamp(s);
    -		if (t <= 0.5) return 0.0;
    -	} else
    -		t = 0.0;
    -
    -	return t;
    -}
    -
    -
    -int rtm_str2notiftype(const char *str) {
    -	if (strcasecmp(str, "STATUS") == 0) return RTM_NOTIF_TYPE_STATUS;
    -	if (strcasecmp(str, "DONE") == 0) return RTM_NOTIF_TYPE_DONE;
    -	if (strcasecmp(str, "JDL") == 0) return RTM_NOTIF_TYPE_JDL;
    -	if (strcasecmp(str, "OLD") == 0) return RTM_NOTIF_TYPE_OLD;
    -	return -1;
    -}
    -
    -
    -const char *rtm_notiftype2str(int type) {
    -	switch (type) {
    -	case RTM_NOTIF_TYPE_STATUS: return "STATUS";
    -	case RTM_NOTIF_TYPE_DONE: return "DONE";
    -	case RTM_NOTIF_TYPE_JDL: return "JDL";
    -	case RTM_NOTIF_TYPE_OLD: return "OLD";
    -	default: return NULL;
    -	}
    -}
    -
    -
    -/**
    - * Cut the network server hostname from the full URL (got from RegJob event).
    - *
    - * Formats (only the first one should be in the wild):
    - *	https://wms2.egee.cesnet.cz:7443/glite_wms_wmproxy_server
    - *	wms2.egee.cesnet.cz
    - *	147.228.1.129
    - *	HTTPS://[2001:0f68:0000:0000:0000:0000:1986:69af]:80/
    - *	2001:0f68::1986:69af
    - */
    -char* rtm_url_parse(const char *url, int only_hostname) {
    -	char *ns, *pos;
    -	size_t len;
    -
    -	if (strncasecmp(url, "https://", 8) == 0) {
    -		ns = strdup(url + 8);
    -		if (only_hostname) {
    -			// first backslash - path
    -			pos = strchr(ns, '/');
    -			if (pos) pos[0] = '\0';
    -			// last colon - port separator
    -			pos = strrchr(ns, ':');
    -			if (pos) pos[0] = '\0';
    -			// brackets - IPv6 address
    -			len = strlen(ns);
    -			if (len >= 2 && ns[0] == '[' && ns[len - 1] == ']') {
    -				pos = strndup(ns + 1, len - 2);
    -				free(ns);
    -				ns = pos;
    -			}
    -		}
    -		return ns;
    -	} else
    -		return strdup(url);
    -}
    -
    -
    -char *rtm_url2hostname(const char *url) {
    -	return rtm_url_parse(url, 1);
    -}
    -
    -
    -char *rtm_url2stripped(const char *url) {
    -	return rtm_url_parse(url, 0);
    -}
    -
    -
    -void wlcg_timeval2str(struct timeval *t, char **str) {
    -	struct tm	*tm;
    -
    -	tm = gmtime(&t->tv_sec);
    -	asprintf(str,"%4d-%02d-%02dT%02d:%02d:%02dZ",tm->tm_year+1900,tm->tm_mon+1,
    -		tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
    -}
    -
    -
    -int wlcg_store_message(thread_t *t, __attribute((unused))notif_t *notif, edg_wll_JobStat *stat) {
    -	unsigned int port;
    -	int status = 0;
    -	char *jobid_str = NULL, *state_str = NULL, *vo = NULL, *lbhost = NULL, *network_host = NULL;
    -	char *wlcg_last_update_time_str = NULL, *wlcg_state_start_time_str = NULL;
    -
    -	jobid_str = stat->jobId ? glite_jobid_unparse(stat->jobId) : strdup("Unknown");
    -	glite_jobid_getServerParts(stat->jobId, &lbhost, &port);
    -	state_str = edg_wll_StatToString(stat->state);
    -	vo = edg_wll_JDLField(stat,"VirtualOrganisation") ? : strdup("Unknown");
    -	network_host = stat->network_server ? rtm_url2hostname(stat->network_server) : NULL;
    -
    -	if (!t->dash_filename || !t->dash_fd) {
    -		free(t->dash_filename);
    -		asprintf(&t->dash_filename, WLCG_FILENAME_TEMPLATE, t->id);
    -		if ((t->dash_fd = mkstemp(t->dash_filename)) == -1) {
    -			status = errno;
    -			lprintf(t, ERR, "can't create temporary file '%s': %s", t->dash_filename, strerror(status));
    -			free(t->dash_filename);
    -			t->dash_filename = NULL;
    -			goto quit;
    -		}
    -	}
    -
    -	wlcg_timeval2str(&stat->lastUpdateTime, &wlcg_last_update_time_str);
    -	wlcg_timeval2str(&stat->stateEnterTime, &wlcg_state_start_time_str);
    -
    -	dprintf(t->dash_fd, "jobId: %s\n\
    -stateName: %s\n\
    -ownerDN: %s\n\
    -voname: %s\n\
    -bkHost: %s:%d\n\
    -networkHost: %s\n\
    -lastUpdateTime: %s\n\
    -stateStartTime: %s\n\
    -exitCode: %d\n\
    -DoneCode: %d\n\
    -destSite: %s\n\
    -condorId: %s\n\
    -StatusReason: %s\n\
    -EOT\n", jobid_str, state_str, stat->owner, vo, lbhost, port, network_host ? : "unknown", wlcg_last_update_time_str, wlcg_state_start_time_str, stat->exit_code, stat->done_code, stat->destination ? : "NULLByPublisher", stat->condorId ? : "0", stat->reason && stat->reason[strspn(stat->reason, " \t\n\r")] != '\0' ? stat->reason : "UNAVAILABLE By Publisher");
    -
    -	free(wlcg_last_update_time_str);
    -	free(wlcg_state_start_time_str);
    -quit:
    -	free(jobid_str);
    -	free(lbhost);
    -	free(network_host);
    -	free(state_str);
    -	free(vo);
    -	return status;
    -}
    -
    -
    -int wlcg_send_message(thread_t *t) {
    -	int status = 0;
    -	char *command;
    -
    -	// WLCG message
    -	if (t->dash_fd) { // send only if anything to send
    -		close(t->dash_fd);
    -		asprintf(&command, "'%s' -c '%s' '%s' '%s'", config.wlcg_binary, config.wlcg_config, config.wlcg_topic, t->dash_filename);
    -		lprintf(t, DBG, "calling %s", command);
    -		switch (vfork()) {
    -		case 0:
    -			if (execlp("/bin/sh", "/bin/sh", "-c", command, NULL) == -1) {
    -				lprintf(t, ERR, "can't exec '%s':%s", command, strerror(errno));
    -			}
    -			_exit(1);
    -			break;
    -		case -1:
    -			lprintf(t, ERR, "can't fork: %s", strerror(errno));
    -			break;
    -		default:
    -			break;
    -		}
    -		wait(&status);
    -		free(command);
    -		if (WIFEXITED(status)) {
    -			status = WEXITSTATUS(status);
    -			if (status) {
    -				lprintf(t, WRN, "%s exited with %d", config.wlcg_binary, status);
    -			} else {
    -				lprintf(t, DBG, "%s exited successfully", config.wlcg_binary);
    -				if (!config.wlcg_no_remove) remove(t->dash_filename);
    -			}
    -		} else {
    -			lprintf(t, ERR, "%s not exited normally", config.wlcg_binary);
    -			status = -1;
    -		}
    -		free(t->dash_filename);
    -		t->dash_filename = NULL;
    -		t->dash_fd = 0;
    -	}
    -
    -	return status;
    -}
    -
    -
    -void notif_free(notif_t *notif) {
    -	edg_wll_NotifIdFree(notif->id);
    -	free(notif->id_str);
    -	free(notif->server);
    -	memset(notif, 0, sizeof(notif_t));
    -}
    -
    -
    -void notif_invalidate(notif_t *notif) {
    -	edg_wll_NotifIdFree(notif->id);
    -	free(notif->id_str);
    -	notif->id = NULL;
    -	notif->id_str = NULL;
    -	notif->error = 0;
    -}
    -
    -
    -int notif_copy(notif_t *dest, notif_t *src) {
    -	if (!src || !dest) return EINVAL;
    -	memset(dest, 0, sizeof(notif_t));
    -	if (src->id) dest->id = edg_wll_NotifIdDup(src->id);
    -	if (src->id_str) dest->id_str = strdup(src->id_str);
    -	dest->type = src->type;
    -	if (src->server) dest->server = strdup(src->server);
    -	dest->port = src->port;
    -	dest->valid = src->valid;
    -	dest->refresh = src->refresh;
    -	dest->last_update = src->last_update;
    -	dest->active = src->active;
    -	dest->error = src->error;
    -	return 0;
    -}
    -
    -
    -#ifdef WITH_LBU_DB
    -static int db_init(thread_t *t, glite_lbu_DBContext *dbctx) {
    -	int err, dbcaps;
    -
    -	if (config.dbcs) {
    -		if ((err = glite_lbu_InitDBContext(dbctx, GLITE_LBU_DB_BACKEND_PSQL, LOG_CATEGORY_LB_HARVESTER_DB)) != 0) {
    -			lprintf_dbctx(t, ERR, "can't initialize DB context");
    -			return err;
    -		}
    -		while ((err = glite_lbu_DBConnect(*dbctx, config.dbcs)) != 0 && !quit) {
    -			lprintf_dbctx(t, ERR, "can't connect to '%s'", config.dbcs);
    -			lprintf(t, INF, "still trying...");
    -			sleep(5);
    -		}
    -		if (err == 0) {
    -			if ((dbcaps = glite_lbu_DBQueryCaps(*dbctx)) == -1) {
    -				lprintf_dbctx(t, ERR, "can't get database capabilities");
    -				dbcaps = 0;
    -			}
    -			lprintf(t, INF, "DB connected, cs: %s, capabilities: %d", config.dbcs, dbcaps);
    -			if (t == NULL && (dbcaps & GLITE_LBU_DB_CAP_PREPARED) == 0) {
    -				lprintf(NULL, WRN, "postgresql server doesn't support SQL prepared commands, recommended version >= 8.2");
    -			}
    -			if (t) t->dbcaps = dbcaps;
    -			return 0;
    -		} else {
    -			glite_lbu_FreeDBContext(*dbctx);
    -			return err;
    -		}
    -	} else {
    -		lprintf(t, DBG, "no DB configured (--pg option)");
    -		return -1;
    -	}
    -}
    -
    -
    -static void db_free(__attribute((unused))thread_t *t, glite_lbu_DBContext dbctx) {
    -	if (dbctx) {
    -		glite_lbu_DBClose(dbctx);
    -		glite_lbu_FreeDBContext(dbctx);
    -	}
    -}
    -#endif
    -
    -
    -static notif_t *db_add_notif(char *notifid, int type, time_t valid, time_t refresh, double last_update, char *server, int port, int active, int errors) {
    -	void *tmp;
    -	notif_t *notif;
    -
    -	if (db.n >= db.maxn) {
    -		db.maxn = db.n + 20;
    -		if ((tmp = realloc(db.notifs, db.maxn * sizeof(notif_t))) == NULL) return NULL;
    -		db.notifs = (notif_t *)tmp;
    -		memset(db.notifs + db.n, 0, (db.maxn - db.n) * sizeof(notif_t));
    -	}
    -	notif = db.notifs + db.n;
    -	notif->id_str = notifid;
    -	notif->type = type;
    -	notif->valid = valid;
    -	notif->refresh = refresh;
    -	notif->last_update = last_update;
    -	notif->server = server;
    -	notif->port = port;
    -	notif->active = active;
    -	notif->error = errors;
    -	db.n++;
    -
    -	return notif;
    -}
    -
    -
    -static int db_save_notifs_file(thread_t *t) {
    -	FILE *f;
    -	char *filename = NULL;
    -	int retval = 1;
    -	notif_t *notif;
    -	int i, cnt;
    -	char *valid_str = NULL, *refresh_str = NULL, *last_update_str = NULL, *id_str = NULL;
    -
    -	asprintf(&filename, "%s-new", config.notif_file);
    -	if ((f = fopen(filename, "wt")) == NULL) {
    -		lprintf(t, ERR, "can't write '%s': %s", filename, strerror(errno));
    -		goto quit;
    -	}
    -
    -	cnt = 0;
    -	for (i = 0; i < db.n; i++) {
    -		notif = db.notifs + i;
    -		if (!notif->active) {
    -			lprintf(t, DBG, "not saving inactive notif %s (%s), server %s:%d", notif->id_str, rtm_notiftype2str(notif->type), notif->server, notif->port);
    -			continue;
    -		}
    -
    -		if (notif->id_str) id_str = strdup(notif->id_str);
    -		else if (notif->error) asprintf(&id_str, "%s:%d", notif->server, notif->port);
    -		if (id_str) {
    -			rtm_time2str(notif->valid, &valid_str);
    -			rtm_time2str(notif->refresh, &refresh_str);
    -			rtm_timestamp2str(notif->last_update, &last_update_str);
    -
    -			fprintf(f, RTM_FILE_NOTIF_PRINTF, id_str, rtm_notiftype2str(notif->type), valid_str, refresh_str, last_update_str, notif->error);
    -			cnt++;
    -
    -			free(valid_str); valid_str = NULL;
    -			free(refresh_str); refresh_str = NULL;
    -			free(last_update_str); last_update_str = NULL;
    -		}
    -		free(id_str);
    -		id_str = NULL;
    -	}
    -	fclose(f);
    -	if (rename(filename, config.notif_file) != 0) {
    -		lprintf(t, ERR, "can't move new notification file '%s' to '%s': %s", filename, config.notif_file, strerror(errno));
    -		goto quit;
    -	}
    -	retval = 0;
    -
    -	if (!cnt) unlink(config.notif_file);
    -
    -quit:
    -	free(filename);
    -	free(valid_str);
    -	free(refresh_str);
    -	free(last_update_str);
    -	return retval;
    -}
    -
    -
    -#if defined(WITH_RTM_SQL_STORAGE) && defined(WITH_LBU_DB)
    -static int db_save_notifs_sql(thread_t *t) {
    -	int retval = 1;
    -	notif_t *notif;
    -	int i;
    -	char *sql = NULL, *valid_str = NULL, *refresh_str = NULL, *last_update_str = NULL;
    -	const char *type_str, *amp;
    -
    -	for (i = 0; i < db.n; i++) {
    -		notif = db.notifs + i;
    -/*
    -		if (!notif->active) {
    -			lprintf(t, INS, "not saving inactive notif %s (%s:%d)", notif->id_str, notif->server, notif->port);
    -			continue;
    -		}
    -*/
    -		type_str = rtm_notiftype2str(notif->type);
    -		if (notif->id_str || notif->error) {
    -			if (notif->valid) glite_lbu_TimeToDB(db.dbctx, notif->valid, &valid_str);
    -			else valid_str = strdup("NULL");
    -			if (notif->refresh) glite_lbu_TimeToDB(db.dbctx, notif->refresh, &refresh_str);
    -			else refresh_str = strdup("NULL");
    -			if (notif->last_update) glite_lbu_TimestampToDB(db.dbctx, notif->last_update, &last_update_str);
    -			else last_update_str = strdup("NULL");
    -			amp = notif->id_str ? "'" : " ";
    -			trio_asprintf(&sql, "UPDATE notifs SET notifid=%s%|Ss%s, valid=%s, refresh=%s, last_update=%s, errors=%d WHERE lb='%|Ss' AND port=%d AND notiftype='%|Ss'", amp, notif->id_str ? : "NULL", amp, valid_str, refresh_str, last_update_str, notif->error, notif->server, notif->port, type_str);
    -			switch (glite_lbu_ExecSQL(db.dbctx, sql, NULL)) {
    -			case 0:
    -				// not found - insert
    -				// can be handy when using file as input of LBs
    -				free(sql);
    -				trio_asprintf(&sql, "INSERT INTO notifs (lb, port, notifid, notiftype, valid, refresh, last_update, errors) VALUES ('%|Ss', %d, %s%|Ss%s, '%|Ss', %s, %s, %s, %d)", notif->server, notif->port, amp, notif->id_str ? : "NULL", amp, type_str, valid_str, refresh_str, last_update_str, notif->error);
    -				switch (glite_lbu_ExecSQL(db.dbctx, sql, NULL)) {
    -				case -1:
    -					lprintf_dbctx(t, ERR, "notif '%s' (%s) insert failed", notif->id_str, type_str);
    -					goto quit;
    -				case 0:
    -					lprintf(t, ERR, "notif '%s' (%s) not inserted for unknown reason", type_str);
    -					break;
    -				default:
    -					lprintf(t, INS, "notif '%s' (%s) inserted", notif->id_str, type_str);
    -					break;
    -				}
    -				break;
    -			case -1:
    -				lprintf_dbctx(t, ERR, "notif '%s' (%s) update failed", notif->id_str, type_str);
    -				goto quit;
    -			default:
    -				lprintf(t, INS, "notif '%s' updated", notif->id_str);
    -				break;
    -			}
    -		} else {
    -			trio_asprintf(&sql, "UPDATE notifs SET notifid=NULL, valid=NULL, refresh=NULL, last_update=NULL WHERE lb='%|Ss' AND port=%d AND notiftype='%|Ss'", notif->server, notif->port, type_str);
    -			switch (glite_lbu_ExecSQL(db.dbctx, sql, NULL)) {
    -			case 0:
    -				lprintf(t, INS, "cleared %s notif for %s:%d not found, ok", type_str, notif->server, notif->port);
    -				break;
    -			case -1:
    -				lprintf_dbctx(t, ERR, "clearing notif %s for %s:%d failed", type_str, notif->server, notif->port);
    -				goto quit;
    -			default:
    -				lprintf(t, INS, "cleared notif %s for %s:%d", type_str, notif->server, notif->port);
    -				break;
    -			}
    -		}
    -		free(sql); sql = NULL;
    -		free(valid_str); valid_str = NULL;
    -		free(refresh_str); refresh_str = NULL;
    -		free(last_update_str); last_update_str = NULL;
    -	}
    -	retval = 0;
    -quit:
    -	free(sql);
    -	free(valid_str);
    -	free(refresh_str);
    -	free(last_update_str);
    -	return 0;
    -}
    -#endif
    -
    -
    -static int db_save_notifs(thread_t *t) {
    -#if 0
    -	int i;
    -
    -	for (i = 0; i < db.n; i++) {
    -		notif_t *notif = db.notifs + i;
    -		lprintf(NULL, DBG, "save: %s (%s), server: %s:%d, active: %d", notif->id_str, rtm_notiftype2str(notif->type), notif->server, notif->port, notif->active);
    -	}
    -#endif
    -
    -#if defined(WITH_LBU_DB)
    -	int i, ret;
    -	notif_t *notif;
    -
    -	//
    -	// Keep monitored flag when:
    -	// 1) used and opened DB
    -	// 2) LB servers not from config file
    -	//
    -	if (t && t->dbctx && !config.config_file) {
    -		for (i = 0; i < t->nservers; i++) {
    -			notif = t->notifs + i;
    -
    -			if (notif->type == RTM_NOTIF_TYPE_OLD || notif->type == RTM_NOTIF_TYPE_JDL) {
    -				lprintf(t, DBG, "changing monitored flag of %d. notification for %s:%d to %d", i, notif->server, notif->port, notif->error ? 0 : 1);
    -				if ((t->dbcaps & GLITE_LBU_DB_CAP_PREPARED) == 0) {
    -					char *sql;
    -
    -					trio_asprintf(&sql, "UPDATE " DBAMP RTM_DB_TABLE_LBS DBAMP " SET monitored=%s WHERE ip='%|Ss'", notif->error ? "false" : "true", notif->server);
    -					ret = glite_lbu_ExecSQL(t->dbctx, sql, NULL);
    -					free(sql);
    -				} else {
    -					ret = glite_lbu_ExecPreparedStmt(t->updatecmd_mon, 2,
    -						GLITE_LBU_DB_TYPE_BOOLEAN, notif->error ? 0 : 1,
    -						GLITE_LBU_DB_TYPE_VARCHAR, notif->server
    -					);
    -				}
    -				if (ret == -1) {
    -					lprintf_dbctx(t, ERR, "can't update monitored flag in " RTM_DB_TABLE_LBS " table");
    -					return 1;
    -				}
    -			}
    -		}
    -	}
    -#endif
    -
    -#if defined(WITH_RTM_SQL_STORAGE) && defined(WITH_LBU_DB)
    -	if (!db.dbctx) return db_save_notifs_file(t);
    -	else return db_save_notifs_sql(t);
    -#else
    -	return db_save_notifs_file(t);
    -#endif
    -}
    -
    -
    -static notif_t *db_search_notif(notif_t *notifs, int n, const char *notifid) {
    -	int i;
    -
    -	for (i = 0; i < n && (!notifs[i].id_str || strcmp(notifs[i].id_str, notifid) != 0); i++);
    -	return i == n ? NULL : notifs + i;
    -}
    -
    -
    -static notif_t *db_search_notif_by_server(notif_t *notifs, int n, const char *server, unsigned int port, int type) {
    -	int i;
    -
    -	for (i = 0; i < n; i++) {
    -		if (strcmp(notifs[i].server, server) == 0 && notifs[i].port == port && notifs[i].type == type) break;
    -	}
    -
    -	return i == n ? NULL : notifs + i;
    -}
    -
    -
    -#ifdef WITH_LBU_DB
    -typedef struct {
    -	char *lb;
    -	char *jobid;
    -	char *unique_str;
    -	char *ce;
    -	char *queue;
    -	char *rb;
    -	char *ui;
    -	char *state;
    -	double state_entered;
    -	double rtm_timestamp;
    -	int registered;
    -	char * vo;
    -} db_job_t;
    -
    -
    -//
    -// store state into dababase
    -// on purged status deletes the record
    -//
    -static void db_store_change_perform_sql(thread_t *t, edg_wll_JobStatCode state, db_job_t *rec) {
    -	char *state_entered_str = NULL, *rtm_timestamp_str = NULL, *regtime_str = NULL;
    -	char *sql = NULL, *sql2 = NULL, *sql_part = NULL, *tmp = NULL;
    -	const char *active = "true", *state_changed = "true";
    -
    -	if (state == EDG_WLL_JOB_PURGED) {
    -		if (!config.no_purge) {
    -			lprintf(t, DBG, "purge %s", rec->jobid);
    -			if ((t->dbcaps & GLITE_LBU_DB_CAP_PREPARED) == 0) {
    -				trio_asprintf(&sql, "DELETE FROM " RTM_DB_TABLE_JOBS " WHERE jobid='%|Ss' AND lb='%|Ss'", rec->unique_str, rec->lb);
    -				lprintf(t, INS, "delete: %s", sql);
    -				if (glite_lbu_ExecSQL(t->dbctx, sql, NULL) == -1) {
    -					lprintf_dbctx(t, WRN, "can't delete job %s", rec->jobid);
    -					goto quit;
    -				}
    -			} else {
    -				if (glite_lbu_ExecPreparedStmt(t->deletecmd, 2,
    -					GLITE_LBU_DB_TYPE_VARCHAR, rec->unique_str,
    -					GLITE_LBU_DB_TYPE_VARCHAR, rec->lb
    -				) == -1) {
    -					lprintf_dbctx(t, WRN, "can't delete job %s", rec->jobid);
    -					goto quit;
    -				}
    -			}
    -		}
    -	} else {
    -		if ((t->dbcaps & GLITE_LBU_DB_CAP_PREPARED) == 0) {
    -			glite_lbu_TimestampToDB(t->dbctx, rec->state_entered, &state_entered_str);
    -			glite_lbu_TimestampToDB(t->dbctx, rec->rtm_timestamp, &rtm_timestamp_str);
    -			glite_lbu_TimeToDB(t->dbctx, rec->registered, ®time_str);
    -
    -			if (rec->vo) trio_asprintf(&sql_part, ", vo='%|Ss'", rec->vo);
    -			if (rec->rb) {
    -				trio_asprintf(&tmp, "%s, rb='%|Ss'", sql_part ? : "", rec->rb);
    -				free(sql_part);
    -				sql_part = tmp;
    -				tmp = NULL;
    -			}
    -			trio_asprintf(&sql, "UPDATE " RTM_DB_TABLE_JOBS " SET ce='%|Ss', queue='%|Ss', ui='%|Ss', state='%|Ss', state_entered=%s, rtm_timestamp=%s, active=%s, state_changed=%s, registered=%s%s WHERE jobid='%|Ss' AND lb='%|Ss'", rec->ce, rec->queue, rec->ui, rec->state, state_entered_str, rtm_timestamp_str, active, state_changed, regtime_str, sql_part ? : "", rec->unique_str, rec->lb);
    -			lprintf(t, INS, "update: %s", sql);
    -			switch (glite_lbu_ExecSQL(t->dbctx, sql, NULL)) {
    -			case -1:
    -				lprintf_dbctx(t, ERR, "can't get jobs");
    -				goto quit;
    -			case 0:
    -				trio_asprintf(&sql2, "INSERT INTO " RTM_DB_TABLE_JOBS " "
    -					"(ce, queue, rb, ui, state, state_entered, rtm_timestamp, jobid, lb, active, state_changed, registered, vo) VALUES "
    -					"('%|Ss', '%|Ss', '%|Ss', '%|Ss', '%|Ss', %s, %s, '%|Ss', '%|Ss', %s, %s, %s, '%|Ss')", rec->ce, rec->queue, rec->rb ? : "unknown", rec->ui, rec->state, state_entered_str, rtm_timestamp_str, rec->unique_str, rec->lb, active, state_changed, regtime_str, rec->vo ? : "unknown");
    -				lprintf(t, INS, "insert: %s", sql2);
    -				if (glite_lbu_ExecSQL(t->dbctx, sql2, NULL) == -1) {
    -					lprintf_dbctx(t, ERR, "can't insert job");
    -					goto quit;
    -				}
    -				break;
    -			default:
    -				break;
    -			}
    -		} else { // prepared commands
    -			int ret;
    -
    -			ret = glite_lbu_ExecPreparedStmt(t->updatecmd, 11,
    -				GLITE_LBU_DB_TYPE_VARCHAR, rec->ce,
    -				GLITE_LBU_DB_TYPE_VARCHAR, rec->queue,
    -				GLITE_LBU_DB_TYPE_VARCHAR, rec->ui,
    -				GLITE_LBU_DB_TYPE_VARCHAR, rec->state,
    -				GLITE_LBU_DB_TYPE_TIMESTAMP, rec->state_entered,
    -				GLITE_LBU_DB_TYPE_TIMESTAMP, rec->rtm_timestamp,
    -				GLITE_LBU_DB_TYPE_BOOLEAN, 1, // active
    -				GLITE_LBU_DB_TYPE_BOOLEAN, 1, // state_changed
    -				GLITE_LBU_DB_TYPE_TIMESTAMP, (double)rec->registered,
    -
    -				GLITE_LBU_DB_TYPE_VARCHAR, rec->unique_str, // jobid
    -				GLITE_LBU_DB_TYPE_VARCHAR, rec->lb // L&B server
    -			);
    -
    -			switch (ret) {
    -			case -1:
    -				lprintf_dbctx(t, ERR, "can't update " RTM_DB_TABLE_JOBS " table");
    -				goto quit;
    -			case 0:
    -				if (glite_lbu_ExecPreparedStmt(t->insertcmd, 13,
    -					GLITE_LBU_DB_TYPE_VARCHAR, rec->ce,
    -					GLITE_LBU_DB_TYPE_VARCHAR, rec->queue,
    -					GLITE_LBU_DB_TYPE_VARCHAR, rec->rb ? : "unknown",
    -					GLITE_LBU_DB_TYPE_VARCHAR, rec->ui,
    -					GLITE_LBU_DB_TYPE_VARCHAR, rec->state,
    -					GLITE_LBU_DB_TYPE_TIMESTAMP, rec->state_entered,
    -					GLITE_LBU_DB_TYPE_TIMESTAMP, rec->rtm_timestamp,
    -					GLITE_LBU_DB_TYPE_VARCHAR, rec->unique_str, // jobid
    -					GLITE_LBU_DB_TYPE_VARCHAR, rec->lb, // L&B server
    -					GLITE_LBU_DB_TYPE_BOOLEAN, 1, // active
    -					GLITE_LBU_DB_TYPE_BOOLEAN, 1, // state_changed
    -					GLITE_LBU_DB_TYPE_TIMESTAMP, (double)rec->registered,
    -					GLITE_LBU_DB_TYPE_VARCHAR, rec->vo ? : "unknown" // VO
    -				) == -1) {
    -					lprintf_dbctx(t, ERR, "can't insert to " RTM_DB_TABLE_JOBS " table");
    -					goto quit;
    -				}
    -				break;
    -			default:
    -				if (rec->vo) {
    -					if (glite_lbu_ExecPreparedStmt(t->updatecmd_vo, 3,
    -						GLITE_LBU_DB_TYPE_VARCHAR, rec->vo, // VO
    -
    -						GLITE_LBU_DB_TYPE_VARCHAR, rec->unique_str, // jobid
    -						GLITE_LBU_DB_TYPE_VARCHAR, rec->lb // L&B server
    -					) == -1)
    -						lprintf(t, ERR, "can't update VO in "  RTM_DB_TABLE_JOBS " table");
    -				}
    -				if (rec->rb) {
    -					if (glite_lbu_ExecPreparedStmt(t->updatecmd_rb, 3,
    -						GLITE_LBU_DB_TYPE_VARCHAR, rec->rb, // RB
    -
    -						GLITE_LBU_DB_TYPE_VARCHAR, rec->unique_str, // jobid
    -						GLITE_LBU_DB_TYPE_VARCHAR, rec->lb // L&B server
    -					) == -1)
    -						lprintf(t, ERR, "can't update RB in "  RTM_DB_TABLE_JOBS " table");
    -				}
    -				break;
    -			}
    -		} // prepare commands
    -	}
    -
    -quit:
    -	free(sql);
    -	free(sql2);
    -	free(sql_part);
    -	free(state_entered_str);
    -	free(rtm_timestamp_str);
    -	free(regtime_str);
    -}
    -#endif
    -
    -
    -static int db_store_change(thread_t *t, notif_t *notif, __attribute((unused))int index, edg_wll_JobStat *stat) {
    -	char *jobid_str = NULL, *state_str = NULL, *vo = NULL, *lbhost = NULL;
    -	unsigned int port;
    -
    -	jobid_str = stat->jobId ? glite_jobid_unparse(stat->jobId) : strdup("unknown");
    -	glite_jobid_getServerParts(stat->jobId, &lbhost, &port);
    -	state_str = edg_wll_StatToString(stat->state);
    -	vo = edg_wll_JDLField(stat, "VirtualOrganisation");
    -	printf(RTM_TTY_GREEN "notifid: %s (%s), jobid: %s, state: %s, vo: %s, last time: %lf" RTM_TTY_RST "\n", notif->id_str, rtm_notiftype2str(notif->type), jobid_str, state_str, vo, notif->last_update);
    -
    -#ifdef WITH_LBU_DB
    -	if (config.dbcs && t->dbctx) {
    -		db_job_t rec;
    -		char *colon;
    -		char *unique_str = NULL, *resource_broker = NULL, *destination = NULL;
    -
    -		memset(&rec, 0, sizeof rec);
    -		// L&B server
    -		rec.lb = lbhost;
    -		// jobid + uniqe
    -		unique_str = glite_jobid_getUnique(stat->jobId);
    -		rec.unique_str = unique_str;
    -		rec.jobid = jobid_str;
    -		// CE
    -		destination = stat->destination ? rtm_url2stripped(stat->destination) : strdup("unknown");
    -		rec.ce = destination;
    -		// queue
    -		rec.queue = strchr(rec.ce, '/');
    -		if (rec.queue) *rec.queue++='\0';
    -		else rec.queue = "unknown";
    -		colon = strchr(rec.ce, ':');
    -		if (colon) colon[0] = '\0';
    -		// Virtual Organization
    -		rec.vo = vo;
    -		// Resource Broker (CREAM jobs from JDL, gLite jobs hostname from Network Server URL)
    -		if (stat->jobtype == EDG_WLL_STAT_CREAM) {
    -			resource_broker = edg_wll_JDLField(stat, "SubmitterService");
    -		} else {
    -			resource_broker = stat->network_server ? rtm_url2hostname(stat->network_server) : NULL;
    -		}
    -		rec.rb = resource_broker;
    -		// UI
    -		rec.ui = stat->ui_host ? : "unknown";
    -		// state
    -		rec.state = state_str ? : "unknown";
    -		// state time
    -		rec.state_entered = stat->stateEnterTime.tv_sec + stat->stateEnterTime.tv_usec / 1000000.0;
    -		// notification time
    -		rec.rtm_timestamp = rtm_gettimeofday();
    -		// registration time
    -		rec.registered = stat->stateEnterTimes[1 + EDG_WLL_JOB_SUBMITTED];
    -
    -		// store!
    -		db_store_change_perform_sql(t, stat->state, &rec);
    -
    -		free(unique_str);
    -		free(resource_broker);
    -		free(destination);
    -	}
    -#endif
    -
    -	// store message
    -	if (config.wlcg) {
    -		if (wlcg_store_message(t, notif, stat) != 0) goto quit;
    -		if (config.wlcg_flush) wlcg_send_message(t);
    -	}
    -
    -quit:
    -	free(jobid_str);
    -	free(state_str);
    -	free(lbhost);
    -	free(vo);
    -
    -	return 0;
    -}
    -
    -
    -static int db_summary_getjobids(__attribute((unused))db_t *db, __attribute((unused))int maxn, __attribute((unused))char **jobids, int *n) {
    -/*
    -	switch (db->was_summary) {
    -	case 0:
    -		*n = 3;
    -		jobids[0] = strdup("https://skurut68-2.cesnet.cz:9000/FJldtiAR2EHC12C3Zz8WjQ");
    -		jobids[1] = strdup("https://skurut68-2.cesnet.cz:9000/AWTCWrUCr3uUh6cuRFaENQ");
    -		jobids[2] = strdup("https://skurut68-1.cesnet.cz:9000/o73CG2wrNdEQ909mG0Ac1g");
    -		break;
    -	case 1:
    -		*n = 1;
    -		jobids[0] = strdup("https://skurut68-2.cesnet.cz:9000/-46Qa2ag4gLsA_Ki-3bSLw");
    -
    -		break;
    -	default: *n = 0; break;
    -	}
    -	db->was_summary = (db->was_summary + 1) % 3;
    -	return 0;
    -*/
    -	*n = 0;
    -	return 0;
    -}
    -
    -
    -static int db_summary_setinfo(__attribute((unused))db_t *db, edg_wll_JobStat *stat) {
    -	char *jobidstr;
    -
    -	jobidstr = stat->jobId ? glite_jobid_unparse(stat->jobId) : NULL;
    -	printf(RTM_TTY_GREEN "summary: jobid='%s'" RTM_TTY_RST "\n", jobidstr);
    -	free(jobidstr);
    -	return 0;
    -}
    -
    -
    -int rtm_summary(edg_wll_Context ctx, db_t *db) {
    -	char *jobids[RTM_SUMMARY_JOBS];
    -	edg_wll_QueryRec lbquery[RTM_SUMMARY_JOBS + 1], *qr;
    -	const edg_wll_QueryRec *lbqueryext[2];
    -	edg_wll_JobStat *jobstates = NULL;
    -	int err = 0, ijob = 0, njobs = 0, iquery = 0, k, server_changed = 0;
    -	glite_jobid_t jid = NULL;
    -	char *server = NULL, *new_server = NULL;
    -	unsigned int port = 0, new_port = 0;
    -
    -	lprintf(NULL, INS, "Summary");
    -
    -	lbqueryext[0] = lbquery;
    -	lbqueryext[1] = NULL;
    -	memset(lbquery, 0, sizeof(lbquery));
    -
    -	do {
    -		if (server) {
    -
    -		if ((iquery >= RTM_SUMMARY_JOBS || server_changed || !njobs) && iquery) {
    -			if ((err = edg_wll_QueryJobsExt(ctx, lbqueryext, 0, NULL, &jobstates)) != 0) {
    -				lprintf_ctx(NULL, ERR, ctx, "query to '%s:%u' failed: %s", server, port, strerror(err));
    -				// report error jobids and skip the job (do nothing)
    -				// TODO
    -			}
    -			for (k = 0; k < iquery; k++) glite_jobid_free((glite_jobid_t)lbquery[k].value.j);
    -
    -			if (err == 0) {
    -				for (k = 0; jobstates[k].state != EDG_WLL_JOB_UNDEF; k++) {
    -					if ((err = db_summary_setinfo(db, jobstates + k)) != 0) lprintf(NULL, ERR, "Can't store %d. summary info for %s:%u", k, server, port);
    -					edg_wll_FreeStatus(jobstates + k);
    -				}
    -				free(jobstates);
    -				lprintf(NULL, DBG, "query to '%s:%u' succeed", server, port);
    -			}
    -
    -			iquery = 0;
    -			memset(lbquery, 0, sizeof(lbquery));
    -			if (!njobs) break; // not needed, just spare summary select
    -
    -			server_changed = 0;
    -		} else {
    -			lprintf(NULL, DBG, "summary pushed %d. %s\n", iquery, jobids[ijob]);
    -			qr = lbquery + iquery;
    -			iquery++;
    -			qr->attr = EDG_WLL_QUERY_ATTR_JOBID;
    -			qr->op = EDG_WLL_QUERY_OP_EQUAL;
    -			glite_jobid_parse(jobids[ijob], (glite_jobid_t *)&qr->value.j);
    -			free(jobids[ijob]); jobids[ijob] = NULL;
    -			ijob++;
    -		}
    -
    -		} // server
    -
    -		if (ijob >= njobs) {
    -			ijob = 0;
    -			memset(jobids, 0, sizeof(jobids));
    -			njobs = 0;
    -			if ((err = db_summary_getjobids(db, RTM_SUMMARY_JOBS, jobids, &njobs)) != 0) {
    -				lprintf(NULL, ERR, "Can't get jobs for the summary");
    -				return err;
    -			}
    -			lprintf(NULL, DBG, "summary for %d jobs", njobs);
    -			if (!njobs) {
    -				if (iquery) continue; // do the last query
    -				else break;
    -			}
    -		}
    -
    -		if ((err = glite_jobid_parse(jobids[ijob], &jid)) != 0) {
    -			lprintf(NULL, ERR, "Can't parse jobid '%s': %s", jobids[ijob], strerror(err));
    -			// report error jobid and skip the job
    -			// TODO
    -			glite_jobid_free(jid); jid = NULL;
    -			free(jobids[ijob]); jobids[ijob] = NULL;
    -			ijob++;
    -			continue;
    -		}
    -		free(new_server);
    -		glite_jobid_getServerParts(jid, &new_server, &new_port);
    -		glite_jobid_free(jid); jid = NULL;
    -
    -		// first or different LB server
    -		if (new_server && (!server || strcmp(server, new_server) != 0 || port != new_port)) {
    -			if (server) server_changed = 1;
    -
    -			free(server);
    -			server = new_server;
    -			port = new_port;
    -
    -			new_server = NULL;
    -			new_port = 0;
    -
    -			edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER, server);
    -			edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, port);
    -			lprintf(NULL, INF, "summary LB server '%s:%u'", server, port);
    -		}
    -	} while (njobs || iquery);
    -
    -	free(server);
    -	free(new_server);
    -
    -	return err;
    -}
    -
    -
    -/*
    - * Updates error counter and retry times on the notification.
    - *
    - * On errors it lineary increases delay. Minimum delay is
    - * RTM_ERROR_REPEAT_RATE, maximum is half of the configured
    - * bootstrap time.
    - *
    - * \param t		thread context
    - * \param notif		updated notification
    - * \param[IN] index	notification order (for debug printing)
    - * \param is_error[IN]	error state (to reset or increment error counter)
    - *
    - */
    -static int rtm_update_error_state(thread_t *t, notif_t *notif, int index, int is_error) {
    -	int old_error, max_count;
    -
    -	old_error = notif->error;
    -	if (is_error) {
    -		if (!notif->error++ || !notif->refresh) notif->refresh = time(NULL);
    -		max_count = config.dive / RTM_ERROR_REPEAT_RATE / 2;
    -		if (max_count <= 0) max_count = 1;
    -		notif->refresh += (notif->error <= max_count ? notif->error : max_count) * RTM_ERROR_REPEAT_RATE;
    -		lprintf(t, DBG, "planned to retry at %s", time2str(t, notif->refresh));
    -	} else {
    -		notif->error = 0;
    -	}
    -	if (old_error != notif->error) {
    -		lprintf(t, DBG, "error count of %d. server %s:%d changed from %d to %d", index, notif->server, notif->port, old_error, notif->error);
    -	}
    -
    -	return 0;
    -}
    -
    -
    -/**
    - * Updates notifications in persistent storage. Used to send WLCG messages too.
    - *
    - * \param t	thread context
    - * \param[IN]	new_notif updating notification, NULL = no change in shared memory
    - * \param[IN]	store     0=light (just shared memory), 1=save (flush, really store)
    - * \retval 0 if OK
    - */
    -int rtm_update_notif(thread_t *t, notif_t *new_notif, int store) {
    -	notif_t *notif;
    -	int retval = 1;
    -
    -	pthread_mutex_lock(&db.lock);
    -
    -	if (new_notif) {	
    -		if ((notif = db_search_notif_by_server(db.notifs, db.n, new_notif->server, new_notif->port, new_notif->type)) == NULL) {
    -			if (db_add_notif(strdup(new_notif->id_str), new_notif->type, new_notif->valid, new_notif->refresh, new_notif->last_update, strdup(new_notif->server), new_notif->port, 1, 0) == NULL) {
    -				lprintf(t, ERR, "can't realloc");
    -				goto quit;
    -			}
    -		} else {
    -			notif_free(notif);
    -			notif_copy(notif, new_notif);
    -		}
    -	}
    -
    -	wlcg_send_message(t);
    -
    -	if (store) {
    -		if (db_save_notifs(t) != 0) goto quit;
    -	}
    -	retval = 0;
    -	
    -quit:
    -	pthread_mutex_unlock(&db.lock);
    -	return retval;
    -}
    -
    -
    -int rtm_drop_notif(thread_t *t, char *notifid, int store) {
    -	notif_t *notif;
    -	int retval = 1;
    -
    -	pthread_mutex_lock(&db.lock);
    -	if ((notif = db_search_notif(db.notifs, db.n, notifid)) != NULL) {
    -		notif_invalidate(notif);
    -		if (store)
    -			if (db_save_notifs(t) != 0) goto quit;
    -	}
    -	retval = 0;
    -quit:
    -	pthread_mutex_unlock(&db.lock);
    -	return retval;
    -}
    -
    -
    -int load_notifs_file() {
    -	FILE *f;
    -	char *results[5];
    -	notif_t *new_notif;
    -	int err;
    -	char *notifidstr;
    -	time_t valid, refresh;
    -	double last_update;
    -	edg_wll_NotifId id;
    -	int type, i, errcnt, port;
    -	int retval = 1;
    -
    -	if ((f = fopen(config.notif_file, "rt")) == NULL) {
    -		if (errno != ENOENT) lprintf(NULL, WRN, "WARNING: can't open notification file '%s'", config.notif_file);
    -		return 0;
    -	}
    -
    -	results[0] = malloc(RTM_FILE_NOTIF_NUM * 512);
    -	for (i = 1; i < RTM_FILE_NOTIF_NUM; i++) {
    -		results[i] = results[0] + i * 512;
    -	}
    -	while ((err = fscanf(f, RTM_FILE_NOTIF_SCANF, results[0], results[1], results[2], results[3], results[4], results[5])) == RTM_FILE_NOTIF_NUM) {
    -		notifidstr = results[0];
    -		if ((type = rtm_str2notiftype(results[1])) == -1) {
    -			lprintf(NULL, ERR, "unknown notification type '%s' in '%s'", results[1], notifidstr);
    -			continue;
    -		}
    -
    -		valid = rtm_str2time(results[2]);
    -		refresh = rtm_str2time(results[3]);
    -		last_update = rtm_str2timestamp(results[4]);
    -
    -		errcnt = 0;
    -		if (results[5] && strcasecmp(results[5], "-") != 0) {
    -			errcnt = atoi(results[5]);
    -		}
    -
    -		if (errcnt) {
    -			if (sscanf(notifidstr, "%511[^:]:%d", results[1], &port) != 2) {
    -				lprintf(NULL, WRN, "can't parse server specification '%s'", notifidstr);
    -				continue;
    -			}
    -			if ((new_notif = db_add_notif(NULL, type, valid, refresh, last_update, strdup(results[1]), port, 0, errcnt)) == NULL) {
    -				lprintf(NULL, ERR, "can't alloc");
    -				goto quit;
    -			}
    -		} else {
    -			if (edg_wll_NotifIdParse(notifidstr, &id) != 0) {
    -				lprintf(NULL, WRN, "can't parse notification ID '%s'", notifidstr);
    -				continue;
    -			}
    -			if ((new_notif = db_add_notif(strdup(notifidstr), type, valid, refresh, last_update, NULL, 0, 0, errcnt)) == NULL) {
    -				lprintf(NULL, ERR, "can't alloc");
    -				goto quit;
    -			}
    -			edg_wll_NotifIdGetServerParts(id, &new_notif->server, &new_notif->port);
    -			edg_wll_NotifIdFree(id);
    -		}
    -	}
    -	if (err == EOF) retval = 0;
    -	else lprintf(NULL, ERR, "can't parse notification file '%s'", config.notif_file);
    -quit:
    -	fclose(f);
    -	free(results[0]);
    -	return retval;
    -}
    -
    -
    -#if defined(WITH_RTM_SQL_STORAGE) && defined(WITH_LBU_DB)
    -int load_notifs_sql() {
    -	notif_t *new_notif;
    -	int err;
    -	char *notifidstr;
    -	time_t valid, refresh;
    -	double last_update;
    -	edg_wll_NotifId id;
    -	int type, i, errcnt;
    -	int retval = 1;
    -	glite_lbu_Statement stmt = NULL;
    -	char *results[8];
    -
    -	if (glite_lbu_ExecSQL(db.dbctx, "SELECT notifid, notiftype, valid, refresh, last_update, errors, lb, port FROM notifs", &stmt) == -1) {
    -		lprintf_dbctx(NULL, ERR, "fetching notification failed");
    -		goto quit;
    -	}
    -	while ((err = glite_lbu_FetchRow(stmt, 8, NULL, results)) > 0) {
    -		if (results[0] && results[0][0]) notifidstr = strdup(results[0]);
    -		else notifidstr = NULL;
    -		free(results[0]);
    -		results[0] = NULL;
    -
    -		if ((type = rtm_str2notiftype(results[1])) == -1) {
    -			lprintf(NULL, ERR, "unknown notification type '%s' in '%s'", results[1], notifidstr);
    -			for (i = 0; i < 8; i++) free(results[i]);
    -			free(notifidstr);
    -			continue;
    -		}
    -		free(results[1]);
    -
    -		valid = 0;
    -		if (results[2] && results[2][0]) {
    -			valid = glite_lbu_DBToTime(db.dbctx, results[2]);
    -		}
    -		free(results[2]);
    -
    -		refresh = 0;
    -		if (results[3] && results[3][0]) {
    -			refresh = glite_lbu_DBToTime(db.dbctx, results[3]);
    -		}
    -		free(results[3]);
    -
    -		last_update = 0;
    -		if (results[4] && results[4][0]) {
    -			last_update = glite_lbu_DBToTimestamp(db.dbctx, results[4]);
    -		}
    -		free(results[4]);
    -
    -		errcnt = 0;
    -		if (results[5] && results[5][0]) errcnt = atoi(results[5]);
    -		free(results[5]);
    -
    -		if ((new_notif = db_add_notif(notifidstr, type, valid, refresh, last_update, (results[6] && !notifidstr) ? strdup(results[6]) : NULL, atoi(results[7]), 0, errcnt)) == NULL) {
    -			free(notifidstr);
    -			free(results[6]);
    -			free(results[7]);
    -			lprintf(NULL, ERR, "can't alloc");
    -			goto quit;
    -		}
    -		free(results[6]);
    -		free(results[7]);
    -		if (notifidstr) {
    -			if (edg_wll_NotifIdParse(notifidstr, &id) != 0) {
    -				lprintf(NULL, WRN, "can't parse notification IDs '%s'", notifidstr);
    -				notif_free(new_notif);
    -				db.n--;
    -				continue;
    -			}
    -			edg_wll_NotifIdGetServerParts(id, &new_notif->server, &new_notif->port);
    -			edg_wll_NotifIdFree(id);
    -		}
    -	}
    -	if (err == 0) retval = 0;
    -	else lprintf_dbctx(NULL, ERR, "fetching failed");
    -quit:
    -	if (stmt) glite_lbu_FreeStmt(&stmt);
    -	return retval;
    -}
    -#endif
    -
    -
    -int load_notifs() {
    -	int i, ret;
    -
    -	pthread_mutex_lock(&db.lock);
    -
    -#if defined(WITH_RTM_SQL_STORAGE) && defined(WITH_LBU_DB)
    -	if (!db.dbctx) ret = load_notifs_file();
    -	else ret = load_notifs_sql();
    -#else
    -	ret = load_notifs_file();
    -#endif
    -	// try to reconnect on bad notifications immediately
    -	for (i = 0; i < db.n; i++)
    -		if (db.notifs[i].error) db.notifs[i].refresh = 0;
    -
    -	pthread_mutex_unlock(&db.lock);
    -
    -	return ret;
    -}
    -
    -
    -void db_free_notifs() {
    -	int i;
    -
    -	for (i = 0; i < db.n; i++) notif_free(db.notifs + i);
    -	free(db.notifs);
    -	db.notifs = NULL;
    -	db.n = db.maxn = 0;
    -}
    -
    -
    -void *notify_thread(void *thread_data) {
    -	struct sockaddr_in addr;
    -	int i, j, err;
    -	time_t now, bootstrap;
    -	edg_wll_NotifId notifid;
    -	struct timeval to;
    -	edg_wll_JobStat jobstat, *jobstates;
    -	notif_t *notif, *notif_jdl;
    -	edg_wll_QueryRec *conditions[3] = { NULL, NULL, NULL }, condition[3], condition2[2];
    -	int sock = -1, updated = 0, error = 0, received = 0;
    -	thread_t *t = (thread_t *)thread_data;
    -	edg_wll_Context ctx = NULL;
    -	int flags = 0;
    -
    -	const int	one = 1;
    -
    -	lprintf(t, DBG, "thread started");
    -
    -	if (!t->nservers) goto exit;
    -
    -	// LB
    -	if (edg_wll_InitContext(&ctx) != 0) {
    -		lprintf(t, ERR, "can't init LB context: %s", strerror(errno));
    -		goto exit;
    -	}
    -	if (config.cert) edg_wll_SetParam(ctx, EDG_WLL_PARAM_X509_CERT, config.cert);
    -	if (config.key) edg_wll_SetParam(ctx, EDG_WLL_PARAM_X509_KEY, config.key);
    -
    -	// socket
    -	if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
    -		lprintf(t, ERR, "can't create socket: %s", strerror(errno));
    -		goto exit;
    -	}
    -	lprintf(t, DBG, "socket created: %d", sock);
    -
    -	setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
    -
    -	memset(&addr, 0, sizeof addr);
    -	addr.sin_family = AF_INET;
    -	if (listen_port) addr.sin_port = htons(listen_port + t->id);
    -	addr.sin_addr.s_addr = INADDR_ANY;
    -	if (bind(sock, (const struct sockaddr*)&addr, sizeof addr) != 0) {
    -		lprintf(t, ERR, "can't bind socket: %s, port = %d", strerror(errno), listen_port ? listen_port + t->id : -1);
    -		goto exit;
    -	}
    -	if (listen(sock, 10) != 0) {
    -		lprintf(t, ERR, "can't listen on socket: %s", strerror(errno));
    -		goto exit;
    -	}
    -
    -#ifdef WITH_LBU_DB
    -	if (db_init(t, &t->dbctx) == 0)
    -		if ((t->dbcaps & GLITE_LBU_DB_CAP_PREPARED) != 0) {
    -			if (glite_lbu_PrepareStmt(t->dbctx, "INSERT INTO " DBAMP RTM_DB_TABLE_JOBS DBAMP " "
    -			    "(ce, queue, rb, ui, state, state_entered, rtm_timestamp, jobid, lb, active, state_changed, registered, vo)"
    -			    " VALUES "
    -			    "($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)",
    -			&t->insertcmd) != 0 || glite_lbu_PrepareStmt(t->dbctx, "UPDATE " DBAMP RTM_DB_TABLE_JOBS DBAMP " "
    -			    "SET ce=$1, queue=$2, ui=$3, state=$4, state_entered=$5, rtm_timestamp=$6, active=$7, state_changed=$8, registered=$9 WHERE jobid=$10 AND lb=$11", 
    -			&t->updatecmd) != 0 || glite_lbu_PrepareStmt(t->dbctx, "UPDATE " DBAMP RTM_DB_TABLE_JOBS DBAMP " "
    -			    "SET vo=$1 WHERE jobid=$2 AND lb=$3", 
    -			&t->updatecmd_vo) != 0 || glite_lbu_PrepareStmt(t->dbctx, "UPDATE " DBAMP RTM_DB_TABLE_LBS DBAMP " "
    -			    "SET rb=$1 WHERE jobid=$2 AND lb=$3",
    -			&t->updatecmd_rb) != 0 || glite_lbu_PrepareStmt(t->dbctx, "UPDATE " DBAMP RTM_DB_TABLE_LBS DBAMP " "
    -			    "SET monitored=$1 WHERE ip=$2",
    -			&t->updatecmd_mon) != 0 || glite_lbu_PrepareStmt(t->dbctx, "DELETE FROM " DBAMP RTM_DB_TABLE_JOBS DBAMP " WHERE jobid=$1 AND lb=$2",
    -			&t->deletecmd) != 0) {
    -				lprintf_dbctx(t, ERR, "can't create prepare commands");
    -				lprintf(t, DBG, "insertcmd=%p, updatecmd=%p, updatecmd_vo=%p, updatecmd_rb=%p, updatecmd_mon=%p, deletecmd=%p", t->insertcmd, t->updatecmd, t->updatecmd_vo, t->updatecmd_rb, t->updatecmd_mon, t->deletecmd);
    -				quit = RTM_QUIT_PRESERVE;
    -			}
    -		}
    -#endif
    -
    -	//
    -	// notifications loop:
    -	//   - refresh/create with bootstrap
    -	//   - receive & store changes
    -	//
    -	while (!quit) {
    -		now = time(NULL);
    -		t->next_refresh = now + RTM_NOTIF_LOOP_MAX_TIME;
    -		for (i = 0; i < t->nservers; i++) {
    -			notif = t->notifs + i;
    -			if (!notif->active) {
    -				lprintf(t, INS, "inactive %d. notification '%s' (%s)", i, notif->id_str, rtm_notiftype2str(notif->type));
    -				continue;
    -			}
    -			// skip invalid LBs if not planned yet
    -			if (notif->error) {
    -				if (notif->refresh > now) {
    -					lprintf(t, INS, "not planned to retry previously failed %d. notification '%s' (%s), plan %s", i, notif->id_str, rtm_notiftype2str(notif->type), time2str(t, notif->refresh));
    -					if (t->next_refresh > notif->refresh) t->next_refresh = notif->refresh;
    -					continue;
    -				}
    -				lprintf(t, DBG, "retry previously failed %d. notification '%s' (%s)", i, notif->id_str, rtm_notiftype2str(notif->type));
    -			}
    -			edg_wll_SetParam(ctx, EDG_WLL_PARAM_NOTIF_SERVER, notif->server);
    -			edg_wll_SetParam(ctx, EDG_WLL_PARAM_NOTIF_SERVER_PORT, notif->port);
    -			now = time(NULL);
    -			if (!notif->valid || notif->valid - RTM_NOTIF_TTL_TO_DEAD <= now || !notif->id_str) {
    -			// new notification
    -				lprintf(t, DBG, "host %s:%d, valid %s, notifstr '%s', notifid %p", notif->server, notif->port, time2str(t, notif->valid), notif->id_str, notif->id);
    -
    -				// crazy inter-notif interactions
    -				switch (notif->type) {
    -				case RTM_NOTIF_TYPE_STATUS:
    -					// STATUS must wait for existing JDL notification
    -					notif_jdl = db_search_notif_by_server(t->notifs, t->nservers, notif->server, notif->port, RTM_NOTIF_TYPE_JDL);
    -					if (!notif_jdl || !notif_jdl->valid || notif_jdl->valid - RTM_NOTIF_TTL_TO_DEAD <= now || !notif_jdl->id_str) {
    -						lprintf(t, DBG, "not created %d. notification for %s:%d (%s), waiting for %d. (JDL)", i, notif->server, notif->port, rtm_notiftype2str(notif->type), i + RTM_NOTIF_TYPE_JDL - RTM_NOTIF_TYPE_STATUS);
    -						// next retry of STATUS stright before the JDL
    -						if (notif_jdl) {
    -							notif->refresh = notif_jdl->refresh;
    -							if (t->next_refresh > notif->refresh) t->next_refresh = notif->refresh;
    -						}
    -						continue;
    -					}
    -					break;
    -				default:
    -					break;
    -				}
    -				bootstrap = notif->valid > RTM_NOTIF_TTL_TO_DEAD ? notif->valid - RTM_NOTIF_TTL_TO_DEAD : 0;
    -				if (config.dive > 0 && now - bootstrap > config.dive) {
    -					bootstrap = now - config.dive;
    -					lprintf(t, INS, "dive from %s:%d cut to %s (max. dive %d)", notif->server, notif->port, time2str(t, bootstrap), config.dive);
    -				}
    -				// explicitly drop old (failed) notification, if any
    -				if (notif->id_str) {
    -					if (notif->id) {
    -						if (edg_wll_NotifDrop(ctx, notif->id)) lprintf_ctx(t, WRN, ctx, "dropping %d. notification '%s' (%s) failed", i, notif->id_str, rtm_notiftype2str(notif->type));
    -					}
    -					// remove from the persistent storage now,
    -					// invalidate && update 
    -					rtm_drop_notif(t, notif->id_str, 1);
    -					// free the notification in the current thread
    -					notif_invalidate(notif);
    -					now = time(NULL);
    -				}
    -				// create the new notification
    -				notif->valid = now + config.ttl;
    -
    -				memset(conditions, 0, sizeof(conditions));
    -				memset(condition, 0, sizeof(condition));
    -				memset(condition2, 0, sizeof(condition2));
    -				flags = 0;
    -				switch(notif->type) {
    -#ifndef WITH_OLD_LB
    -				case RTM_NOTIF_TYPE_STATUS:
    -					conditions[0] = condition;
    -					condition[0].attr = EDG_WLL_QUERY_ATTR_STATUS;
    -					condition[0].op = EDG_WLL_QUERY_OP_CHANGED;
    -					break;
    -				case RTM_NOTIF_TYPE_JDL:
    -					conditions[0] = condition;
    -					conditions[1] = condition2;
    -					condition[0].attr = EDG_WLL_QUERY_ATTR_STATUS;
    -					condition[0].op = EDG_WLL_QUERY_OP_EQUAL;
    -					condition[0].value.i = EDG_WLL_JOB_WAITING;
    -					condition[1].attr = EDG_WLL_QUERY_ATTR_STATUS;
    -					condition[1].op = EDG_WLL_QUERY_OP_EQUAL;
    -					condition[1].value.i = EDG_WLL_JOB_SUBMITTED;
    -					condition2[0].attr = EDG_WLL_QUERY_ATTR_JDL_ATTR;
    -					condition2[0].op = EDG_WLL_QUERY_OP_CHANGED;
    -					flags = EDG_WLL_STAT_CLASSADS;
    -					break;
    -#endif
    -				case RTM_NOTIF_TYPE_OLD:
    -					flags = EDG_WLL_STAT_CLASSADS;
    -					break;
    -				case RTM_NOTIF_TYPE_DONE:
    -					conditions[0] = condition;
    -					condition[0].attr = EDG_WLL_QUERY_ATTR_STATUS;
    -					condition[0].op = EDG_WLL_QUERY_OP_EQUAL;
    -					condition[0].value.i = EDG_WLL_JOB_DONE;
    -					flags = EDG_WLL_STAT_CHILDREN;
    -					break;
    -				default:
    -					assert(notif->type != notif->type); // unknown type
    -					break;
    -				}
    -				if (edg_wll_NotifNew(ctx, (edg_wll_QueryRec const * const *) conditions, flags, sock, config.local_address, ¬if->id, ¬if->valid)) {
    -					memset(condition,0,sizeof condition);
    -					lprintf_ctx(t, ERR, ctx, "can't create %d. notification for %s:%d (%s)", i, notif->server, notif->port, rtm_notiftype2str(notif->type));
    -					notif->valid = 0;
    -					notif->id = NULL;
    -					rtm_update_error_state(t, notif, i, 1);
    -					error = 1;
    -					goto cont;
    -				} 
    -				notif->id_str = edg_wll_NotifIdUnparse(notif->id);
    -				lprintf(t, INF, "created %d. notification '%s' (%s), valid: %s", i, notif->id_str, rtm_notiftype2str(notif->type), time2str(t, notif->valid));
    -
    -				// bootstrap
    -				memset(condition, 0, sizeof(condition));
    -				flags = 0;
    -				switch (notif->type) {
    -				case RTM_NOTIF_TYPE_STATUS:
    -					condition[0].attr = EDG_WLL_QUERY_ATTR_LASTUPDATETIME;
    -					condition[0].op = EDG_WLL_QUERY_OP_WITHIN;
    -					condition[0].value.t.tv_sec = bootstrap;
    -					condition[0].value2.t.tv_sec = now;
    -					flags = EDG_WLL_STAT_CLASSADS;
    -					break;
    -				case RTM_NOTIF_TYPE_OLD:
    -					break;
    -				case RTM_NOTIF_TYPE_JDL:
    -					break;
    -				case RTM_NOTIF_TYPE_DONE:
    -					break;
    -				default:
    -					assert(notif->type != notif->type); // unknown type
    -					break;
    -				}
    -
    -				if (condition[0].attr) {
    -
    -				lprintf(t, INF, "bootstrap %s:%d (%d), time %s..%d(now)", notif->server, notif->port, i, time2str(t, bootstrap), now);
    -				edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER, notif->server);
    -				edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, notif->port);
    -				if ((err = edg_wll_QueryJobs(ctx, condition, flags, NULL, &jobstates)) != 0 && err != ENOENT) {
    -					lprintf_ctx(t, ERR, ctx, "can't bootstrap jobs on %s:%d, time %s..%d(now)", notif->server, notif->port, time2str(t, bootstrap), now);
    -					//
    -					// destroy the notification after failed bootstrap
    -					//
    -					// This error means there is something nasty on the remote LB server.
    -					// It could lost some messages between recreating notification,
    -					// so destroy this notification now.
    -					//
    -					if (edg_wll_NotifDrop(ctx, notif->id)) {
    -						lprintf_ctx(t, WRN, ctx, "dropping %d. notification '%s' (%s) after failed bootstrap failed", i, notif->id_str, rtm_notiftype2str(notif->type));
    -					} else {
    -						lprintf(t, INF, "dropped %d. notification '%s' (%s) after failed bootstrap", i, notif->id_str, rtm_notiftype2str(notif->type));
    -					}
    -					// free the notification instance in the current thread
    -					// (not propagated to the persistent storage yet)
    -					edg_wll_NotifIdFree(notif->id);
    -					notif->id = NULL;
    -					free(notif->id_str);
    -					notif->id_str = NULL;
    -					notif->valid = 0;
    -					rtm_update_error_state(t, notif, i, 1);
    -					error = 1;
    -					if (t->next_refresh > notif->refresh) t->next_refresh = notif->refresh;
    -					goto cont;
    -				} else {
    -					for (j = 0; jobstates[j].state != EDG_WLL_JOB_UNDEF; j++) {
    -						notif->last_update = jobstates[j].lastUpdateTime.tv_sec + jobstates[j].lastUpdateTime.tv_usec / 1000000.0;
    -						db_store_change(t, notif, i, jobstates + j);
    -						edg_wll_FreeStatus(jobstates + j);
    -					}
    -					free(jobstates);
    -					lprintf(t, INF, "bootstrap %s:%d (%d), found %d jobs", notif->server, notif->port, i, j);
    -					rtm_update_error_state(t, notif, i, 0);
    -					updated = 1;
    -				}
    -
    -				} else {
    -					rtm_update_error_state(t, notif, i, 0);
    -					updated = 1;
    -				}
    -			} else if (!notif->id) {
    -			// rebind existing still valid notification
    -				if (edg_wll_NotifIdParse(notif->id_str, ¬if->id)) {
    -					lprintf_ctx(t, WRN, ctx, "can't parse %d. notification '%s' (%s)", i, notif->id_str, rtm_notiftype2str(notif->type));
    -					notif->valid = 0;
    -					notif->id = NULL;
    -					i--;
    -					continue;
    -				}
    -				notif->valid = now + config.ttl;
    -				if (edg_wll_NotifBind(ctx, notif->id, sock, config.local_address, ¬if->valid)) {
    -					lprintf_ctx(t, WRN, ctx, "can't rebind %d. notification '%s' (%s)", i, notif->id_str, rtm_notiftype2str(notif->type));
    -					notif->valid = 0;
    -					edg_wll_NotifIdFree(notif->id);
    -					notif->id = NULL;
    -					i--;
    -					continue;
    -				}
    -				lprintf(t, INF, "bound %d. notification '%s' (%s), valid: %s", i, notif->id_str, rtm_notiftype2str(notif->type), time2str(t, notif->valid));
    -				rtm_update_error_state(t, notif, i, 0);
    -				// no bootstrap here, reliable delivery will send changes
    -				updated = 1;
    -			} else if (!notif->refresh || notif->refresh <= now) {
    -			// refresh notification
    -				time_t valid;
    -
    -				valid = now + config.ttl;
    -				if (edg_wll_NotifRefresh(ctx, notif->id, &valid)) {
    -					lprintf_ctx(t, WRN, ctx, "can't refresh %d. notification '%s' (%s), will try up to %s...", i, notif->id_str, rtm_notiftype2str(notif->type), time2str(t, notif->valid - RTM_NOTIF_TTL_TO_DEAD));
    -					// refresh failed, just move the refresh time...
    -					updated = 1;
    -				} else {
    -					notif->valid = valid;
    -					lprintf(t, INF, "refreshed %d. notification '%s' (%s), valid: %s", i, notif->id_str, rtm_notiftype2str(notif->type), time2str(t, notif->valid));
    -					rtm_update_error_state(t, notif, i, 0);
    -					updated = 1;
    -				}
    -			} else {
    -				lprintf(t, INS, "no change in %d. notification '%s' (%s)", i, notif->id_str, rtm_notiftype2str(notif->type));
    -			}
    -
    -cont:
    -			if (updated || error) {
    -				if (!error) {
    -					assert(notif->valid);
    -					notif->refresh = notif->valid ? (now + ((notif->valid - now) >> 1)) : 0;
    -				
    -				}
    -				// create or refresh OK, bootstrap if needed OK, store the new notification
    -				updated = 0;
    -				error = 0;
    -
    -				// quicker refresh (or recreate) if needed
    -				now = time(NULL);
    -				if (notif->valid && now >= notif->refresh) {
    -					lprintf(t, WRN, "operation not in time, refreshing/recreating the notification '%s' (%s) now", notif->id_str, rtm_notiftype2str(notif->type));
    -					i--;
    -					continue;
    -				}
    - 				rtm_update_notif(t, notif, 1);
    -			}
    -
    -			// compute time of the next event from the new refresh on notification
    -	 		if (t->next_refresh > notif->refresh) t->next_refresh = notif->refresh;
    -		}
    -
    -		// receive
    -		//
    -		// cycle here locally around NotifReceive, we know about next
    -		// refresh time
    -		//
    -		lprintf(t, DBG, "waiting for the notifications up to %s...", t->next_refresh ? time2str(t, t->next_refresh) : "0 (no wait)");
    -		while (t->next_refresh > now && !quit) {
    -			to.tv_sec = t->next_refresh - now;
    -			if (to.tv_sec > RTM_NOTIF_READ_TIMEOUT) to.tv_sec = RTM_NOTIF_READ_TIMEOUT;
    -			to.tv_usec = 0;
    -			memset(&jobstat, 0, sizeof(jobstat));
    -			notifid = NULL;
    -			err = edg_wll_NotifReceive(ctx, sock, &to, &jobstat, ¬ifid);
    -			lprintf(t, INS, "received, err=%d%s", err, err == ETIMEDOUT ? " (timeout)":"");
    -			if (err != 0) {
    -				if (err != ETIMEDOUT) {
    -					lprintf_ctx(t, ERR, ctx, "can't receive notifications");
    -					// don't cycle too quick...
    -					sleep(1);
    -				}
    -				// lazily refresh persistent storage here, only after timeouts
    -				if (received) {
    -					lprintf(t, DBG, "storing notification times");
    - 	 				rtm_update_notif(t, NULL, 1);
    -					received = 0;
    -				}
    -			} else {
    -				char *jobidstr, *notifidstr;
    -				double last_update;
    -
    -				if (notifid) {
    -					jobidstr = jobstat.jobId ? glite_jobid_unparse(jobstat.jobId) : NULL;
    -					notifidstr = notifid ? edg_wll_NotifIdUnparse(notifid) : NULL;
    -					for (i = 0; i < t->nservers && (!t->notifs[i].id_str || strcmp(notifidstr, t->notifs[i].id_str) != 0); i++);
    -					if (i == t->nservers) {
    -						lprintf(t, ERR, "received notify '%s' not found", notifidstr);
    -					} else {
    -						received = 1;
    -						notif = t->notifs + i;
    -						//
    -						// last changed time from the arrived notification
    -						//
    -						last_update = jobstat.lastUpdateTime.tv_sec + jobstat.lastUpdateTime.tv_usec / 1000000.0;
    -						if (last_update > notif->last_update) notif->last_update = last_update;
    -						db_store_change(t, notif, i, &jobstat);
    - 	 					rtm_update_notif(t, notif, 0);
    -					}
    -					free(jobidstr);
    -					free(notifidstr);
    -				}
    -			}
    -			if (jobstat.state != EDG_WLL_JOB_UNDEF) edg_wll_FreeStatus(&jobstat);
    -			if (notifid) edg_wll_NotifIdFree(notifid);
    -
    -			now = time(NULL);
    -		} // receive
    -	} // main loop
    -
    -exit:	
    -	if (sock != -1) close(sock);
    -//	for (i = 0; conditions[i]; i++) free(conditions[i]);
    -	if (t->nservers && quit != RTM_QUIT_PRESERVE && quit != RTM_QUIT_RELOAD) {
    -		for (i = 0; i < t->nservers; i++) {
    -			if (t->notifs[i].id) {
    -				char *notifidstr;
    -
    -				notifidstr = edg_wll_NotifIdUnparse(t->notifs[i].id);
    -				edg_wll_SetParam(ctx, EDG_WLL_PARAM_NOTIF_SERVER, t->notifs[i].server);
    -				edg_wll_SetParam(ctx, EDG_WLL_PARAM_NOTIF_SERVER_PORT, t->notifs[i].port);
    -				if (edg_wll_NotifDrop(ctx, t->notifs[i].id)) {
    -					lprintf_ctx(t, WRN, ctx, "can't drop %s (%s)", notifidstr, rtm_notiftype2str(t->notifs[i].type));
    -				} else {
    -					lprintf(t, INF, "notification %s (%s) dropped", notifidstr, rtm_notiftype2str(t->notifs[i].type));
    -				}
    -				rtm_drop_notif(t, t->notifs[i].id_str, 0);
    -				free(notifidstr);
    -			}
    -		}
    -		rtm_update_notif(t, NULL, 1);
    -	}
    -#ifdef WITH_LBU_DB
    -	if (t->insertcmd) glite_lbu_FreeStmt(&t->insertcmd);
    -	if (t->updatecmd) glite_lbu_FreeStmt(&t->updatecmd);
    -	if (t->updatecmd_vo) glite_lbu_FreeStmt(&t->updatecmd_vo);
    -	if (t->updatecmd_rb) glite_lbu_FreeStmt(&t->updatecmd_rb);
    -	if (t->updatecmd_mon) glite_lbu_FreeStmt(&t->updatecmd_mon);
    -	if (t->deletecmd) glite_lbu_FreeStmt(&t->deletecmd);
    -	db_free(t, t->dbctx);
    -#endif
    -	if (ctx) edg_wll_FreeContext(ctx);
    -	lprintf(t, DBG, "thread ended");
    -	pthread_exit(NULL);
    -	return NULL;
    -}
    -
    -
    -int reconcile_threads() {
    -	int iserver, ithread, inotif, gran, mod, nnotifs;
    -	int i, j, oldn, type, typestart, typeend;
    -	notif_t *a, *b;
    -	edg_wll_Context ctx = NULL;
    -	edg_wll_NotifId notifid;
    -	thread_t *t;
    -
    -	if (!config.cleanup) {
    -		if (config.silly) {
    -			typestart = RTM_NOTIF_TYPE_OLD;
    -			typeend = RTM_NOTIF_TYPE_OLD;
    -			nnotifs = 1;
    -		} else {
    -			typestart = RTM_NOTIF_TYPE_STATUS;
    -			typeend = RTM_NOTIF_TYPE_JDL;
    -			nnotifs = 2;
    -		}
    -
    -		oldn = db.n;
    -
    -		// distribute LB servers between threads
    -		// (always use existing loaded notification when found)
    -		threads = (thread_t *)calloc(config.nthreads, sizeof(thread_t));
    -		gran = config.nservers / config.nthreads, mod = config.nservers % config.nthreads;
    -		t = NULL;
    -		ithread = 0;
    -		inotif = 0;
    -		for (iserver = 0; iserver < config.nservers; iserver++) {
    -			// new thread
    -			if (!t || inotif + nnotifs > t->nservers) {
    -				assert(ithread < config.nthreads);   // proper number of threads
    -				assert(!t || inotif == t->nservers); // start or exactly distributed
    -				t = threads + ithread;
    -				t->nservers = nnotifs * ((ithread < mod) ? gran + 1 : gran);
    -				t->notifs = (notif_t *)calloc(t->nservers, sizeof(notif_t));
    -				lprintf(NULL, DBG, "%d. thread: %d notifications", ithread, t->nservers);
    -				ithread++;
    -				inotif = 0;
    -			}
    -
    -			// next configured server
    -			a = config.notifs + iserver;
    -			for (type = typestart; type <= typeend; type++) {
    -				// find or create all notification types
    -				b = db_search_notif_by_server(db.notifs, oldn, a->server, a->port, type);
    -				if (!b) b = db_add_notif(NULL, type, 0, 0, 0, strdup(a->server), a->port, 1, 0);
    -				else {
    -					if (b->id_str) {
    -						lprintf(NULL, INF, "found previous notification '%s' (%s)", b->id_str, rtm_notiftype2str(b->type));
    -					} else {
    -						lprintf(NULL, INF, "found previous server %s:%d (%s), %d errors", b->server, b->port, rtm_notiftype2str(b->type), b->error);
    -					}
    -					b->active = 1;
    -				}
    -				// and add each to the thread
    -				notif_copy(t->notifs + inotif, b);
    -				lprintf(NULL, INS, "thread[%d][%d] <- %s:%d (%s), id %s", ithread-1, inotif, b->server, b->port, rtm_notiftype2str(b->type), b->id_str);
    -				inotif++;
    -			}
    -		}
    -		j = 0;
    -		for (i = 0; i < db.n; i++)
    -			if (db.notifs[i].active) j++;
    -		assert(j % nnotifs == 0); // each server all notifs
    -	}
    -
    -	if (edg_wll_InitContext(&ctx) != 0) {
    -		lprintf(NULL, ERR, "can't init LB context: %s", strerror(errno));
    -		return 1;
    -	}
    -	if (config.cert) edg_wll_SetParam(ctx, EDG_WLL_PARAM_X509_CERT, config.cert);
    -	if (config.key) edg_wll_SetParam(ctx, EDG_WLL_PARAM_X509_KEY, config.key);
    -	for (j = 0; j < db.n; j++) {
    -		if (!db.notifs[j].active) {
    -			if (db.notifs[j].id_str) {
    -				lprintf(NULL, INF, "dropping previous notification '%s' (%s)", db.notifs[j].id_str, rtm_notiftype2str(db.notifs[j].type));
    -				if (edg_wll_NotifIdParse(db.notifs[j].id_str, ¬ifid)) {
    -					lprintf(NULL, WRN, "can't parse notification ID '%s'", db.notifs[j].id_str);
    -					continue;
    -				}
    -				edg_wll_SetParam(ctx, EDG_WLL_PARAM_NOTIF_SERVER, db.notifs[j].server);
    -				edg_wll_SetParam(ctx, EDG_WLL_PARAM_NOTIF_SERVER_PORT, db.notifs[j].port);
    -				if (edg_wll_NotifDrop(ctx, notifid) != 0) {
    -					lprintf_ctx(NULL, WRN, ctx, "can't drop %s (%s)", db.notifs[j].id_str, rtm_notiftype2str(db.notifs[j].type));
    -				}
    -				edg_wll_NotifIdFree(notifid);
    -				notif_invalidate(db.notifs + j);
    -			}
    -		}
    -	}
    -	edg_wll_FreeContext(ctx);
    -
    -	return db_save_notifs(NULL);
    -}
    -
    -
    -void usage(const char *prog) {
    -	fprintf(stderr, "Usage: %s [options]\n"
    -		"	-h, --help         display this help\n"
    -		"	-v, --version      display version\n"
    -		"	-d, --debug LEVEL  debug level (0=error,1=warn,2=info,3=debug,4=insane,\n"
    -		"	                   +8=not fork)\n"
    -		"	-D, --daemonize    daemonize\n"
    -		"	-i, --pidfile      the file with process ID\n"
    -		"	-s, --threads N    number of slave threads\n"
    -		"	-t, --ttl TIME     time to live (validity) of the notifications\n"
    -		"	                   in seconds (%d)\n"
    -		"	-H, --history      historic dive in seconds (<=0 is unlimited)\n"
    -		"	-c, --config       config file name (list of LB servers), precedence before " RTM_DB_TABLE_LBS " table\n"
    -#ifdef WITH_LBU_DB
    -		"	-m, --pg           db connection string (user/pwd@server:dbname) to " RTM_DB_TABLE_LBS " table\n"
    -#endif
    -		"	-n, --notifs       file for persistent information about active\n"
    -		"	                   notifications\n"
    -		"	-p, --port         listen only on this port (default: use any)\n"
    -		"	-C, --cert         X509 certificate file\n"
    -		"	-K, --key          X509 key file\n"
    -		"	-o, --old          \"silly\" mode for old L&B 1.9 servers\n"
    -		"	-l, --cleanup      clean up the notifications and exit\n"
    -		"	-u, --no-purge     disable purging from RTM database\n"
    -		"	-w, --wlcg         enable messaging for dashboard\n"
    -		"	--wlcg-binary      full path to msg-publish binary\n"
    -		"	--wlcg-topic       topic for msg-publish\n"
    -		"	--wlcg-config      config file for msg-publish\n"
    -		"	--wlcg-flush       send message on each notification\n"
    -		, prog, RTM_NOTIF_TTL);
    -	fprintf(stderr, "\n");
    -	fprintf(stderr, "List of L&B servers: first it's read the config file if specified (-c option). When config file is not used and connection to database is specified, it's tried DB table " RTM_DB_TABLE_LBS ".\n");
    -	fprintf(stderr, "\n");
    -}
    -
    -
    -int config_preload(int argn, char *argv[]) {
    -	int opt, intval, index;
    -	char *err, *s;
    -
    -	while ((opt = getopt_long(argn, argv, opts_line, opts, &index)) != EOF) {
    -		switch (opt) {
    -		case 'h':
    -		case '?':
    -			usage(argv[0]);
    -			return 1;
    -		case 'v':
    -			fprintf(stderr, "%s: %s\n", argv[0], rcsid);
    -			return 1;
    -		case 'd':
    -			intval = strtol(optarg, &err, 10);
    -			if (err && err[0]) {
    -				lprintf(NULL, ERR, "debug level number required");
    -				return 2;
    -			}
    -			config.debug = (intval & DEBUG_LEVEL_MASK);
    -			config.guard = !(intval & DEBUG_GUARD_MASK);
    -			break;
    -		case 'D':
    -			config.daemonize = 1;
    -			break;
    -		case 'i':
    -			config.pidfile = strdup(optarg);
    -			break;
    -		case 's':
    -			intval = strtol(optarg, &err, 10);
    -			if (err && err[0]) {
    -				lprintf(NULL, ERR, "number of threads required");
    -				return 2;
    -			}
    -			config.nthreads = intval;
    -			break;
    -		case 't':
    -			intval = strtol(optarg, &err, 10);
    -			if (err && err[0]) {
    -				lprintf(NULL, ERR, "requested validity in seconds required");
    -				return 2;
    -			}
    -			config.ttl = intval;
    -			break;
    -		case 'H':
    -			intval = strtol(optarg, &err, 10);
    -			if (err && err[0]) {
    -				lprintf(NULL, ERR, "historic dive in seconds required");
    -				return 2;
    -			}
    -			config.dive = intval;
    -			break;
    -		case 'c':
    -			free(config.config_file);
    -			config.config_file = strdup(optarg);
    -			break;
    -		case 'n':
    -			free(config.notif_file);
    -			config.notif_file = strdup(optarg);
    -			break;
    -		case 'p':
    -			listen_port = atoi(optarg);
    -			break;
    -		case 'm':
    -			free(config.dbcs);
    -			config.dbcs = strdup(optarg);
    -			break;
    -		case 'C':
    -			free(config.cert);
    -			config.cert = strdup(optarg);
    -			break;
    -		case 'K':
    -			free(config.key);
    -			config.key = strdup(optarg);
    -			break;
    -		case 'l':
    -			config.cleanup = 1;
    -			break;
    -		case 'w':
    -			config.wlcg = 1;
    -			break;
    -		case 'o':
    -			config.silly = 1;
    -			break;
    -		case 'u':
    -			config.no_purge = 1;
    -			break;
    -		case 0:
    -			switch(index) {
    -			case 0:
    -				config.wlcg_binary = strdup(optarg);
    -				break;
    -			case 1:
    -				config.wlcg_config = strdup(optarg);
    -				break;
    -			case 2:
    -				config.wlcg_topic = strdup(optarg);
    -				break;
    -			case 3:
    -				config.wlcg_flush = 1;
    -				break;
    -			default:
    -				lprintf(NULL, ERR, "crazy option, index %d", index);
    -				break;
    -			}
    -			break;
    -		}
    -	}
    -	if (!config.notif_file) config.notif_file = strdup(RTM_FILE_NOTIFS);
    -	if (config.wlcg) {
    -		if (!config.wlcg_binary) config.wlcg_binary = strdup(WLCG_BINARY);
    -		if (!config.wlcg_config) config.wlcg_config = strdup(WLCG_CONFIG);
    -		if (!config.wlcg_topic) config.wlcg_topic = strdup(WLCG_TOPIC);
    -	}
    -#ifdef WITH_OLD_LB
    -	if (!config.silly) {
    -		lprintf(NULL, WRN, "compiled with older LB library, switching on silly mode");
    -		config.silly = 1;
    -	}
    -#endif
    -
    -	if ((s = getenv("GLITE_LB_HARVESTER_NO_REMOVE")) != NULL) {
    -		if (s[0] != '0' && strcasecmp(s, "false") != 0) config.wlcg_no_remove = 1;
    -	}
    -
    -	if (INF <= config.debug) {
    -		lprintf(NULL, INF, "threads: %d", config.nthreads);
    -		lprintf(NULL, INF, "notifs ttl: %d", config.ttl);
    -		lprintf(NULL, INF, "historic dive: %d", config.dive);
    -		if (config.dbcs) {
    -			lprintf(NULL, INF, "database storage: '%s'", config.dbcs);
    -		} else {
    -			lprintf(NULL, INF, "file storage: '%s'", config.notif_file);
    -		}
    -		lprintf(NULL, INF, "WLCG messaging: %s%s", config.wlcg ? "enabled" : "disabled", config.wlcg_no_remove ? " (not removing tmp files)" : "");
    -		lprintf(NULL, INF, "debug level: %d", config.debug);
    -		lprintf(NULL, INF, "daemonize: %s", config.daemonize ? "enabled" : "disabled");
    -		lprintf(NULL, INF, "fork guard: %s", config.guard ? "enabled" : "disabled");
    -		lprintf(NULL, INF, "silly compatibility mode: %s", config.silly ? "enabled" : "disabled");
    -		lprintf(NULL, INF, "purge: %s", !config.no_purge ? "enabled" : "disabled");
    -	}
    -
    -	return 0;
    -}
    -
    -
    -int config_load() {
    -	char line[LINE_MAX], *port, *s;
    -	FILE *f;
    -	void *tmp;
    -	int i, n;
    -#ifdef WITH_LBU_DB
    -	int major, minor, sub, version;
    -	char *results[2];
    -	char *result = NULL;
    -	glite_lbu_Statement stmt = NULL;
    -	int err = 0;
    -#endif
    -
    -	if (config.config_file) {
    -		if ((f = fopen(config.config_file, "rt")) == NULL) {
    -			lprintf(NULL, ERR, "can't open config file '%s': %s", config.config_file, strerror(errno));
    -			return 1;
    -		}
    -
    -		n = 10;
    -		while (fgets(line, sizeof(line), f) != NULL) {
    -			if ((s = strpbrk(line, "\n\r")) != NULL) s[0] = '\0';
    -			if (line[0] == '\0' || line[0] == '#') continue;
    -			if (config.nservers >= n || !config.notifs) {
    -				n = 2 * n;
    -				if ((tmp = (notif_t *)realloc(config.notifs, n * sizeof(notif_t))) == NULL) {
    -					lprintf(NULL, ERR, "insufficient memory");
    -					return 1;
    -				}
    -				config.notifs = tmp;
    -				memset(config.notifs + config.nservers, 0, (n - config.nservers) * sizeof(notif_t));
    -			}
    -			if ((port = strrchr(line, ':')) != NULL) { port[0] = '\0'; port++; }
    -			config.notifs[config.nservers].server = strdup(line);
    -			config.notifs[config.nservers++].port = (port && port[0]) ? atoi(port) : GLITE_JOBID_DEFAULT_PORT;
    -		}
    -
    -		fclose(f);
    -	} else
    -#ifdef WITH_LBU_DB
    -	if (db.dbctx) {
    -		if ((err = glite_lbu_ExecSQL(db.dbctx, "SELECT COUNT(*) FROM " RTM_DB_TABLE_LBS, &stmt)) < 0 ||
    -		    (err = glite_lbu_FetchRow(stmt, 1, NULL, &result)) < 0) {
    -			goto err;
    -		}
    -		if (err == 0) {
    -			lprintf(NULL, ERR, "can't count LB servers");
    -			goto err;
    -		}
    -		n = atoi(result);
    -		free(result);
    -		glite_lbu_FreeStmt(&stmt);
    -
    -		config.notifs = calloc(n, sizeof(notif_t));
    -		config.nservers = 0;
    -		if ((err = glite_lbu_ExecSQL(db.dbctx, "SELECT DISTINCT ip, serv_version FROM " RTM_DB_TABLE_LBS, &stmt)) < 0) {
    -			goto err;
    -		}
    -		while (config.nservers < n && (err = glite_lbu_FetchRow(stmt, 2, NULL, results)) > 0) {
    -			if (sscanf(results[1], "%d.%d.%d", &major, &minor, &sub) != 3) {
    -				lprintf(NULL, ERR, "can't parse LB server version '%s'", results[1]);
    -				free(results[1]);
    -				break;
    -			}
    -			version = 10000 * major + 100 * minor + sub;
    -			if (version >= 20000 || config.silly) {
    -				config.notifs[config.nservers].server = strdup(results[0]);
    -				config.notifs[config.nservers++].port = GLITE_JOBID_DEFAULT_PORT;
    -			} else {
    -				lprintf(NULL, INF, "skipped older LB server %s (version '%s')", results[0], results[1]);
    -			}
    -			free(results[0]);
    -			free(results[1]);
    -		}
    -		if (err < 0) goto err;
    -		glite_lbu_FreeStmt(&stmt);
    -	}
    -#endif
    -
    -	if (INF <= config.debug) {
    -		lprintf(NULL, INF, "servers: %d", config.nservers);
    -		for (i = 0; i < config.nservers; i++) lprintf(NULL, INF, "  %s:%d", config.notifs[i].server, config.notifs[i].port);
    -	}
    -
    -	return 0;
    -#ifdef WITH_LBU_DB
    -err:
    -	if (err) lprintf_dbctx(NULL, ERR, "can't get LB servers");
    -	if (stmt) glite_lbu_FreeStmt(&stmt);
    -	if (result) free(result);
    -#endif
    -	return 1;
    -}
    -
    -
    -void config_free() {
    -	int i;
    -
    -	for (i = 0; i < config.nservers; i++) free(config.notifs[i].server);
    -	free(config.config_file);
    -	free(config.notif_file);
    -	free(config.pidfile);
    -	free(config.dbcs);
    -	free(config.notifs);
    -	free(config.cert);
    -	free(config.key);
    -	free(config.wlcg_binary);
    -	free(config.wlcg_config);
    -	free(config.wlcg_topic);
    -}
    -
    -
    -// on keyboard cleanup notification, on termination signal break with
    -// notification preserved
    -void handle_signal(int num) {
    -	lprintf(NULL, INF, "received signal %d", num);
    -	switch (num) {
    -	case SIGINT:
    -	case SIGTERM:
    -	default:
    -		quit = RTM_QUIT_PRESERVE;
    -		break;
    -	}
    -}
    -
    -
    -int main(int argn, char *argv[]) {
    -	struct sigaction sa;
    -	sigset_t sset;
    -	int i, j;
    -	double t1, t2, last_summary = 0, start_time;
    -	thread_t *t;
    -	struct stat pstat;
    -	pid_t watched;
    -	int status;
    -	edg_wll_Context ctx = NULL;
    -	int retval = RTM_EXIT_ERROR;
    -	int cert_mtime = 0;
    -
    -	// load basic configurations
    -	switch (config_preload(argn, argv)) {
    -	case 0:
    -		break;
    -	case 1:
    -		retval = RTM_EXIT_OK;
    -		goto quit_guard0;
    -		break;
    -	default:
    -		retval = RTM_EXIT_ERROR;
    -		goto quit_guard0;
    -	}
    -
    -	// daemonize
    -	if (config.pidfile) {
    -		FILE *f;
    -		char s[256];
    -
    -		if ((f = fopen(config.pidfile, "rt"))) {
    -			if (fscanf(f, "%255[^\n\r]", s) == 1) {
    -				if (kill(atoi(s),0)) {
    -					lprintf(NULL, WRN, "stale pidfile, pid = %s, pidfile '%s'", s, config.pidfile);
    -					fclose(f);
    -				}
    -				else {
    -					lprintf(NULL, ERR, "another instance running, pid = %s, pidfile '%s'", s, config.pidfile);
    -					fclose(f);
    -					goto quit_guard0;
    -				}
    -			} else {
    -				lprintf(NULL, ERR, "another instance possibly running, can't read pidfile '%s': %s", config.pidfile, strerror(errno));
    -				fclose(f);
    -				goto quit_guard0;
    -			}
    -		} else if (errno != ENOENT) {
    -			lprintf(NULL, ERR, "error opening pidfile '%s': %s", config.pidfile, strerror(errno));
    -			goto quit_guard0;
    -		}
    -	}
    -	if (config.daemonize) {
    -#ifndef WITH_OLD_LB
    -		if (glite_common_log_init()) {
    -			fprintf(stderr,"glite_common_log_init() failed, exiting.");
    -			exit(RTM_EXIT_ERROR);
    -		}
    -#endif
    -		if (daemon(0, 0) == -1) {
    -			lprintf(NULL, ERR, "can't daemonize: %s", strerror(errno));
    -			goto quit_guard0;
    -		}
    -	}
    -
    -	// disable signals to the guardian
    -	sigemptyset(&sset);
    -	sigaddset(&sset, SIGABRT);
    -	sigaddset(&sset, SIGTERM);
    -	sigaddset(&sset, SIGINT);
    -	pthread_sigmask(SIG_BLOCK, &sset, NULL);
    -
    -	if (!config.guard) {
    -	// not guard
    -		if (config.pidfile) {
    -			FILE *f;
    -
    -			if ((f = fopen(config.pidfile, "wt")) == NULL) {
    -				lprintf(NULL, ERR, "can't create pidfile '%s': %s", config.pidfile, strerror(errno));
    -				goto quit_guard0;
    -			}
    -			fprintf(f, "%d", getpid());
    -			fclose(f);
    -		}
    -	} else
    -	// guard
    -	while ((watched = fork()) != 0) {
    -		if (watched == -1) {
    -			lprintf(NULL, ERR, "fork() failed: %s", strerror(errno));
    -			goto quit_guard;
    -		}
    -		if (config.pidfile) {
    -			FILE *f;
    -
    -			if ((f = fopen(config.pidfile, "wt")) == NULL) {
    -				lprintf(NULL, ERR, "can't create pidfile '%s': %s", config.pidfile, strerror(errno));
    -				goto quit_guard0;
    -			}
    -			fprintf(f, "%d", watched);
    -			fclose(f);
    -		}
    -		if (waitpid(watched, &status, 0) == -1) {
    -			lprintf(NULL, ERR, "waitpid() failed: %s", strerror(errno));
    -			// orpaned child will restart later anyway,
    -			// better to end the child process just now
    -			kill(watched, SIGTERM);
    -			goto quit_guard;
    -		}
    -		if (WIFSIGNALED(status)) {
    -			switch (WTERMSIG(status)) {
    -			case SIGSEGV:
    -			case SIGILL:
    -			case SIGABRT:
    -#ifdef SIGBUS
    -			case SIGBUS:
    -#endif
    -				lprintf(NULL, ERR, "caught signal %d from process %d, resurrecting...", WTERMSIG(status), watched);
    -				// slow down the core generator ;-)
    -				// disabled signals and ended child in pidfile, live with it
    -				pthread_sigmask(SIG_UNBLOCK, &sset, NULL);
    -				if (config.pidfile) {
    -					if (remove(config.pidfile) == -1) lprintf(NULL, WRN, "can't remove pidfile '%s': %s", config.pidfile, strerror(errno));
    -				}
    -				sleep(2);
    -				pthread_sigmask(SIG_BLOCK, &sset, NULL);
    -				break;
    -			default:
    -				lprintf(NULL, WRN, "ended with signal %d", WTERMSIG(status));
    -				goto quit_guard;
    -			}
    -		} else if (WIFEXITED(status)) {
    -			retval = WEXITSTATUS(status);
    -			switch(retval) {
    -			case RTM_EXIT_OK:
    -				lprintf(NULL, INF, "exit with status %d, OK", retval);
    -				goto quit_guard;
    -			case RTM_EXIT_RELOAD:
    -				lprintf(NULL, INF, "exit with status %d, reloading", retval);
    -				break;
    -			default:
    -				lprintf(NULL, WRN, "exit with status %d, error", retval);
    -				goto quit_guard;
    -			}
    -		} else {
    -			lprintf(NULL, ERR, "unknown child status");
    -			goto quit_guard;
    -		}
    -	}
    -
    -	// child continues...
    -
    -	// threads && Globus
    -	if (edg_wll_gss_initialize()) {
    -		lprintf(NULL, ERR, "can't initialize GSS");
    -		goto quit_guard;
    -	}
    -
    -#ifndef WITH_OLD_LB
    -	// connection pool manually (just for tuning memory leaks)
    -	if (!edg_wll_initConnections()) {
    -		lprintf(NULL, ERR, "can't initialize LB connections");
    -		goto quit_guard;
    -	}
    -#endif
    -
    -#ifdef WITH_LBU_DB
    -	// database
    -	switch(db_init(NULL, &db.dbctx)) {
    -	case 0:
    -		break;
    -	case -1:
    -		// no db
    -		break;
    -	default:
    -		// error
    -		goto quit;
    -	}
    -#endif
    -
    -	// load configurations
    -	if (config_load()) goto quit;
    -#ifdef WITH_OLD_LB
    -	// other client certificate settings ignored by older globus,
    -	// using environment (certificate the same for all threads)
    -	{
    -		char *s;
    -
    -		if (config.cert) {
    -			asprintf(&s, "X509_USER_CERT=%s", config.cert);
    -			putenv(s);
    -		}
    -		if (config.key) {
    -			asprintf(&s, "X509_USER_KEY=%s", config.key);
    -			putenv(s);
    -		}
    -	}
    -#endif
    -
    -	// load previous notifications
    -	if (load_notifs()) goto quit;
    -	// compare lb servers from configuration and notifications,
    -	// or clean up and exit if specified
    -	if (reconcile_threads()) goto quit;
    -	if (config.cleanup) {
    -		retval = RTM_EXIT_OK;
    -		goto quit;
    -	}
    -
    -	// signal handler
    -	sa.sa_handler = handle_signal;
    -	sigemptyset(&sa.sa_mask);
    -	sa.sa_flags = SA_RESETHAND;
    -	if (sigaction(SIGABRT, &sa, NULL) == -1
    -	    || sigaction(SIGTERM, &sa, NULL) == -1
    -	    || sigaction(SIGINT, &sa, NULL) == -1) {
    -		lprintf(NULL, ERR, "can't handle signal: %s", strerror(errno));
    -		goto quit;
    -	}
    -	// enable signals in main
    -	pthread_sigmask(SIG_UNBLOCK, &sset, NULL);
    -
    -	// launch the threads
    -	for (i = 0; i < config.nthreads; i++) {
    -		t = threads + i;
    -		t->id = i;
    -		if (pthread_create(&threads[i].thread, NULL, notify_thread, t) != 0) {
    -			lprintf(NULL, ERR, "[main] can't create %d. thread: %s\n", i, strerror(errno));
    -			goto quit;
    -		}
    -	}
    -
    -	edg_wll_InitContext(&ctx);
    -	if (config.cert) edg_wll_SetParam(ctx, EDG_WLL_PARAM_X509_CERT, config.cert);
    -	if (config.key) edg_wll_SetParam(ctx, EDG_WLL_PARAM_X509_KEY, config.key);
    -	last_summary = 0;
    -	start_time = rtm_gettimeofday();
    -	while (!quit) {
    -		t1 = rtm_gettimeofday();
    -		if (t1 - last_summary > RTM_SUMMARY_POLL_TIME) {
    -			last_summary = t1;
    -			rtm_summary(ctx, &db);
    -		}
    -		if (config.guard) {
    -			if (t1 - start_time > RTM_SUICIDE_TIME) {
    -				quit = RTM_QUIT_RELOAD;
    -				lprintf(NULL, INF, "preventive suicide");
    -				break;
    -			}
    -			if (config.cert) {
    -				if (stat(config.cert, &pstat) == 0) {
    -					if (!cert_mtime) cert_mtime = pstat.st_mtime;
    -					if (cert_mtime < pstat.st_mtime) {
    -						lprintf(NULL, INF, "certificate '%s' changed, reloading", config.cert);
    -						quit = RTM_QUIT_RELOAD;
    -						break;
    -					}
    -				} else {
    -					lprintf(NULL, ERR, "can't check certificate file '%s'", config.cert, strerror(errno));
    -				}
    -			}
    -		}
    -		t2 = rtm_gettimeofday();
    -		if (t2 - t1 < RTM_IDLE_POLL_TIME) usleep((RTM_IDLE_POLL_TIME + t1 - t2) * 1000000);
    -	}
    -	retval = quit == RTM_QUIT_RELOAD ? RTM_EXIT_RELOAD : RTM_EXIT_OK;
    -quit:
    -	// cleanup on error
    -	if (!quit) quit = RTM_QUIT_CLEANUP;
    -	if (threads) {
    -		for (i = 0; i < config.nthreads; i++) {
    -			t = threads + i;
    -			if (t->thread) pthread_join(t->thread, NULL);
    -			for (j = 0; j < t->nservers; j++) notif_free(t->notifs + j);
    -			free(t->notifs);
    -		}
    -		free(threads);
    -	}
    -
    -	if (config.pidfile && !config.guard) {
    -		if (remove(config.pidfile) == -1) lprintf(NULL, WRN, "can't remove pidfile '%s': %s", config.pidfile, strerror(errno));
    -	}
    -#ifdef WITH_OLD_LB
    -	if (config.daemonize) glite_common_log_fini();
    -#endif
    -
    -#ifdef WITH_LBU_DB
    -	db_free(NULL, db.dbctx);
    -#endif
    -	edg_wll_FreeContext(ctx);
    -	db_free_notifs();
    -	config_free();
    -#ifndef WITH_OLD_LB
    -	edg_wll_poolFree();
    -#endif
    -
    -	return retval;
    -
    -quit_guard:
    -	if (config.pidfile) {
    -		if (remove(config.pidfile) == -1) lprintf(NULL, WRN, "can't remove pidfile '%s': %s", config.pidfile, strerror(errno));
    -	}
    -quit_guard0:
    -	config_free();
    -	return retval;
    -}
    diff --git a/org.glite.lb.logger/.cvsignore b/org.glite.lb.logger/.cvsignore
    deleted file mode 100644
    index 1df717b..0000000
    --- a/org.glite.lb.logger/.cvsignore
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -.project
    -.cdtproject
    \ No newline at end of file
    diff --git a/org.glite.lb.logger/LICENSE b/org.glite.lb.logger/LICENSE
    deleted file mode 100644
    index 259a91f..0000000
    --- a/org.glite.lb.logger/LICENSE
    +++ /dev/null
    @@ -1,69 +0,0 @@
    -LICENSE file for EGEE Middleware
    -================================
    -
    -Copyright (c) 2004 on behalf of the EU EGEE Project: 
    -The European Organization for Nuclear Research (CERN), 
    -Istituto Nazionale di Fisica Nucleare (INFN), Italy
    -Datamat Spa, Italy
    -Centre National de la Recherche Scientifique (CNRS), France
    -CS Systeme d'Information (CSSI), France
    -Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
    -Universiteit van Amsterdam (UvA), Netherlands
    -University of Helsinki (UH.HIP), Finlan
    -University of Bergen (UiB), Norway
    -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
    -
    -Redistribution and use in source and binary forms, with or without
    -modification, are permitted provided that the following conditions are
    -met: 
    -
    -1. Redistributions of source code must retain the above copyright
    -notice, this list of conditions and the following disclaimer.
    -
    -2. Redistributions in binary form must reproduce the above copyright
    -notice, this list of conditions and the following disclaimer in the
    -documentation and/or other materials provided with the distribution.
    -
    -3. The end-user documentation included with the redistribution, if
    -any, must include the following acknowledgment: "This product includes
    -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)."
    -Alternatively, this acknowledgment may appear in the software itself, if
    -and wherever such third-party acknowledgments normally appear.
    -
    -4. The names EGEE and the EU EGEE Project must not be
    -used to endorse or promote products derived from this software without
    -prior written permission. For written permission, please contact
    -.
    -
    -5. You are under no obligation whatsoever to provide anyone with any
    -bug fixes, patches, or upgrades to the features, functionality or
    -performance of the Software ("Enhancements") that you may develop over
    -time; however, if you choose to provide your Enhancements to The EU
    -EGEE Project, or if you choose to otherwise publish or distribute your
    -Enhancements, in source code form without contemporaneously requiring
    -end users of The EU EGEE Proejct to enter into a separate written license
    -agreement for such Enhancements, then you hereby grant The EU EGEE Project
    -a non-exclusive, royalty-free perpetual license to install, use, copy,
    -modify, prepare derivative works, incorporate into the EGEE Middleware
    -or any other computer software, distribute, and sublicense your
    -Enhancements or derivative works thereof, in binary and source code
    -form (if any), whether developed by The EU EGEE Project or third parties.
    -
    -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
    -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE
    -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
    -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
    -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
    -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    -
    -This software consists of voluntary contributions made by many
    -individuals on behalf of the EU EGEE Prject. For more information on The
    -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on
    -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/
    -
    -
    diff --git a/org.glite.lb.logger/Makefile b/org.glite.lb.logger/Makefile
    deleted file mode 100644
    index e3a4c3a..0000000
    --- a/org.glite.lb.logger/Makefile
    +++ /dev/null
    @@ -1,227 +0,0 @@
    -# defaults
    -top_srcdir=..
    -stagedir=.
    -globalprefix=glite
    -lbprefix=lb
    -package=glite-lb-client
    -version=0.0.0
    -PREFIX=/opt/glite
    -
    -nothrflavour=gcc32
    -thrflavour=gcc32pthr
    -
    --include Makefile.inc
    --include ../project/version.properties
    -
    -version=${module.version}
    -
    -CC=gcc
    -
    -VPATH:=${top_srcdir}/src:${top_srcdir}/test:${top_srcdir}/doc
    -
    -VERSION=-DVERSION=\"GLite-${version}\"
    -
    -SUFFIXES=.no
    -
    -ifdef LB_STANDALONE
    -	LB_STANDALONE_FLAGS:=-DLB_STANDALONE
    -endif
    -
    -ifdef LB_PERF
    -	LOGD:=glite-lb-logd-perf glite-lb-logd-perf-nofile
    -	INTERLOGD:=glite-lb-interlogd-perf \
    -		   glite-lb-interlogd-perf-empty 
    -#		   glite-lb-interlogd-perf-inline-empty
    -	NOTIF_INTERLOGD:=glite-lb-notif-interlogd
    -	LB_PERF_FLAGS:=-DLB_PERF
    -else
    -	LOGD:=glite-lb-logd
    -	INTERLOGD:=glite-lb-interlogd
    -	NOTIF_INTERLOGD:=glite-lb-notif-interlogd
    -	WS_INTERLOGD:=glite-lb-ws-interlogd
    -endif
    -
    -DEBUG:=-g -O0
    -CFLAGS:=${DEBUG} \
    -	-I${stagedir}/include -I${top_srcdir}/src \
    -	-D_GNU_SOURCE \
    -	${COVERAGE_FLAGS} \
    -	${VERSION} ${LB_STANDALONE_FLAGS} ${LB_PERF_FLAGS} 
    -
    -LDFLAGS:=-L${stagedir}/${libdir} \
    -	${COVERAGE_FLAGS} 
    -
    -LINK:=libtool --mode=link ${CC} ${LDFLAGS}
    -LINKXX:=libtool --mode=link ${CXX} -rpath ${stagedir}/${libdir} ${LDFLAGS} 
    -INSTALL:=libtool --mode=install install
    -
    -#ifneq (${expat_prefix},/usr)
    -#	EXPAT_LIBS:=-L${expat_prefix}/lib
    -#endif
    -#EXPAT_LIBS:=${EXPAT_LIBS} -lexpat
    -#
    -#EXT_LIBS:= ${EXPAT_LIBS}
    -
    -COMMON_LIB:=-lglite_lb_common
    -
    -EXT_LIB:=-lglite_lbu_trio -lglite_lbu_log
    -
    -GLITE_GSS_LIB:=-lglite_security_gss
    -
    -TEST_LIBS:=-L${cppunit_prefix}/${libdir} -lcppunit
    -TEST_INC:=-I${cppunit_prefix}/include
    -
    -LOGD_OBJS:= logd_proto.o logd.o
    -
    -LOGD_NOBJS:=${LOGD_OBJS:.o=.no}
    -
    -INTERLOG_OBJS:=il_error.o input_queue_socket.o \
    -	recover.o send_event.o plugin_mgr.o \
    -	event_queue.o event_store.o il_master.o interlogd.o \
    -	queue_mgr.o server_msg.o queue_thread.o \
    -
    -WS_INTERLOG_OBJS:=il_error.o input_queue_socket_http.o \
    -	recover.o http.o send_event_http.o plugin_mgr.o \
    -	event_queue.o event_store_http.o il_master.o interlogd.o \
    -	queue_mgr_http.o server_msg_http.o queue_thread.o
    -
    -INTERLOG_NOBJS:=${INTERLOG_OBJS:.o=.no}
    -INTERLOG_WOBJS:=${WS_INTERLOG_OBJS:.o=.wo}
    -INTERLOG_PERF_OBJS:=${INTERLOG_OBJS:.o=.perf.o}
    -INTERLOG_EMPTY_OBJS:=${INTERLOG_OBJS:.o=.empty.o}
    -#INTERLOG_INLINE_EMPTY_OBJS:=${INTERLOG_OBJS:.o=.io}
    -
    -INTERLOG_TEST_OBJS:= \
    -	il_error.o \
    -	server_msg.o \
    -	server_msgTest.o \
    -	queue_thread.o \
    -	event_store.o \
    -	event_storeTest.o \
    -	queue_mgr.o \
    -	il_master.o \
    -	input_queue_socket.o \
    -	input_queue_socketTest.o \
    -	send_event.o \
    -	plugin_mgr. o \
    -	event_queue.o \
    -	event_queueTest.o \
    -	IlTestBase.o \
    -	il_test.o 
    -
    -MAN_GZ:=glite-lb-interlogd.8.gz glite-lb-logd.8.gz
    -MAN = $(MAN_GZ:.gz=)
    -
    -default: all 
    -
    -all compile: $(LOGD) $(INTERLOGD) $(NOTIF_INTERLOGD) ${MAN_GZ}
    -
    -glite-lb-logd: ${LOGD_OBJS}
    -	${LINK} -o $@ ${LOGD_OBJS} ${COMMON_LIB}_${nothrflavour} ${EXT_LIB}
    -
    -glite-lb-logd-perf: ${LOGD_OBJS}
    -	${LINK} -o $@ ${LOGD_OBJS} ${COMMON_LIB}_${nothrflavour} ${EXT_LIB}
    -
    -glite-lb-logd-nofile: ${LOGD_NOBJS}
    -	${LINK} -o $@ ${LOGD_NOBJS} ${COMMON_LIB}_${nothrflavour} ${EXT_LIB}
    -
    -glite-lb-logd-perf-nofile: ${LOGD_NOBJS}
    -	${LINK} -o $@ ${LOGD_NOBJS} ${COMMON_LIB}_${nothrflavour} ${EXT_LIB}
    -
    -glite-lb-interlogd: ${INTERLOG_OBJS}
    -	${LINK} -o $@ ${INTERLOG_OBJS} ${COMMON_LIB}_${thrflavour} ${EXT_LIB}
    -
    -glite-lb-notif-interlogd: ${INTERLOG_NOBJS}
    -	${LINK} -o $@ ${INTERLOG_NOBJS} ${COMMON_LIB}_${thrflavour} ${EXT_LIB}
    -
    -glite-lb-interlogd-perf: ${INTERLOG_PERF_OBJS}
    -	${LINK} -o $@ ${INTERLOG_PERF_OBJS} ${COMMON_LIB}_${thrflavour} ${EXT_LIB}
    -
    -glite-lb-interlogd-perf-empty: ${INTERLOG_EMPTY_OBJS}
    -	${LINK} -o $@ ${INTERLOG_EMPTY_OBJS} ${COMMON_LIB}_${thrflavour} ${EXT_LIB}
    -
    -glite-lb-ws-interlogd: ${INTERLOG_WOBJS}
    -	${LINK} -o $@ ${INTERLOG_WOBJS} ${COMMON_LIB}_${thrflavour} ${EXT_LIB}
    -
    -#glite-lb-interlogd-perf-inline-empty: ${INTERLOG_INLINE_EMPTY_OBJS}
    -#	${LINK} -o $@ ${INTERLOG_INLINE_EMPTY_OBJS} \
    -#		${COMMON_LIB}_${thrflavour}
    -
    -${MAN_GZ}: ${MAN}
    -	rm -f ${MAN_GZ} ${MAN}
    -	cp $? .
    -	gzip -f $(notdir $?)
    -
    -man: ${MAN_GZ}
    -
    -stage: compile
    -	$(MAKE) install PREFIX=${stagedir} 
    -
    -check: 
    -# do nothing until test/ is really added to CVS
    -# check.ll check.il
    -
    -#check.ll: logd_proto_test.o ll_test.o
    -#	${LINKXX} -o $@ ${COMMON_LIB}_${nothrflavour} ${EXT_LIBS} ${TEST_LIBS} $+
    -#	./check.ll
    -
    -check.ll:
    -	-echo commented out -- fix needed
    -
    -check.il: ${INTERLOG_TEST_OBJS}
    -	${LINKXX} -o $@ ${COMMON_LIB}_${thrflavour} ${GLITE_GSS_LIB}_${nothrflavour} ${TEST_LIBS} -lpthread $+
    -
    -install:
    -	-mkdir -p ${PREFIX}/bin
    -	-mkdir -p ${PREFIX}/etc/init.d
    -	-mkdir -p ${PREFIX}/share/doc/${package}-${version}
    -	-mkdir -p ${PREFIX}/share/man/man8
    -	${INSTALL} -m 755 ${LOGD} ${PREFIX}/bin
    -	${INSTALL} -m 755 ${INTERLOGD} ${PREFIX}/bin
    -	${INSTALL} -m 755 ${NOTIF_INTERLOGD} ${PREFIX}/bin
    -ifdef LB_PERF
    -	-mkdir -p ${PREFIX}/sbin
    -	${INSTALL} -m 755 ${top_srcdir}/src/perftest_ll.sh ${PREFIX}/sbin
    -	${INSTALL} -m 755 ${top_srcdir}/src/perftest_il.sh ${PREFIX}/sbin
    -endif
    -	${INSTALL} -m 755 ${top_srcdir}/config/startup ${PREFIX}/etc/init.d/glite-lb-locallogger
    -	${INSTALL} -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version}
    -	( cd ${top_srcdir}/project && ${INSTALL} -m 644 ChangeLog package.description package.summary ${PREFIX}/share/doc/${package}-${version} )
    -	${INSTALL} -m 644 ${MAN_GZ} ${PREFIX}/share/man/man8
    -
    -${INTERLOG_NOBJS}: %.no: %.c
    -	${CC} ${CFLAGS} -DIL_NOTIFICATIONS -c $< -o $@
    -
    -${INTERLOG_OBJS}: %.o: %.c
    -	${CC} ${CFLAGS} -c $< -o $@
    -
    -${INTERLOG_WOBJS}: %.wo: %.c
    -	${CC} ${CFLAGS} -DIL_WS -c $< -o $@
    -
    -${INTERLOG_EMPTY_OBJS}: %.empty.o: %.c
    -	${CC} ${CFLAGS} -DPERF_EMPTY -c $< -o $@
    -
    -${INTERLOG_PERF_OBJS}: %.perf.o: %.c
    -	${CC} ${CFLAGS} -c $< -o $@
    -
    -#${INTERLOG_INLINE_EMPTY_OBJS}: %.io: %.c
    -#	${CC} ${CFLAGS} -DLB_PERF -DPERF_EMPTY -DPERF_EVENTS_INLINE -c $< -o $@
    -
    -${LOGD_NOBJS}: %.no: %.c
    -	${CC} ${CFLAGS} -DLOGD_NOFILE -c $< -o $@
    -
    -${LOGD_OBJS}: %.o: %.c
    -	${CC} ${CFLAGS} -c $< -o $@
    -
    -logd_proto_test.o: %.o: %.c
    -	${CC} ${CFLAGS} -c $< -o $@
    -
    -ll_test.o: %.o: %.cpp
    -	${CXX} ${CFLAGS} ${TEST_INC} -c $< -o $@
    -
    -il_test.o IlTestBase.o server_msgTest.o event_queueTest.o input_queue_socketTest.o event_storeTest.o: %.o: %.cpp
    -	${CXX} ${CFLAGS} ${TEST_INC} -c $< -o $@
    -
    -clean:
    -	rm -rvf .libs/ *.o *.no ${LOGD} ${INTERLOGD} ${NOTIF_INTERLOGD} ${MAN_GZ}
    -	rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/
    diff --git a/org.glite.lb.logger/build.xml b/org.glite.lb.logger/build.xml
    deleted file mode 100755
    index e5382ce..0000000
    --- a/org.glite.lb.logger/build.xml
    +++ /dev/null
    @@ -1,131 +0,0 @@
    -
    -
    -
    -
    -	
    -	
    -	
    -	
    -
    -	
    -	
    -
    -	
    -	
    -	
    -	
    -	
    -
    -	
    -	
    -		
    -	
    -	
    -	
    -	
    -	
    -	
    -	
    -	
    -	
    -
    -	
    -	
    -	
    -			
    -	
    -	
    -
    -	
    -	
    -	
    -		
    -	
    -	
    -	
    -		
    -	
    -		
    -	
    -	
    -	
    -	
    -	
    -	
    -	
    -
    -	
    -	
    -
    -		
    diff --git a/org.glite.lb.logger/config/glite-lb-logger.config.xml b/org.glite.lb.logger/config/glite-lb-logger.config.xml
    deleted file mode 100644
    index 897975f..0000000
    --- a/org.glite.lb.logger/config/glite-lb-logger.config.xml
    +++ /dev/null
    @@ -1,77 +0,0 @@
    -
    - 
    -
    -  
    -   
    -    glite_lb_logd daemon
    -    
    -     
    -      port to listen
    -     
    -     
    -      path and prefix for event files
    -     
    -     
    -      path to local socket
    -     
    -     
    -      location of server certificate
    -     
    -     
    -      location of server private key
    -     
    -     
    -      "directory containing CA certificates"
    -     
    -    
    -   
    -  
    -
    -  
    -   
    -    glite_lb_interlogd daemon
    -    
    -     
    -      path and prefix for event files
    -     
    -     
    -      path to local socket
    -     
    -     
    -      location of server certificate
    -     
    -     
    -      location of server private key
    -     
    -     
    -      "directory containing CA certificates"
    -     
    -    
    -   
    -  
    -
    -  
    -   
    -    glite_lb_notif_interlogd daemon
    -    
    -     
    -      path and prefix for event files
    -     
    -     
    -      path to local socket
    -     
    -     
    -      location of server certificate
    -     
    -     
    -      location of server private key
    -     
    -     
    -      "directory containing CA certificates"
    -     
    -    
    -   
    -  
    -
    - 
    -
    diff --git a/org.glite.lb.logger/config/glite-lb-logger.default-properties b/org.glite.lb.logger/config/glite-lb-logger.default-properties
    deleted file mode 100644
    index 202f5aa..0000000
    --- a/org.glite.lb.logger/config/glite-lb-logger.default-properties
    +++ /dev/null
    @@ -1,18 +0,0 @@
    -locallogger.port = 9002
    -locallogger.file-prefix = /var/glite/log/dglogd.log
    -locallogger.socket = /tmp/interlogger.sock
    -locallogger.cert = /etc/grid-security/hostcert.pem
    -locallogger.key = /etc/grid-security/hostkey.pem
    -locallogger.CAdir = /etc/grid-security/certificates
    -interlogger.file-prefix = /var/glite/log/dglogd.log
    -interlogger.socket = /tmp/interlogger.sock
    -interlogger.cert = /etc/grid-security/hostcert.pem
    -interlogger.key = /etc/grid-security/hostkey.pem
    -interlogger.CAdir = /etc/grid-security/certificates
    -notification-interlogger.file-prefix = /tmp/notif_events
    -notification-interlogger.socket = /tmp/notif_interlogger.sock
    -notification-interlogger.cert = /etc/grid-security/hostcert.pem
    -notification-interlogger.key = /etc/grid-security/hostkey.pem
    -notification-interlogger.CAdir = /etc/grid-security/certificates
    -log.Priority = DEBUG
    -log.fileName = /var/glite/log/glite-lb-logger.log
    diff --git a/org.glite.lb.logger/config/startup b/org.glite.lb.logger/config/startup
    deleted file mode 100755
    index 1454c9f..0000000
    --- a/org.glite.lb.logger/config/startup
    +++ /dev/null
    @@ -1,153 +0,0 @@
    -#!/bin/sh
    -# chkconfig: 345 76 24
    -#
    -# Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -# See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -# 
    -# Licensed under the Apache License, Version 2.0 (the "License");
    -# you may not use this file except in compliance with the License.
    -# You may obtain a copy of the License at
    -# 
    -#     http://www.apache.org/licenses/LICENSE-2.0
    -# 
    -# Unless required by applicable law or agreed to in writing, software
    -# distributed under the License is distributed on an "AS IS" BASIS,
    -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -# See the License for the specific language governing permissions and
    -# limitations under the License.
    -#
    -
    -GLITE_LOCATION=${GLITE_LOCATION:-/opt/glite}
    -GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-$GLITE_LOCATION/var}
    -
    -[ -f /etc/glite.conf ] && . /etc/glite.conf
    -[ -f $GLITE_LOCATION/etc/glite-wms.conf ] && . $GLITE_LOCATION/etc/glite-wms.conf
    -
    -[ -f $GLITE_LOCATION/etc/lb.conf ] && . $GLITE_LOCATION/etc/lb.conf
    -[ -f $GLITE_LOCATION_VAR/etc/lb.conf ] && . $GLITE_LOCATION_VAR/etc/lb.conf
    -
    -[ -f $HOME/.glite.conf ] && . $HOME/.glite.conf
    -
    -LL_PIDFILE=${LL_PIDFILE:-$GLITE_LOCATION_VAR/glite-lb-logd.pid}
    -IL_PIDFILE=${IL_PIDFILE:-$GLITE_LOCATION_VAR/glite-lb-interlogd.pid}
    -
    -unset creds port log4c
    -
    -start_daemon()
    -{
    -	local name="$1"
    -	local pidfile="$2"
    -	local cmd="$3"
    -
    -	if [ -f "$pidfile" ]; then
    -		if kill -0 `cat $pidfile`; then
    -			return 0
    -		fi
    -		echo -n "Warning: stalled $pidfile for $name"
    -		rm -f "$pidfile"
    -	fi
    -	echo -n "Starting $name ..."
    -	su - $GLITE_USER -c "$log4c $cmd" && echo " done" || echo " FAILED"
    -}
    -
    -start()
    -{
    -	case "$GLITE_LB_TYPE" in
    -	proxy)
    -		echo 'Not starting logd and interlogger, proxy only instance (GLITE_LB_TYPE=proxy).'
    -		return 0
    -	esac
    -
    -	if test -z "$GLITE_USER" ;then
    -		echo 'Error: GLITE_USER is not set'
    -		echo FAILED
    -		return 1
    -	fi
    -
    -	[ -n "$GLITE_HOST_CERT" -a -n "$GLITE_HOST_KEY" ] &&
    -		creds="-c $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="-c /etc/grid-security/hostcert.pem -k /etc/grid-security/hostkey.pem"
    -		fi
    -	fi
    -
    -	[ -z "$creds" ] && echo $0: WARNING: No credentials specified. Using default lookup which is dangerous. >&2
    -
    -	[ -n "$GLITE_LB_LOGGER_PORT" ] && port="--port $GLITE_LB_LOGGER_PORT"
    -	[ -n "$GLITE_LB_IL_SOCK" ] && sock="--socket $GLITE_LB_IL_SOCK"
    -	[ -n "$GLITE_LB_IL_FPREFIX" ] && fprefix="--file-prefix $GLITE_LB_IL_FPREFIX"
    -
    -	log4c="LOG4C_RCPATH='$GLITE_LOCATION/etc/glite-lb'"
    -
    -	mkdir -p /var/glite/log 
    -	chown $GLITE_USER /var/glite/log
    -        (cd /tmp && ls -f /tmp |grep ^dglogd_sock_ |xargs rm -f)
    -	start_daemon "glite-lb-logd" "$LL_PIDFILE" "$GLITE_LOCATION/bin/glite-lb-logd \
    -		-i $LL_PIDFILE $creds $port $sock $fprefix"
    -
    -	start_daemon "glite-lb-interlogd" "$IL_PIDFILE" "$GLITE_LOCATION/bin/glite-lb-interlogd \
    -		-i $IL_PIDFILE $creds $sock $fprefix"
    -}
    -
    -killwait()
    -{
    -	pidfile=$1
    -	if [ -f $pidfile ] && pid=`cat $pidfile` && kill $pid 2>/dev/null; then
    -		cnt=0
    -		while ps p $pid 2>/dev/null >/dev/null; do
    -			sleep 1;
    -			cnt=`expr $cnt + 1`
    -			if [ $cnt = 120 ]; then break; fi
    -		done
    -		if [ $cnt = 100 ]; then echo " can't stop"
    -		else echo " done"; fi
    -	else
    -		echo " not running"
    -	fi
    -}
    -
    -stop()
    -{
    -	echo -n Stopping glite-lb-logd ...
    -	killwait $LL_PIDFILE
    -	echo -n Stopping glite-lb-interlogd ...
    -	killwait $IL_PIDFILE
    -
    -	# for L&B <= 2.0
    -	LC_ALL=C
    -	if netstat -an --inet | grep "^tcp .* 0.0.0.0:${GLITE_LB_LOGGER_PORT:-9002} .*LISTEN" >/dev/null 2>&1 ;then
    -		killall -9 glite-lb-logd
    -	fi
    -	if netstat -an --unix | grep "^unix .* LISTEN.* ${GLITE_LB_IL_SOCK:-/tmp/interlogger.sock}$" >/dev/null 2>&1 ;then
    -		killall -9 glite-lb-interlogd
    -	fi
    -}
    -
    -status()
    -{
    -	LC_ALL=C
    -	if netstat -an --inet | grep "^tcp .* 0.0.0.0:${GLITE_LB_LOGGER_PORT:-9002} .*LISTEN" >/dev/null 2>&1 ;then
    -	echo glite-lb-logd running
    -	else
    -	echo glite-lb-logd not running
    -	return 1
    -	fi
    -	if netstat -an --unix | grep "^unix .* LISTEN.* ${GLITE_LB_IL_SOCK:-/tmp/interlogger.sock}$" >/dev/null 2>&1 ;then
    -	echo glite-lb-interlogd running
    -	else
    -	echo glite-lb-interlogd not running
    -	return 1
    -	fi
    -}
    -
    -case x$1 in
    -	xstart)	start;;
    -	xstop)	stop;;
    -	xrestart) stop; start;;
    -	xstatus) status;;
    -	x*)	echo usage: $0 start,stop,restart,status >&2
    -		exit 1;;
    -esac
    diff --git a/org.glite.lb.logger/configure b/org.glite.lb.logger/configure
    deleted file mode 100755
    index c82ed75..0000000
    --- a/org.glite.lb.logger/configure
    +++ /dev/null
    @@ -1,843 +0,0 @@
    -#!/usr/bin/perl
    -
    -# WARNING: Don't edit this file unless it is the master copy in org.glite.lb
    -#
    -# For the purpose of standalone builds of lb/jobid/lbjp-common components
    -# it is copied on tagging 
    -
    -# $Header$
    -#
    -# Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -# See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -# 
    -# Licensed under the Apache License, Version 2.0 (the "License");
    -# you may not use this file except in compliance with the License.
    -# You may obtain a copy of the License at
    -# 
    -#     http://www.apache.org/licenses/LICENSE-2.0
    -# 
    -# Unless required by applicable law or agreed to in writing, software
    -# distributed under the License is distributed on an "AS IS" BASIS,
    -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -# See the License for the specific language governing permissions and
    -# limitations under the License.
    -#
    -
    -use Getopt::Long;
    -
    -my $pwd = `pwd`; chomp $pwd;
    -my $prefix = $pwd.'/stage';
    -my $stagedir;
    -my $staged;
    -my $module;
    -my $thrflavour = 'gcc64dbgpthr';
    -my $nothrflavour = 'gcc64dbg';
    -my $mode = 'build';
    -my $help = 0;
    -my $listmodules;
    -my $version;
    -my $branch;
    -my $output;
    -my $lb_tag = '';
    -my $lbjp_tag = '';
    -my $jp_tag = '';
    -my $sec_tag = '';
    -my $jobid_tag = '';
    -my $libdir = getlibdir();
    -
    -my @nodes = qw/client server logger utils client-java doc ws-test db jpprimary jpindex jpclient harvester/;
    -my %enable_nodes;
    -my %disable_nodes;
    -
    -my %extern_prefix = (
    -	cares => '/opt/c-ares',
    -	classads => '/opt/classads',
    -	cppunit => '/usr',
    -	expat => '/usr',
    -	globus => '/opt/globus',
    -	gsoap => '/usr',
    -	mysql => '/usr',
    -	'mysql-devel' => '',
    -	'mysql-server' => '',
    -	voms => '/opt/glite',
    -	gridsite => '/opt/glite',
    -	lcas => '/opt/glite',
    -	trustmanager => '/opt/glite',
    -	utiljava => '/opt/glite',
    -	ant => '/usr',
    -	jdk => '/usr',
    -	libtar => '/usr',
    -	axis => '/usr',
    -	log4c => '/usr',
    -	postgresql => '/usr'
    -);
    -
    -my %jar = (
    -	'commons-codec' => '/usr/share/java/commons-codec.jar',
    -	'commons-lang' => '/usr/share/java/commons-lang.jar',
    -);
    -
    -
    -my %glite_prefix;
    -my %need_externs;
    -my %need_externs_type;
    -my %need_jars;
    -my %extrafull;
    -my %extranodmod;
    -my %deps;
    -my %deps_type;
    -my %topbuild;
    -
    -my %lbmodules = (
    -	'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim glite-LB/], 
    -	'security' => [qw/gss gsoap-plugin/],
    -	'lbjp-common' => [qw/db log maildir server-bones trio jp-interface/],
    -	'jobid' => [qw/api-c api-cpp api-java/],
    -	'jp' => [ qw/client doc index primary server-common ws-interface/ ],
    -	);
    -
    -
    -my @opts = (
    -	'prefix=s' => \$prefix,
    -	'staged=s' => \$staged,
    -	'module=s' => \$module,
    -	'thrflavour=s' => \$thrflavour,
    -	'nothrflavour=s' => \$nothrflavour,
    -	'mode=s' => \$mode,
    -	'listmodules=s' => \$listmodules,
    -	'version=s' => \$version,
    -	'branch=s' => \$branch,
    -	'output=s' => \$output,
    -	'stage=s' => \$stagedir,
    -	'lb-tag=s' => \$lb_tag,
    -	'lbjp-common-tag=s' => \$lbjp_tag,
    -	'jp-tag=s' => \$jp_tag,
    -	'security-tag=s' => \$sec_tag,
    -	'jobid-tag=s' => \$jobid_tag,
    -	'help' => \$help,
    -	'libdir=s' => \$libdir,
    -);
    -
    -for (@nodes) {
    -	$enable_nodes{$_} = 0;
    -	$disable_nodes{$_} = 0;
    -	
    -	push @opts,"disable-$_",\$disable_nodes{$_};
    -	push @opts,"enable-$_",\$enable_nodes{$_};
    -}
    -
    -push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix;
    -push @opts,"with-$_=s",\$jar{$_} for keys %jar;
    -
    -my @keeparg = @ARGV;
    -
    -GetOptions @opts or die "Errors parsing command line\n";
    -
    -$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq '';
    -$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq '';
    -
    -if ($help) { usage(); exit 0; }
    -
    -if ($listmodules) {
    -	my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}};
    -	print "@m\n";
    -	exit 0;
    -}
    -
    -warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
    -	if ($version || $output || $branch) && $mode ne 'etics';
    -
    -my $en;
    -for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; }
    -
    -my $dis;
    -for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; }
    -
    -die "--enable-* and --disable-* are mutually exclusive\n"
    -	if $en && $dis;
    -
    -die "--module cannot be used with --enable-* or --disable-*\n"
    -	if $module && ($en || $dis);
    -
    -die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}};
    -
    -if ($dis) {
    -	for (@nodes) {
    -		$enable_nodes{$_} = 1 unless $disable_nodes{$_};
    -	}
    -}
    -
    -if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ;
    -
    -for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; }
    -
    -$stagedir = $prefix unless $stagedir;
    -
    -if ($mode eq 'build') {
    -	print "Writing config.status\n";
    -	open CONF,">config.status" or die "config.status: $!\n";
    -	print CONF "$0 @keeparg\n";
    -	close CONF;
    -}
    -
    -
    -my @modules;
    -my %aux;
    -
    -if ($module) {
    -#	push @modules,split(/[,.]+/,$module);
    -	push @modules,$module;
    -}
    -else {
    -	@modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes));
    -	
    -	my $n;
    -
    -	do {
    -		local $"="\n";
    - 		$n = $#modules;
    -		push @modules,(map @{$deps{$_}},@modules);
    -
    -		undef %aux; @aux{@modules} = (1) x ($#modules+1);
    -		@modules = keys %aux;
    -	} while ($#modules > $n);
    -}
    -
    -@aux{@modules} = (1) x ($#modules+1);
    -delete $aux{$_} for (split /,/,$staged);
    -@modules = keys %aux;
    -
    -mode_build() if $mode eq 'build';
    -mode_checkout() if $mode eq 'checkout';
    -mode_etics($module) if $mode eq 'etics';
    -
    -sub mode_build {
    -	print "\nBuilding modules: @modules\n";
    -	
    -	my @ext = map @{$need_externs{$_}},@modules;
    -	my @myjars = map @{$need_jars{$_}},@modules;
    -	undef %aux; @aux{@ext} = 1;
    -	@ext = keys %aux;
    -	undef %aux; @aux{@myjars} = (1) x ($#myjars+1);
    -	@myjars = keys %aux;
    -	
    -	print "\nRequired externals:\n";
    -	print "\t$_: $extern_prefix{$_}\n" for @ext;
    -	print "\t$_: $jar{$_}\n" for @myjars;
    -	print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n";
    -	
    -	mkinc($_) for @modules;
    -	
    -	print "Creating Makefile\n";
    -	
    -	open MAK,">Makefile" or die "Makefile: $!\n";
    -	
    -	print MAK "all: @modules\n\nclean:\n";
    -	
    -	for (@modules) {
    -		my $full = full($_);
    -		my $build = $topbuild{$_} ? '': '/build';
    -		print MAK "\tcd $full$build && \${MAKE} clean\n"
    -	}
    -	
    -	print MAK "\ndistclean:\n";
    -	
    -	for (@modules) {
    -		my $full = full($_);
    -		print MAK $topbuild{$_} ?
    -			"\tcd $full$build && \${MAKE} distclean\n" :
    -			"\trm -rf $full$build\n"
    -	}
    -	
    -	print MAK "\n";
    -	
    -	for (@modules) {
    -		my %ldeps; undef %ldeps;  
    -		@ldeps{@{$deps{$_}}} = 1;
    -		for my $x (split /,/,$staged) { delete $ldeps{$x}; }
    -		my @dnames = $module ? () : keys %ldeps;
    -	
    -		my $full = full($_);
    -		my $build = $topbuild{$_} ? '': '/build';
    -	
    -		print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n";
    -	}
    -	
    -	close MAK;
    -}
    -	
    -sub mode_checkout() {
    -	for (@modules) {
    -		my $module = $_;
    -		my $tag = "";
    -		if ($lb_tag){
    -			for (@{$lbmodules{lb}}){
    -				if ("lb.".$_ eq $module){
    -					$tag = '-r '.$lb_tag;
    -				}
    -			}	
    -		}
    -		if ($lbjp_tag){
    -			for (@{$lbmodules{'lbjp-common'}}){
    -				if ("lbjp-common.".$_ eq $module){
    -                                        $tag = '-r '.$lbjp_tag;
    -                                }
    -			}
    -		}
    -		if ($jp_tag){
    -			for (@{$lbmodules{'jp'}}){
    -	                        if ("jp.".$_ eq $module){
    -                                        $tag = '-r '.$jp_tag;
    -	                        }
    -                        }
    -		}
    -		if ($sec_tag){
    -			for (@{$lbmodules{security}}){
    -				if ("security.".$_ eq $module){
    -                                        $tag = '-r '.$sec_tag;
    -                                }
    -			}
    -		}
    -		if ($jobid_tag){
    -			for (@{$lbmodules{jobid}}){
    -				if ("jobid.".$_ eq $module){
    -                                        $tag = '-r '.$jobid_tag;
    -                                }
    -			}
    -		}
    -		#if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){
    -		#	print "found";
    -		#}
    -		$_ = full($_);
    -		print "\n*** Checking out $_\n";
    -		system("cvs checkout  $tag $_") == 0 or die "cvs checkout $tag $_: $?\n";
    -	}
    -}
    -
    -BEGIN{
    -%need_externs_aux = (
    -	'lb.client' => [ qw/cppunit:B classads/ ],
    -	'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava/ ],
    -	'lb.common' => [ qw/expat cares:B cppunit:B classads/ ],
    -	'lb.doc' => [],
    -	'lb.logger' => [ qw/cppunit:B/ ],
    -	'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ],
    -	'lb.state-machine' => [ qw/classads/ ],
    -	'lb.utils' => [ qw/cppunit:B/ ],
    -	'lb.ws-interface' => [],
    -	'lb.ws-test' => [ qw/gsoap:B/ ],
    -	'lb.types' => [ qw// ],
    -	'lb.harvester' => [ qw// ],
    -	'lb.yaim' => [ qw/yaim_core:R/ ],
    -	'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ],
    -	'lbjp-common.db' => [ qw/mysql:B mysql-devel:B postgresql:B cppunit:B log4c:B/ ],
    -	'lbjp-common.log' => [ qw/log4c/ ],
    -	'lbjp-common.maildir' => [ qw// ],
    -	'lbjp-common.server-bones' => [ qw// ],
    -	'lbjp-common.trio' => [ qw/cppunit:B/ ],
    -	'lbjp-common.jp-interface' => [ qw/cppunit:B log4c:B/ ],
    -	'security.gss' =>  [ qw/globus_essentials:R globus:B cares cppunit:B/ ],
    -	'security.gsoap-plugin' =>  [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap:B/ ],
    -	'jobid.api-c' =>  [ qw/cppunit:B/ ],
    -	'jobid.api-cpp' =>  [ qw/cppunit:B/ ],
    -	'jobid.api-java' =>  [ qw/ant:B jdk:B/ ],
    -	'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ],
    -        'jp.doc' => [],
    -        'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ],
    -        'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ],
    -        'jp.server-common' => [],
    -        'jp.ws-interface' => [],
    -);
    -
    -for my $ext (keys %need_externs_aux) {
    -	for (@{$need_externs_aux{$ext}}) {
    -		/([^:]*)(?::(.*))?/;
    -		push @{$need_externs{$ext}},$1;
    -		my $type = $2 ? $2 : 'BR';
    -		$need_externs_type{$ext}->{$1} = $type;
    -	}
    -}
    -
    -%need_jars = (
    -	'jobid.api-java' => [ qw/commons-codec/ ],
    -	'lb.client-java' => [ qw/commons-lang/ ],
    -);
    -
    -for my $jar (keys %need_jars) {
    -	for (@{$need_jars{$jar}}) {
    -		$need_externs_type{$jar}->{$_} = 'BR'; 	# XXX
    -	}
    -}
    -
    -%deps_aux = (
    -	'lb.client' => [ qw/
    -		lb.types:B lb.common
    -		lbjp-common.trio
    -		jobid.api-cpp:B jobid.api-c
    -		security.gss
    -	/ ],
    -	'lb.client-java' => [ qw/
    -		lb.types:B
    -		lb.ws-interface:B
    -		jobid.api-java
    -	/ ],
    -	'lb.common' => [ qw/
    -		jobid.api-cpp:B jobid.api-c
    -		lb.types:B lbjp-common.trio security.gss
    -	/ ],
    -	'lb.doc' => [ qw/lb.types:B/ ],
    -	'lb.logger' => [ qw/
    -		lbjp-common.trio
    -		lbjp-common.log
    -		jobid.api-c
    -		lb.common
    -		security.gss
    -	/ ],
    -	'lb.server' => [ qw/
    -		lb.ws-interface lb.types:B lb.common lb.state-machine
    -		lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log
    -		jobid.api-c
    -		security.gsoap-plugin security.gss
    -	/ ],
    -	'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ],
    -	'lb.utils' => [ qw/
    -		lbjp-common.jp-interface
    -		jobid.api-c
    -		lbjp-common.trio lbjp-common.maildir
    -		lb.client lb.state-machine
    -	/ ],
    -	'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ],
    -	'lb.ws-interface' => [ qw/lb.types:B/ ],
    -	'lb.types' => [ qw// ],
    -	'lb.harvester' => [ qw/
    -		jobid.api-c lbjp-common.trio lbjp-common.db lb.common lb.client
    -		security.gss lbjp-common.log
    -	/ ],
    -	'lb.yaim' => [ qw// ],
    -	'lb.glite-LB' => [ qw/
    -		lb.logger:R lb.server:R lb.utils:R lb.doc:R
    -		lb.ws-test:R lb.harvester:R lb.yaim:R lb.client-java:R
    -	/ ],
    -	'lbjp-common.db' => [ qw/lbjp-common.trio lbjp-common.log/ ],
    -	'lbjp-common.maildir' => [ qw// ],
    -	'lbjp-common.server-bones' => [ qw/lbjp-common.log/ ],
    -	'lbjp-common.trio' => [ qw// ],
    -	'security.gss' =>  [ qw// ],
    -	'security.gsoap-plugin' =>  [ qw/security.gss/ ],
    -	'jobid.api-c' =>  [ qw// ],
    -	'jobid.api-cpp' =>  [ qw/jobid.api-c/ ],
    -	'jobid.api-java' =>  [ qw// ],
    -
    -	'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ],
    -
    -	'jp.client' => [ qw/
    -                jp.ws-interface
    -                lbjp-common.jp-interface lbjp-common.maildir
    -                jobid.api-c
    -                security.gsoap-plugin
    -        / ],
    -	'jp.doc' => [ qw// ],
    -	'jp.index' => [ qw/
    -                jp.server-common jp.ws-interface
    -                lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones
    -                security.gsoap-plugin
    -        / ],
    -	'jp.primary' => [ qw/
    -                jobid.api-c
    -                jp.server-common jp.ws-interface
    -                lb.state-machine
    -                lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones
    -                security.gsoap-plugin
    -        / ],
    -	'jp.server-common' => [ qw/ 
    -                lbjp-common.jp-interface lbjp-common.db
    -        / ],
    -	'jp.ws-interface' => [ qw// ],
    -);
    -
    -for my $ext (keys %deps_aux) {
    -	for (@{$deps_aux{$ext}}) {
    -		/([^:]*)(?::(.*))?/;
    -		push @{$deps{$ext}},$1;
    -		my $type = $2 ? $2 : 'BR';
    -		$deps_type{$ext}->{$1} = $type;
    -	}
    -}
    -
    -
    -%extrafull = ( gridsite=>'org.gridsite.core');
    -
    -#( java => 'client-java' );
    -%extranodmod = (
    -	db => 'lbjp-common.db',
    -	jpprimary => 'jp.primary',
    -	jpindex => 'jp.index',
    -	jpclient => 'jp.client',
    -);
    -
    -%obsoletes = (
    -	'lb.yaim' => [ qq/glite-yaim-lb/ ],
    -);
    -
    -my @t = qw/lb.client-java jobid.api-java lb.types/;
    -@topbuild{@t} = (1) x ($#t+1);
    -}
    -
    -sub full
    -{
    -	my $short = shift;
    -	return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short;
    -}
    -
    -sub mkinc
    -{
    -	my %aux;
    -	undef %aux;
    -	my @m=qw/
    -lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB
    -security.gss security.gsoap-plugin
    -jobid.api-c jobid.api-cpp jobid.api-java
    -lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface
    -jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface
    -/;
    -	@aux{@m} = (1) x ($#m+1);
    -
    -	my $short = shift;
    -	my $full = full $short;
    -
    -	unless ($aux{$short}) {
    -		print "Makefile.inc not needed in $full\n";
    -		return;
    -	}
    -
    -	my $build = '';
    -	
    -	unless ($topbuild{$_}) {
    -		$build = '/build';
    -		unless (-d "$full/build") {
    -			mkdir "$full/build" or die "mkdir $full/build: $!\n";
    -		}
    -		unlink "$full/build/Makefile";
    -		symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n";
    -	}
    -
    -	open MKINC,">$full$build/Makefile.inc"
    -		or die "$full$build/Makefile.inc: $!\n";
    -
    -	print "Creating $full$build/Makefile.inc\n";
    -
    -	print MKINC qq{
    -PREFIX = $prefix
    -stagedir = $stagedir
    -thrflavour = $thrflavour
    -nothrflavour = $nothrflavour
    -libdir = $libdir
    -};
    -
    -	for (@{$need_externs{$short}}) {
    -		print MKINC "${_}_prefix = $extern_prefix{$_}\n"
    -	}
    -
    -	for (@{$need_jars{$short}}) {
    -		print MKINC "${_}_jar = $jar{$_}\n"
    -	}
    -
    -	my $need_gsoap = 0;
    -	for (@{$need_externs{$short}})  { $need_gsoap = 1 if $_ eq 'gsoap'; }
    -
    -	print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
    -
    -	close MKINC;
    -}
    -
    -my %etics_externs;
    -my %etics_projects;
    -BEGIN{
    -	%etics_externs = (
    -		globus_essentials=>'vdt_globus_essentials',
    -		globus=>'globus',
    -		cares=>'c-ares',
    -		voms=>'org.glite.security.voms-api-cpp',
    -		gridsite=>'org.gridsite.shared',
    -		lcas=>'org.glite.security.lcas',
    -		trustmanager=>'org.glite.security.trustmanager',
    -		utiljava=>'org.glite.security.util-java',
    -		gpt=>'gpt',
    -		fetchcrl=>'fetch-crl',
    -		gip_release=>'glite-info-provider-release',
    -		gip_service=>'glite-info-provider-service',
    -		bdii=>'bdii',
    -		glite_version=>'glite-version',
    -		glite_info_templates=>'glite-info-templates',
    -		glue_schema=>'glue-schema',
    -		yaim_core=>'org.glite.yaim.core',
    -	);
    -	%etics_projects = (
    -		vdt=>[qw/globus globus_essentials/],
    -		'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/],
    -	);
    -};
    -
    -sub mode_etics {
    -	$fmod = shift;
    -
    -	die "$0: --module required with --etics\n" unless $fmod;
    -	
    -	my ($subsys,$module) = split /\./,$fmod;
    -
    -	my ($major,$minor,$rev,$age);
    -
    -	if ($version) {
    -		$version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
    -		($major,$minor,$rev,$age) = ($1,$2,$3,$4);
    -	}
    -	else { 
    -		open V,"org.glite.$subsys.$module/project/version.properties"
    -			or die "org.glite.$subsys.$module/project/version.properties: $!\n";
    -	
    -		while ($_ = ) {
    -			chomp;
    -			($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/;
    -			$age = $1 if /module\.age\s*=\s*([[:digit:]]+)/;
    -		}
    -		close V;
    -	}
    -
    -	my @copts = ();
    -	my %ge;
    -	@ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1);
    -
    -	for (@{$need_externs{"$subsys.$module"}}) {
    -	    if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) {
    -		my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
    -		push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}";
    -	    }
    -	}
    -
    -	for (@{$need_jars{"$subsys.$module"}}) {
    -		my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
    -
    -		push @copts,"--with-$_ \${$eext.location}/$_*.jar";
    -	}
    -
    -	my $conf;
    -	my $conftag;
    -
    -	if ($branch) {
    -		$conf = "glite-${subsys}-${module}_$branch"; 
    -		$conftag = $branch; 
    -		$dwpath = ""; }
    -	else {
    -		$conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
    -		$conftag = $conf; 
    -		$dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n"; }
    -#	my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}";
    -	my $file = $output ? $output : "$conf.ini";
    -	open C,">$file" or die "$file: $!\n";
    -
    -	my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build";
    -
    -	my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..';
    -
    -	my $package_description = "";
    -	my $package_summary = "";
    -
    -	if (-e "org.glite.$subsys.$module/project/package.description") {
    -		open V, "org.glite.$subsys.$module/project/package.description";
    -		$package_description = join ("", );
    -		close V;
    -		chomp $package_description;
    -		$package_description =~ s/\n/\\n/g; 
    -		$package_description = "package.description = $package_description";
    -	} 
    -	else { 
    -		print STDERR "package.description not found for $subsys.$module!\n"; }
    -
    -	if (-e "org.glite.$subsys.$module/project/package.summary") {
    -		open V, "org.glite.$subsys.$module/project/package.summary";
    -		$package_summary = join ("", );
    -		close V;
    -		chomp $package_summary;
    -		$package_summary =~ s/\n/\\n/g; 
    -		$package_summary = "package.summary = $package_summary";
    -	} 
    -	else { 
    -		print STDERR "package.summary not found for $subsys.$module!\n"; }
    -
    -
    -	print STDERR "Writing $file\n";
    -	print C qq{
    -[Configuration-$conf]
    -profile = None
    -moduleName = org.glite.$subsys.$module
    -displayName = $conf
    -description = org.glite.$subsys.$module
    -projectName = org.glite
    -age = $age
    -deploymentType = None
    -tag = $conftag
    -version = $major.$minor.$rev
    -$dwpath
    -[Platform-default:VcsCommand]
    -displayName = None
    -description = None
    -tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName}
    -branch = None
    -commit = None
    -checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName}
    -
    -[Platform-default:BuildCommand]
    -postpublish = None
    -packaging = None
    -displayName = None
    -description = None
    -doc = None
    -prepublish = None
    -publish = None
    -compile = make
    -init = None
    -install = make install
    -clean = make clean
    -test = make check
    -configure = cd $confdir && /usr/bin/perl \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts
    -checkstyle = None
    -
    -[Platform-default:Property]
    -$buildroot
    -$package_description
    -$package_summary
    -};
    -	for (@{$obsoletes{"$subsys.$module"}}) {
    -		print C "package.obsoletes = $_\n";
    -		print C "package.replaces = $_\n";
    -	}
    -
    -	print C qq{
    -[Platform-default:DynamicDependency]
    -};
    -	for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) {
    -		my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
    -
    -		my $proj = 'externals';
    -		for my $p (keys %etics_projects) {
    -			for $m (@{$etics_projects{$p}}) {
    -				$proj = $p if $m eq $_;
    -			}
    -		}
    -
    -		my $type = $need_externs_type{"$subsys.$module"}->{$_};
    -		print C "$proj|$eext = $type\n";
    -	}
    -
    -	for (@{$deps{"$subsys.$module"}}) {
    -		my $type = $deps_type{"$subsys.$module"}->{$_};
    -		print C "org.glite|org.glite.$_ = $type\n";
    -	}
    -
    -	close C;
    -}
    -
    -sub gsoap_version {
    -	local $_;
    -	my $gsoap_version;
    -	open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n";
    -
    -	while ($_ = ) {
    -		chomp;
    -
    -		$gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/;
    -	}
    -	close S;
    -	return $gsoap_version;
    -}
    -
    -sub getlibdir {
    -	if ( -e "/etc/debian_version") { # We are on Debian
    -		$lib64="lib";
    -		$lib32="lib32";	}
    -	else { # Another distribution
    -		$lib64="lib64";
    -		$lib32="lib";	}
    -        $libdir=$lib32;
    -
    -        open INP, "uname -s | "; # Check kernel name
    -        $kname= ;
    -        chomp($kname);
    -        close INP;
    -
    -        if ( $kname == "Linux") {
    -                $arch = ("x86_64\npowerpc\nppc64\n");
    -
    -                open INP, "uname -p | "; # Check processor type
    -                $procname= ;
    -                chomp($procname);
    -                close INP;
    -
    -                if ($arch =~/^$procname\n/) {
    -                        return ($lib64); }
    -
    -                open INP, "uname -m | "; # Check machine hardware
    -                $machname= ;
    -                chomp($machname);
    -                close INP;
    -
    -                if ($arch =~/^$machname\n/) {
    -                        return ($lib64); }
    -
    -                # special cases (hyperlink lib64, Debian)
    -                if (-l "/usr/lib64") {
    -                        $libdir=$lib32; }
    -
    -                # if /usr/lib64 doesn't exist at all (AIX)
    -                unless ( -e "/usr/lib64" ) {
    -                        $libdir=$lib32; }
    -        }
    -
    -        if ( $kname == "SunOS") {
    -                if (-e "/usr/lib/64") {
    -                $libdir="lib/64"; }
    -        }
    -
    -        return $libdir;
    -}
    -
    -sub usage {
    -	my @ext = keys %extern_prefix;
    -	my @myjars, keys %jar;
    -
    -	print STDERR qq{
    -usage: $0 options
    -
    -General options (defaults in []):
    -  --prefix=PREFIX		destination directory [./stage]
    -  --staged=module,module,...	what is already in PREFIX (specify without org.glite.)
    -  --thrflavour=flavour
    -  --nothrflavour=flavour	threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg]
    -  --listmodules=subsys          list modules of a subsystem
    -  --libdir=libdir		typically [lib,lib64] postfix
    -  
    -Mode of operation:
    -  --mode={checkout|build|etics}	what to do [build]
    -  
    -What to build:
    -  --module=module		build this module only (mostly in-Etics operation)
    -  --enable-NODE			build this "node" (set of modules) only. Available nodes are
    -					@{$lbmodules{lb}},@{$lbmodules{security}}
    -  --disable-NODE		don't build this node
    -  --lb-tag=tag			checkout LB modules with specific tag
    -  --jp-tag=tag			checkout JP modules with specific tag
    -  --lbjp-common-tag=tag         checkout lbjp-common modules with specific tag
    -  --security-tag=tag		checkout security modules with specific tag
    -  --jobid-tag=tag		checkout jobid modules with specific tag
    -
    -Dependencies:
    -  --with-EXTERNAL=PATH		where to look for an external. Required externals
    - 				(not all for all modules) are:
    -					@ext
    -  --with-JAR=JAR		where to look for jars. Required jars are:
    -					@myjars
    -				Summary of what will be used is always printed
    -
    -};
    -
    -}
    diff --git a/org.glite.lb.logger/doc/glite-lb-interlogd.8 b/org.glite.lb.logger/doc/glite-lb-interlogd.8
    deleted file mode 100644
    index 68ae914..0000000
    --- a/org.glite.lb.logger/doc/glite-lb-interlogd.8
    +++ /dev/null
    @@ -1,183 +0,0 @@
    -.TH GLITE-LB-INTERLOGD 8 "April 2008" "EU EGEE Project" "Logging&Bookkeeping"
    -
    -.SH NAME
    -glite-lb-interlogd - interlogger daemon
    -
    -.SH SYNOPSIS
    -.B glite-lb-interlogd
    -.RI [ options ]
    -.br
    -
    -.SH DESCRIPTION
    -.B glite-lb-interlogd 
    -takes over L&B events from glite-lb-logd and 
    -it is responsible for reliable transfer to their target storage -
    -bookkeeping and logging servers.
    -Interlogger maintains message queues for each target server 
    -and implements reliable handling in environment with possible communication
    -failures.
    -
    -On startup (and then periodically during operation) interlogger checks the
    -event files (created by glite-lb-logd, see also the -f option),
    -spawns a thread for each target server, and populates the queues
    -with events read from the files.
    -Then it starts listening for further incoming events on the UNIX socket
    -(see the -s option).
    -
    -The queue threads periodically attempt to contact the destination servers
    -and to deliver the pending events.
    -
    -Eventually, when all events from a file are delivered the file is removed
    -after a certain timeout by a clean-up thread.
    -Possible race conditions wrt. glite-lb-logd are prevented by 
    -locking the files appropriately.
    -
    -.SH OPTIONS
    -.TP
    -.B "-b\fR,\fP --book 
    -Send events only to bookkeeping server. This option has effect only if
    -the logging server address is specified through the -l option. There is no
    -implementation of logging server currently.
    - 
    -.TP
    -.BI \-c " FILE" "\fR,\fP --cert " FILE
    -Get certificate from
    -.I FILE\fR.\fP
    -This option overrides the
    -.B \fR$\fPX509_USER_CERT
    -environment variable.
    -
    -.TP
    -.BI \-k " FILE" "\fR,\fP --key " FILE
    -Get server private key from
    -.I FILE\fR.\fP
    -This option overrides the
    -.B \fR$\fPX509_USER_KEY
    -environment variable.
    -
    -.TP
    -.BI \-C " DIR" "\fR,\fP --CAdir " DIR
    -Look for trusted CA's certificates in
    -.I DIR\fR.\fP
    -This option overrides the
    -.B \fR$\fPX509_CERT_DIR
    -environment variable.
    -
    -.TP
    -.B "-d\fR,\fP --debug"
    -Don't run as daemon (do not fork and put itself into background).
    -
    -.TP
    -.BI \-i " FILE" "\fR,\fP --pidfile " FILE
    -Store process id into this file rather than default /var/glite/glite-lb-[notif]-interlogd.pid
    -
    -.TP
    -.BI \-f " PREFIX" "\fR,\fP --file-prefix " PREFIX
    -.I PREFIX 
    -is path prefix of the event files.
    -
    -For each job (jobid) a specific file is created that stores all events
    -associated with this job.
    -The job filename is constructed by stripping the
    -protocol+server prefix from the jobid and appending the rest to this
    -.I PREFIX.
    -
    -.I PREFIX
    -defaults to /tmp/dglogd.log.
    -
    -On startup, interlogger checks all files matching the pattern
    -.I PREFIX*.
    -
    -The value has to be same as used in the cooperating glite-lb-logd.
    -
    -.TP
    -.BI \-k " FILE" "\fR,\fP --key " FILE
    -Get private key from
    -.I FILE\fR.\fP
    -This option overrides the
    -.B \fR$\fPX509_USER_KEY
    -environment variable.
    -
    -.TP
    -.BI -l " HOST" "\fR,\fP --log-server " HOST
    -Use 
    -.I HOST
    -as address of logging server.
    -As the logging is not implemented yet this option should not be used.
    -
    -.TP
    -.BI -s " PATH" "\fR,\fP --socket " PATH
    -Listen for events sent by glite-lb-logd at the UNIX socket
    -.I PATH.
    -
    -.TP
    -.B "-v\fR,\fP --verbose"
    -Print extensive debug output.
    -
    -.TP
    -.B "-V\fR,\fP --version"
    -Print version and exit.
    -
    -.TP
    -.BI -L " TIMEOUT" "\fR,\fP --lazy " TIMEOUT
    -Be lazy when closing connections to servers (default, 
    -.I TIMEOUT\fR
    -==0 means turn lazy off).
    -
    -.TP
    -.BI "-h\fR,\fP --help"
    -Print help and exit.
    -
    -.\".SH USAGE
    -.\" Add any additional description here
    -
    -.PP
    -
    -.SH FILES
    -.TP
    -.I /tmp/interlogger.sock
    -Default name of local socket.
    -.TP
    -.I /var/glite/log/dglogd.log*
    -Default location of event files.
    -
    -.I /var/glite/log/dglogd.log*.ctl
    -Interlogger's control files keeping the information on status of
    -the corresponding event file wrt. delivery to the target server.
    -
    -.TP
    -No configuration files needed.
    -
    -.SH ENVIRONMENT
    -.TP
    -.B X509_USER_KEY
    -If
    -.B \fR$\fPX509_USER_KEY
    -is set, it is used to locate private key file.
    -
    -.TP
    -.B X509_USER_CERT
    -If
    -.B \fR$\fPX509_USER_CERT
    -is set, it is used to locate certificate file.
    -
    -.TP
    -.B X509_CERT_DIR
    -If
    -.B \fR$\fPX509_CERT_DIR
    -is set, it is used to locate the trusted CA's certificates and ca-signing-policy files.
    -
    -.TP
    -.B X509_USER_PROXY
    -If
    -.B \fR$\fPX509USER_PROXY
    -is set, it is used to locate proxy certificate file.
    -
    -.SH REPORTING BUGS
    -Please, report all bugs to EU EGEE Bug Tracking System located at https://savannah.cern.ch
    -
    -.SH SEE ALSO
    -.B te-lb-bkserverd\fR(8),\fP glite-lb-logd\fR(8),\fP glite-lb-logevent\fR(1),\fP
    -
    -.SH AUTHOR
    -EU EGEE, JRA1.
    diff --git a/org.glite.lb.logger/doc/glite-lb-logd.8 b/org.glite.lb.logger/doc/glite-lb-logd.8
    deleted file mode 100644
    index 2a04be6..0000000
    --- a/org.glite.lb.logger/doc/glite-lb-logd.8
    +++ /dev/null
    @@ -1,172 +0,0 @@
    -.TH GLITE-LB-LOGD 8 "April 2008" "EU EGEE Project" "Logging&Bookkeeping"
    -
    -.SH NAME
    -glite-lb-logd - local logger daemon
    -
    -.SH SYNOPSIS
    -.B glite-lb-logd
    -.RI [ options ]
    -.br
    -
    -.SH DESCRIPTION
    -.B glite-lb-logd 
    -accepts the L&B events from their sources (via the producer L&B API).
    -It is responsible for fast acceptance of the events and their reliable storage
    -in local files.
    -
    -Under normal conditions, the events are forwared to the 
    -.B glite-lb-interlogd
    -immediately.
    -The file storage allows the interlogger crash recovery.
    -
    -.SH OPTIONS
    -.TP
    -.BI \-c " FILE" "\fR,\fP --cert " FILE
    -Get certificate from
    -.I FILE\fR.\fP
    -This option overrides the
    -.B \fR$\fPX509_USER_CERT
    -environment variable.
    -
    -.TP
    -.BI \-C " DIR" "\fR,\fP --CAdir " DIR
    -Look for trusted CA's certificates in
    -.I DIR\fR.\fP
    -This option overrides the
    -.B \fR$\fPX509_CERT_DIR
    -environment variable.
    -
    -.TP
    -.B "-d\fR,\fP --debug"
    -Don't run as daemon, print additional diagnostics.
    -
    -.TP
    -.B "-v\fR,\fP --verbose"
    -Print extensive debug output.
    -
    -.TP
    -.BI \-p " NUM" "\fR,\fP --port " NUM
    -Listen on the port
    -.I NUM\fR.\fP
    -
    -.TP
    -.BI \-f " PREFIX" "\fR,\fP --file-prefix " PREFIX
    -.I PREFIX 
    -is a path prefix of the event files.
    -
    -For each job (jobid) a specific file is created that stores all events
    -associated with this job.
    -The job filename is constructed by stripping the
    -protocol+server prefix from the jobid and appending the rest to this
    -.I PREFIX. 
    -
    -.I PREFIX 
    -defaults to /tmp/dglogd.log.
    -
    -The value has to be same as used in the cooperating glite-lb-logd.
    -
    -.TP
    -.BI \-k " FILE" "\fR,\fP --key " FILE
    -Get private key from
    -.I FILE\fR.\fP
    -This option overrides the
    -.B \fR$\fPX509_USER_KEY
    -environment variable.
    -
    -
    -.TP
    -.BI -s " PATH" "\fR,\fP --socket " PATH
    -Send the messages to interlogger through the UNIX socket  
    -.I PATH\fR.\fP
    -
    -The value has to be same as used in the cooperating glite-lb-interlogd.
    -
    -.TP
    -.BI \-i " FILE" "\fR,\fP --pidfile " FILE
    -Store pid into 
    -.I FILE\fR.\fP
    -Defaults to /var/glite/glite-lb-logd.pid.
    -
    -.TP
    -.B "-V\fR,\fP --version"
    -Print version and exit.
    -
    -.TP
    -.B "-h\fR,\fP --help"
    -Print help and exit.
    -
    -.TP
    -.B --noAuth
    -Don't require valid X509 credentials to run the daemon.
    -Used for debugging only.
    -
    -.TP
    -.B --noIPC
    -Don't send messages to interlogger.
    -
    -.TP
    -.B --noParse
    -Don't parse messages for correctness.
    -Dangerous, for debugging only! Don't use at all.
    -
    -
    -.\".SH USAGE
    -.\" Add any additional description here
    -
    -.PP
    -
    -.SH FILES
    -.TP
    -.I /tmp/interlogger.sock
    -Default name of local socket.
    -
    -.TP
    -.I /var/glite/log/dglogd.log*
    -Default location of the event storage files.
    -.TP
    -No configuration files needed.
    -
    -.SH ENVIRONMENT
    -.TP
    -.B X509_USER_KEY
    -If
    -.B \fR$\fPX509_USER_KEY
    -is set, it is used to locate private key file.
    -
    -.TP
    -.B X509_USER_CERT
    -If
    -.B \fR$\fPX509_USER_CERT
    -is set, it is used to locate certificate file.
    -
    -.TP
    -.B X509_CERT_DIR
    -If
    -.B \fR$\fPX509_CERT_DIR
    -is set, it is used to locate the trusted CA's certificates and ca-signing-policy files.
    -
    -.TP
    -.B X509_USER_PROXY
    -If
    -.B \fR$\fPX509USER_PROXY
    -is set, it is used to locate proxy certificate file.
    -
    -
    -.SH SIGNALS
    -.TP
    -.B USR1
    -Increase verbosity of the program.
    -
    -.TP
    -.B USR2
    -Decrease verbosity of the program.
    -
    -
    -.SH REPORTING BUGS
    -Please, report all bugs to EGEE Bug Tracking System located at https://savannah.cern.ch
    -
    -.SH SEE ALSO
    -.B glite-lb-bkserverd\fR(8),\fP glite-lb-interlogd\fR(8),\fP glite-lb-logevent\fR(1),\fP
    -
    -.SH AUTHOR
    -EU EGEE, JRA1.
    diff --git a/org.glite.lb.logger/project/ChangeLog b/org.glite.lb.logger/project/ChangeLog
    deleted file mode 100644
    index 4cd97d7..0000000
    --- a/org.glite.lb.logger/project/ChangeLog
    +++ /dev/null
    @@ -1,87 +0,0 @@
    -1.4.6-1 (lb-1.7.0-1)
    -- let empty notification message get through the output queue to keep
    -  event_store commits in sync
    -- don't keep event queue mutex while sleeping on error
    -
    -1.4.7-1 (lb-1.7.1-1)
    -- support for message expiration
    -
    -1.4.8-1 (lb-1.7.2-1)
    -- support for notification expiration
    -
    -1.4.9-1 (lb-1.7.3-1)
    -- treat zero event expiration time as "never"
    -
    -1.4.9-2 (lb-1.7.4-1)
    -- rebuild wrt. downgraded security 3.1.57-1
    -
    -1.4.9-3 (lb-1.8.0-1)
    -- startup script: use grep with ^ rather than fgrep
    -
    -1.4.10-1
    -- fixed sending empty events
    -- do not syslog "error reading server reply" unnecessarily
    -
    -2.0.0-1
    -- LB 2.0 release
    -
    -2.0.0-2
    -- fixed configure to work in etics
    -
    -2.0.0-3
    -- Fixed typos in the Makefile
    -
    -2.0.0-4
    -- configure script update (globus flavors added to configure call)
    -
    -2.0.1-1
    -- (from 1.4.11-1) Support chconfig in startup scripts (#27055)
    -- (from 1.4.11-1) Proper kill signal handling (#36470)
    -
    -2.0.2-1
    -- implemented multi-file event store, avoiding ever-growing files
    -  in the case of heavy traffic notifications
    -
    -2.0.3-1
    -- Fixed handling messages with destination not set
    -- Additional logging output
    -
    -2.0.4-1
    -- Man page update
    -
    -2.0.4-2
    -- install libraries into $libdir
    -
    -2.0.6-1
    -- Pidfiles support in daemons
    -
    -2.0.7-1
    -- Startup script fixes
    -
    -2.0.8-1
    -- Compatibility with IPv6 compliant clients
    -
    -2.1.0-1
    -- Compliance with the Common Logging Format
    -- Fixed startup script (Savannah Bug #29081)
    -- Addressed memory consumption (Savannah Bug #48164)
    -- Improved portability
    -- IPv6 fixes
    -- SIGHUP handling
    -- Warnings on expected server connection disconnections removed
    -- Database and permission errors from server handled by wait&retry
    -
    -2.1.1-1
    -- Startup script update
    -
    -2.1.2-1
    -- Startup script update: log4c config file name hardcoded to 'log4crc'
    -
    -2.1.3-1
    -- Configuration files moved from /etc to /etc/lb
    -- LCAS logging temporarily disabled
    - 
    -2.1.4-1
    -- Introduce a separate logging category for notification interlogger
    -- Fix problem with dropping unused notoifications
    -
    diff --git a/org.glite.lb.logger/project/build.number b/org.glite.lb.logger/project/build.number
    deleted file mode 100644
    index 6dd2f97..0000000
    --- a/org.glite.lb.logger/project/build.number
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -#Fri Aug 18 12:30:51 CEST 2006
    -module.build=0243
    diff --git a/org.glite.lb.logger/project/build.properties b/org.glite.lb.logger/project/build.properties
    deleted file mode 100644
    index e69de29..0000000
    diff --git a/org.glite.lb.logger/project/configure.properties.xml b/org.glite.lb.logger/project/configure.properties.xml
    deleted file mode 100644
    index 3279d84..0000000
    --- a/org.glite.lb.logger/project/configure.properties.xml
    +++ /dev/null
    @@ -1,65 +0,0 @@
    -
    -
    -
    -	
    -        
    -	                                                                        
    -		
    -			
    -				
    -			
    -			
    -top_srcdir=..
    -builddir=build
    -stagedir=${stage.abs.dir}
    -distdir=${dist.dir}
    -globalprefix=${global.prefix}
    -lbprefix=${subsystem.prefix}
    -package=${module.package.name}
    -PREFIX=${install.dir}
    -version=${module.version}
    -glite_location=${with.glite.location}
    -globus_prefix=${with.globus.prefix}
    -expat_prefix=${with.expat.prefix}
    -cppunit_prefix=${with.cppunit.prefix}
    -thrflavour=${with.globus.thr.flavor}
    -nothrflavour=${with.globus.nothr.flavor}
    -			
    -	    
    -	
    diff --git a/org.glite.lb.logger/project/package.description b/org.glite.lb.logger/project/package.description
    deleted file mode 100644
    index cd0621b..0000000
    --- a/org.glite.lb.logger/project/package.description
    +++ /dev/null
    @@ -1 +0,0 @@
    -glite-lb-logger is the gLite LB local-logger and inter-logger. This package contains the local-logger (glite-lb-logd), inter-logger (glite-lb-interlogd) and notification inter-logger (glite-lb-notif-interlogd) daemons.
    diff --git a/org.glite.lb.logger/project/package.summary b/org.glite.lb.logger/project/package.summary
    deleted file mode 100644
    index 089b630..0000000
    --- a/org.glite.lb.logger/project/package.summary
    +++ /dev/null
    @@ -1 +0,0 @@
    -gLite Logging and Bookkeeping local-logger and inter-logger
    diff --git a/org.glite.lb.logger/project/properties.xml b/org.glite.lb.logger/project/properties.xml
    deleted file mode 100755
    index 44827cf..0000000
    --- a/org.glite.lb.logger/project/properties.xml
    +++ /dev/null
    @@ -1,59 +0,0 @@
    -
    -
    -
    -
    -
    -	
    -		
    -
    -	
    -
    -	
    -	
    -		
    -	
    -	
    -
    -	
    -		 		
    -	
    -	
    -			
    -	
    -	
    -	
    -						
    -	
    -		 
    -		 						
    -
    diff --git a/org.glite.lb.logger/project/tar_exclude b/org.glite.lb.logger/project/tar_exclude
    deleted file mode 100644
    index e1fcd1a..0000000
    --- a/org.glite.lb.logger/project/tar_exclude
    +++ /dev/null
    @@ -1,10 +0,0 @@
    -tar_exclude
    -CVS
    -build.xml
    -build
    -build.properties
    -properties.xml
    -configure.properties.xml
    -.cvsignore
    -.project
    -.cdtproject
    diff --git a/org.glite.lb.logger/project/version.properties b/org.glite.lb.logger/project/version.properties
    deleted file mode 100644
    index 6e8c734..0000000
    --- a/org.glite.lb.logger/project/version.properties
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -# $Header$
    -module.version=2.1.4
    -module.age=1
    diff --git a/org.glite.lb.logger/src-nt/Connection.H b/org.glite.lb.logger/src-nt/Connection.H
    deleted file mode 100644
    index 0690174..0000000
    --- a/org.glite.lb.logger/src-nt/Connection.H
    +++ /dev/null
    @@ -1,51 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef _CONNECTION_H
    -#define _CONNECTION_H
    -
    -
    -class Connection {
    -public:
    -	class Factory {
    -	public:
    -		virtual Connection *newConnection(int fd) const = 0;
    -		virtual Connection *accept(int fd) const = 0;
    -
    -		virtual ~Factory() {}
    -	};
    -
    -	class Endpoint {
    -	};
    -
    -	Connection(int a_fd) : fd(a_fd)
    -		{}
    -
    -	virtual ~Connection() 
    -		{}
    -
    -	virtual int getFD() const 
    -		{ return fd; }
    -
    -	virtual int read(char *buf, unsigned int len) = 0;
    -	virtual int write(char *buf, unsigned int len) = 0;
    -
    -protected:
    -	int fd;
    -};
    -
    -#endif
    diff --git a/org.glite.lb.logger/src-nt/Connection.cpp b/org.glite.lb.logger/src-nt/Connection.cpp
    deleted file mode 100644
    index 2d0938d..0000000
    --- a/org.glite.lb.logger/src-nt/Connection.cpp
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include "Connection.H"
    -
    -Connection::Factory::~Factory() {
    -}
    diff --git a/org.glite.lb.logger/src-nt/EventManager.H b/org.glite.lb.logger/src-nt/EventManager.H
    deleted file mode 100644
    index 840343b..0000000
    --- a/org.glite.lb.logger/src-nt/EventManager.H
    +++ /dev/null
    @@ -1,109 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef _EVENT_MANAGER_H
    -#define _EVENT_MANAGER_H
    -
    -#include 
    -
    -
    -// interface
    -
    -/**
    - * Base class of event hierarchy.
    - */
    -class Event {
    -public:
    -    virtual ~Event() {}
    -};
    -
    -
    -/**
    - * Base class for event handler address.
    - */
    -class EventHandler {
    -public:
    -    // constants for event handler return codes
    -    static const int NOT_HANDLED = 0;
    -    static const int HANDLED = 1;
    -    static const int HANDLED_FINAL = 2;
    -    static const int HANDLED_NEW = 3;
    -
    -    virtual int handleEvent(Event* &e) { return NOT_HANDLED; }
    -    virtual ~EventHandler() {}
    -};
    -
    -
    -/**
    - * Holds addres of event handler, ie. pointer to member function of T 
    - * that takes E* & as an argument.
    - */
    -template
    -class TypedEventHandler: public EventHandler {
    -public:
    -    typedef int (T::*handlerType)(E* &);
    -    
    -    TypedEventHandler(T *handler, handlerType method) 
    -	: m_handler(handler), m_handleEvent(method) {
    -    }
    -
    -    virtual int handleEvent(Event* &e) {
    -	E *ne = dynamic_cast(e);
    -	int result = EventHandler::NOT_HANDLED;
    -	if(ne) {
    -	    result = (m_handler->*m_handleEvent)(ne);
    -	    if((result == EventHandler::HANDLED_NEW) && 
    -	       !(ne == e)) {
    -		delete e;
    -		e = ne;
    -	    }
    -	}
    -	return result;
    -    }
    -    
    -private:
    -    T *m_handler;
    -    handlerType m_handleEvent;
    -};
    -
    -
    -class EventManager {
    -public:
    -    
    -    int postEvent(Event* &event);
    -    
    -    template
    -    EventHandler& registerHandler(T *handler, int (T::*method)(E* &)) {
    -	EventHandler *h = new TypedEventHandler(handler, method);
    -	addHandler(h);
    -	return *h;
    -    }
    -    
    -    template
    -    EventHandler& registerHandler(T *handler) {
    -	return registerHandler(handler, &T::handleEvent);
    -    }
    -
    -private:
    -    std::list handlers;
    -
    -    void addHandler(EventHandler*);
    -    void removeHandler(EventHandler *);
    -};
    -
    -
    -#endif
    diff --git a/org.glite.lb.logger/src-nt/EventManager.cpp b/org.glite.lb.logger/src-nt/EventManager.cpp
    deleted file mode 100644
    index 16b577b..0000000
    --- a/org.glite.lb.logger/src-nt/EventManager.cpp
    +++ /dev/null
    @@ -1,40 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include "EventManager.H"
    -
    -int
    -EventManager::postEvent(Event* &e)
    -{
    -  for(std::list::iterator i = handlers.begin();
    -      i != handlers.end();
    -      i++) {
    -    (*i)->handleEvent(e);
    -  }
    -  return 0;
    -}
    -
    -void
    -EventManager::addHandler(EventHandler *handler)
    -{
    -  handlers.push_back(handler);
    -}
    -
    -void
    -EventManager::removeHandler(EventHandler *handler)
    -{
    -}
    diff --git a/org.glite.lb.logger/src-nt/Exception.H b/org.glite.lb.logger/src-nt/Exception.H
    deleted file mode 100644
    index 678e258..0000000
    --- a/org.glite.lb.logger/src-nt/Exception.H
    +++ /dev/null
    @@ -1,30 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef _EXCEPTION_H
    -#define _EXCEPTION_H
    -
    -class Exception {
    -};
    -
    -class FatalException {
    -};
    -
    -
    -#define E_ASSERT(a) if(!(a)) { throw new FatalException; }
    -
    -#endif
    diff --git a/org.glite.lb.logger/src-nt/HTTPTransport.H b/org.glite.lb.logger/src-nt/HTTPTransport.H
    deleted file mode 100644
    index f56d50e..0000000
    --- a/org.glite.lb.logger/src-nt/HTTPTransport.H
    +++ /dev/null
    @@ -1,71 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef _HTTP_TRANSPORT_H
    -#define _HTTP_TRANSPORT_H
    -
    -#include "ThreadPool.H"
    -#include "Transport.H"
    -#include "Singleton.H"
    -
    -#include 
    -
    -class HTTPTransport: 
    -	public Transport
    -{
    -public:
    -
    -	// factory class
    -	class Factory: public Transport::Factory, 
    -		       public Singleton  {
    -	public:
    -		virtual Transport *newTransport() const {
    -			return(new HTTPTransport());
    -		}
    -	};
    -
    -	HTTPTransport() 
    -		: Transport(),
    -		  state(NONE),
    -		  request(), headers(), body(NULL), pos(NULL),
    -		  content_length(0)
    -		{}
    -
    -	virtual ~HTTPTransport();
    -
    -	virtual int receive(Connection *conn, Message* &msg);
    -	virtual int send(Connection *conn, Message* msg);
    -	virtual void reset();
    -
    -private:
    -	enum { NONE, 
    -	       IN_REQUEST,
    -	       IN_HEADERS,
    -	       IN_BODY } state;
    -	std::string request;
    -	std::string headers;
    -	char *body;
    -	char buffer[256];
    -	char *pos;
    -	unsigned int content_length;
    -
    -	int parseHeader(const char *s, unsigned int len);
    -	void serializeHeaders(Message *msg);
    -};
    -
    -
    -#endif
    diff --git a/org.glite.lb.logger/src-nt/HTTPTransport.cpp b/org.glite.lb.logger/src-nt/HTTPTransport.cpp
    deleted file mode 100644
    index ca3d378..0000000
    --- a/org.glite.lb.logger/src-nt/HTTPTransport.cpp
    +++ /dev/null
    @@ -1,272 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include "HTTPTransport.H"
    -#include "Exception.H"
    -#include "EventManager.H"
    -
    -#include 
    -#include 
    -
    -
    -HTTPTransport::~HTTPTransport()
    -{
    -	if(body) free(body);
    -}
    -
    -
    -// read what is available and parse what can be parsed
    -// returns the result of read operation of the underlying connection,
    -// ie. the number of bytes read or error code
    -int
    -HTTPTransport::receive(Connection *conn, Message* &msg)
    -{
    -	int len;
    -
    -	switch(state) {
    -	case NONE:
    -		state = IN_REQUEST;
    -		pos = buffer;
    -
    -	case IN_REQUEST:
    -	case IN_HEADERS:
    -		len = conn->read(pos, sizeof(buffer) - (pos - buffer));
    -		if(len < 0) {
    -			// error during request
    -			// state = NONE;
    -			return len;
    -		} else if(len == 0) {
    -			// other side closed connection
    -			// state = NONE;
    -			return len;
    -		} else {
    -			char *cr = NULL, *p = buffer, *s = buffer;
    -			bool crlf_seen = false;
    -
    -			// parse buffer, look for CRLFs
    -			//   s - start scan position
    -			//   p - start of current token
    -			//   cr - current CRLF position
    -			//   crlf_seen <=> previous block ends with CRLF
    -			while((state != IN_BODY) &&
    -			      (s < buffer + len) && 
    -			      (cr = (char*)memchr(s, '\r', len - (s - buffer)))) {
    -				if((cr < buffer + len - 1) && 
    -				   (cr[1] == '\n')) {
    -					// found CRLF
    -					if(state == IN_REQUEST) {
    -						// found end of request
    -						request.append(p, cr - p);
    -						// change state
    -						state = IN_HEADERS;
    -						// start new tokens
    -						p = cr + 2;
    -					} else {
    -						// headers continue. parse the current one
    -						*cr = 0;
    -						parseHeader(s, cr - s);
    -						*cr = '\r';
    -					}
    -					if(crlf_seen && (s == cr)) {
    -						// found CRLFCRLF
    -						state = IN_BODY;
    -					} 
    -					// next scan starts after CRLF
    -					s = cr + 2; 
    -					// we have seen CRLF
    -					crlf_seen = true;
    -				} else {
    -					if(crlf_seen && (s == cr)) {
    -						if(cr < buffer + len - 1) {
    -							// found CRLFCRx
    -							// continue scan behind this
    -							s = cr + 2;
    -						} else {
    -							// found CRLFCR at the end of buffer
    -							// s points behind buffer => scan ends
    -							s = cr + 1;
    -							// cr points at the CRLFCR => it will be left for next pass
    -							cr = cr - 2;
    -						}
    -					} else {
    -						// single '\r'  - skip it, 
    -						// or '\r' at the end of buffer - skip it, that ends scanning
    -						s = cr + 1;
    -					}	
    -					crlf_seen = false;
    -				}
    -			}
    -			// copy the current token into appropriate variable,
    -			// but leave the trailing \r[\n] in buffer
    -			if(!cr) cr = buffer + len;
    -			if(state == IN_REQUEST) 
    -				request.append(p, cr - p);
    -			else 
    -				headers.append(p, cr - p);
    -			if(state == IN_BODY) {
    -				// we found body
    -				// content-length should be set at the moment
    -				if(content_length > 0) {
    -					body = (char*)malloc(content_length);
    -					if(body == NULL) {
    -						// chyba alokace
    -					}
    -					// move rest of buffer to body
    -					if(s < buffer + len) {
    -						memmove(body, s, buffer + len - s);
    -						pos = body + (buffer + len - s);
    -					} else {
    -						pos = body;
    -					}
    -				} else {
    -					// report error
    -					// XXX - this may happen, do not handle using exceptions
    -					std::cout << "Wrong content length" << std::endl;
    -					throw new Exception();
    -				}
    -			} else {
    -				// move the trailing characters to the front
    -				if(cr < buffer + len) 
    -					memmove(buffer, cr, buffer + len - cr);
    -				// and set pos to point at the first free place
    -				pos = buffer + (buffer + len - cr);
    -			}
    -		}
    -		break;
    -
    -	case IN_BODY:
    -		len = conn->read(pos, content_length - (pos - body));
    -		if(len < 0) {
    -			// error reading
    -			// state = NONE;
    -			return len;
    -		} else if(len == 0) {
    -			// no more data
    -			// state = NONE;
    -			return len;
    -		} else {
    -			pos += len;
    -			if(pos == content_length + body) {
    -				// finished reading
    -				state = NONE;
    -			}
    -		}
    -		break;
    -	}
    -
    -	if(state != NONE) 
    -		msg = NULL;
    -	else {
    -		// we have a new message
    -		// XXX - or we have an error, must handle it
    -		msg = new Message(body, content_length);
    -		msg->setProperties(
    -	}
    -	return len;
    -}
    -
    -
    -int
    -HTTPTransport::parseHeader(const char *s, unsigned int len)
    -{
    -	char *p;
    -
    -	p = (char*)memccpy((void*)s, (void*)s, ':', len);
    -	
    -	if(!strncasecmp(s, "Content-Length", 14)) {
    -		content_length = p ? atoi(p) : 0 ;
    -	}
    -	return(0);
    -}
    -
    -
    -int
    -HTTPTransport::send(Connection *conn, Message* msg)
    -{
    -	int len;
    -	switch(state) {
    -	case NONE:
    -		state = IN_REQUEST;
    -		request = "POST " + msg->path() + "HTTP/1.1\r\n";
    -		pos = request.c_str();
    -		content_length = msg->getContent(body);
    -
    -	case IN_REQUEST:
    -		len = conn->send(pos, request.length() - pos + request.c_str());
    -		if(len < 0) {
    -			return len;
    -		}
    -		pos += len;
    -		if(request.c_str() + request.length() == pos) {
    -			state = IN_HEADERS;
    -			prepareHeaders(msg);
    -			pos = headers.c_str();
    -		} else {
    -			break;
    -		}
    -
    -	case IN_HEADERS:
    -		len = conn->send(pos, headers.length() - pos + headers.c_str());
    -		if(len < 0) {
    -			return len;
    -		}
    -		pos += len;
    -		if(headers.c_str() + headers.length() == pos) {
    -			state = IN_BODY;
    -			pos = body;
    -		} else {
    -			break;
    -		}
    -
    -	case IN_BODY:
    -		len = conn->send(pos, body, content_length - pos + body);
    -		if(len < 0) {
    -			return len;
    -		}
    -		pos += len;
    -		if(body + content_length == pos) {
    -			state = NONE;
    -			return 0;
    -		}
    -		break;
    -		
    -	default:
    -	}
    -	return len;
    -}
    -
    -
    -void 
    -HTTPTransport::reset()
    -{
    -	state = NONE;
    -	request.clear();
    -	headers.clear();
    -	if(body) {
    -		free(body);
    -		body = NULL;
    -	}
    -	content_length = 0;
    -	pos = buffer;
    -}
    -	
    -
    -void
    -HTTPTransport::serializeHeaders(Message *msg);
    -{
    -	for(Properties::iterator i = msg->
    -}
    diff --git a/org.glite.lb.logger/src-nt/InputChannel.H b/org.glite.lb.logger/src-nt/InputChannel.H
    deleted file mode 100644
    index 5f6434f..0000000
    --- a/org.glite.lb.logger/src-nt/InputChannel.H
    +++ /dev/null
    @@ -1,46 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef _INPUT_CHANNEL_H_
    -#define _INPUT_CHANNEL_H_
    -
    -#include "ThreadPool.H"
    -#include "Connection.H"
    -#include "Transport.H"
    -
    -class InputChannel 
    -	: public ThreadPool::WorkDescription {
    -public:
    -	
    -	InputChannel(Connection *conn, Transport *trans)
    -		:  ThreadPool::WorkDescription(conn->getFD()),
    -		   m_connection(conn), m_transport(trans)
    -		{}
    -
    -	void start();
    -
    -protected:
    -	virtual void onReady();
    -	virtual void onTimeout();
    -	virtual void onError();
    -
    -private:
    -	Connection *m_connection;
    -	Transport  *m_transport;
    -};
    -
    -#endif
    diff --git a/org.glite.lb.logger/src-nt/InputChannel.cpp b/org.glite.lb.logger/src-nt/InputChannel.cpp
    deleted file mode 100644
    index 99d5999..0000000
    --- a/org.glite.lb.logger/src-nt/InputChannel.cpp
    +++ /dev/null
    @@ -1,54 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include "InputChannel.H"
    -#include "ThreadPool.H"
    -#include "EventManager.H"
    -
    -extern EventManager theEventManager;
    -
    -void
    -InputChannel::start()
    -{
    -	ThreadPool::instance()->queueWorkRead(this);
    -}
    -
    -void
    -InputChannel::onReady()
    -{
    -	Transport::Message *msg = NULL;
    -	int ret = m_transport->receive(m_connection, msg);
    -	if(ret <= 0) {
    -		// no new data read
    -	} else if(msg) {
    -		// we have a new message
    -		
    -	} else {
    -		// still need more data
    -		ThreadPool::instance()->queueWorkRead(this);
    -	}
    -}
    -
    -void
    -InputChannel::onTimeout()
    -{
    -}
    -
    -void
    -InputChannel::onError()
    -{
    -}
    diff --git a/org.glite.lb.logger/src-nt/Makefile b/org.glite.lb.logger/src-nt/Makefile
    deleted file mode 100644
    index 8ebe707..0000000
    --- a/org.glite.lb.logger/src-nt/Makefile
    +++ /dev/null
    @@ -1,51 +0,0 @@
    -
    -CXX = c++
    -CC = gcc
    -
    -CFLAGS = -g -Wall
    -
    -COMPILEPP = $(CXX) $(CXXFLAGS) $(CFLAGS)
    -COMPILE = $(CC) $(CFLAGS)
    -LINK = libtool --mode=link g++ $(LDFLAGS)
    -
    -THREAD_LIB = -lpthread
    -
    -CPPUNIT_ROOT = 
    -CPPUNIT_LIB = -lcppunit -ldl
    -CPPUNIT_INCLUDE = 
    -
    -TEST_OBJS= \
    -	test/ThreadPoolTest.o \
    -	test/PluginManagerTest.o \
    -	test/EventManagerTest.o \
    -	test/SingletonTest.o \
    -	test/test_main.o
    -
    -OBJS = \
    -	PluginManager.o \
    -	SocketInput.o \
    -	Connection.o \
    -	PlainConnection.o \
    -	Transport.o \
    -	HTTPTransport.o \
    -	ThreadPool.o \
    -	EventManager.o \
    -	InputChannel.cpp 
    -
    -plain: main.o $(OBJS)
    -	$(LINK) -o $@ $+ $(THREAD_LIB)
    -
    -utest: ThreadPool.o PluginManager.o EventManager.o $(TEST_OBJS)
    -	$(LINK) -o $@ $+ $(CPPUNIT_LIB) $(THREAD_LIB)
    -
    -stest: EventManager.o test/EventManagerTest.o test/test_main.o
    -	$(LINK) -o $@ $+ $(CPPUNIT_LIB) $(THREAD_LIB)
    -
    -$(TEST_OBJS): %.o: %.cpp
    -	$(COMPILEPP) -I. $(CPPUNIT_INCLUDE) -o $@ -c $<
    -
    -%.o: %.cpp
    -	$(COMPILEPP) -o $@ -c $<
    -
    -%.o: %.c
    -	$(COMPILE) -o $@ -c $<
    \ No newline at end of file
    diff --git a/org.glite.lb.logger/src-nt/Message.H b/org.glite.lb.logger/src-nt/Message.H
    deleted file mode 100644
    index 9f6fcc4..0000000
    --- a/org.glite.lb.logger/src-nt/Message.H
    +++ /dev/null
    @@ -1,83 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef _MESSAGE_H_
    -#define _MESSAGE_H
    -
    -#include "Properties.H"
    -#include "MessageStore.H"
    -
    -#include 
    -
    -class Message: public MessageStore::Storable {
    -public:
    -	
    -	/** class that holds message state
    -	 *
    -	 */
    -	class State : public MessageStore::Storable {
    -	public:
    -
    -		/** Get size needed for storage (from Storable).
    -		 */
    -		virtual int getStorageSize() const;
    -
    -		/** Save State (from Storable)
    -		 */
    -		virtual int save(void* data, int len) const;
    -
    -		/** Load State (from Storable)
    -		 */
    -		virtual int load(void* data, int len);
    -	};
    -
    -
    -	Message();
    -
    -	Message(void * data, unsigned int length) 
    -		: m_length(length), 
    -		  m_data(data)
    -		{}
    -
    -
    -	int getContent(void* &data) const
    -		{ data = m_data; return m_length; }
    -
    -	int getContentLength() const 
    -		{ return m_length; }
    -
    -	std::string getProperty(const std::string &name, std::string &val)
    -		{ return m_properties.getProperty(name); }
    -	
    -	void setProperty(const std::string &name, std::string &val) 
    -		{ m_properties.setProperty(name, val); }
    -	
    -	Properties& getProperties() 
    -		{ return m_properties; }
    -	
    -	void setProperties(Properties &)
    -		{}
    -
    -private:
    -	MessageStore::ID        m_id;
    -	unsigned int            m_length;
    -	void *                  m_data;
    -	Properties              m_properties;
    -};
    -
    -
    -#endif
    diff --git a/org.glite.lb.logger/src-nt/MessageStore.H b/org.glite.lb.logger/src-nt/MessageStore.H
    deleted file mode 100644
    index 7e47718..0000000
    --- a/org.glite.lb.logger/src-nt/MessageStore.H
    +++ /dev/null
    @@ -1,101 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef _MESSAGE_STORE_H_
    -#define _MESSAGE_STORE_H_
    -
    -#include 
    -
    -/** Permanent storage for messages and their states.
    - */
    -
    -class MessageStore {
    -public:
    -
    -	/** Base class for everything that can be stored here.
    -	 */
    -	class Storable {
    -	public:
    -		/** Get size needed for object storage.
    -		 */
    -		virtual int getStorageSize() const = 0;
    -		
    -		/** Save state of object into binary data.
    -		 */
    -		virtual int save(void* data, int len) const = 0;
    -
    -		/** Load state of object from binary data.
    -		 */
    -		virtual int load(void* data, int len) = 0;
    -
    -		virtual ~Storable() {}
    -	};
    -
    -
    -	/** Class that uniquely identifies stored content.
    -	 */
    -	class ID: public Storable {
    -	public:
    -		/** Default constructor.
    -		 *
    -		 * Creates new unique ID.
    -		 */
    -		ID();
    -
    -		/** Copy constructor.
    -		 */
    -		ID(const ID& src);
    -
    -		/** Destructor.
    -		 */
    -		~ID() {};
    -
    -		/** Assignment operator.
    -		 */
    -		ID& operator=(const ID& src);
    -
    -		/** Return the string suitable for printing.
    -		 */
    -		std::string toString() const;
    -
    -		/** Comparison operator
    -		 */
    -		int operator==(const ID& second);
    -
    -		/** Get size needed for storage (from Storable).
    -		 */
    -		virtual int getStorageSize() const;
    -
    -		/** Save ID (from Storable)
    -		 */
    -		virtual int save(void* data, int len) const;
    -
    -		/** Load ID (from Storable)
    -		 */
    -		virtual int load(void* data, int len);
    -
    -	protected:
    -		unsigned long long getID() {return id;}
    -
    -	private:
    -		static pthread_mutex_t counterLock;
    -		static unsigned counter;
    -		unsigned long long id;
    -	};
    -};
    -
    -#endif
    diff --git a/org.glite.lb.logger/src-nt/MessageStore.cpp b/org.glite.lb.logger/src-nt/MessageStore.cpp
    deleted file mode 100644
    index e90fa44..0000000
    --- a/org.glite.lb.logger/src-nt/MessageStore.cpp
    +++ /dev/null
    @@ -1,41 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    -#include 
    -#include 
    -
    -#include "MessageStore.H"
    -
    -pthread_mutex_t MessageStore::ID::counterLock = PTHREAD_MUTEX_INITIALIZER;
    -unsigned MessageStore::ID::counter = 0;
    -
    -MessageStore::ID::ID(){
    -	time_t t;
    -	time(&t);
    -	pthread_mutex_lock(&counterLock);
    -	counter++;
    -	id = ((unsigned long long) counter << 32) + t;
    -	pthread_mutex_unlock(&counterLock);
    -}
    -
    -std::string MessageStore::ID::toString() const{
    -	std::ostringstream oss;
    -	oss << id;
    -	return oss.str();
    -}
    -
    diff --git a/org.glite.lb.logger/src-nt/PlainConnection.H b/org.glite.lb.logger/src-nt/PlainConnection.H
    deleted file mode 100644
    index 63fba33..0000000
    --- a/org.glite.lb.logger/src-nt/PlainConnection.H
    +++ /dev/null
    @@ -1,51 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef _PLAIN_CONNECTION_H
    -#define _PLAIN_CONNECTION_H
    -
    -#include "Connection.H"
    -#include "Singleton.H"
    -
    -class PlainConnection: 
    -	public Connection
    -{
    -public:
    -	class Factory: public Connection::Factory, 
    -		       public Singleton {
    -	public:
    - 		virtual Connection *newConnection(int fd) const {
    -			return new PlainConnection(fd);
    -		}
    -
    -		virtual Connection *accept(int fd) const;
    -
    -		virtual ~Factory() {}
    -	};
    -
    -	PlainConnection(int a_fd): Connection(a_fd)
    -		{}
    -
    -	virtual ~PlainConnection();
    -
    -	// from Connection
    -	virtual int read(char *buf, unsigned int len);
    -	virtual int write(char *buf, unsigned int len);
    -
    -};
    -
    -#endif
    diff --git a/org.glite.lb.logger/src-nt/PlainConnection.cpp b/org.glite.lb.logger/src-nt/PlainConnection.cpp
    deleted file mode 100644
    index 79fe74b..0000000
    --- a/org.glite.lb.logger/src-nt/PlainConnection.cpp
    +++ /dev/null
    @@ -1,56 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include "PlainConnection.H"
    -#include "ThreadPool.H"
    -
    -#include 
    -#include 
    -
    -PlainConnection::~PlainConnection()
    -{
    -}
    -
    -
    -Connection *
    -PlainConnection::Factory::accept(int fd) const
    -{
    -	int nfd;
    -
    -	nfd = ::accept(fd, NULL, NULL);
    -	return newConnection(nfd);
    -}
    -
    -
    -int
    -PlainConnection::read(char *buf, unsigned int len)
    -{
    -	int ret;
    -
    -	ret = ::recv(fd, buf, len, MSG_NOSIGNAL);
    -	return ret;
    -}
    -
    -
    -int 
    -PlainConnection::write(char *buf, unsigned int len)
    -{
    -	int ret;
    -
    -	ret = ::write(fd, buf, len);
    -	return ret;
    -}
    diff --git a/org.glite.lb.logger/src-nt/PluginManager.H b/org.glite.lb.logger/src-nt/PluginManager.H
    deleted file mode 100644
    index 98c0a52..0000000
    --- a/org.glite.lb.logger/src-nt/PluginManager.H
    +++ /dev/null
    @@ -1,86 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef _PLUGIN_MANAGER_H
    -#define _PLUGIN_MANAGER_H
    -
    -#include 
    -#include 
    -
    -#include "Singleton.H"
    -
    -class PluginManager: public Singleton {
    -	friend class Singleton;
    -public:
    -	
    -	// base class for plugins
    -	class Plugin {
    -	public:
    -		const char *name;
    -
    -		Plugin(const char *aname) : name(aname) { 
    -			PluginManager::instance()->registerPlugin(this, aname); 
    -		}
    -
    -		virtual bool initialize() = 0;
    -		virtual bool cleanup () = 0;
    -
    -		virtual ~Plugin();
    -	};
    -
    -	// add plugin with given name to the list of registered plugins
    -	void registerPlugin(Plugin *plugin, const char *name) { 
    -		pluginList.push_front(plugin);
    -	}
    -
    -	// remove plugin from the list
    -	void removePlugin();
    -
    -	// initialize all plugins on list
    -	void initialize() {
    -		for(std::list::iterator i = pluginList.begin();
    -		    i != pluginList.end();
    -		    i++) {
    -			(*i)->initialize();
    -		}
    -		
    -	}
    -
    -	// cleanup all plugins on list
    -	void cleanup() {
    -		for(std::list::iterator i = pluginList.begin();
    -		    i != pluginList.end();
    -		    i++) {
    -			(*i)->cleanup();
    -		}
    -		
    -	}
    -		
    -
    -protected:
    -	//  default constructor
    -	PluginManager() : pluginList()
    -		{};
    -
    -private:
    -	// list of registered plugins
    -	std::list pluginList;
    -
    -};
    -
    -
    -#endif
    diff --git a/org.glite.lb.logger/src-nt/PluginManager.cpp b/org.glite.lb.logger/src-nt/PluginManager.cpp
    deleted file mode 100644
    index e294d61..0000000
    --- a/org.glite.lb.logger/src-nt/PluginManager.cpp
    +++ /dev/null
    @@ -1,23 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include "PluginManager.H"
    -
    -PluginManager::Plugin::~Plugin() {
    -}
    -
    -
    diff --git a/org.glite.lb.logger/src-nt/Properties.H b/org.glite.lb.logger/src-nt/Properties.H
    deleted file mode 100644
    index 662b636..0000000
    --- a/org.glite.lb.logger/src-nt/Properties.H
    +++ /dev/null
    @@ -1,53 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef _PROPERTIES_H_
    -#define _PROPERTIES_H_
    -
    -#include 
    -#include 
    -
    -class Properties {
    -public:
    -
    -	// default constructor
    -	Properties() 
    -		: properties()
    -		{}
    -
    -	// accessors
    -	std::string& getProperty(const std::string &key) 
    -		{ return properties[key]; }
    -
    -	void setProperty(const std::string &key, std::string &val) 
    -		{ properties[key] = val; }
    -
    -	// iterators
    -	typedef std::map::iterator  iterator;
    -
    -	iterator begin() 
    -		{ return properties.begin(); }
    -
    -	iterator end()
    -		{ return properties.end(); }
    -
    -	
    -private:
    -	std::map properties;
    -};
    -
    -#endif
    diff --git a/org.glite.lb.logger/src-nt/Singleton.H b/org.glite.lb.logger/src-nt/Singleton.H
    deleted file mode 100644
    index 1dccd07..0000000
    --- a/org.glite.lb.logger/src-nt/Singleton.H
    +++ /dev/null
    @@ -1,56 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef _SINGLETON_H
    -#define _SINGLETON_H
    -
    -#include 
    -
    -#include "Exception.H"
    -
    -template 
    -class Singleton {
    -public:
    -	// obtain the singleton object
    -	static T* instance() {
    -		// XXX - is this really thread safe?
    -		static pthread_mutex_t instance_lock = PTHREAD_MUTEX_INITIALIZER;
    -
    -		pthread_mutex_lock(&instance_lock);
    -		if(theInstance == NULL) {
    -			theInstance = new T;
    -		}
    -		pthread_mutex_unlock(&instance_lock);
    -		return(theInstance);
    -	}
    -
    -protected:
    -	// prevent other's from messing with the instance
    -	Singleton()  {}
    -	Singleton(const Singleton &) {}
    -	Singleton& operator=(const Singleton &) {}
    -	~Singleton() {}
    -	
    -private:
    -	static T *theInstance;
    -};
    -
    -template
    -T *Singleton::theInstance = NULL;
    -
    -
    -#endif
    diff --git a/org.glite.lb.logger/src-nt/SocketInput.H b/org.glite.lb.logger/src-nt/SocketInput.H
    deleted file mode 100644
    index db84f9b..0000000
    --- a/org.glite.lb.logger/src-nt/SocketInput.H
    +++ /dev/null
    @@ -1,49 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef _SOCKET_INPUT_H
    -#define _SOCKET_INPUT_H
    -
    -#include "ThreadPool.H"
    -#include "Connection.H"
    -#include "Transport.H"
    -
    -#include "sys/un.h"
    -
    -
    -class SocketInput: public ThreadPool::WorkDescription
    -{
    -public:
    -	SocketInput(const char *path, 
    -		    const Connection::Factory *a_cfactory,
    -		    const Transport::Factory *a_tfactory);
    -	virtual ~SocketInput();
    -
    -	// from WorkDescription
    -	virtual void onReady();
    -	virtual void onTimeout();
    -	virtual void onError();
    -
    -private:
    -	static const int SOCK_QUEUE_MAX = 5;
    -
    -	struct sockaddr_un saddr;
    -	const Connection::Factory *cFactory;
    -	const Transport::Factory *tFactory;
    -};
    -
    -#endif
    diff --git a/org.glite.lb.logger/src-nt/SocketInput.cpp b/org.glite.lb.logger/src-nt/SocketInput.cpp
    deleted file mode 100644
    index e8fc966..0000000
    --- a/org.glite.lb.logger/src-nt/SocketInput.cpp
    +++ /dev/null
    @@ -1,88 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "ThreadPool.H"
    -#include "SocketInput.H"
    -#include "InputChannel.H"
    -#include "Exception.H"
    -
    -
    -// create unix domain socket for input
    -SocketInput::SocketInput(const char *path, 
    -			 const Connection::Factory *a_cfactory,
    -			 const Transport::Factory *a_tfactory)
    -	: ThreadPool::WorkDescription(0),
    -	  cFactory(a_cfactory),
    -	  tFactory(a_tfactory)
    -{
    -	memset(&saddr, 0, sizeof(saddr));
    -	saddr.sun_family = AF_UNIX;
    -	strcpy(saddr.sun_path, path);
    -	fd = socket(PF_UNIX, SOCK_STREAM, 0);
    -	if(fd < 0) throw new Exception;
    -	if(connect(fd, (struct sockaddr*)&saddr, sizeof(saddr.sun_path)) < 0) {
    -		if(errno == ECONNREFUSED) {
    -			unlink(saddr.sun_path);
    -		}
    -	} else {
    -		// another instance running
    -		// throw new Exception
    -	}
    -	if(bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) 
    -		throw new Exception;
    -	if(listen(fd, SOCK_QUEUE_MAX) < 0)
    -		throw new Exception;
    -}
    -
    -
    -// remove the socket
    -SocketInput::~SocketInput()
    -{
    -	if(fd >= 0)
    -		close(fd);
    -	unlink(saddr.sun_path);
    -}
    -
    -
    -void
    -SocketInput::onReady()
    -{
    -	Connection *conn = cFactory->accept(fd);
    -	Transport  *trans = tFactory->newTransport();
    -	InputChannel *channel = new InputChannel(conn, trans);
    -	channel->start();
    -}
    -
    -
    -void
    -SocketInput::onTimeout()
    -{
    -	// nothing special, just sit around
    -}
    -
    -
    -void
    -SocketInput::onError()
    -{
    -	// should report an error?
    -}
    diff --git a/org.glite.lb.logger/src-nt/ThreadPool.H b/org.glite.lb.logger/src-nt/ThreadPool.H
    deleted file mode 100644
    index 8e26927..0000000
    --- a/org.glite.lb.logger/src-nt/ThreadPool.H
    +++ /dev/null
    @@ -1,134 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef _THREAD_POOL_H
    -#define _THREAD_POOL_H
    -
    -#include 
    -#include 
    -#include 
    -
    -#include 
    -
    -#include "Singleton.H"
    -
    -class ThreadPool : public Singleton {
    -	friend class Singleton;
    -public:
    -	const static int default_timeout = 5;
    -
    -	class WorkDescription {
    -		friend class ThreadPool;
    -	public:
    -		int fd;
    -		
    -		WorkDescription(int afd) 
    -			: fd(afd), event(NONE) {}
    -
    -
    -		virtual ~WorkDescription();
    -
    -	protected:
    -		enum Event { NONE, READY, TIMEOUT, ERROR } event;
    -		void doWork();
    -
    -		virtual void onReady() 
    -			{}
    -
    -		virtual void onTimeout() 
    -			{}
    -
    -		virtual void onError() 
    -			{}
    -	};
    -
    -public:
    -	void startWorkers(unsigned int n);
    -	void stopWorkers();
    -
    -	void postWork(WorkDescription *work_unit);
    -
    -	void queueWorkAccept(WorkDescription *work_unit);
    -	void queueWorkRead(WorkDescription *work_unit);
    -	void queueWorkWrite(WorkDescription *work_unit);
    -	void queueWorkTimeout(WorkDescription *work_unit);
    -	void queueWorkConnect(WorkDescription *work_unit);
    -
    -	void setWorkAccept(WorkDescription *work_unit);
    -	void setWorkRead(WorkDescription *work_unit);
    -	void setWorkWrite(WorkDescription *work_unit);
    -	void setWorkTimeout(WorkDescription *work_unit);
    -
    -	void run();
    -	void exit() 
    -		{ f_exit = true; pthread_cond_signal(&wait_queue_cond_ready); }
    -
    -protected:
    -	ThreadPool();
    -	~ThreadPool();
    -
    -	WorkDescription *getWork();
    -
    -private:
    -	class WaitDesc {
    -	public:
    -		WorkDescription *wd;
    -		short event;
    -		bool f_permanent;
    -		struct timeval timeout;
    -
    -		WaitDesc(WorkDescription *w, short e, 
    -			 bool permanent = false, int t = default_timeout) 
    -			: wd(w), event(e), f_permanent(permanent) {
    -			timeout.tv_sec = t;
    -			timeout.tv_usec = 0;
    -		}
    -		
    -		int get_fd() { return wd->fd; };
    -		void adjustTimeout(const struct timeval &delta);
    -		int timeoutExpired() { return((timeout.tv_sec < 0) ||
    -					      (timeout.tv_sec == 0 && timeout.tv_usec == 0)); }
    -	};
    -
    -private:
    -	bool f_exit;
    -	int num_workers;
    -	pthread_t *workers;
    -	int work_count;
    -	int wait_count;
    -	int ufds_size;
    -	std::list work_queue;
    -	std::list wait_queue;
    -	pthread_mutex_t work_queue_mutex;
    -	pthread_cond_t work_queue_cond_ready;
    -	pthread_cond_t work_queue_cond_full;
    -	pthread_mutex_t wait_queue_mutex;
    -	pthread_cond_t wait_queue_cond_ready;
    -	struct pollfd *ufds;
    -	int pd[2];
    -	struct timeval min_timeout;
    -
    -	void prepareDescriptorArray();
    -	void removeWaitDesc(std::list::iterator &i);
    -	void removeWorkDesc();
    -	void queueWork(WaitDesc *);
    -
    -	static void *threadMain(void *);
    -	static void threadCleanup(void *);
    -};
    -
    -#endif
    diff --git a/org.glite.lb.logger/src-nt/ThreadPool.cpp b/org.glite.lb.logger/src-nt/ThreadPool.cpp
    deleted file mode 100644
    index 8c3aa22..0000000
    --- a/org.glite.lb.logger/src-nt/ThreadPool.cpp
    +++ /dev/null
    @@ -1,430 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include 
    -
    -#include "ThreadPool.H"
    -#include "Exception.H"
    -
    -
    -static inline
    -void
    -tv_sub(struct timeval &a, const struct timeval &b) {
    -        a.tv_usec -= b.tv_usec;		
    -        a.tv_sec -= b.tv_sec;
    -        if (a.tv_usec < 0) {
    -                a.tv_sec--;
    -                a.tv_usec += 1000000;
    -        }
    -}
    -
    -
    -static inline
    -int 
    -tv_cmp(const struct timeval &a, const struct timeval &b) {
    -	if(a.tv_sec < b.tv_sec) {
    -		return -1;
    -	} else 	if(a.tv_sec > b.tv_sec) {
    -		return 1;
    -	} else {
    -		if (a.tv_usec < b.tv_usec) {
    -			return -1;
    -		} else if(a.tv_usec > b.tv_usec) {
    -			return 1;
    -		} else {
    -			return 0;
    -		}
    -	} 
    -}
    -
    -
    -inline
    -void 
    -ThreadPool::WorkDescription::doWork() {
    -	switch(event) {
    -	case READY:
    -		onReady();
    -		break;
    -	case TIMEOUT:
    -		onTimeout();
    -		break;
    -	case ERROR:
    -		onError();
    -		break;
    -	default:
    -		break;
    -	}
    -}
    -
    -
    -inline
    -void
    -ThreadPool::WaitDesc::adjustTimeout(const struct timeval &delta)
    -{
    -	tv_sub(timeout, delta);
    -}
    -
    -
    -ThreadPool::WorkDescription::~WorkDescription() {
    -}
    -
    -
    -ThreadPool::ThreadPool() 
    -	: f_exit(false), work_count(0), wait_count(0), ufds_size(0), ufds(NULL) 
    -{
    -	pthread_mutex_init(&wait_queue_mutex, NULL);
    -	pthread_mutex_init(&work_queue_mutex, NULL);
    -	pthread_cond_init(&work_queue_cond_ready, NULL);
    -	pthread_cond_init(&work_queue_cond_full, NULL);
    -	pthread_cond_init(&wait_queue_cond_ready, NULL);
    -	pipe(pd);
    -	ufds = static_cast(malloc(sizeof(struct pollfd)));
    -	if(ufds == NULL) {
    -		throw new Exception;
    -	}
    -	ufds->fd = pd[0];
    -	ufds->events = POLLIN;
    -	ufds_size = 1;
    -}
    -
    -
    -ThreadPool::~ThreadPool()
    -{
    -	pthread_cond_destroy(&work_queue_cond_full);
    -	pthread_cond_destroy(&work_queue_cond_ready);
    -	pthread_cond_destroy(&wait_queue_cond_ready);
    -	pthread_mutex_destroy(&work_queue_mutex);
    -	pthread_mutex_destroy(&wait_queue_mutex);
    -}
    -
    -
    -void
    -ThreadPool::startWorkers(unsigned int n) 
    -{
    -	workers = new pthread_t[n];
    -
    -	num_workers = n;
    -	for(unsigned int i = 0; i < n; i++) {
    -		// XXX check return 
    -		pthread_create(&workers[i], NULL, ThreadPool::threadMain, NULL);
    -	}
    -}
    -
    -
    -void 
    -ThreadPool::stopWorkers()
    -{
    -	for(int i = 0; i < num_workers; i++) {
    -		pthread_cancel(workers[i]);
    -		pthread_join(workers[i], NULL);
    -	}
    -	delete[] workers;
    -}
    -
    -
    -void 
    -ThreadPool::postWork(WorkDescription *work_unit)
    -{
    -	E_ASSERT(pthread_mutex_lock(&work_queue_mutex) >= 0);
    -	work_queue.push_back(work_unit);
    -	work_count++;
    -	E_ASSERT(pthread_cond_signal(&work_queue_cond_ready) >= 0);
    -	E_ASSERT(pthread_mutex_unlock(&work_queue_mutex) >= 0);
    -}
    -
    -
    -inline
    -void 
    -ThreadPool::queueWork(WaitDesc *wd)
    -{
    -	E_ASSERT(pthread_mutex_lock(&wait_queue_mutex) >= 0);
    -	wait_queue.push_back(wd);
    -	wait_count++;
    -	E_ASSERT(pthread_cond_signal(&wait_queue_cond_ready) >= 0);
    -	E_ASSERT(pthread_mutex_unlock(&wait_queue_mutex) >= 0);
    -	if(write(pd[1], "1", 1) != 1) {
    -		throw new Exception;
    -	}
    -}
    -
    -
    -void 
    -ThreadPool::queueWorkAccept(WorkDescription *work_unit) 
    -{
    -	queueWork(new WaitDesc(work_unit, POLLIN));
    -}
    -	
    -
    -void 
    -ThreadPool::queueWorkRead(WorkDescription *work_unit) 
    -{
    -	queueWork(new WaitDesc(work_unit, POLLIN));
    -}
    -
    -
    -void
    -ThreadPool::queueWorkWrite(WorkDescription *work_unit) 
    -{
    -	queueWork(new WaitDesc(work_unit, POLLOUT));
    -}
    -	
    -
    -void 
    -ThreadPool::queueWorkTimeout(WorkDescription *work_unit) 
    -{
    -	queueWork(new WaitDesc(work_unit, 0));
    -}
    -
    -
    -void 
    -ThreadPool::queueWorkConnect(WorkDescription *work_unit) 
    -{
    -	queueWork(new WaitDesc(work_unit, POLLIN));
    -}
    -
    -
    -void 
    -ThreadPool::setWorkAccept(WorkDescription *work_unit) 
    -{
    -	queueWork(new WaitDesc(work_unit, POLLIN, true));
    -}
    -	
    -
    -void 
    -ThreadPool::setWorkRead(WorkDescription *work_unit) 
    -{
    -	queueWork(new WaitDesc(work_unit, POLLIN, true));
    -}
    -
    -
    -void
    -ThreadPool::setWorkWrite(WorkDescription *work_unit) 
    -{
    -	queueWork(new WaitDesc(work_unit, POLLOUT, true));
    -}
    -	
    -
    -void 
    -ThreadPool::setWorkTimeout(WorkDescription *work_unit) 
    -{
    -	queueWork(new WaitDesc(work_unit, 0, true));
    -}
    -
    -
    -ThreadPool::WorkDescription *
    -ThreadPool::getWork()
    -{
    -	WorkDescription *work_unit = NULL;
    -	struct timespec timeout;
    -
    -	E_ASSERT(pthread_mutex_lock(&work_queue_mutex) >= 0);
    -	if(work_count == 0) {
    -		timeout.tv_sec = 1;
    -		timeout.tv_nsec = 0;
    -//		pthread_cond_timedwait(&work_queue_cond_ready, &work_queue_mutex, &timeout);
    -		E_ASSERT(pthread_cond_wait(&work_queue_cond_ready, &work_queue_mutex) == 0);
    -	}
    -	if(work_count > 0) {
    -		work_count--;
    -		work_unit = work_queue.front();
    -		work_queue.pop_front();
    -	}
    -	E_ASSERT(pthread_mutex_unlock(&work_queue_mutex) >= 0);
    -	return work_unit;
    -}
    -
    -void
    -ThreadPool::threadCleanup(void *data)
    -{
    -	ThreadPool *pool = ThreadPool::instance();
    -
    -	E_ASSERT(pthread_mutex_unlock(&(pool->work_queue_mutex)) >= 0);
    -}
    -
    -
    -void *
    -ThreadPool::threadMain(void *data)
    -{
    -	ThreadPool *pool  = ThreadPool::instance();
    -	WorkDescription *work_unit;
    -
    -	pthread_cleanup_push(ThreadPool::threadCleanup, NULL); 
    -	while(true) {
    -
    -		work_unit = pool->getWork();
    -		if(work_unit) {
    -			// something to work on
    -			work_unit->doWork();
    -		} else {
    -			// timed out waiting for work
    -		}
    -	}
    -	pthread_cleanup_pop(1);
    -}
    -
    -
    -void 
    -ThreadPool::removeWaitDesc(std::list::iterator &i)
    -{
    -	std::list::iterator j = i;
    -	
    -	// actually this is safe even for the first element
    -	E_ASSERT(pthread_mutex_lock(&wait_queue_mutex) >= 0);
    -	j--;
    -	wait_queue.erase(i);
    -	wait_count--;
    -	i = j;
    -	E_ASSERT(pthread_mutex_unlock(&wait_queue_mutex) >= 0);
    -}
    -
    -
    -void
    -ThreadPool::prepareDescriptorArray()
    -{
    -	std::list::iterator theIterator;
    -	struct pollfd *p;
    -
    -	E_ASSERT(pthread_mutex_lock(&wait_queue_mutex) >= 0);
    -	if(wait_count == 0) {
    -		E_ASSERT(pthread_cond_wait(&wait_queue_cond_ready, &wait_queue_mutex) != 0);
    -	}
    -	if(wait_count == 0) {
    -		E_ASSERT(pthread_mutex_unlock(&wait_queue_mutex) >= 0);
    -		return;
    -	}
    -	if(ufds_size != wait_count + 1) {
    -		ufds = static_cast(realloc(ufds, (1 + wait_count) * sizeof(struct pollfd)));
    -		if(ufds == NULL) {
    -			throw new Exception();
    -		}
    -		ufds_size = wait_count + 1;
    -	}
    -	min_timeout.tv_sec = default_timeout;
    -	min_timeout.tv_usec = 0;
    -	for(theIterator = wait_queue.begin(), p = ufds + 1;
    -	    theIterator != wait_queue.end(); 
    -	    theIterator++, p++) {
    -		WaitDesc *w = *theIterator;
    -		p->fd = w->get_fd();
    -		p->events = w->event;
    -		if(tv_cmp(min_timeout, w->timeout) > 0) {
    -			min_timeout = w->timeout;
    -		}
    -	}
    -	E_ASSERT(pthread_mutex_unlock(&wait_queue_mutex) >= 0);
    -}
    -
    -
    -void
    -ThreadPool::run()
    -{
    -	f_exit = false;
    -	while(!f_exit) {
    -		struct pollfd *p;
    -		struct timeval before, after;
    -		int ret;
    -
    -		// may block waiting for new work
    -		prepareDescriptorArray();
    -
    -		gettimeofday(&before, NULL);
    -		ret = poll(ufds, ufds_size, 1000*min_timeout.tv_sec + min_timeout.tv_usec/1000);
    -		gettimeofday(&after, NULL);
    -		tv_sub(after, before);
    -
    -		if((ret >= 0) || // ready or timeout
    -		   ((ret < 0) && (errno == EINTR))) { // interrupted 
    -			std::list::iterator i;
    -			WaitDesc *w;
    -
    -			// handle the pipe
    -			if(ufds->revents & POLLIN) {
    -				char discard[1];
    -				read(ufds->fd, discard, 1);
    -			}
    -
    -			// at least we have to adjust timeouts
    -			E_ASSERT(pthread_mutex_lock(&wait_queue_mutex) >= 0);
    -			i = wait_queue.begin();
    -			E_ASSERT(pthread_mutex_unlock(&wait_queue_mutex) >= 0);
    -			// the wait queue mutex is unlocked inside the loop
    -			// to allow handlers to add queue new
    -			// WorkDescriptions - these are added at the
    -			// end of the list so we should be safe 
    -			for(p = ufds + 1; p - ufds < ufds_size; p++) {
    -				enum WorkDescription::Event event = WorkDescription::NONE;
    -				
    -				w = *i;
    -				// check for consistency
    -				if(p->fd != w->get_fd()) {
    -					// mismatch, what shall we do?
    -					throw new Exception;
    -				}
    -
    -				// subtract the time passed from timeout
    -				w->adjustTimeout(after);
    -
    -				// see what happened
    -				if(ret <= 0) {
    -					// timeout or interrupted
    -					if(w->timeoutExpired()) {
    -						event = WorkDescription::TIMEOUT;
    -					}
    -				} else {
    -					// ready or error
    -					if(p->revents & POLLERR) {
    -						event = WorkDescription::ERROR;
    -					} else if(p->revents & w->event) {
    -						event = WorkDescription::READY;
    -					} else if(w->timeoutExpired()) {
    -						event = WorkDescription::TIMEOUT;
    -					}
    -				}
    -				if(event != WorkDescription::NONE) {
    -					WorkDescription *wd;
    -					wd = w->wd;
    -					wd->event = event;
    -					if(!w->f_permanent) {
    -						postWork(wd);
    -						removeWaitDesc(i);
    -						delete w;
    -					} else {
    -						w->wd->doWork();
    -						// we have to reset the timeout
    -						w->timeout.tv_sec = default_timeout;
    -						w->timeout.tv_usec = 0;
    -					}
    -				}
    -				E_ASSERT(pthread_mutex_lock(&wait_queue_mutex) >= 0);
    -				i++;
    -				E_ASSERT(pthread_mutex_unlock(&wait_queue_mutex) >= 0);
    -			}
    -		} else {
    -			// some nasty error
    -			throw new Exception;
    -		}
    -	}
    -}
    -
    diff --git a/org.glite.lb.logger/src-nt/Transport.H b/org.glite.lb.logger/src-nt/Transport.H
    deleted file mode 100644
    index 09cb777..0000000
    --- a/org.glite.lb.logger/src-nt/Transport.H
    +++ /dev/null
    @@ -1,50 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef _TRANSPORT_H
    -#define _TRANSPORT_H
    -
    -#include "Connection.H"
    -#include "Message.H"
    -
    -// Transport implements transport protocol 
    -//  - reads/writes messages using Connection interface
    -//  - 
    -class Transport {
    -public:
    -
    -	// 
    -	class Factory {
    -	public:
    -		virtual Transport *newTransport() const = 0;
    -
    -		virtual ~Factory() 
    -			{}
    -	};
    -
    -	//
    -	Transport() 
    -		{}
    -
    -	virtual ~Transport();
    -
    -	// 
    -	virtual int receive(Connection *conn, Message* &msg) = 0;
    -	virtual int send(Connection *conn, Message* msg) = 0;
    -	virtual void reset() = 0;
    -};
    -#endif
    diff --git a/org.glite.lb.logger/src-nt/Transport.cpp b/org.glite.lb.logger/src-nt/Transport.cpp
    deleted file mode 100644
    index ec12ec4..0000000
    --- a/org.glite.lb.logger/src-nt/Transport.cpp
    +++ /dev/null
    @@ -1,22 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include "Transport.H"
    -
    -Transport::~Transport()
    -{
    -}
    diff --git a/org.glite.lb.logger/src-nt/main.cpp b/org.glite.lb.logger/src-nt/main.cpp
    deleted file mode 100644
    index 59cb0dd..0000000
    --- a/org.glite.lb.logger/src-nt/main.cpp
    +++ /dev/null
    @@ -1,55 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include "PluginManager.H"
    -#include "ThreadPool.H"
    -#include "SocketInput.H"
    -#include "PlainConnection.H"
    -#include "HTTPTransport.H"
    -#include "EventManager.H"
    -
    -const int num_threads = 2;
    -const char *sock_path = "/tmp/il_sock";
    -
    -EventManager theEventManager();
    -
    -int main(int argc, char *argv[])
    -{
    -	SocketInput *input;
    -	
    -	// initialize plugins
    -	PluginManager::instance()->initialize();
    -
    -	// create unix socket with plain IO and HTTP transport
    -	input = new SocketInput(sock_path, 
    -				PlainConnection::Factory::instance(), 
    -				HTTPTransport::Factory::instance());
    -	// and add the socket to pool
    -	ThreadPool::instance()->setWorkAccept(input);
    -
    -	// start worker threads
    -	ThreadPool::instance()->startWorkers(num_threads);
    -
    -	// run the main loop
    -	ThreadPool::instance()->run();
    -
    -	// cleanup & exit
    -	delete input;
    -	PluginManager::instance()->cleanup();
    -
    -	return 0;
    -}
    diff --git a/org.glite.lb.logger/src-nt/test/EventManagerTest.cpp b/org.glite.lb.logger/src-nt/test/EventManagerTest.cpp
    deleted file mode 100644
    index 1660af7..0000000
    --- a/org.glite.lb.logger/src-nt/test/EventManagerTest.cpp
    +++ /dev/null
    @@ -1,62 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    -
    -#include "EventManager.H"
    -
    -class EventA : public Event {
    -};
    -
    -class EventB : public Event {
    -};
    -
    -class EventAA : public EventA {
    -};
    -
    -
    -class EventManagerTest: public CppUnit::TestFixture {
    -	CPPUNIT_TEST_SUITE(EventManagerTest);
    -	CPPUNIT_TEST(handleEventTest);
    -	CPPUNIT_TEST_SUITE_END();
    -public:
    -	
    -	void setUp() {
    -		handled = false;
    -		manager.registerHandler(this);
    -	}
    -
    -	void tearDown() {
    -	}
    -
    -	void handleEventTest() {
    -		Event *e = new EventAA();
    -		manager.postEvent(e);
    -		CPPUNIT_ASSERT(handled);
    -	}
    -
    -	int handleEvent(EventA* &e) {
    -		handled = true;
    -		return 0;
    -	}
    -
    -private:
    -	EventManager manager;
    -	bool handled;
    -};
    -
    -CPPUNIT_TEST_SUITE_REGISTRATION( EventManagerTest );
    diff --git a/org.glite.lb.logger/src-nt/test/PluginManagerTest.cpp b/org.glite.lb.logger/src-nt/test/PluginManagerTest.cpp
    deleted file mode 100644
    index cc97d98..0000000
    --- a/org.glite.lb.logger/src-nt/test/PluginManagerTest.cpp
    +++ /dev/null
    @@ -1,75 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    -
    -#include "PluginManager.H"
    -
    -class TestPlugin : public PluginManager::Plugin {
    -public:
    -	bool inited, cleaned;
    -
    -	virtual bool initialize() {
    -		inited = true;
    -	}
    -
    -	virtual bool cleanup() {
    -		cleaned = true;
    -	}
    -
    -	static TestPlugin theTestPlugin;
    -
    -private:
    -	TestPlugin() : PluginManager::Plugin("test plugin"),
    -		       inited(false),
    -		       cleaned(false) 
    -		{}
    -
    -
    -
    -};
    -
    -
    -class PluginManagerTest : public CppUnit::TestFixture 
    -{
    -	CPPUNIT_TEST_SUITE(PluginManagerTest);
    -	CPPUNIT_TEST(testInit);
    -	CPPUNIT_TEST(testClean);
    -	CPPUNIT_TEST_SUITE_END();
    -	
    -public:
    -	void setUp() {
    -	}
    -
    -	void tearDown() {
    -	}
    -
    -	void testInit() {
    -		PluginManager::instance()->initialize();
    -		CPPUNIT_ASSERT(TestPlugin::theTestPlugin.inited);
    -	}
    -	
    -	void testClean() {
    -		PluginManager::instance()->cleanup();
    -		CPPUNIT_ASSERT(TestPlugin::theTestPlugin.cleaned);
    -	}
    -};
    -
    -
    -TestPlugin TestPlugin::theTestPlugin;
    -
    -CPPUNIT_TEST_SUITE_REGISTRATION( PluginManagerTest );
    diff --git a/org.glite.lb.logger/src-nt/test/SingletonTest.cpp b/org.glite.lb.logger/src-nt/test/SingletonTest.cpp
    deleted file mode 100644
    index 4bc1346..0000000
    --- a/org.glite.lb.logger/src-nt/test/SingletonTest.cpp
    +++ /dev/null
    @@ -1,72 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    -
    -#include "Singleton.H"
    -
    -class one : public Singleton {
    -	friend class Singleton;
    -};
    -
    -class two : public Singleton {
    -	friend class Singleton;
    -};
    -
    -class SingletonTest: public CppUnit::TestFixture {
    -	CPPUNIT_TEST_SUITE(SingletonTest);
    -	CPPUNIT_TEST(getInstance);
    -	CPPUNIT_TEST(pair);
    -	CPPUNIT_TEST(noCreate);
    -	CPPUNIT_TEST_SUITE_END();
    -public:
    -	
    -	void setUp() {
    -	}
    -
    -	void tearDown() {
    -	}
    -
    -	void getInstance() {
    -		one *p;
    -		one *q;
    -
    -		p = one::instance();
    -		q = one::instance();
    -		CPPUNIT_ASSERT(p != NULL);
    -		CPPUNIT_ASSERT(q != NULL);
    -		CPPUNIT_ASSERT(p == q);
    -	}
    -
    -	void pair() {
    -		one *p;
    -		two *q;
    -
    -		p = one::instance();
    -		q = two::instance();
    -		CPPUNIT_ASSERT(p != NULL);
    -		CPPUNIT_ASSERT(q != NULL);
    -		CPPUNIT_ASSERT((void*)p != (void*)q);
    -	}
    -
    -	void noCreate() {
    -		one *p = new one;
    -
    -	}
    -};
    -
    -CPPUNIT_TEST_SUITE_REGISTRATION( SingletonTest );
    diff --git a/org.glite.lb.logger/src-nt/test/ThreadPoolTest.cpp b/org.glite.lb.logger/src-nt/test/ThreadPoolTest.cpp
    deleted file mode 100644
    index fd9b955..0000000
    --- a/org.glite.lb.logger/src-nt/test/ThreadPoolTest.cpp
    +++ /dev/null
    @@ -1,207 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include 
    -
    -#include "ThreadPool.H"
    -
    -class TestWork : public ThreadPool::WorkDescription {
    -public:
    -	int done;
    -	
    -	TestWork(int fd) : ThreadPool::WorkDescription(fd), done(0) {};
    -
    -	virtual void onReady() {
    -		done++;
    -	}
    -	
    -};
    -
    -
    -class TestConsumer : public ThreadPool::WorkDescription {
    -public:
    -	char buf[2];
    -
    -	TestConsumer(int fd) : ThreadPool::WorkDescription(fd) {};
    -
    -	virtual void onReady() {
    -		int r;
    -		
    -		r = read(fd, buf, 1);
    -		buf[1] = 0;
    -		ThreadPool::instance()->exit();
    -	}
    -
    -	virtual void onTimeout() {
    -	}
    -
    -};
    -
    -
    -class TestProducer : public ThreadPool::WorkDescription {
    -public:
    -	TestProducer(int fd) : ThreadPool::WorkDescription(fd) {};
    -
    -	virtual void onReady() {
    -		write(fd, "a", 1);
    -	}
    -	
    -	virtual void onTimeout() {
    -	}
    -
    -};
    -
    -
    -class TestSocketRead: public ThreadPool::WorkDescription {
    -public:
    -	char buffer[10];
    -
    -	TestSocketRead(int fd) : ThreadPool::WorkDescription(fd) {
    -	}
    -
    -	virtual void onReady() {
    -		
    -		int len = recv(fd, buffer, sizeof(buffer), MSG_NOSIGNAL);
    -		ThreadPool::instance()->exit();
    -	}
    -
    -	virtual void onError() {
    -	}
    -};
    -
    -
    -class TestSocketWrite: public ThreadPool::WorkDescription {
    -public:
    -	static char buffer[];
    -
    -	TestSocketWrite(const char *name) 
    -		: ThreadPool::WorkDescription(0) {
    -		struct sockaddr_un saddr;
    -		int ret;
    -		fd = socket(PF_UNIX, SOCK_STREAM, 0);
    -		memset(&saddr, 0, sizeof(saddr));
    -		saddr.sun_family = AF_UNIX;
    -		strcpy(saddr.sun_path, name);
    -		if((ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr))) < 0) {
    -		}
    -	}
    -
    -	virtual void onReady() {
    -		int ret;
    -
    -		ret = send(fd, buffer, strlen(buffer)+1, MSG_NOSIGNAL);
    -		close(fd);
    -	}
    -
    -};
    -
    -char TestSocketWrite::buffer[] = "ahoj";
    -
    -class TestSocketAccept : public ThreadPool::WorkDescription {
    -public:
    -	TestSocketRead *reader;
    -
    -	TestSocketAccept(const char *name) 
    -		: ThreadPool::WorkDescription(0) {
    -		struct sockaddr_un saddr;
    -
    -		fd = socket(PF_UNIX, SOCK_STREAM, 0);
    -		memset(&saddr, 0, sizeof(saddr));
    -		saddr.sun_family = AF_UNIX;
    -		strcpy(saddr.sun_path, name);
    -		bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
    -		listen(fd, 1);
    -	}
    -
    -	virtual void onReady() {
    -		int nfd;
    -
    -		nfd = accept(fd, NULL, NULL);
    -		if(nfd < 0) { 
    -		} else {
    -			ThreadPool *pool = ThreadPool::instance();
    -
    -			reader  = new TestSocketRead(nfd);
    -			pool->queueWorkRead(reader);
    -		}
    -	}
    -};
    -
    -
    -class ThreadPoolTest: public CppUnit::TestFixture
    -{
    -	CPPUNIT_TEST_SUITE( ThreadPoolTest );
    -	CPPUNIT_TEST( testWorkQueue );
    -	CPPUNIT_TEST( testPoll );
    -	CPPUNIT_TEST( testAccept );
    -	CPPUNIT_TEST_SUITE_END();
    -
    -public:
    -	void setUp() {
    -		pool = ThreadPool::instance();
    -		unlink("/tmp/smazat.sock");
    -		pool->startWorkers(2);
    -	}
    -
    -	void tearDown() {
    -		pool->stopWorkers();
    -	}
    -
    -	void testWorkQueue() {
    -		TestWork *work_unit = new TestWork(0);
    -		pool->postWork(work_unit);
    -	}
    -
    -	void testPoll() {
    -		int fd[2];
    -		TestProducer *p = new TestProducer(0);
    -		TestConsumer *c = new TestConsumer(0);
    -
    -		pipe(fd);
    -		c->fd = fd[0];
    -		p->fd = fd[1];
    -		pool->queueWorkRead(c);
    -		pool->queueWorkWrite(p);
    -		pool->run();
    -		CPPUNIT_ASSERT(c->buf[0] == 'a');
    -		CPPUNIT_ASSERT(c->buf[1] == 0);
    -	}
    -
    -	void testAccept() {
    -		TestSocketAccept *consumer = new TestSocketAccept("/tmp/smazat.sock");
    -		TestSocketWrite *producer;
    -
    -		pool->queueWorkAccept(consumer);
    -		producer = new TestSocketWrite("/tmp/smazat.sock");
    -		ThreadPool::instance()->queueWorkWrite(producer);
    -		pool->run();
    -		CPPUNIT_ASSERT(consumer->reader != NULL);
    -		CPPUNIT_ASSERT(strcmp(consumer->reader->buffer, TestSocketWrite::buffer) == 0);
    -	}
    -
    -private:
    -	ThreadPool *pool;
    -};
    -
    -
    -CPPUNIT_TEST_SUITE_REGISTRATION( ThreadPoolTest );
    diff --git a/org.glite.lb.logger/src-nt/test/test_main.cpp b/org.glite.lb.logger/src-nt/test/test_main.cpp
    deleted file mode 100644
    index 83c15ef..0000000
    --- a/org.glite.lb.logger/src-nt/test/test_main.cpp
    +++ /dev/null
    @@ -1,49 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    -#include 
    -
    -#include 
    -#include 
    -//#include 
    -#include 
    -#include 
    -#include 
    -
    -int main (int argc,const char *argv[])
    -{
    -        CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
    -
    -//        assert(argc == 2);
    -//        std::ofstream   xml(argv[1]);
    -
    -        CppUnit::TestResult controller;
    -        CppUnit::TestResultCollector result;
    -        controller.addListener( &result );
    -
    -        CppUnit::TestRunner runner;
    -        runner.addTest(suite);
    -        runner.run(controller);
    -
    -//        CppUnit::XmlOutputter xout( &result, xml );
    -        CppUnit::CompilerOutputter tout( &result, std::cout);
    -//        xout.write();
    -        tout.write();
    -
    -        return result.wasSuccessful() ? 0 : 1 ;
    -}
    diff --git a/org.glite.lb.logger/src/activemq_cpp_plugin.cpp b/org.glite.lb.logger/src/activemq_cpp_plugin.cpp
    deleted file mode 100644
    index 5e4c762..0000000
    --- a/org.glite.lb.logger/src/activemq_cpp_plugin.cpp
    +++ /dev/null
    @@ -1,400 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -/*
    - * activemq_cpp_plugin.cpp
    - *
    - *  Created on: Jan 20, 2010
    - *      Author: michal
    - */
    -
    -#include "interlogd.h"
    -#include "glite/lb/events_parse.h"
    -#include "glite/lb/context.h"
    -#include "glite/lbu/escape.h"
    -#include "glite/lb/jobstat.h"
    -#include "glite/lb/xml_parse.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include 
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -class OutputPlugin : public cms::ExceptionListener {
    -
    -public:
    -
    -	OutputPlugin() : session(NULL), destination(NULL), producer(NULL) {};
    -
    -	virtual void onException(const cms::CMSException &ex);
    -
    -	void connect(const std::string &topic);
    -	void send(cms::Message *msg);
    -	void close();
    -	void cleanup();
    -
    -public:
    -
    -	cms::Session *session;
    -	cms::Topic   *destination;
    -	cms::MessageProducer *producer;
    -
    -	static cms::Connection *connection;
    -	static cms::ConnectionFactory *connectionFactory;
    -
    -	static const char *SCHEME;
    -};
    -
    -
    -void
    -OutputPlugin::onException(const cms::CMSException &ex)
    -{
    -	this->cleanup();
    -}
    -
    -
    -void
    -OutputPlugin::connect(const std::string &topic)
    -{
    -	if(this->session == NULL) {
    -		this->session = connection->createSession(/* TODO: ackMode */);
    -		this->destination = this->session->createTopic(topic);
    -		this->producer = this->session->createProducer(this->destination);
    -	}
    -	connection->start();
    -	connection->setExceptionListener(this);
    -}
    -
    -
    -void
    -OutputPlugin::send(cms::Message *msg)
    -{
    -	if(this->producer != NULL) {
    -		this->producer->send(this->destination, msg);
    -	}
    -}
    -
    -
    -void
    -OutputPlugin::close()
    -{
    -	this->cleanup();
    -	connection->stop();
    -}
    -
    -
    -void
    -OutputPlugin::cleanup()
    -{
    -	if(this->producer != NULL) {
    -		delete this->producer;
    -		this->producer = NULL;
    -	}
    -	if(this->destination != NULL) {
    -		delete this->destination;
    -		this->destination = NULL;
    -	}
    -	if(this->session != NULL) {
    -		this->session->close();
    -		delete this->session;
    -		this->session = NULL;
    -	}
    -}
    -
    -
    -static
    -void timeval2str(struct timeval *t, char **str) {
    -        struct tm       *tm;
    -
    -        tm = gmtime(&t->tv_sec);
    -        asprintf(str,"%4d-%02d-%02dT%02d:%02d:%02dZ",tm->tm_year+1900,tm->tm_mon+1,
    -                tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
    -}
    -
    -
    -extern "C"
    -int
    -event_queue_connect(struct event_queue *eq)
    -{
    -	OutputPlugin *output;
    -	std::string topicName;
    -
    -	if(eq->plugin_data == NULL) {
    -		output = new OutputPlugin();
    -		eq->plugin_data = (void*)output;
    -	} else {
    -		output = (OutputPlugin*)eq->plugin_data;
    -	}
    -
    -	try {
    -		output->connect(topicName);
    -	} catch(cms::CMSException &e) {
    -			output->cleanup();
    -			eq->timeout = TIMEOUT;
    -			return 0;
    -	}
    -	eq->first_event_sent = 0;
    -	return 1;
    -}
    -
    -
    -extern "C"
    -int
    -event_queue_send(struct event_queue *eq)
    -{
    -	OutputPlugin *output = (OutputPlugin*)eq->plugin_data;
    -	edg_wll_Context context;
    -	edg_wll_Event *notif_event;
    -    edg_wll_JobStat *state_out;
    -    il_octet_string_t event;
    -    char *jobstat_char;
    -	int ret;
    -
    -	assert(output != NULL);
    -
    -	edg_wll_InitContext(&context);
    -
    -	while(!event_queue_empty(eq)) {
    -	    struct server_msg *msg;
    -	    cms::TextMessage *cms_msg;
    -	    char *s;
    -	    unsigned int i;
    -	    std::string val;
    -
    -	    if(event_queue_get(eq, &msg) < 0) {
    -	    	goto err;
    -	    }
    -
    -	    try {
    -	    	if(decode_il_msg(&event, msg->msg) < 0) {
    -	    		set_error(IL_LBAPI, EINVAL, "event_queue_send: error parsing notification event data");
    -	    		goto err;
    -	    	}
    -	    	ret=edg_wll_ParseNotifEvent(context, event.data, ¬if_event);
    -	    	if(ret) {
    -	    		set_error(IL_LBAPI, ret, "event_queue_send: error parsing notification event");
    -	    		goto err;
    -	    	}
    -	        jobstat_char = glite_lbu_UnescapeXML((const char *) notif_event->notification.jobstat);
    -	        if (jobstat_char == NULL) {
    -	            set_error(IL_LBAPI, EINVAL, "event_queue_send: error unescaping job status");
    -	            goto err;
    -	        }
    -	        if ( edg_wll_ParseJobStat(context, jobstat_char, strlen(jobstat_char), state_out)) {
    -	        	set_error(IL_LBAPI, EINVAL, "event_queue_send: error parsing job status");
    -	        	goto err;
    -	        }
    -
    -
    -	    	cms_msg = output->session->createTextMessage();
    -	    	/* ownerDn */
    -	    	val.assign(state_out->owner);
    -	    	cms_msg->setStringProperty("ownerDn", val);
    -	    	/* voname */
    -	    	s = edg_wll_JDLField(state_out,"VirtualOrganisation");
    -	    	val.assign(s);
    -	    	free(s);
    -	    	cms_msg->setStringProperty("voname", val);
    -	    	/* bkHost */
    -	    	glite_jobid_getServerParts(state_out->jobId, &s, &i);
    -	    	val.assign(s);
    -	    	free(s);
    -	    	cms_msg->setStringProperty("bkHost", val);
    -	    	/* networkServer */
    -	    	/* TODO: XXX cut out hostname */
    -	    	val.assign(state_out->network_server);
    -	    	cms_msg->setStringProperty("networkHost", val);
    -	    	timeval2str(&state_out->lastUpdateTime, &s);
    -	    	val.assign(s);
    -	    	if(s) free(s);
    -	    	cms_msg->setStringProperty("lastUpdateTime", val);
    -	    	/* stateName */
    -	    	s = edg_wll_StatToString(state_out->state);
    -	    	val.assign(s);
    -	    	if(s) free(s);
    -	    	cms_msg->setStringProperty("stateName", val);
    -	    	timeval2str(&state_out->stateEnterTime, &s);
    -	    	val.assign(s);
    -	    	if(s) free(s);
    -	    	cms_msg->setStringProperty("stateStartTime", val);
    -	    	/* condorId */
    -	    	val.assign(state_out->condorId);
    -	    	cms_msg->setStringProperty("condorId", val);
    -	    	/* destSite */
    -	    	val.assign(state_out->destination);
    -	    	cms_msg->setStringProperty("destSite", val);
    -	    	/* exitCode */
    -	    	cms_msg->setIntProperty("exitCode", state_out->exit_code);
    -	    	/* doneCode */
    -	    	cms_msg->setIntProperty("doneCode", state_out->done_code);
    -	    	/* statusReason */
    -	    	val.assign(state_out->reason);
    -	    	cms_msg->setStringProperty("statusReason", val);
    -
    -	    	free(event.data);
    -	    	edg_wll_FreeEvent(notif_event);
    -	    	free(notif_event);
    -	    	edg_wll_FreeStatus(state_out);
    -	    	free(state_out);
    -	    	free(jobstat_char);
    -	    } catch(cms::CMSException &e) {
    -	    	goto err;
    -	    }
    -
    -	    try {
    -	    	output->send(cms_msg);
    -		    delete cms_msg;
    -	    	if(event_store_commit(msg->es, msg->ev_len, queue_list_is_log(eq), msg->generation) < 0) {
    -	    		/* failure committing message, this is bad */
    -	    		goto err;
    -	    	}
    -	        event_queue_remove(eq);
    -	        eq->first_event_sent = 1;
    -	    } catch(cms::CMSException &e) {
    -		    delete cms_msg;
    -	    	output->cleanup();
    -	    	eq->timeout = TIMEOUT;
    -	    	edg_wll_FreeContext(context);
    -	    	return 0;
    -	    }
    -	}
    -	edg_wll_FreeContext(context);
    -	return 1;
    -
    -err:
    -	if(event.data) {
    -		free(event.data);
    -	}
    -	if(notif_event) {
    -    	edg_wll_FreeEvent(notif_event);
    -    	free(notif_event);
    -	}
    -	if(jobstat_char) {
    -		free(jobstat_char);
    -	}
    -	if(state_out) {
    -		edg_wll_FreeStatus(state_out);
    -		free(state_out);
    -	}
    -	return -1;
    -}
    -
    -
    -extern "C"
    -int
    -event_queue_close(struct event_queue *eq)
    -{
    -	OutputPlugin *output = (OutputPlugin*)eq->plugin_data;
    -
    -	assert(output != NULL);
    -
    -	try {
    -		output->close();
    -	} catch(cms::CMSException &e) {
    -		return -1;
    -	}
    -	eq->first_event_sent = 0;
    -	return 0;
    -}
    -
    -
    -extern "C"
    -int
    -plugin_init(char *config)
    -{
    -	char *s, *p;
    -	char key[MAXPATHLEN], val[MAXPATHLEN];
    -	int ret;
    -	std::string brokerURI;
    -
    -	s = strstr(config, "[msg]");
    -	if(s == NULL) {
    -		set_error(IL_DL, ENOENT, "plugin_init: missing required configuration section [msg]\n");
    -		return -1;
    -	}
    -	s = strchr(s, '\n');
    -	if(s) s++;
    -	while(s) {
    -		if(*s == 0 || *s == '[')
    -			break;
    -		p = strchr(s, '\n');
    -		if(p) *p = 0;
    -		ret = sscanf(s, " %s =%s", key, val);
    -		if(p) *p = '\n';
    -		if(ret == 2) {
    -			if(strcmp(key, "broker") == 0) {
    -				brokerURI.assign(val);
    -			}
    -		}
    -		s = p;
    -	}
    -	if(brokerURI.length() == 0) {
    -		set_error(IL_DL, ENOENT, "plugin_init: broker uri not configured\n");
    -		return -1;
    -	}
    -
    -	try {
    -		activemq::library::ActiveMQCPP::initializeLibrary();
    -
    -		OutputPlugin::connectionFactory =
    -				cms::ConnectionFactory::createCMSConnectionFactory(brokerURI);
    -		OutputPlugin::connection = OutputPlugin::connectionFactory->createConnection();
    -	} catch (cms::CMSException &e) {
    -		try {
    -			if(OutputPlugin::connection != NULL) {
    -				delete OutputPlugin::connection;
    -				OutputPlugin::connection = NULL;
    -			}
    -			if(OutputPlugin::connectionFactory != NULL) {
    -				delete OutputPlugin::connectionFactory;
    -				OutputPlugin::connectionFactory = NULL;
    -			}
    -		} catch(cms::CMSException &e) {
    -		}
    -		set_error(IL_DL, 0, (char*)e.what());
    -		return -1;
    -	}
    -
    -	return 0;
    -}
    -
    -
    -extern "C"
    -int
    -plugin_supports_scheme(const char *scheme)
    -{
    -	return strncmp(scheme, OutputPlugin::SCHEME, strlen(OutputPlugin::SCHEME)) == 0;
    -}
    -
    -
    -cms::Connection *OutputPlugin::connection = NULL;
    -cms::ConnectionFactory *OutputPlugin::connectionFactory = NULL;
    -const char *OutputPlugin::SCHEME = "x-msg:";
    diff --git a/org.glite.lb.logger/src/event_queue.c b/org.glite.lb.logger/src/event_queue.c
    deleted file mode 100644
    index cbf0bee..0000000
    --- a/org.glite.lb.logger/src/event_queue.c
    +++ /dev/null
    @@ -1,400 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -/*
    - *   - general queue handling routines (insert, get)
    - */
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/jobid/cjobid.h"
    -
    -#include "interlogd.h"
    -
    -struct event_queue_msg {
    -  struct server_msg *msg;
    -  struct event_queue_msg *prev;
    -};
    -
    -struct event_queue *
    -event_queue_create(char *server_name, struct il_output_plugin *output)
    -{
    -  struct event_queue *eq;
    -  char *p,*s, c;
    -
    -  p = strrchr(server_name, ':');
    -  
    -  if(p) 
    -    *p++ = 0;
    -
    -  if((eq = malloc(sizeof(*eq))) == NULL) {
    -    set_error(IL_NOMEM, ENOMEM, "event_queue_create: error allocating event queue");
    -    return(NULL);
    -  }
    -
    -  memset(eq, 0, sizeof(*eq));
    -
    -  eq->dest = strdup(server_name);
    -
    -  s = strstr(server_name, "://");
    -  if(s == NULL) {
    -	  s = server_name;
    -  } else {
    -	  s = s + 3;
    -  }
    -  p = strchr(s, ':');
    -  if(p) {
    -    *p++ = 0;
    -    c = ':';
    -  } else {
    -	  p = strchr(s, '/');
    -	  if(p) {
    -		  *p++ = 0;
    -		  c = '/';
    -	  }
    -  }
    -  eq->dest_name = strdup(server_name);
    -  if(p)
    -    *(p-1) = c;
    -
    -#if defined(IL_NOTIFICATIONS) || defined(IL_WS)
    -  if(p && c == ':') {
    -	  eq->dest_port = atoi(p);
    -  } else {
    -	  eq->dest_port = 0; // use whatever default there is for given url scheme
    -  }
    -#else
    -	  eq->dest_port = p && c == ':' ? atoi(p)+1 : GLITE_JOBID_DEFAULT_PORT+1;
    -#endif
    -
    -  /* setup output functions */
    -  if(output != NULL) {
    -    eq->event_queue_connect = output->event_queue_connect;
    -    eq->event_queue_send = output->event_queue_send;
    -    eq->event_queue_close = output->event_queue_close;
    -  } else {
    -    eq->event_queue_connect = event_queue_connect;
    -    eq->event_queue_send = event_queue_send;
    -    eq->event_queue_close = event_queue_close;
    -  }
    -
    -  /* create all necessary locks */
    -  if(pthread_rwlock_init(&eq->update_lock, NULL)) {
    -    set_error(IL_SYS, errno, "event_queue_create: error creating update lock");
    -    free(eq);
    -    return(NULL);
    -  }
    -  if(pthread_mutex_init(&eq->cond_lock, NULL)) {
    -    set_error(IL_SYS, errno, "event_queue_create: error creating cond mutex");
    -    free(eq);
    -    return(NULL);
    -  }
    -  if(pthread_cond_init(&eq->ready_cond, NULL)) {
    -    set_error(IL_SYS, errno, "event_queue_create: error creating cond variable");
    -    free(eq);
    -    return(NULL);
    -  }
    -
    -#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
    -  if(pthread_cond_init(&eq->flush_cond, NULL)) {
    -    set_error(IL_SYS, errno, "event_queue_create: error creating cond variable");
    -    free(eq);
    -    return(NULL);
    -  }
    -#endif
    -
    -  return(eq);
    -}
    -
    -
    -int
    -event_queue_free(struct event_queue *eq)
    -{
    -  assert(eq != NULL);
    -
    -  if(!event_queue_empty(eq))
    -    return(-1);
    -
    -  if(eq->thread_id)
    -    pthread_cancel(eq->thread_id);
    -
    -
    -  pthread_rwlock_destroy(&eq->update_lock);
    -  pthread_mutex_destroy(&eq->cond_lock);
    -  pthread_cond_destroy(&eq->ready_cond);
    -#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
    -  pthread_cond_destroy(&eq->flush_cond);
    -#endif
    -
    -  if(eq->dest_name)
    -	  free(eq->dest_name);
    -  if(eq->dest)
    -	  free(eq->dest);
    -  free(eq);
    -
    -  return(0);
    -}
    -
    -
    -int
    -event_queue_empty(struct event_queue *eq)
    -{
    -  int ret;
    -
    -  assert(eq != NULL);
    -
    -  event_queue_lock_ro(eq);
    -  ret = (eq->head == NULL);
    -  event_queue_unlock(eq);
    -
    -  return(ret);
    -}
    -
    -
    -int
    -event_queue_insert(struct event_queue *eq, struct server_msg *msg)
    -{
    -  struct event_queue_msg *el;
    -#if defined(INTERLOGD_EMS)
    -  struct event_queue_msg *tail;
    -#endif
    -
    -  assert(eq != NULL);
    -
    -  if(queue_size_high > 0 && (eq->cur_len >= queue_size_high || eq->throttling)) {
    -	  eq->throttling = 1;
    -	  return 1;
    -  }
    -
    -  if((el = malloc(sizeof(*el))) == NULL)
    -    return(set_error(IL_NOMEM, ENOMEM, "event_queue_insert: not enough room for queue element"));
    -
    -  el->msg = server_msg_copy(msg);
    -  if(el->msg == NULL) {
    -    free(el);
    -    return(-1);
    -  };
    -
    -  /* this is critical section */
    -  event_queue_lock(eq);
    -#if defined(INTERLOGD_EMS)
    -  if(server_msg_is_priority(msg)) {
    -    /* priority messages go first */
    -    tail = eq->tail_ems;
    -    if(tail) {
    -      el->prev = tail->prev;
    -      tail->prev = el;
    -      if (tail == eq->tail)
    -	eq->tail = el;
    -    } else {
    -      el->prev = eq->head;
    -      eq->head = el;
    -      if(eq->tail == NULL)
    -	eq->tail = el;
    -    }
    -    eq->tail_ems = el;
    -  } else
    -#endif
    -  {
    -    /* normal messages */
    -    if(eq->tail)
    -      eq->tail->prev = el;
    -    else
    -      eq->head = el;
    -    eq->tail = el;
    -    el->prev = NULL;
    -  }
    -#if defined(INTERLOGD_EMS)
    -  /* if we are inserting message between mark_prev and mark_this,
    -     we have to adjust mark_prev accordingly */
    -  if(eq->mark_this && (el->prev == eq->mark_this))
    -    eq->mark_prev = el;
    -#endif
    -
    -  if(++eq->cur_len > eq->max_len)
    -	  eq->max_len = eq->cur_len;
    -
    -  event_queue_unlock(eq);
    -  /* end of critical section */
    -
    -  return(0);
    -}
    -
    -
    -int
    -event_queue_get(struct event_queue *eq, struct server_msg **msg)
    -{
    -  struct event_queue_msg *el;
    -
    -  assert(eq != NULL);
    -  assert(msg != NULL);
    -
    -  event_queue_lock(eq);
    -  el = eq->head;
    -#if defined(INTERLOGD_EMS)
    -  /* this message is marked for removal, it is first on the queue */
    -  eq->mark_this = el;
    -  eq->mark_prev = NULL;
    -#endif
    -  event_queue_unlock(eq);
    -
    -  if(el == NULL)
    -    return(-1);
    -
    -  *msg = el->msg;
    -
    -  return(0);
    -}
    -
    -
    -int
    -event_queue_remove(struct event_queue *eq)
    -{
    -  struct event_queue_msg *el;
    -#if defined(INTERLOGD_EMS)
    -  struct event_queue_msg *prev;
    -#endif
    -
    -  assert(eq != NULL);
    -
    -  /* this is critical section */
    -  event_queue_lock(eq);
    -#if defined(INTERLOGD_EMS)
    -  el = eq->mark_this;
    -  prev = eq->mark_prev;
    -
    -  if(el == NULL) {
    -    event_queue_unlock(eq);
    -    return(-1);
    -  }
    -
    -  if(prev == NULL) {
    -    /* removing from head of the queue */
    -    eq->head = el->prev;
    -  } else {
    -    /* removing from middle of the queue */
    -    prev->prev = el->prev;
    -  }
    -  if(el == eq->tail) {
    -    /* we are removing the last message */
    -    eq->tail = prev;
    -  }
    -  if(el == eq->tail_ems) {
    -    /* we are removing last priority message */
    -    eq->tail_ems = prev;
    -  }
    -
    -  eq->mark_this = NULL;
    -  eq->mark_prev = NULL;
    -#else
    -  el = eq->head;
    -  if(el == NULL) {
    -	  event_queue_unlock(eq);
    -	  return(-1);
    -  }
    -  eq->head = el->prev;
    -  if(el == eq->tail) {
    -	  eq->tail = NULL;
    -  }
    -#endif
    -  if(--eq->cur_len == 0)
    -	  eq->times_empty++;
    -
    -  if(eq->cur_len <= queue_size_low) {
    -	  eq->throttling = 0;
    -  }
    -
    -  event_queue_unlock(eq);
    -  /* end of critical section */
    -
    -  server_msg_free(el->msg);
    -  free(el);
    -
    -  return(0);
    -}
    -
    -int
    -event_queue_move_events(struct event_queue *eq_s,
    -			struct event_queue *eq_d,
    -			int (*cmp_func)(struct server_msg *, void *),
    -			void *data)
    -{
    -	struct event_queue_msg *p, **source_prev, **dest_tail;
    -
    -	assert(eq_s != NULL);
    -	assert(data != NULL);
    -
    -	event_queue_lock(eq_s);
    -	if(eq_d) {
    -		event_queue_lock(eq_d);
    -		/* dest tail is set to point to the last (NULL) pointer in the list */
    -		dest_tail = (eq_d->head == NULL) ? &(eq_d->head) : &(eq_d->tail->prev);
    -	}
    -	source_prev = &(eq_s->head);
    -	p = *source_prev;
    -	eq_s->tail = NULL;
    -	while(p) {
    -		if((*cmp_func)(p->msg, data)) {
    -			glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -					 "      moving event at offset %d(%d) from %s:%d to %s:%d",
    -					 p->msg->offset, p->msg->generation, 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;
    -			assert(eq_s->cur_len > 0);
    -			eq_s->cur_len--;
    -			if(eq_d) {
    -				/* append the message at the end of destination list */
    -				p->prev = NULL;
    -				*dest_tail = p;
    -				dest_tail = &(p->prev);
    -				eq_d->tail = p;
    -				if(++eq_d->cur_len > eq_d->max_len) {
    -					eq_d->max_len = eq_d->cur_len;
    -				}
    -			} else {
    -				/* signal that the message was 'delivered' */
    -				event_store_commit(p->msg->es, p->msg->ev_len, queue_list_is_log(eq_s),
    -						   p->msg->generation);
    -				/* free the message */
    -				server_msg_free(p->msg);
    -				free(p);
    -			}
    -		} else {
    -			/* message stays */
    -			source_prev = &(p->prev);
    -			eq_s->tail = p;
    -		}
    -		p = *source_prev;
    -	}
    -	if(eq_s->cur_len <= queue_size_low) {
    -		eq_s->throttling = 0;
    -	}
    -	if(eq_d) event_queue_unlock(eq_d);
    -	event_queue_unlock(eq_s);
    -	return(0);
    -}
    -
    diff --git a/org.glite.lb.logger/src/event_store.c b/org.glite.lb.logger/src/event_store.c
    deleted file mode 100644
    index 1824899..0000000
    --- a/org.glite.lb.logger/src/event_store.c
    +++ /dev/null
    @@ -1,1623 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/lb/events_parse.h"
    -
    -#include "interlogd.h"
    -
    -#ifdef __GNUC__
    -#define UNUSED_VAR __attribute__((unused))
    -#else
    -#define UNUSED_VAR
    -#endif
    -
    -static char *file_prefix = NULL;
    -
    -
    -struct event_store_list {
    -	struct event_store *es;
    -	struct event_store_list *next;			// LL of event_store's
    -	struct event_store_list *jobid_next;	   /* double LL of rotated stores - forward */
    -	struct event_store_list *jobid_prev;	   /* double LL of rotated stores - backward */
    -};
    -
    -
    -static struct event_store_list *store_list;
    -static pthread_rwlock_t store_list_lock = PTHREAD_RWLOCK_INITIALIZER;
    -
    -
    -/* ----------------
    - * helper functions
    - * ----------------
    - */
    -static
    -char *
    -astrcat(const char *s1, const char *s2)
    -{
    -	char *s = malloc(strlen(s1) + strlen(s2) + 1);
    -	if(s == NULL)
    -		return NULL;
    -	*s = 0;
    -	strcat(s, s1);
    -	strcat(s, s2);
    -	return s;
    -}
    -
    -
    -static
    -char *
    -jobid2eventfile(IL_EVENT_ID_T job_id)
    -{
    -  char *buffer;
    -  char *hash;
    -
    -  if(job_id) {
    -    hash = IL_EVENT_GET_UNIQUE(job_id);
    -    asprintf(&buffer, "%s.%s", file_prefix, hash);
    -    free(hash);
    -  } else
    -    asprintf(&buffer, "%s.default", file_prefix);
    -
    -  return(buffer);
    -}
    -
    -
    -static
    -char *
    -jobid2controlfile(IL_EVENT_ID_T job_id)
    -{
    -  char buffer[256];
    -  char *hash;
    -
    -  if(job_id) {
    -    hash = IL_EVENT_GET_UNIQUE(job_id);
    -    snprintf(buffer, 256, "%s.%s.ctl", file_prefix, hash);
    -    free(hash);
    -  } else
    -    snprintf(buffer, 256, "%s.default.ctl", file_prefix);
    -
    -  return(strdup(buffer));
    -}
    -
    -static
    -long long
    -fname2index(const char *filename)
    -{
    -	char *p = rindex(filename, '.');
    -	char *s;
    -	long long	ret;
    -
    -	if(p == NULL)
    -		return 0;
    -
    -	for(s = p+1; *s != 0; s++) {
    -		if(*s < '0' || *s > '9') {
    -			return 0;
    -		}
    -	}
    -
    -	sscanf(p+1,"%lld",&ret);
    -	return ret+1;
    -}
    -
    -
    -static
    -char *
    -read_event_string(FILE *file)
    -{
    -  char *buffer, *p, *n;
    -  int  len, c;
    -
    -  buffer=malloc(1024);
    -  if(buffer == NULL) {
    -    set_error(IL_NOMEM, ENOMEM, "read_event_string: no room for event");
    -    return(NULL);
    -  }
    -  p = buffer;
    -  len = 1024;
    -
    -  while((c=fgetc(file)) != EOF) {
    -
    -    /* we have to have free room for one byte */
    -    /* if(len - (p - buffer) < 1) */
    -    if(p - buffer >= len) {
    -      n = realloc(buffer, len + 8192);
    -      if(n == NULL) {
    -	free(buffer);
    -	set_error(IL_NOMEM, ENOMEM, "read_event_string: no room for event");
    -	return(NULL);
    -      }
    -      p = p - buffer + n;
    -      buffer = n;
    -      len += 8192;
    -    }
    -
    -    if(c == EVENT_SEPARATOR) {
    -      *p++ = 0;
    -      break;
    -    } else
    -      *p++ = (char) c;
    -  }
    -
    -  if(c != EVENT_SEPARATOR) {
    -    free(buffer);
    -    return(NULL);
    -  }
    -
    -  return(buffer);
    -}
    -
    -
    -
    -/* ------------------------------
    - * event_store 'member' functions
    - * ------------------------------
    - */
    -static
    -int
    -event_store_free(struct event_store *es)
    -{
    -  assert(es != NULL);
    -
    -  if(es->job_id_s) free(es->job_id_s);
    -  if(es->event_file_name) free(es->event_file_name);
    -  if(es->control_file_name) free(es->control_file_name);
    -  pthread_rwlock_destroy(&es->use_lock);
    -  pthread_rwlock_destroy(&es->commit_lock);
    -  pthread_rwlock_destroy(&es->offset_lock);
    -  free(es);
    -
    -  return(0);
    -}
    -
    -
    -static
    -struct event_store *
    -event_store_create(char *job_id_s, const char *filename)
    -{
    -  struct event_store *es;
    -  IL_EVENT_ID_T job_id;
    -
    -  es = malloc(sizeof(*es));
    -  if(es == NULL) {
    -    set_error(IL_NOMEM, ENOMEM, "event_store_create: error allocating room for structure");
    -    return(NULL);
    -  }
    -
    -  memset(es, 0, sizeof(*es));
    -
    -  job_id = NULL;
    -  if(strcmp(job_id_s, "default") && IL_EVENT_ID_PARSE(job_id_s, &job_id)) {
    -    set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM, "event_store_create: error parsing id");
    -    free(es);
    -    return(NULL);
    -  }
    -
    -  es->job_id_s = strdup(job_id_s);
    -  es->event_file_name = filename ? strdup(filename) : jobid2eventfile(job_id);
    -  es->control_file_name = filename ? astrcat(filename, ".ctl") : jobid2controlfile(job_id);
    -  es->rotate_index = filename ? fname2index(filename) : 0;
    -  IL_EVENT_ID_FREE(job_id);
    -
    -  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		   "  creating event store for id %s, filename %s, rotate index %lld",
    -		   job_id_s, es->event_file_name, es->rotate_index);
    -
    -  if(pthread_rwlock_init(&es->commit_lock, NULL))
    -          abort();
    -  if(pthread_rwlock_init(&es->offset_lock, NULL))
    -          abort();
    -  if(pthread_rwlock_init(&es->use_lock, NULL))
    -	  abort();
    -
    -  return(es);
    -}
    -
    -
    -static
    -int
    -event_store_lock(struct event_store *es)
    -{
    -  assert(es != NULL);
    -
    -  if(pthread_rwlock_wrlock(&es->commit_lock))
    -    abort();
    -
    -  return(0);
    -}
    -
    -
    -static
    -int
    -event_store_unlock(struct event_store *es)
    -{
    -  assert(es != NULL);
    -
    -  if(pthread_rwlock_unlock(&es->commit_lock))
    -    abort();
    -  return(0);
    -}
    -
    -
    -static
    -int
    -event_store_read_ctl(struct event_store *es)
    -{
    -  FILE *ctl_file;
    -
    -  assert(es != NULL);
    -
    -  event_store_lock(es);
    -  if((ctl_file = fopen(es->control_file_name, "r")) == NULL) {
    -    /* no control file, new event file */
    -    es->last_committed_ls = 0;
    -    es->last_committed_bs = 0;
    -  } else {
    -    /* read last seen and last committed counts */
    -    fscanf(ctl_file, "%*s\n%ld\n%ld\n",
    -	   &es->last_committed_ls,
    -	   &es->last_committed_bs);
    -    fclose(ctl_file);
    -  }
    -  event_store_unlock(es);
    -
    -  return(0);
    -}
    -
    -
    -static
    -int
    -event_store_write_ctl(struct event_store *es)
    -{
    -  FILE   *ctl;
    -
    -  assert(es != NULL);
    -
    -  ctl = fopen(es->control_file_name, "w");
    -  if(ctl == NULL) {
    -    set_error(IL_SYS, errno, "event_store_write_ctl: error opening control file");
    -    return(-1);
    -  }
    -
    -  if(fprintf(ctl, "%s\n%ld\n%ld\n",
    -	     es->job_id_s,
    -	     es->last_committed_ls,
    -	     es->last_committed_bs) < 0) {
    -    set_error(IL_SYS, errno, "event_store_write_ctl: error writing control record");
    -    return(-1);
    -  }
    -
    -  if(fclose(ctl) < 0) {
    -    set_error(IL_SYS, errno, "event_store_write_ctl: error closing control file");
    -    return(-1);
    -  }
    -
    -  return(0);
    -}
    -
    -
    -/*
    - * event_store_qurantine()
    - *   - rename damaged event store file
    - *   - essentially does the same actions as cleanup, but the event store
    - *     does not have to be empty
    - * returns 0 on success, -1 on error
    - */
    -static
    -int
    -event_store_quarantine(struct event_store *es)
    -{
    -	// TODO enable cleanup of quarantined event_store struct
    -	// TODO	handle file rotation
    -
    -	int num;
    -	char newname[MAXPATHLEN+1];
    -
    -	/* find available quarantine name */
    -	/* we give it at most 1024 tries */
    -	for(num = 0; num < 1024; num++) {
    -		struct stat st;
    -
    -		snprintf(newname, MAXPATHLEN, "%s.quarantine.%d", es->event_file_name, num);
    -		newname[MAXPATHLEN] = 0;
    -		if(stat(newname, &st) < 0) {
    -			if(errno == ENOENT) {
    -				/* file not found */
    -				break;
    -			} else {
    -				/* some other error with name, probably permanent */
    -				set_error(IL_SYS, errno, "event_store_qurantine: error looking for quarantine filename");
    -				return(-1);
    -
    -			}
    -		} else {
    -			/* the filename is used already */
    -		}
    -	}
    -	if(num >= 1024) {
    -		/* new name not found */
    -		/* XXX - is there more suitable error? */
    -		set_error(IL_SYS, ENOSPC, "event_store_quarantine: exhausted number of retries looking for quarantine filename");
    -		return(-1);
    -	}
    -
    -	/* actually rename the file */
    -	glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_WARN, 
    -			 "    renaming damaged event file from %s to %s",
    -			 es->event_file_name, newname);
    -	if(rename(es->event_file_name, newname) < 0) {
    -		set_error(IL_SYS, errno, "event_store_quarantine: error renaming event file");
    -		return(-1);
    -	}
    -
    -	/* clear the counters */
    -	es->last_committed_ls = 0;
    -	es->last_committed_bs = 0;
    -	es->offset = 0;
    -
    -	/* increase cleanup count, this will invalidate all commits from previous generation */
    -	es->generation++;
    -
    -	return(0);
    -}
    -
    -
    -/*
    - * event_store_rotate_file()
    - * returns 0 on success, -1 on error
    - */
    -static
    -int
    -event_store_rotate_file(struct event_store *es)
    -{
    -	int num;
    -	time_t timestamp = time(NULL);
    -	char newname[MAXPATHLEN+1];
    -
    -	/* do not rotate already rotated files */
    -	if(es->rotate_index > 0)
    -		return 0;
    -
    -	/* find available name */
    -	/* we give it at most 256 tries */
    -	for(num = 0; num < 256; num++) {
    -		struct stat st;
    -
    -		snprintf(newname, MAXPATHLEN, "%s.%d%03d", es->event_file_name, (int) timestamp, num);
    -		newname[MAXPATHLEN] = 0;
    -		if(stat(newname, &st) < 0) {
    -			if(errno == ENOENT) {
    -				/* file not found */
    -				break;
    -			} else {
    -				/* some other error with name, probably permanent */
    -				set_error(IL_SYS, errno, "event_store_rotate_file: error looking for available filename");
    -				return(-1);
    -
    -			}
    -		} else {
    -			/* the filename is used already */
    -		}
    -	}
    -	if(num >= 1024) {
    -		/* new name not found */
    -		/* XXX - is there more suitable error? */
    -		set_error(IL_SYS, ENOSPC, "event_store_quarantine: exhausted number of retries looking for quarantine filename");
    -		return(-1);
    -	}
    -
    -	/* actually rename the file */
    -	glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_INFO, 
    -			 "    renaming too large event file from %s to %s",
    -			 es->event_file_name, newname);
    -	if(rename(es->event_file_name, newname) < 0) {
    -		set_error(IL_SYS, errno, "event_store_rotate_file: error renaming event file");
    -		return(-1);
    -	}
    -
    -	/* change names in event_store */
    -	es->event_file_name = strdup(newname);
    -	es->control_file_name = astrcat(newname, ".ctl");
    -	es->rotate_index = 1000*timestamp + num + 1;
    -
    -	return(0);
    -}
    -
    -
    -/*
    - * event_store_recover_jobid()
    - *  - recover all event stores for given jobid
    - */
    -static
    -int
    -event_store_recover_jobid(struct event_store *es)
    -{
    -	// es is locked for use already
    -	struct event_store_list *p = es->le;
    -
    -	do {
    -		event_store_recover(p->es);
    -		if(p != es->le ) {
    -			event_store_release(p->es);
    -		}
    -
    -		if(pthread_rwlock_rdlock(&store_list_lock))
    -			abort();
    -		p = p->jobid_next;
    -		if(p != es->le) {
    -			if(pthread_rwlock_rdlock(&p->es->use_lock))
    -				abort();
    -		}
    -		if(pthread_rwlock_unlock(&store_list_lock))
    -			abort();
    -
    -
    -	} while(p != es->le);
    -
    -	return 0;
    -}
    -
    -#if defined(IL_NOTIFICATIONS)
    -static
    -int
    -cmp_jobid(struct server_msg *msg, void *data)
    -{
    -	assert(msg != NULL);
    -	assert(data != NULL);
    -
    -	char *job_id_s = (char*)data;
    -	return strcmp(msg->job_id_s, job_id_s) == 0;
    -}
    -
    -struct cmp_exp_data {
    -	char *job_id_s;
    -	time_t expires;
    -};
    -
    -static
    -int
    -cmp_jobid_set_exp(struct server_msg *msg, void *data)
    -{
    -	struct cmp_exp_data *m = (struct cmp_exp_data *)data;
    -
    -	assert(msg != NULL);
    -	assert(data != NULL);
    -
    -	if(strcmp(msg->job_id_s, m->job_id_s) == 0) {
    -		msg->expires = m->expires;
    -	}
    -	return 0;
    -}
    -#endif
    -
    -/*
    - * event_store_recover()
    - *   - recover after restart or catch up when events missing in IPC
    - *   - if offset > 0, read everything behind it
    - *   - if offset == 0, read everything behind min(last_committed_bs, last_committed_es)
    - */
    -int
    -event_store_recover(struct event_store *es)
    -{
    -  struct event_queue *eq_l = NULL, *eq_b = NULL;
    -  struct server_msg *msg;
    -  char *event_s;
    -  int fd, ret;
    -  int throttle;
    -  long fpos, last;
    -  FILE *ef;
    -  struct flock efl;
    -  char err_msg[128];
    -  struct stat stbuf;
    -#if defined(IL_NOTIFICATIONS)
    -  char *last_dest = NULL;
    -  time_t last_exp = 0;
    -#endif
    -
    -  assert(es != NULL);
    -
    -#if defined(IL_NOTIFICATIONS)
    -  /* destination queue has to be found for each message separately, */
    -  /* this is current known destination for our notification id (may be NULL!) */
    -  eq_b = notifid_map_get_dest(es->job_id_s);
    -#else
    -  /* get log server queue */
    -  eq_l = queue_list_get(NULL);
    -  /* find bookkeeping server queue */
    -  eq_b = queue_list_get(es->job_id_s);
    -  if(eq_b == NULL)
    -    return(-1);
    -#endif
    -
    -  /* lock the event_store and offset locks */
    -  event_store_lock(es);
    -  if(pthread_rwlock_wrlock(&es->offset_lock))
    -	  abort();
    -
    -  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		   "  reading events from %s", 
    -		   es->event_file_name);
    -
    -  /* open event file */
    -  ef = fopen(es->event_file_name, "r");
    -  if(ef == NULL) {
    -	  snprintf(err_msg, sizeof(err_msg),
    -		   "event_store_recover: error opening event file %s",
    -		   es->event_file_name);
    -	  set_error(IL_SYS, errno, err_msg);
    -	  event_store_unlock(es);
    -	  if(pthread_rwlock_unlock(&es->offset_lock))
    -		  abort();
    -	  return(-1);
    -  }
    -
    -  /* lock the file for reading (we should not read while dglogd is writing) */
    -  fd = fileno(ef);
    -  efl.l_type = F_RDLCK;
    -  efl.l_whence = SEEK_SET;
    -  efl.l_start = 0;
    -  efl.l_len = 0;
    -  if(fcntl(fd, F_SETLKW, &efl) < 0) {
    -	  snprintf(err_msg, sizeof(err_msg),
    -		   "event_store_recover: error locking event file %s",
    -		   es->event_file_name);
    -	  set_error(IL_SYS, errno, err_msg);
    -	  event_store_unlock(es);
    -	  if(pthread_rwlock_unlock(&es->offset_lock))
    -		  abort();
    -	  fclose(ef);
    -	  return(-1);
    -  }
    -
    -  /* check the file modification time and size to avoid unnecessary operations */
    -  memset(&stbuf, 0, sizeof(stbuf));
    -  if(fstat(fd, &stbuf) < 0) {
    -	  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_ERROR, 
    -			   "    could not stat event file %s: %s", 
    -			   es->event_file_name, strerror(errno));
    -	  fclose(ef);
    -	  event_store_unlock(es);
    -	  if(pthread_rwlock_unlock(&es->offset_lock))
    -		  abort();
    -	  return -1;
    -  } else {
    -	  if((es->offset == stbuf.st_size) && (es->last_modified == stbuf.st_mtime)) {
    -		  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -				   "  event file not modified since last visit, skipping");
    -		  fclose(ef);
    -		  event_store_unlock(es);
    -		  if(pthread_rwlock_unlock(&es->offset_lock))
    -			  abort();
    -		  return(0);
    -	  }
    -  }
    -
    -  /* check the file size, rename it if it is bigger than max_store_size */
    -  if(max_store_size > 0 && stbuf.st_size > max_store_size) {
    -	  event_store_rotate_file(es);
    -  }
    -
    -  while(1) { /* try, try, try */
    -
    -	  /* get the position in file to be sought */
    -	  if(es->offset)
    -		  last = es->offset;
    -	  else {
    -#if !defined(IL_NOTIFICATIONS)
    -		  if(eq_b == eq_l)
    -			  last = es->last_committed_ls;
    -		  else
    -#endif
    -			  /* last = min(ls, bs) */
    -			  /* I took the liberty to optimize this,
    -			     since LS is not used. */
    -			  /* last = (es->last_committed_bs <
    -			     es->last_committed_ls) ? es->last_committed_bs :
    -			     es->last_committed_ls; */
    -			  last = es->last_committed_bs;
    -	  }
    -
    -	  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -			   "    setting starting file position to  %ld", last);
    -	  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -			   "    bytes sent to logging server: %d", es->last_committed_ls);
    -	  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -			   "    bytes sent to bookkeeping server: %d", es->last_committed_bs);
    -
    -	  if(last > 0) {
    -		  int c;
    -
    -		  /* skip all committed or already enqueued events */
    -		  /* be careful - check, if the offset really points to the
    -		     beginning of event string */
    -		  if(fseek(ef, last-1, SEEK_SET) < 0) {
    -			  set_error(IL_SYS, errno, "event_store_recover: error setting position for read");
    -			  event_store_unlock(es);
    -			  fclose(ef);
    -			  if(pthread_rwlock_unlock(&es->offset_lock))
    -				  abort();
    -			  return(-1);
    -		  }
    -		  /* the last enqueued event MUST end with EVENT_SEPARATOR,
    -		     even if the offset points at EOF */
    -		  if((c=fgetc(ef)) != EVENT_SEPARATOR) {
    -			  /* Houston, we have got a problem */
    -			  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_WARN,
    -					   "    file position %ld does not point at the beginning of event string, backing off!",
    -					   last);
    -			  /* now, where were we? */
    -			  if(es->offset) {
    -				  /* next try will be with
    -				     last_commited_bs */
    -				  es->offset = 0;
    -			  } else {
    -				  /* this is really weird... back off completely */
    -				  es->last_committed_ls = es->last_committed_bs = 0;
    -			  }
    -		  } else {
    -			  /* OK, break out of the loop */
    -			  break;
    -		  }
    -	  } else {
    -		  /* this breaks out of the loop, we are starting at
    -		   * the beginning of file
    -		   */
    -		  if(fseek(ef, 0, SEEK_SET) < 0) {
    -			  set_error(IL_SYS, errno, "event_store_recover: error setting position for read");
    -			  event_store_unlock(es);
    -			  fclose(ef);
    -			  if(pthread_rwlock_unlock(&es->offset_lock))
    -				  abort();
    -			  return(-1);
    -		  }
    -		  break;
    -	  }
    -  }
    -
    -  /* now we have:
    -   *   - event file opened at position 'last'
    -   *   - offset and last_committed_* potentially reset to zero
    -   */
    -
    -  /* release lock on commits, offset remains locked;
    -   * other threads are allowed to send/remove events, but not insert
    -   */
    -  event_store_unlock(es);
    -
    -  /* enqueue all remaining events */
    -  ret = 1;
    -  msg = NULL;
    -  throttle = 0;
    -  fpos = last;
    -  while((event_s=read_event_string(ef)) != NULL) {
    -    long last_ls, last_bs;
    -    int r;
    -
    -    /* fpos holds the starting position of event_s in file */
    -    glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		     "    reading event at %ld", fpos);
    -
    -    last_ls = es->last_committed_ls;
    -    last_bs = es->last_committed_bs;
    -
    -    /* break from now on means there was some error */
    -    ret = -1;
    -
    -    /* create message for server */
    -    {
    -	    il_octet_string_t e;
    -
    -	    e.data = event_s;
    -	    e.len = strlen(event_s);
    -	    msg = server_msg_create(&e, last);
    -	    free(event_s);
    -    }
    -    if(msg == NULL) {
    -	    glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_WARN, 
    -			     "    event file corrupted! I will try to move it to quarantine (ie. rename it).");
    -	    /* actually do not bother if quarantine succeeded or not - we could not do more */
    -	    event_store_quarantine(es);
    -	    fclose(ef);
    -	    if(pthread_rwlock_unlock(&es->offset_lock))
    -		    abort();
    -	    return(-1);
    -    }
    -    msg->es = es;
    -    msg->generation = es->generation;
    -
    -#ifdef IL_NOTIFICATIONS
    -    glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		     "message dest %s, last dest %s, known dest %s",
    -		     msg->dest, last_dest, eq_b ? eq_b->dest : "none");
    -    /* check message destination */
    -    if(msg->dest == NULL) {
    -            /* the message does not have destination itself, use destination cached for notification id */
    -	    if(eq_b == NULL) {
    -		    /* no destination is known for notification id, commit it immediately */
    -		    glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -				     "    message has no known destination, will not be sent");
    -		    event_store_commit(es, msg->ev_len, 0, msg->generation);
    -	    }
    -    } else {
    -        /* check if we know destination for notification id */
    -        if(eq_b == NULL) {
    -        	eq_b = queue_list_get(msg->dest);
    -		if(notifid_map_set_dest(es->job_id_s, eq_b) < 0) {
    -			break;
    -		}
    -        }
    -	/* remember last message destination */
    -	if(last_dest == NULL || strcmp(msg->dest, last_dest) != 0) {
    -		/* destination changed */
    -		if(last_dest) {
    -			free(last_dest);
    -		}
    -		last_dest = strdup(msg->dest);
    -	}
    -    }
    -
    -    /* check message expiration */
    -    if(last_exp == 0 || last_exp != msg->expires) {
    -    	last_exp = msg->expires;
    -    }
    -#else
    -    /* first enqueue to the LS */
    -    if(!bs_only && (last >= last_ls)) {
    -
    -	    glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -			     "      queuing event at %ld to logging server", last);
    -
    -      /* TODO: throttling for the log server queue? */
    -      if(enqueue_msg(eq_l, msg) < 0) {
    -    	  break;
    -      }
    -    }
    -#endif
    -
    -    /* now enqueue to the BS, if necessary */
    -    if(!throttle && (eq_b != eq_l) && (last >= last_bs)) {
    -
    -      if((r=enqueue_msg(eq_b, msg)) < 0) {
    -    	  break;
    -      } else if(r > 0) {
    -	      throttle = 1;
    -	      glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_INFO, 
    -			       "      queue max length limit reached, event at %ld throttled", fpos);
    -      } else {
    -	      glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -			       "      queuing event at %ld to bookkeeping server", last);
    -      }
    -    }
    -    server_msg_free(msg);
    -    msg = NULL;
    -
    -    fpos = ftell(ef);
    -    /* now last is also the offset behind the last successfully queued event */
    -    if(!throttle) {
    -	    last = fpos;
    -    }
    -
    -    /* ret == 0 means EOF or incomplete event found */
    -    ret = 0;
    -
    -  } /* while */
    -
    -#if defined(IL_NOTIFICATIONS)
    -  /* check if we have to move events to new destination */
    -  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		   "    last destination %s, last known destination %s", 
    -		   last_dest, eq_b ? eq_b->dest : "none");
    -  if(last_dest && strcmp(last_dest, eq_b->dest)) {
    -	  struct event_queue *eq_dest = queue_list_get(last_dest);
    -
    -	  /* set new destination */
    -	  if(notifid_map_set_dest(es->job_id_s, eq_dest) < 0) {
    -		  ret = -1;
    -	  } else {
    -
    -		  /* move all events with this notif_id from eq_b to eq_dest */
    -		  event_queue_move_events(eq_b, eq_dest, cmp_jobid, es->job_id_s);
    -		  eq_b = eq_dest;
    -		  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_INFO, 
    -				   "    all messages for notif id %s are now destined to %s",
    -			 es->job_id_s, eq_b->dest);
    -		  if(event_queue_create_thread(eq_b) < 0) {
    -			  ret = -1;
    -		  } else {
    -			  event_queue_cond_lock(eq_b);
    -			  event_queue_signal(eq_b);
    -			  event_queue_cond_unlock(eq_b);
    -		  }
    -	  }
    -  }
    -  if(last_dest) {
    -	  free(last_dest);
    -	  last_dest = NULL;
    -  }
    -
    -  /* if the expiration changed, set new one */
    -  if(eq_b && last_exp != notifid_map_get_expiration(es->job_id_s)) {
    -	  struct cmp_exp_data data;
    -
    -	  notifid_map_set_expiration(es->job_id_s, last_exp);
    -	  /* set expiration for all events with this notif id */
    -	  data.job_id_s = es->job_id_s;
    -	  data.expires = last_exp;
    -	  event_queue_move_events(eq_b, NULL, cmp_jobid_set_exp, &data);
    -  }
    -#endif
    -
    -  es->offset = last;
    -  es->last_modified = stbuf.st_mtime;
    -  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		   "  event store offset set to %ld", last);
    -
    -  if(msg)
    -    server_msg_free(msg);
    -
    -  fclose(ef);
    -  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		   "  finished reading events with %d", ret);
    -
    -  if(pthread_rwlock_unlock(&es->offset_lock))
    -	  abort();
    -
    -  return(ret);
    -}
    -
    -
    -/*
    - * event_store_sync()
    - *   - check the position of event and fill holes from file
    - *   - return 1 if the event is new,
    - *            0 if it was seen before,
    - *           -1 if there was an error
    - */
    -int
    -event_store_sync(struct event_store *es, long offset)
    -{
    -  int ret;
    -
    -  assert(es != NULL);
    -
    -  /* Commented out due to the fact that offset as received on socket
    -   * has little to do with the real event file at the moment. The
    -   * event will be read from file, socket now serves only to notify
    -   * about possible event file change.
    -   */
    -  ret = event_store_recover_jobid(es);
    -  ret = (ret < 0) ? ret : 0;
    -  return(ret);
    -}
    -
    -
    -int
    -event_store_next(struct event_store *es, long offset, int len)
    -{
    -  assert(es != NULL);
    -
    -  /* offset as received on socket
    -   * has little to do with real event file at the moment. es->offset
    -   * handling is left solely to the event_store_recover().
    -   */
    -
    -  return(0);
    -}
    -
    -
    -/*
    - * event_store_commit()
    - *
    - */
    -int
    -event_store_commit(struct event_store *es, int len, int ls, int generation)
    -{
    -  assert(es != NULL);
    -
    -  /* do not move counters if event store with this message was cleaned up
    -   * (this can happen only when moving to quarantine)
    -   */
    -  /* XXX - assume int access is atomic */
    -  if(generation != es->generation)
    -	  return 0;
    -
    -  event_store_lock(es);
    -
    -  if(ls)
    -    es->last_committed_ls += len;
    -  else {
    -    es->last_committed_bs += len;
    -    if (bs_only) es->last_committed_ls += len;
    -  }
    -
    -  if(event_store_write_ctl(es) < 0) {
    -    event_store_unlock(es);
    -    return(-1);
    -  }
    -
    -  event_store_unlock(es);
    -
    -
    -  return(0);
    -}
    -
    -
    -/*
    - * event_store_clean()
    - *  - remove the event files (event and ctl), if they are not needed anymore
    - *  - returns 0 if event_store is in use, 1 if it was removed and -1 on error
    - *
    - * Q: How do we know that we can safely remove the files?
    - * A: When all events from file have been committed both by LS and BS.
    - */
    -static
    -int
    -event_store_clean(struct event_store *es)
    -{
    -  long last;
    -  int fd;
    -  FILE *ef;
    -  struct flock efl;
    -
    -  assert(es != NULL);
    -
    -  /* prevent sender threads from updating */
    -  event_store_lock(es);
    -
    -  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		   "  trying to cleanup event store %s", es->job_id_s);
    -  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		   "    bytes sent to logging server: %d", es->last_committed_ls);
    -  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		   "    bytes sent to bookkeeping server: %d", es->last_committed_bs);
    -
    -  /* preliminary check to avoid opening event file */
    -  /* if the positions differ, some events still have to be sent */
    -  if(es->last_committed_ls != es->last_committed_bs) {
    -    event_store_unlock(es);
    -    glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		     "  not all events sent, cleanup aborted");
    -    return(0);
    -  }
    -
    -  if((fd = pthread_rwlock_wrlock(&es->offset_lock)) != 0) {
    -	  abort();
    -  }
    -
    -  /* the file can only be removed when all the events were succesfully sent
    -     (ie. committed both by LS and BS */
    -  /* That also implies that the event queues are 'empty' at the moment. */
    -  ef = fopen(es->event_file_name, "r+");
    -  if(ef == NULL) {
    -    /* if we can not open the event store, it is an error and the struct should be removed */
    -    /* XXX - is it true? */
    -    event_store_unlock(es);
    -    if(pthread_rwlock_unlock(&es->offset_lock))
    -	    abort();
    -    glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_ERROR,  
    -		     "  event_store_clean: error opening event file: %s", strerror(errno));
    -    return(1);
    -  }
    -
    -  fd = fileno(ef);
    -
    -  /* prevent local-logger from writing into event file */
    -  efl.l_type = F_WRLCK;
    -  efl.l_whence = SEEK_SET;
    -  efl.l_start = 0;
    -  efl.l_len = 0;
    -  if(fcntl(fd, F_SETLK, &efl) < 0) {
    -	  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_WARN, 
    -			  "    could not lock event file, cleanup aborted");
    -    fclose(ef);
    -    event_store_unlock(es);
    -    if(pthread_rwlock_unlock(&es->offset_lock))
    -	    abort();
    -    if(errno != EACCES &&
    -       errno != EAGAIN) {
    -      set_error(IL_SYS, errno, "event_store_clean: error locking event file");
    -      return(-1);
    -    }
    -    return(0);
    -  }
    -
    -  /* now the file should not contain partially written event, so it is safe
    -     to get offset behind last event by seeking the end of file */
    -  if(fseek(ef, 0, SEEK_END) < 0) {
    -    set_error(IL_SYS, errno, "event_store_clean: error seeking the end of file");
    -    event_store_unlock(es);
    -    if(pthread_rwlock_unlock(&es->offset_lock))
    -	    abort();
    -    fclose(ef);
    -    return(-1);
    -  }
    -
    -  last = ftell(ef);
    -  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		   "    total bytes in file: %d", last);
    -
    -  if(es->last_committed_ls < last) {
    -    fclose(ef);
    -    event_store_unlock(es);
    -    if(pthread_rwlock_unlock(&es->offset_lock))
    -	    abort();
    -    glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		     "    events still waiting in queue, cleanup aborted");
    -    return(0);
    -  } else if( es->last_committed_ls > last) {
    -	  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_WARN, 
    -			   "  warning: event file seems to shrink!");
    -	  /* XXX - in that case we can not continue because there may be
    -	     some undelivered events referring to that event store */
    -	  fclose(ef);
    -	  event_store_unlock(es);
    -	  if(pthread_rwlock_unlock(&es->offset_lock))
    -		  abort();
    -	  return(0);
    -  }
    -
    -  /* now we are sure that all events were sent and the event queues are empty */
    -  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_INFO, 
    -		   "    removing event file %s", es->event_file_name);
    -
    -  /* remove the event file */
    -  unlink(es->event_file_name);
    -  unlink(es->control_file_name);
    -
    -  /* clear the counters */
    -  es->last_committed_ls = 0;
    -  es->last_committed_bs = 0;
    -  es->offset = 0;
    -
    -  /* increasing the generation count is rather pointless here, because there
    -     are no messages waiting in the queue that would be invalidated */
    -  /* es->generation++ */
    -
    -  /* unlock the event_store even if it is going to be removed */
    -  event_store_unlock(es);
    -  if(pthread_rwlock_unlock(&es->offset_lock))
    -	  abort();
    -
    -  /* close the event file (that unlocks it as well) */
    -  fclose(ef);
    -
    -  /* indicate that it is safe to remove this event_store */
    -  return(1);
    -}
    -
    -
    -/* --------------------------------
    - * event store management functions
    - * --------------------------------
    - */
    -struct event_store *
    -event_store_find(char *job_id_s, const char *filename)
    -{
    -  struct event_store_list *q, *p, *d;
    -  struct event_store *es;
    -
    -  if(pthread_rwlock_wrlock(&store_list_lock)) {
    -	  abort();
    -  }
    -
    -  es = NULL;
    -
    -  d = NULL;
    -  p = store_list;
    -
    -  while(p) {
    -    if(strcmp(p->es->job_id_s, job_id_s) == 0) {
    -	    es = p->es;
    -	    d = p;
    -    	// if filename was given, compare it as well
    -	    if((filename == NULL && p->es->rotate_index == 0) ||
    -	       (filename != NULL && strcmp(p->es->event_file_name, filename) == 0)) {
    -    		if(pthread_rwlock_rdlock(&es->use_lock))
    -    			abort();
    -    		if(pthread_rwlock_unlock(&store_list_lock))
    -    			abort();
    -    		return(es);
    -    	}
    -    }
    -    p = p->next;
    -  }
    -
    -  // event store for given jobid and filename was not found, create one
    -  es = event_store_create(job_id_s, filename);
    -  if(es == NULL) {
    -	  if(pthread_rwlock_unlock(&store_list_lock))
    -		  abort();
    -	  return(NULL);
    -  }
    -
    -  p = malloc(sizeof(*p));
    -  if(p == NULL) {
    -    set_error(IL_NOMEM, ENOMEM, "event_store_find: no room for new event store");
    -      if(pthread_rwlock_unlock(&store_list_lock))
    -	      abort();
    -    return(NULL);
    -  }
    -  p->es = es;
    -  p->jobid_next = p;
    -  p->jobid_prev = p;
    -  es->le = p;
    -
    -  if(filename != NULL && d != NULL) {
    -	  // there is another event store for this jobid;
    -	  // 	d points to the last event store for this jobid in LL
    -	  // find proper place to insert new event store
    -	  if(p->es->rotate_index == 0) {
    -		  // insert behind d in LL
    -		  p->next = d->next;
    -		  d->next = p;
    -		  // insert behind d in jobid LL
    -		  p->jobid_next = d->jobid_next;
    -		  p->jobid_prev = d;
    -		  d->jobid_next->jobid_prev = p;
    -		  d->jobid_next = p;
    -	  } else {
    -		  struct event_store_list *r;
    -		  q = NULL;
    -		  for(r = d->jobid_next; r != d->jobid_next; r = r->jobid_next) {
    -			  if(p->es->rotate_index < r->es->rotate_index)
    -				  break;
    -			  if(r->es->rotate_index > 0)
    -				  q = r;
    -		  }
    -		  // q has the last lesser non-zero index than p
    -		  if(q == NULL) {
    -			  p->next = store_list;
    -			  store_list = p;
    -			  // insert behind d
    -			  p->jobid_next = d->jobid_next;
    -			  p->jobid_prev = d;
    -			  d->jobid_next->jobid_prev = p;
    -			  d->jobid_next = p;
    -		  } else {
    -			  p->next = q->next;
    -			  q->next = p;
    -			  // insert behind q
    -			  p->jobid_next = q->jobid_next;
    -			  p->jobid_prev = q;
    -			  q->jobid_next->jobid_prev = p;
    -			  q->jobid_next = p;
    -		  }
    -	  }
    -  } else {
    -	  // insert at the beginning
    -	  p->next = store_list;
    -	  store_list = p;
    -  }
    -
    -  if(pthread_rwlock_rdlock(&es->use_lock))
    -	  abort();
    -
    -  if(pthread_rwlock_unlock(&store_list_lock))
    -	  abort();
    -
    -  return(es);
    -}
    -
    -
    -int
    -event_store_release(struct event_store *es)
    -{
    -	assert(es != NULL);
    -
    -	if(pthread_rwlock_unlock(&es->use_lock))
    -		abort();
    -	glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -			 "  released lock on %s (%s)", es->job_id_s, es->event_file_name);
    -	return(0);
    -}
    -
    -
    -static
    -int
    -event_store_from_file(char *filename)
    -{
    -	struct event_store *es;
    -	FILE *event_file;
    -	char *event_s, *job_id_s = NULL;
    -	int ret;
    -#if defined(IL_NOTIFICATIONS)
    -	edg_wll_Event *notif_event;
    -	edg_wll_Context context;
    -#endif
    -
    -	glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_INFO, 
    -			 "  attaching to event file: %s", filename);
    -
    -	if(strstr(filename, "quarantine") != NULL) {
    -		glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, "  file name belongs to quarantine, not touching that.");
    -		return(0);
    -	}
    -
    -	event_file = fopen(filename, "r");
    -	if(event_file == NULL) {
    -		set_error(IL_SYS, errno, "event_store_from_file: error opening event file");
    -		return(-1);
    -	}
    -	event_s = read_event_string(event_file);
    -	fclose(event_file);
    -	if(event_s == NULL)
    -		return(0);
    -
    -#if defined(IL_NOTIFICATIONS)
    -	edg_wll_InitContext(&context);
    -	ret=edg_wll_ParseNotifEvent(context, event_s, ¬if_event);
    -	edg_wll_FreeContext(context);
    -	if(ret) {
    -		set_error(IL_LBAPI, ret, "event_store_from_file: could not parse event");
    -		ret = -1;
    -		goto out;
    -	}
    -	if(notif_event->notification.notifId == NULL) {
    -		set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM,
    -			  "event_store_from_file: parse error - no notif id");
    -		ret = -1;
    -		goto out;
    -	}
    -	if((job_id_s = edg_wll_NotifIdUnparse(notif_event->notification.notifId)) == NULL) {
    -		set_error(IL_SYS, ENOMEM, "event_store_from_file: could not copy id");
    -		ret = -1;
    -		goto out;
    -	}
    -	/*  XXX: what was that good for?
    -	if(notif_event->notification.dest_host &&
    -	   (strlen(notif_event->notification.dest_host) > 0)) {
    -		char *dest_name = NULL;
    -		asprintf(&dest_name, "%s:%d", notif_event->notification.dest_host, notif_event->notification.dest_port);
    -	}
    -	*/
    -
    -#else
    -	job_id_s = edg_wll_GetJobId(event_s);
    -#endif
    -	glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -			 "  event id: '%s'", job_id_s);
    -	if(job_id_s == NULL) {
    -		glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -				 "  skipping file, could not parse event");
    -		ret = 0;
    -		goto out;
    -	}
    -
    -	es = event_store_find(job_id_s, filename);
    -
    -	if(es == NULL) {
    -		ret = -1;
    -		goto out;
    -	}
    -
    -	if((es->last_committed_ls == 0) &&
    -	   (es->last_committed_bs == 0) &&
    -	   (es->offset == 0)) {
    -		ret = event_store_read_ctl(es);
    -	} else
    -		ret = 0;
    -
    -	event_store_release(es);
    -
    -out:
    -#if defined(IL_NOTIFICATIONS)
    -	if(notif_event) {
    -		edg_wll_FreeEvent(notif_event);
    -		free(notif_event);
    -	}
    -#endif
    -	if(event_s) free(event_s);
    -	if(job_id_s) free(job_id_s);
    -	return(ret);
    -}
    -
    -
    -int
    -event_store_init(char *prefix)
    -{
    -  if(file_prefix == NULL) {
    -    file_prefix = strdup(prefix);
    -    store_list = NULL;
    -  }
    -
    -  /* read directory and get a list of event files */
    -  {
    -    int len;
    -
    -    char *p, *dir;
    -    DIR *event_dir;
    -    struct dirent *entry;
    -
    -
    -    /* get directory name */
    -    p = strrchr(file_prefix, '/');
    -    if(p == NULL) {
    -      dir = strdup(".");
    -      p = "";
    -      len = 0;
    -    } else {
    -      *p = '\0';
    -      dir = strdup(file_prefix);
    -      *p++ = '/';
    -      len = strlen(p);
    -    }
    -
    -    event_dir = opendir(dir);
    -    if(event_dir == NULL) {
    -      free(dir);
    -      set_error(IL_SYS, errno, "event_store_init: error opening event directory");
    -      return(-1);
    -    }
    -
    -    while((entry=readdir(event_dir))) {
    -      char *s;
    -
    -      /* skip all files that do not match prefix */
    -      if(strncmp(entry->d_name, p, len) != 0)
    -	continue;
    -
    -      /* skip all control files */
    -      if((s=strstr(entry->d_name, ".ctl")) != NULL &&
    -	 s[4] == '\0')
    -	continue;
    -
    -      s = malloc(strlen(dir) + strlen(entry->d_name) + 2);
    -      if(s == NULL) {
    -	free(dir);
    -	set_error(IL_NOMEM, ENOMEM, "event_store_init: no room for file name");
    -	return(-1);
    -      }
    -
    -      *s = '\0';
    -      strcat(s, dir);
    -      strcat(s, "/");
    -      strcat(s, entry->d_name);
    -
    -      if(event_store_from_file(s) < 0) {
    -	free(dir);
    -	free(s);
    -	closedir(event_dir);
    -	return(-1);
    -      }
    -
    -      free(s);
    -    }
    -    closedir(event_dir);
    -
    -    /* one more pass - this time remove stale .ctl files */
    -    event_dir = opendir(dir);
    -    if(event_dir == NULL) {
    -      free(dir);
    -      set_error(IL_SYS, errno, "event_store_init: error opening event directory");
    -      return(-1);
    -    }
    -
    -    while((entry=readdir(event_dir))) {
    -      char *s;
    -
    -      /* skip all files that do not match prefix */
    -      if(strncmp(entry->d_name, p, len) != 0)
    -	continue;
    -
    -      /* find all control files */
    -      if((s=strstr(entry->d_name, ".ctl")) != NULL &&
    -	 s[4] == '\0') {
    -	      char *ef;
    -	      struct stat st;
    -
    -	      /* is there corresponding event file? */
    -	      ef = malloc(strlen(dir) + strlen(entry->d_name) + 2);
    -	      if(ef == NULL) {
    -		      free(dir);
    -		      set_error(IL_NOMEM, ENOMEM, "event_store_init: no room for event file name");
    -		      return(-1);
    -	      }
    -
    -	      s[0] = 0;
    -	      *ef = '\0';
    -	      strcat(ef, dir);
    -	      strcat(ef, "/");
    -	      strcat(ef, entry->d_name);
    -	      s[0] = '.';
    -
    -	      if(stat(ef, &st) == 0) {
    -		      /* something is there */
    -		      /* XXX - it could be something else than event file, but do not bother now */
    -	      } else {
    -		      /* could not stat file, remove ctl */
    -		      strcat(ef, s);
    -		      glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -				       "  removing stale file %s", ef);
    -		      if(unlink(ef))
    -			      glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_ERROR, 
    -					       "  could not remove file %s: %s\n", ef, strerror(errno));
    -
    -	      }
    -	      free(ef);
    -
    -      }
    -    }
    -    closedir(event_dir);
    -    free(dir);
    -  }
    -
    -  return(0);
    -}
    -
    -
    -int
    -event_store_recover_all()
    -{
    -  struct event_store_list *sl;
    -
    -
    -  if(pthread_rwlock_rdlock(&store_list_lock))
    -	  abort();
    -
    -  /* recover all event stores */
    -  sl = store_list;
    -  while(sl != NULL) {
    -
    -	  /* recover this event store */
    -	  /* no need to lock use_lock in event_store, the store_list_lock is in place */
    -	  if(event_store_recover(sl->es) < 0) {
    -		  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_ERROR, 
    -				   "  error recovering event store %s:  %s", 
    -				   sl->es->event_file_name, error_get_msg());
    -		  clear_error();
    -	  }
    -	  sl = sl->next;
    -  }
    -
    -  if(pthread_rwlock_unlock(&store_list_lock))
    -	  abort();
    -
    -  return(0);
    -}
    -
    -
    -#if 0
    -int
    -event_store_remove(struct event_store *es)
    -{
    -  struct event_store_list *p, **q;
    -
    -  assert(es != NULL);
    -
    -  switch(event_store_clean(es)) {
    -  case 0:
    -	  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -			   "  event store not removed, still used");
    -	  return(0);
    -
    -  case 1:
    -    if(pthread_rwlock_wrlock(&store_list_lock) < 0) {
    -      set_error(IL_SYS, errno, "  event_store_remove: error locking event store list");
    -      return(-1);
    -    }
    -
    -    p = store_list;
    -    q = &store_list;
    -
    -    while(p) {
    -      if(p->es == es) {
    -	(*q) = p->next;
    -	event_store_free(es);
    -	free(p);
    -	break;
    -      }
    -      q = &(p->next);
    -      p = p->next;
    -    }
    -
    -    if(pthread_rwlock_unlock(&store_list_lock) < 0) {
    -      set_error(IL_SYS, errno, "  event_store_remove: error unlocking event store list");
    -      return(-1);
    -    }
    -    return(1);
    -
    -  default:
    -    return(-1);
    -  }
    -  /* not reached */
    -  return(0);
    -}
    -#endif
    -
    -int
    -event_store_cleanup()
    -{
    -  struct event_store_list *sl;
    -  struct event_store_list *slnext;
    -  struct event_store_list **prev;
    -
    -  /* try to remove event files */
    -
    -  if(pthread_rwlock_wrlock(&store_list_lock))
    -	  abort();
    -
    -  sl = store_list;
    -  prev = &store_list;
    -
    -  while(sl != NULL) {
    -	  int ret;
    -
    -	  slnext = sl->next;
    -
    -	  /* one event store at time */
    -	  ret = pthread_rwlock_trywrlock(&sl->es->use_lock);
    -	  if(ret == EBUSY) {
    -		  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_WARN, 
    -				   "  event_store %s is in use by another thread",
    -			 sl->es->job_id_s);
    -		  sl = slnext;
    -		  continue;
    -	  } else if (ret < 0)
    -	    abort();
    -
    -	  switch(event_store_clean(sl->es)) {
    -
    -	  case 1:
    -		  /* remove this event store from LL */
    -		  (*prev) = slnext;
    -		  /* remove this event store from jobid's LL */
    -		  if(sl->jobid_next != sl) {
    -			  sl->jobid_prev->jobid_next = sl->jobid_next;
    -			  sl->jobid_next->jobid_prev = sl->jobid_prev;
    -		  }
    -		  event_store_free(sl->es);
    -		  free(sl);
    -		  break;
    -
    -	  case -1:
    -		  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_ERROR, 
    -				   "  error removing event store %s (file %s):   %s",
    -				   sl->es->job_id_s, sl->es->event_file_name, error_get_msg());
    -		  /* event_store_release(sl->es); */
    -		  clear_error();
    -		  /* go on to the next */
    -
    -	  default:
    -		  event_store_release(sl->es);
    -		  prev = &(sl->next);
    -		  break;
    -	  }
    -
    -	  sl = slnext;
    -  }
    -
    -  if(pthread_rwlock_unlock(&store_list_lock))
    -	  abort();
    -
    -  return(0);
    -}
    -
    diff --git a/org.glite.lb.logger/src/event_store_http.c b/org.glite.lb.logger/src/event_store_http.c
    deleted file mode 100644
    index 4f09b26..0000000
    --- a/org.glite.lb.logger/src/event_store_http.c
    +++ /dev/null
    @@ -1,1130 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#ifdef HAVE_UNISTD_H
    -#include 
    -#endif
    -#include 
    -#include 
    -
    -#include "glite/lb/events_parse.h"
    -
    -#include "interlogd.h"
    -
    -#ifdef __GNUC__
    -#define UNUSED_VAR __attribute__((unused))
    -#else
    -#define UNUSED_VAR
    -#endif
    -
    -static char *file_prefix = NULL;
    -
    -
    -struct event_store_list {
    -	struct event_store *es;
    -	struct event_store_list *next;
    -};
    -
    -
    -static struct event_store_list *store_list;
    -static pthread_rwlock_t store_list_lock = PTHREAD_RWLOCK_INITIALIZER;
    -
    -
    -/* ----------------
    - * helper functions
    - * ----------------
    - */
    -static
    -char *
    -jobid2eventfile(const char *job_id_s)
    -{
    -  char *buffer;
    -
    -  if(job_id_s) {
    -    asprintf(&buffer, "%s.%s", file_prefix, job_id_s);
    -  } else 
    -    asprintf(&buffer, "%s.default", file_prefix);
    -    
    -  return(buffer);
    -}
    -
    -
    -static
    -char *
    -jobid2controlfile(char *job_id_s)
    -{
    -  char *buffer;
    -  char *hash;
    -
    -  if(job_id_s) {
    -    asprintf(&buffer, "%s.%s.ctl", file_prefix, job_id_s);
    -  } else 
    -    asprintf(&buffer, "%s.default.ctl", file_prefix);
    -    
    -  return(buffer);
    -}
    -
    -static
    -int
    -file_reader(void *user_data, char *buffer, const int len)
    -{
    -	size_t ret = 0;
    -	
    -	if(len > 0) {
    -		ret = fread(buffer, 1, len, (FILE*)user_data);
    -		if(ret == 0 && ferror((FILE*)user_data)) {
    -			return -1;
    -		} 
    -	}
    -	return ret;
    -}
    -
    -
    -static
    -int
    -read_event_string(FILE *file, il_http_message_t *msg)
    -{
    -	int  len, ret;
    -	int fd = fileno(file);
    -	long start;
    -
    -	/* remember the start position */
    -	start = ftell(file);
    -	ret = receive_http(file, file_reader, msg);
    -	if(ret < 0) return ret;
    -	/* seek at the end of message in case the reader read ahead */
    -	len = fseek(file, start + msg->len, SEEK_SET);
    -	len = fgetc(file);
    -	if(len != '\n') {
    -		il_log(LOG_ERR, "error reading event from file, missing terminator character at %d, found %c(%d))\n", 
    -		       start+msg->len, len, len);
    -		if(msg->data) { free(msg->data); msg->data = NULL; }
    -		if(msg->host) { free(msg->host); msg->host = NULL; }
    -		return EINVAL;
    -	}
    -	return ret;
    -}
    -
    -
    -
    -/* ------------------------------
    - * event_store 'member' functions
    - * ------------------------------
    - */
    -static
    -int
    -event_store_free(struct event_store *es)
    -{
    -  assert(es != NULL);
    -
    -  if(es->job_id_s) free(es->job_id_s);
    -  if(es->event_file_name) free(es->event_file_name);
    -  if(es->control_file_name) free(es->control_file_name);
    -  pthread_rwlock_destroy(&es->use_lock);
    -  pthread_rwlock_destroy(&es->commit_lock);
    -  free(es);
    -
    -  return(0);
    -}
    -
    -
    -static
    -struct event_store *
    -event_store_create(char *job_id_s)
    -{
    -  struct event_store *es;
    -
    -  es = malloc(sizeof(*es));
    -  if(es == NULL) {
    -    set_error(IL_NOMEM, ENOMEM, "event_store_create: error allocating room for structure");
    -    return(NULL);
    -  }
    -
    -  memset(es, 0, sizeof(*es));
    -
    -  il_log(LOG_DEBUG, "  creating event store for id %s\n", job_id_s);
    -
    -  es->job_id_s = strdup(job_id_s);
    -  es->event_file_name = jobid2eventfile(job_id_s);
    -  es->control_file_name = jobid2controlfile(job_id_s);
    -
    -  if(pthread_rwlock_init(&es->commit_lock, NULL)) 
    -          abort();
    -  if(pthread_rwlock_init(&es->use_lock, NULL)) 
    -	  abort();
    -
    -  return(es);
    -}
    -
    -
    -static
    -int
    -event_store_lock_ro(struct event_store *es)
    -{
    -  assert(es != NULL);
    -
    -  if(pthread_rwlock_rdlock(&es->commit_lock)) 
    -    abort();
    -
    -  return(0);
    -}
    -
    -
    -static
    -int
    -event_store_lock(struct event_store *es)
    -{
    -  assert(es != NULL);
    -
    -  if(pthread_rwlock_wrlock(&es->commit_lock)) 
    -    abort();
    -
    -  return(0);
    -}
    -
    -
    -static
    -int
    -event_store_unlock(struct event_store *es)
    -{
    -  assert(es != NULL);
    -
    -  if(pthread_rwlock_unlock(&es->commit_lock)) 
    -    abort();
    -  return(0);
    -}
    -
    -
    -static
    -int
    -event_store_read_ctl(struct event_store *es)
    -{
    -  FILE *ctl_file;
    -
    -  assert(es != NULL);
    -
    -  event_store_lock(es);
    -  if((ctl_file = fopen(es->control_file_name, "r")) == NULL) {
    -    /* no control file, new event file */
    -    es->last_committed_ls = 0;
    -    es->last_committed_bs = 0;
    -  } else {
    -    /* read last seen and last committed counts */
    -    fscanf(ctl_file, "%*s\n%ld\n%ld\n",
    -	   &es->last_committed_ls,
    -	   &es->last_committed_bs);
    -    fclose(ctl_file);
    -  }
    -  event_store_unlock(es);
    -
    -  return(0);
    -}
    -
    -
    -static
    -int
    -event_store_write_ctl(struct event_store *es)
    -{
    -  FILE   *ctl;
    -
    -  assert(es != NULL);
    -
    -  ctl = fopen(es->control_file_name, "w");
    -  if(ctl == NULL) {
    -    set_error(IL_SYS, errno, "event_store_write_ctl: error opening control file");
    -    return(-1);
    -  }
    -
    -  if(fprintf(ctl, "%s\n%ld\n%ld\n", 
    -	     es->job_id_s, 
    -	     es->last_committed_ls,
    -	     es->last_committed_bs) < 0) {
    -    set_error(IL_SYS, errno, "event_store_write_ctl: error writing control record");
    -    return(-1);
    -  }
    -
    -  if(fclose(ctl) < 0) {
    -    set_error(IL_SYS, errno, "event_store_write_ctl: error closing control file");
    -    return(-1);
    -  }
    -
    -  return(0);
    -}
    -
    -
    -/*
    - * event_store_qurantine() 
    - *   - rename damaged event store file 
    - *   - essentially does the same actions as cleanup, but the event store 
    - *     does not have to be empty
    - * returns 0 on success, -1 on error
    - */
    -static
    -int
    -event_store_quarantine(struct event_store *es) 
    -{
    -	int num;
    -	char newname[MAXPATHLEN+1];
    -
    -	/* find available qurantine name */
    -	/* we give it at most 1024 tries */
    -	for(num = 0; num < 1024; num++) {
    -		struct stat st;
    -
    -		snprintf(newname, MAXPATHLEN, "%s.quarantine.%d", es->event_file_name, num);
    -		newname[MAXPATHLEN] = 0;
    -		if(stat(newname, &st) < 0) {
    -			if(errno == ENOENT) {
    -				/* file not found */
    -				break;
    -			} else {
    -				/* some other error with name, probably permanent */
    -				set_error(IL_SYS, errno, "event_store_qurantine: error looking for qurantine filename");
    -				return(-1);
    -				
    -			}
    -		} else {
    -			/* the filename is used already */
    -		}
    -	}
    -	if(num >= 1024) {
    -		/* new name not found */
    -		/* XXX - is there more suitable error? */
    -		set_error(IL_SYS, ENOSPC, "event_store_quarantine: exhausted number of retries looking for quarantine filename");
    -		return(-1);
    -	}
    -
    -	/* actually rename the file */
    -	il_log(LOG_DEBUG, "    renaming damaged event file from %s to %s\n",
    -	       es->event_file_name, newname);
    -	if(rename(es->event_file_name, newname) < 0) {
    -		set_error(IL_SYS, errno, "event_store_quarantine: error renaming event file");
    -		return(-1);
    -	}
    -
    -	/* clear the counters */
    -	es->last_committed_ls = 0;
    -	es->last_committed_bs = 0;
    -	es->offset = 0;
    -
    -	return(0);
    -}
    -
    -
    -/*
    - * event_store_recover()
    - *   - recover after restart or catch up when events missing in IPC
    - *   - if offset > 0, read everything behind it
    - *   - if offset == 0, read everything behind min(last_committed_bs, last_committed_es)
    - */
    -int
    -event_store_recover(struct event_store *es)
    -{
    -  struct event_queue *eq_l = NULL, *eq_b = NULL;
    -  struct server_msg *msg;
    -  il_http_message_t hmsg;
    -  char *event_s;
    -  int fd, ret;
    -  long last;
    -  FILE *ef;
    -  struct flock efl;
    -  char err_msg[128];
    -  struct stat stbuf;
    -
    -  assert(es != NULL);
    -  
    -#if defined(IL_NOTIFICATIONS)
    -  /* destination queue has to be found for each message separately */
    -#else
    -  /* find bookkepping server queue */
    -  eq_b = queue_list_get(es->job_id_s);
    -  if(eq_b == NULL) 
    -    return(-1);
    -#endif
    -
    -#if !defined(IL_NOTIFICATIONS)
    -  /* get log server queue */
    -  eq_l = queue_list_get(NULL);
    -#endif
    -
    -  event_store_lock(es);
    -
    -  il_log(LOG_DEBUG, "  reading events from %s\n", es->event_file_name);
    -
    -  /* open event file */
    -  ef = fopen(es->event_file_name, "r");
    -  if(ef == NULL) {
    -	  snprintf(err_msg, sizeof(err_msg), 
    -		   "event_store_recover: error opening event file %s",
    -		   es->event_file_name);
    -	  set_error(IL_SYS, errno, err_msg);
    -	  event_store_unlock(es);
    -	  return(-1);
    -  }
    -
    -  /* lock the file for reading (we should not read while dglogd is writing) */
    -  fd = fileno(ef);
    -  efl.l_type = F_RDLCK;
    -  efl.l_whence = SEEK_SET;
    -  efl.l_start = 0;
    -  efl.l_len = 0;
    -  if(fcntl(fd, F_SETLKW, &efl) < 0) {
    -	  snprintf(err_msg, sizeof(err_msg), 
    -		   "event_store_recover: error locking event file %s",
    -		   es->event_file_name);
    -	  set_error(IL_SYS, errno, err_msg);
    -	  event_store_unlock(es);
    -	  fclose(ef);
    -	  return(-1);
    -  }
    -
    -  /* check the file modification time and size to avoid unnecessary operations */
    -  memset(&stbuf, 0, sizeof(stbuf));
    -  if(fstat(fd, &stbuf) < 0) {
    -	  il_log(LOG_ERR, "    could not stat event file %s: %s\n", es->event_file_name, strerror(errno));
    -	  fclose(ef);
    -	  event_store_unlock(es);
    -	  return -1;
    -  } else {
    -	  if((es->offset == stbuf.st_size) && (es->last_modified == stbuf.st_mtime)) {
    -		  il_log(LOG_DEBUG, "  event file not modified since last visit, skipping\n");
    -		  fclose(ef);
    -		  event_store_unlock(es);
    -		  return(0);
    -	  }
    -  }
    -
    -  while(1) { /* try, try, try */
    -
    -	  /* get the position in file to be sought */
    -	  if(es->offset)
    -		  last = es->offset;
    -	  else {
    -		  last = es->last_committed_bs;
    -	  }
    -
    -	  il_log(LOG_DEBUG, "    setting starting file position to  %ld\n", last);
    -	  il_log(LOG_DEBUG, "    bytes sent to destination: %d\n", es->last_committed_bs);
    -
    -	  if(last > 0) {
    -		  int c;
    -
    -		  /* skip all committed or already enqueued events */
    -		  /* be careful - check, if the offset really points to the
    -		     beginning of event string */
    -		  if(fseek(ef, last - 1, SEEK_SET) < 0) {
    -			  set_error(IL_SYS, errno, "event_store_recover: error setting position for read");
    -			  event_store_unlock(es);
    -			  fclose(ef);
    -			  return(-1);
    -		  }
    -		  /* the last enqueued event MUST end with \n */
    -		  if((c=fgetc(ef)) != '\n') {
    -			  /* Houston, we have got a problem */
    -			  il_log(LOG_WARNING, 
    -				 "    file position %ld does not point at the beginning of event string, backing off!\n",
    -				 last);
    -			  /* now, where were we? */
    -			  if(es->offset) {
    -				  /* next try will be with
    -				     last_commited_bs */
    -				  es->offset = 0;
    -			  } else {
    -				  /* this is really weird... back off completely */
    -				  es->last_committed_ls = es->last_committed_bs = 0;
    -			  }
    -		  } else {
    -			  /* OK, break out of the loop */
    -			  break;
    -		  }
    -	  } else {
    -		  /* this breaks out of the loop, we are starting at
    -		   * the beginning of file
    -		   */
    -		  if(fseek(ef, 0, SEEK_SET) < 0) {
    -			  set_error(IL_SYS, errno, "event_store_recover: error setting position for read");
    -			  event_store_unlock(es);
    -			  fclose(ef);
    -			  return(-1);
    -		  }
    -		  break;
    -	  }
    -  }
    -
    -  /* enqueue all remaining events */
    -  ret = 1;
    -  msg = NULL;
    -  while(read_event_string(ef, &hmsg) >= 0) {
    -	
    -    /* last holds the starting position of event_s in file */
    -    il_log(LOG_DEBUG, "    reading event at %ld\n", last);
    -
    -    /* break from now on means there was some error */
    -    ret = -1;
    -
    -    /* create message for server */
    -    msg = server_msg_create((il_octet_string_t*)&hmsg, last);
    -    if(msg == NULL) {
    -	    il_log(LOG_ALERT, "    event file corrupted! I will try to move it to quarantine (ie. rename it).\n");
    -	    /* actually do not bother if quarantine succeeded or not - we could not do more */
    -	    event_store_quarantine(es);
    -	    fclose(ef);
    -	    event_store_unlock(es);
    -	    return(-1);
    -    }
    -    msg->es = es;
    -
    -    /* first enqueue to the LS */
    -    if(!bs_only && (last >= es->last_committed_ls)) {
    -      
    -	    il_log(LOG_DEBUG, "      queueing event at %ld to server %s\n", last, eq_l->dest_name);
    -
    -#if !defined(IL_NOTIFICATIONS)
    -      if(enqueue_msg(eq_l, msg) < 0)
    -	break;
    -#endif
    -      }
    -
    -#ifdef IL_NOTIFICATIONS
    -    eq_b = queue_list_get(msg->dest);
    -#endif
    -
    -    /* now enqueue to the BS, if neccessary */
    -    if((eq_b != eq_l) && 
    -       (last >= es->last_committed_bs)) {
    -      
    -	    il_log(LOG_DEBUG, "      queueing event at %ld to server %s\n", last, eq_b->dest_name);
    -      
    -      if(enqueue_msg(eq_b, msg) < 0)
    -	break;
    -    }
    -    server_msg_free(msg);
    -    msg = NULL;
    -
    -    /* now last is also the offset behind the last successfully queued event */
    -    last = ftell(ef);
    -
    -    /* ret == 0 means EOF or incomplete event found */
    -    ret = 0;
    -
    -  } /* while */
    -
    -  /* due to this little assignment we had to lock the event_store for writing */
    -  es->offset = last;
    -  es->last_modified = stbuf.st_mtime;
    -  il_log(LOG_DEBUG, "  event store offset set to %ld\n", last);
    -
    -  if(msg) 
    -    server_msg_free(msg);
    -
    -  fclose(ef);
    -  il_log(LOG_DEBUG, "  finished reading events with %d\n", ret);
    -
    -  event_store_unlock(es);
    -  return(ret);
    -}
    -
    -
    -/*
    - * event_store_sync()
    - *   - check the position of event and fill holes from file
    - *   - return 1 if the event is new,
    - *            0 if it was seen before,
    - *           -1 if there was an error
    - */
    -int
    -event_store_sync(struct event_store *es, long offset)
    -{
    -	int ret;
    -
    -	assert(es != NULL);
    -
    -	/* all events are actually read from file, the event on socket
    -	 * is ignored and serves just to notify us about file change
    -	 */
    -	ret = event_store_recover(es);
    -	ret = (ret < 0) ? ret : 0;
    -	return(ret);
    -}
    -
    -
    -int
    -event_store_next(struct event_store *es, long offset, int len)
    -{
    -	assert(es != NULL);
    -  
    -	/* offsets are good only to detect losses (differences between socket and file),
    -	   which is not possible now */
    -	return 0;
    -}
    -
    -
    -/* 
    - * event_store_commit()
    - *
    - */
    -int
    -event_store_commit(struct event_store *es, int len, int ls)
    -{
    -  assert(es != NULL);
    -
    -  event_store_lock(es);
    -
    -  if(ls)
    -    es->last_committed_ls += len;
    -  else {
    -    es->last_committed_bs += len;
    -    if (bs_only) es->last_committed_ls += len;
    -  }
    -
    -  if(event_store_write_ctl(es) < 0) {
    -    event_store_unlock(es);
    -    return(-1);
    -  }
    -
    -  event_store_unlock(es);
    -
    -
    -  return(0);
    -}
    -
    -
    -/*
    - * event_store_clean()
    - *  - remove the event files (event and ctl), if they are not needed anymore
    - *  - returns 0 if event_store is in use, 1 if it was removed and -1 on error
    - *
    - * Q: How do we know that we can safely remove the files?
    - * A: When all events from file have been committed both by LS and BS.
    - */
    -static 
    -int
    -event_store_clean(struct event_store *es)
    -{
    -  long last;
    -  int fd;
    -  FILE *ef;
    -  struct flock efl;
    -
    -  assert(es != NULL);
    -
    -  /* prevent sender threads from updating */
    -  event_store_lock(es);
    -  
    -  il_log(LOG_DEBUG, "  trying to cleanup event store %s\n", es->job_id_s);
    -  il_log(LOG_DEBUG, "    bytes sent to logging server: %d\n", es->last_committed_ls);
    -  il_log(LOG_DEBUG, "    bytes sent to bookkeeping server: %d\n", es->last_committed_bs);
    -
    -  /* preliminary check to avoid opening event file */
    -  /* if the positions differ, some events still have to be sent */
    -  if(es->last_committed_ls != es->last_committed_bs) {
    -    event_store_unlock(es);
    -    il_log(LOG_DEBUG, "  not all events sent, cleanup aborted\n");
    -    return(0);
    -  }
    -
    -  /* the file can only be removed when all the events were succesfully sent 
    -     (ie. committed both by LS and BS */
    -  /* That also implies that the event queues are 'empty' at the moment. */
    -  ef = fopen(es->event_file_name, "r+");
    -  if(ef == NULL) {
    -    /* if we can not open the event store, it is an error and the struct should be removed */
    -    /* XXX - is it true? */
    -    event_store_unlock(es);
    -    il_log(LOG_ERR,  "  event_store_clean: error opening event file: %s\n", strerror(errno));
    -    return(1);
    -  }
    -  
    -  fd = fileno(ef);
    -  
    -  /* prevent local-logger from writing into event file */
    -  efl.l_type = F_WRLCK;
    -  efl.l_whence = SEEK_SET;
    -  efl.l_start = 0;
    -  efl.l_len = 0;
    -  if(fcntl(fd, F_SETLK, &efl) < 0) {
    -    il_log(LOG_DEBUG, "    could not lock event file, cleanup aborted\n");
    -    fclose(ef);
    -    event_store_unlock(es);
    -    if(errno != EACCES &&
    -       errno != EAGAIN) {
    -      set_error(IL_SYS, errno, "event_store_clean: error locking event file");
    -      return(-1);
    -    }
    -    return(0);
    -  }
    -  
    -  /* now the file should not contain partially written event, so it is safe
    -     to get offset behind last event by seeking the end of file */
    -  if(fseek(ef, 0, SEEK_END) < 0) {
    -    set_error(IL_SYS, errno, "event_store_clean: error seeking the end of file");
    -    event_store_unlock(es);
    -    fclose(ef);
    -    return(-1);
    -  }
    -  
    -  last = ftell(ef);
    -  il_log(LOG_DEBUG, "    total bytes in file: %d\n", last);
    -
    -  if(es->last_committed_ls < last) {
    -    fclose(ef);
    -    event_store_unlock(es);
    -    il_log(LOG_DEBUG, "    events still waiting in queue, cleanup aborted\n");
    -    return(0);
    -  } else if( es->last_committed_ls > last) {
    -	  il_log(LOG_WARNING, "  warning: event file seems to shrink!\n");
    -	  /* XXX - in that case we can not continue because there may be
    -	     some undelivered events referring to that event store */
    -	  fclose(ef);
    -	  event_store_unlock(es);
    -	  return(0);
    -  }
    -  
    -  /* now we are sure that all events were sent and the event queues are empty */
    -  il_log(LOG_INFO, "    removing event file %s\n", es->event_file_name);
    -  
    -  /* remove the event file */
    -  unlink(es->event_file_name);
    -  unlink(es->control_file_name);
    -  
    -  /* clear the counters */
    -  es->last_committed_ls = 0;
    -  es->last_committed_bs = 0;
    -  es->offset = 0;
    -
    -  /* unlock the event_store even if it is going to be removed */
    -  event_store_unlock(es);
    -
    -  /* close the event file (that unlocks it as well) */
    -  fclose(ef);
    -
    -  /* indicate that it is safe to remove this event_store */
    -  return(1);
    -}
    -
    -
    -/* --------------------------------
    - * event store management functions
    - * --------------------------------
    - */
    -struct event_store *
    -event_store_find(char *job_id_s)
    -{
    -  struct event_store_list *q, *p;
    -  struct event_store *es;
    -
    -  if(pthread_rwlock_wrlock(&store_list_lock)) {
    -	  abort();
    -  }
    -
    -  es = NULL;
    -  
    -  q = NULL;
    -  p = store_list;
    -  
    -  while(p) {
    -    if(strcmp(p->es->job_id_s, job_id_s) == 0) {
    -      es = p->es;
    -      if(pthread_rwlock_rdlock(&es->use_lock))
    -	      abort();
    -      if(pthread_rwlock_unlock(&store_list_lock)) 
    -	      abort();
    -      return(es);
    -    }
    -
    -    q = p;
    -    p = p->next;
    -  }
    -
    -  es = event_store_create(job_id_s);
    -  if(es == NULL) {
    -	  if(pthread_rwlock_unlock(&store_list_lock)) 
    -		  abort();
    -	  return(NULL);
    -  }
    -
    -  p = malloc(sizeof(*p));
    -  if(p == NULL) {
    -    set_error(IL_NOMEM, ENOMEM, "event_store_find: no room for new event store");
    -      if(pthread_rwlock_unlock(&store_list_lock)) 
    -	      abort();
    -    return(NULL);
    -  }
    -  
    -  p->next = store_list;
    -  store_list = p;
    -    
    -  p->es = es;
    -
    -  if(pthread_rwlock_rdlock(&es->use_lock))
    -	  abort();
    -
    -  if(pthread_rwlock_unlock(&store_list_lock)) 
    -	  abort();
    -
    -  return(es);
    -}
    -
    -
    -int
    -event_store_release(struct event_store *es)
    -{
    -	assert(es != NULL);
    -
    -	if(pthread_rwlock_unlock(&es->use_lock))
    -		abort();
    -	il_log(LOG_DEBUG, "  released lock on %s\n", es->job_id_s);
    -	return(0);
    -}
    -
    -
    -event_store_from_file(char *filename)
    -{
    -	struct event_store *es;
    -	FILE *event_file;
    -	char *job_id_s = NULL, *p;
    -	il_http_message_t hmsg;
    -	int ret;
    -	
    -	il_log(LOG_INFO, "  attaching to event file: %s\n", filename);
    -	
    -	if(strstr(filename, "quarantine") != NULL) {
    -		il_log(LOG_INFO, "  file name belongs to quarantine, not touching that.\n");
    -		return(0);
    -	}
    -
    -	event_file = fopen(filename, "r");
    -	if(event_file == NULL) {
    -		set_error(IL_SYS, errno, "event_store_from_file: error opening event file");
    -		return(-1);
    -	}
    -	ret = read_event_string(event_file, &hmsg);
    -	fclose(event_file);
    -	if(ret < 0) 
    -		return(0);
    -	
    -	/* get id aka dest */
    -	job_id_s = hmsg.host;
    -
    -	il_log(LOG_DEBUG, "  message dest: '%s'\n", job_id_s);
    -	if(job_id_s == NULL) {
    -		il_log(LOG_NOTICE, "  skipping file, could not parse event\n");
    -		ret = 0;
    -		goto out;
    -	}
    -	
    -	es=event_store_find(job_id_s);
    -	
    -	if(es == NULL) {
    -		ret = -1;
    -		goto out;
    -	}
    -
    -	if((es->last_committed_ls == 0) &&
    -	   (es->last_committed_bs == 0) &&
    -	   (es->offset == 0)) {
    -		ret = event_store_read_ctl(es);
    -	} else 
    -		ret = 0;
    -	
    -	event_store_release(es);
    -
    -out:
    -	if(hmsg.data) free(hmsg.data);
    -	if(job_id_s) free(job_id_s);
    -	return(ret);
    -}
    -
    -
    -int
    -event_store_init(char *prefix)
    -{
    -  if(file_prefix == NULL) {
    -    file_prefix = strdup(prefix);
    -    store_list = NULL;
    -  }
    -
    -  /* read directory and get a list of event files */
    -  {
    -    int len;
    -
    -    char *p, *dir;
    -    DIR *event_dir;
    -    struct dirent *entry;
    -
    -
    -    /* get directory name */
    -    p = strrchr(file_prefix, '/');
    -    if(p == NULL) {
    -      dir = strdup(".");
    -      p = "";
    -      len = 0;
    -    } else {
    -      *p = '\0';
    -      dir = strdup(file_prefix);
    -      *p++ = '/';
    -      len = strlen(p);
    -    }
    -
    -    event_dir = opendir(dir);
    -    if(event_dir == NULL) {
    -      free(dir);
    -      set_error(IL_SYS, errno, "event_store_init: error opening event directory");
    -      return(-1);
    -    }
    -    
    -    while((entry=readdir(event_dir))) {
    -      char *s;
    -
    -      /* skip all files that do not match prefix */
    -      if(strncmp(entry->d_name, p, len) != 0) 
    -	continue;
    -
    -      /* skip all control files */
    -      if((s=strstr(entry->d_name, ".ctl")) != NULL &&
    -	 s[4] == '\0')
    -	continue;
    -
    -      s = malloc(strlen(dir) + strlen(entry->d_name) + 2);
    -      if(s == NULL) {
    -	free(dir);
    -	set_error(IL_NOMEM, ENOMEM, "event_store_init: no room for file name");
    -	return(-1);
    -      }
    -
    -      *s = '\0';
    -      strcat(s, dir);
    -      strcat(s, "/");
    -      strcat(s, entry->d_name);
    -
    -      if(event_store_from_file(s) < 0) {
    -	free(dir);
    -	free(s);
    -	closedir(event_dir);
    -	return(-1);
    -      }
    -
    -      free(s);
    -    }
    -    closedir(event_dir);
    -
    -    /* one more pass - this time remove stale .ctl files */
    -    event_dir = opendir(dir);
    -    if(event_dir == NULL) {
    -      free(dir);
    -      set_error(IL_SYS, errno, "event_store_init: error opening event directory");
    -      return(-1);
    -    }
    -    
    -    while((entry=readdir(event_dir))) {
    -      char *s;
    -
    -      /* skip all files that do not match prefix */
    -      if(strncmp(entry->d_name, p, len) != 0) 
    -	continue;
    -
    -      /* find all control files */
    -      if((s=strstr(entry->d_name, ".ctl")) != NULL &&
    -	 s[4] == '\0') {
    -	      char *ef;
    -	      struct stat st;
    -
    -	      /* is there corresponding event file? */
    -	      ef = malloc(strlen(dir) + strlen(entry->d_name) + 2);
    -	      if(ef == NULL) {
    -		      free(dir);
    -		      set_error(IL_NOMEM, ENOMEM, "event_store_init: no room for event file name");
    -		      return(-1);
    -	      }
    -
    -	      s[0] = 0;
    -	      *ef = '\0';
    -	      strcat(ef, dir);
    -	      strcat(ef, "/");
    -	      strcat(ef, entry->d_name);
    -	      s[0] = '.';
    -
    -	      if(stat(ef, &st) == 0) {
    -		      /* something is there */
    -		      /* XXX - it could be something else than event file, but do not bother now */
    -	      } else {
    -		      /* could not stat file, remove ctl */
    -		      strcat(ef, s);
    -		      il_log(LOG_DEBUG, "  removing stale file %s\n", ef);
    -		      if(unlink(ef)) 
    -			      il_log(LOG_ERR, "  could not remove file %s: %s\n", ef, strerror(errno));
    -		      
    -	      }
    -	      free(ef);
    -
    -      }
    -    }
    -    closedir(event_dir);
    -    free(dir);
    -  }
    -
    -  return(0);
    -}
    -
    -
    -int
    -event_store_recover_all()
    -{
    -  struct event_store_list *sl;
    -
    -
    -  if(pthread_rwlock_rdlock(&store_list_lock)) 
    -	  abort();
    -
    -  /* recover all event stores */
    -  sl = store_list;
    -  while(sl != NULL) {
    -
    -	  /* recover this event store */
    -	  /* no need to lock use_lock in event_store, the store_list_lock is in place */
    -	  if(event_store_recover(sl->es) < 0) {
    -		  il_log(LOG_ERR, "  error recovering event store %s:\n    %s\n", sl->es->event_file_name, error_get_msg());
    -		  clear_error();
    -	  }
    -	  sl = sl->next;
    -  }
    -  
    -  if(pthread_rwlock_unlock(&store_list_lock)) 
    -	  abort();
    -
    -  return(0);
    -}
    -
    -
    -#if 0 
    -int
    -event_store_remove(struct event_store *es)
    -{
    -  struct event_store_list *p, **q;
    -
    -  assert(es != NULL);
    -
    -  switch(event_store_clean(es)) {
    -  case 0:
    -    il_log(LOG_DEBUG, "  event store not removed, still used\n");
    -    return(0);
    -    
    -  case 1:
    -    if(pthread_rwlock_wrlock(&store_list_lock) < 0) {
    -      set_error(IL_SYS, errno, "  event_store_remove: error locking event store list");
    -      return(-1);
    -    }
    -
    -    p = store_list;
    -    q = &store_list;
    -
    -    while(p) {
    -      if(p->es == es) {
    -	(*q) = p->next;
    -	event_store_free(es);
    -	free(p);
    -	break;
    -      }
    -      q = &(p->next);
    -      p = p->next;
    -    }
    -
    -    if(pthread_rwlock_unlock(&store_list_lock) < 0) {
    -      set_error(IL_SYS, errno, "  event_store_remove: error unlocking event store list");
    -      return(-1);
    -    }
    -    return(1);
    -
    -  default:
    -    return(-1);
    -  }
    -  /* not reached */
    -  return(0);
    -}
    -#endif
    -
    -int
    -event_store_cleanup()
    -{
    -  struct event_store_list *sl;
    -  struct event_store_list *slnext;
    -  struct event_store_list **prev;
    -
    -  /* try to remove event files */
    -
    -  if(pthread_rwlock_wrlock(&store_list_lock)) 
    -	  abort();
    -
    -  sl = store_list;
    -  prev = &store_list;
    -
    -  while(sl != NULL) {
    -	  int ret;
    -
    -	  slnext = sl->next;
    -	  
    -	  /* one event store at time */
    -	  ret = pthread_rwlock_trywrlock(&sl->es->use_lock);
    -	  if(ret == EBUSY) {
    -		  il_log(LOG_DEBUG, "  event_store %s is in use by another thread\n", 
    -			 sl->es->job_id_s);
    -		  sl = slnext;
    -		  continue;
    -	  } else if (ret < 0)
    -	    abort();
    -
    -	  switch(event_store_clean(sl->es)) {
    -		  
    -	  case 1:
    -		  /* remove this event store */
    -		  (*prev) = slnext;
    -		  event_store_free(sl->es);
    -		  free(sl);
    -		  break;
    -		  
    -	  case -1:
    -		  il_log(LOG_ERR, "  error removing event store %s (file %s):\n    %s\n", 
    -			 sl->es->job_id_s, sl->es->event_file_name, error_get_msg());
    -		  /* event_store_release(sl->es); */
    -		  clear_error();
    -		  /* go on to the next */
    -		  
    -	  default:
    -		  event_store_release(sl->es);
    -		  prev = &(sl->next);
    -		  break;
    -	  }
    -	  
    -	  sl = slnext;
    -  }
    -  
    -  if(pthread_rwlock_unlock(&store_list_lock)) 
    -	  abort();
    -  
    -  return(0);
    -}
    -
    diff --git a/org.glite.lb.logger/src/http.c b/org.glite.lb.logger/src/http.c
    deleted file mode 100644
    index 2480872..0000000
    --- a/org.glite.lb.logger/src/http.c
    +++ /dev/null
    @@ -1,214 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -
    -#include "interlogd.h"
    -
    -
    -int 
    -parse_request(const char *s, il_http_message_t *msg)
    -{
    -	if(!strncasecmp(s, "HTTP", 4)) {
    -		msg->msg_type = IL_HTTP_REPLY;
    -	} else if(!strncasecmp(s, "POST", 4)) {
    -		msg->msg_type = IL_HTTP_POST;
    -	} else if(!strncasecmp(s, "GET", 3)) {
    -		msg->msg_type = IL_HTTP_GET;
    -	} else {
    -		msg->msg_type = IL_HTTP_OTHER;
    -	}
    -	if(msg->msg_type == IL_HTTP_REPLY) {
    -		char *p = strchr(s, ' ');
    -
    -		if(!p) goto parse_end;
    -		p++;
    -		msg->reply_code=atoi(p);
    -		p = strchr(p, ' ');
    -		if(!p) goto parse_end;
    -		p++;
    -		msg->reply_string = strdup(p);
    -
    -	parse_end:
    -		;
    -	}
    -}
    -
    -
    -int
    -parse_header(const char *s, il_http_message_t *msg)
    -{
    -	if(!strncasecmp(s, "Content-Length:", 15)) {
    -		msg->content_length = atoi(s + 15);
    -	} else if(!strncasecmp(s, "Host:", 5)) {
    -		const char *p = s + 4;
    -		while(*++p == ' '); /* skip spaces */
    -		msg->host = strdup(p);
    -	}
    -	return(0);
    -}
    -
    -
    -#define DEFAULT_CHUNK_SIZE 1024
    -
    -// read what is available and parse what can be parsed
    -// returns the result of read operation of the underlying connection,
    -// ie. the number of bytes read or error code
    -int
    -receive_http(void *user_data, int (*reader)(void *, char *, const int), il_http_message_t *msg)
    -{
    -	static enum { NONE, IN_REQUEST, IN_HEADERS, IN_BODY } state = NONE;
    -	int  len, alen, clen, i, buffer_free, min_buffer_free = DEFAULT_CHUNK_SIZE;
    -	char *buffer, *p, *s, *cr;
    -	
    -	memset(msg, 0, sizeof(*msg));
    -	// msg->data = NULL;
    -	// msg->len = 0;
    -	state = IN_REQUEST;
    -	alen = 0;
    -	buffer = NULL;
    -	buffer_free = 0;
    -	p = NULL;
    -	s = NULL;
    -
    -	do {
    -		/* p - first empty position in buffer
    -		   alen - size of allocated buffer
    -		   len - number of bytes received in last read
    -		   s - points behind last scanned CRLF or at buffer start 
    -		   buffer_free = alen - (p - buffer) 
    -		*/
    -
    -		/* prepare at least chunk_size bytes for next data */
    -		if(buffer_free < min_buffer_free) {
    -		        char *n;
    -			
    -			alen += min_buffer_free;
    -			n = realloc(buffer, alen);
    -			if(n == NULL) {
    -				free(buffer);
    -				set_error(IL_NOMEM, ENOMEM, "read_event: no room for event");
    -				return(-1);
    -			}
    -			buffer_free += min_buffer_free;
    -			p = n + (p - buffer);
    -			s = n + (s - buffer);
    -			buffer = n;
    -		}
    -
    -		if(buffer_free > 0) {
    -			len = (*reader)(user_data, p, buffer_free); 
    -			if(len < 0) {
    -				// error
    -				free(buffer);
    -				// set_error(IL_SYS, errno, "receive_http: error reading data");
    -				return -1;
    -			} else if(len == 0) {
    -				// EOF
    -				free(buffer);
    -				set_error(IL_PROTO, errno, "receive_http: error reading data - premature EOF");
    -				return -1;
    -			}
    -			buffer_free -= len;
    -			p+= len;
    -		}
    -
    -
    -		switch(state) {
    -
    -			// parse buffer, look for CRLFs
    -			//   s - start scan position
    -			//   p - start of current token
    -			//   cr - current CRLF position
    -
    -		case IN_REQUEST:
    -			if((s < p - 1) &&
    -			   (cr = (char*)memchr(s, '\r', p - s - 1)) &&
    -			   (cr[1] == '\n')) {
    -				*cr = 0;
    -				parse_request(s, msg);
    -				*cr = '\r';
    -				// change state
    -				state = IN_HEADERS;
    -				// start new tokens (cr < p - 1 -> s < p + 1 <-> s <= p)
    -				s = cr + 2;
    -			} else {
    -			  break;
    -			}
    -
    -		case IN_HEADERS:  
    -			while((state != IN_BODY) &&
    -			      (s < p - 1) && 
    -			      (cr = (char*)memchr(s, '\r', p - s - 1)) &&
    -			      (cr[1] == '\n')) {
    -				if(s == cr) { /* do not consider request starting with CRLF */
    -					// found CRLFCRLF
    -					state = IN_BODY;
    -				} else {
    -					*cr = 0;
    -					parse_header(s, msg);
    -					*cr = '\r';
    -				}
    -				// next scan starts after CRLF
    -				s = cr + 2; 
    -			}
    -			if(state == IN_BODY) {
    -				// we found body
    -				// content-length should be set at the moment
    -				if(msg->content_length > 0) {
    -					int need_free = msg->content_length - (p - s);
    -					char *n;
    -			
    -					alen += need_free - buffer_free + 1;
    -					n = realloc(buffer, alen);
    -					if(n == NULL) {
    -						free(buffer);
    -						set_error(IL_NOMEM, ENOMEM, "read_event: no room for event");
    -						return(-1);
    -					}
    -					buffer_free = need_free;
    -					min_buffer_free = 0;
    -					p = n + (p - buffer);
    -					s = n + (s - buffer);
    -					buffer = n;
    -				} else {
    -					// report error
    -					free(buffer);
    -					set_error(IL_PROTO, EINVAL, "receive_http: error reading data - no content length specified\n");
    -					return -1;
    -				}
    -			}
    -			break;
    -			
    -		case IN_BODY:
    -			if(buffer_free == 0) {
    -				// finished reading
    -				*p = 0;
    -				state = NONE;
    -			}
    -			break;
    -		}
    -	} while(state != NONE);
    -	
    -	msg->data = buffer;
    -	msg->len = p - buffer;
    -
    -	return 0;
    -}
    diff --git a/org.glite.lb.logger/src/il_error.c b/org.glite.lb.logger/src/il_error.c
    deleted file mode 100644
    index b9a5647..0000000
    --- a/org.glite.lb.logger/src/il_error.c
    +++ /dev/null
    @@ -1,201 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#ifdef LB_PROF
    -#include 
    -extern void _start (void), etext (void);
    -#endif
    -
    -#include "glite/security/glite_gss.h"
    -#include "il_error.h"
    -
    -
    -static pthread_key_t err_key;
    -
    -static int IL_ERR_MSG_LEN = 1024;
    -
    -static
    -void
    -error_key_delete(void *err)
    -{
    -  if(((struct error_inf*)err)->msg)
    -    free(((struct error_inf*)err)->msg);
    -  free(err);
    -}
    -
    -static 
    -void
    -error_key_create()
    -{
    -  pthread_key_create(&err_key, error_key_delete);
    -}
    -
    -static 
    -struct error_inf *
    -error_get_err ()
    -{
    -  struct error_inf *err;
    -
    -  /* get thread specific error structure */
    -  err = (struct error_inf *)pthread_getspecific(err_key);
    -  assert(err != NULL);
    -
    -  return(err);
    -}
    -
    -
    -int
    -init_errors()
    -{
    -  static pthread_once_t error_once = PTHREAD_ONCE_INIT;
    -  struct error_inf *err;
    -
    -  /* create the key for thread specific error only once */
    -  pthread_once(&error_once, error_key_create);
    -  
    -  /* there is no thread error yet, try to create one */
    -  if((err = (struct error_inf *)malloc(sizeof(*err)))) {
    -    /* allocation successfull, make it thread specific data */
    -    if(pthread_setspecific(err_key, err)) {
    -	free(err);
    -	return(-1);
    -    }
    -  } else 
    -    return(-1);
    -
    -  err->code_maj = 0;
    -  err->code_min = 0;
    -  err->msg = malloc(IL_ERR_MSG_LEN + 1);
    -  if(err->msg == NULL) 
    -	  return(-1);
    -
    -#ifdef LB_PROF
    -  monstartup((u_long)&_start, (u_long)&etext);
    -#endif
    -
    -  return(0);
    -}
    -
    -int 
    -set_error(int code, long minor, char *msg)
    -{
    -  struct error_inf *err;
    -
    -  err = error_get_err();
    -
    -  err->code_maj = code;
    -  err->code_min = minor;
    -
    -  switch(code) {
    -
    -  case IL_SYS:
    -    snprintf(err->msg, IL_ERR_MSG_LEN, "%s: %s", msg, strerror(err->code_min));
    -    break;
    -
    -  case IL_HOST:
    -    snprintf(err->msg, IL_ERR_MSG_LEN, "%s: %s", msg, hstrerror(err->code_min));
    -    break;
    -
    -  case IL_DGGSS:
    -    switch(err->code_min) {
    -
    -    case EDG_WLL_GSS_ERROR_GSS:
    -      snprintf(err->msg, IL_ERR_MSG_LEN, "%s", msg);
    -      break;
    -
    -    case EDG_WLL_GSS_ERROR_TIMEOUT:
    -      snprintf(err->msg, IL_ERR_MSG_LEN, "%s: Timeout in GSS connection.", msg);
    -      break;
    -
    -    case EDG_WLL_GSS_ERROR_EOF:
    -      snprintf(err->msg, IL_ERR_MSG_LEN, "%s: Connection lost.", msg);
    -      break;
    -
    -    case EDG_WLL_GSS_ERROR_ERRNO:
    -      snprintf(err->msg, IL_ERR_MSG_LEN, "%s: %s", msg, strerror(errno));
    -      break;
    -      
    -    case EDG_WLL_GSS_ERROR_HERRNO:
    -      snprintf(err->msg, IL_ERR_MSG_LEN, "%s: %s", msg, hstrerror(errno));
    -      break;
    -    }
    -
    -  default:
    -	  strncpy(err->msg, msg, IL_ERR_MSG_LEN);
    -  }
    -
    -  err->msg[IL_ERR_MSG_LEN] = 0; /* OK, malloc()ed IL_ERR_MSG_LEN + 1 */
    -
    -  return(code);
    -}
    -
    -
    -int 
    -clear_error() {
    -  struct error_inf *err;
    -
    -  err = error_get_err();
    -
    -  err->code_maj = IL_OK;
    -  err->code_min = 0;
    -  *(err->msg) = 0;
    -
    -  return(0);
    -} 
    -
    -
    -int
    -error_get_maj()
    -{
    -  struct error_inf *err;
    -
    -  err = error_get_err();
    -
    -  return(err->code_maj);
    -}
    -
    -
    -long
    -error_get_min()
    -{
    -  struct error_inf *err;
    -
    -  err = error_get_err();
    -
    -  return(err->code_min);
    -}
    -
    -
    -char * 
    -error_get_msg()
    -{
    -  struct error_inf *err;
    -
    -  err = error_get_err();
    -
    -  return(err->msg);
    -}
    diff --git a/org.glite.lb.logger/src/il_error.h b/org.glite.lb.logger/src/il_error.h
    deleted file mode 100644
    index f150212..0000000
    --- a/org.glite.lb.logger/src/il_error.h
    +++ /dev/null
    @@ -1,49 +0,0 @@
    -#ifndef IL_ERROR_H
    -#define IL_ERROR_H
    -
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -
    -enum err_code_maj { /* minor =                   */
    -  IL_OK,            /*     0                     */
    -  IL_SYS,           /*     errno                 */
    -  IL_NOMEM,         /*     ENOMEM                */
    -  IL_PROTO,         /*     LB_*                  */
    -  IL_LBAPI,         /*     dgLBErrCode           */
    -  IL_DGGSS,         /*     EDG_WLL_GSS_*         */
    -  IL_HOST,          /*     h_errno               */
    -  IL_DL             /*     dlerror               */
    -};
    -
    -struct error_inf {
    -  int  code_maj;
    -  long code_min;
    -  char *msg;
    -};
    -
    -int init_errors();
    -int set_error(int, long, char *);
    -int clear_error();
    -int error_get_maj();
    -long error_get_min();
    -char *error_get_msg();
    -
    -#endif
    diff --git a/org.glite.lb.logger/src/il_master.c b/org.glite.lb.logger/src/il_master.c
    deleted file mode 100644
    index 2cc1018..0000000
    --- a/org.glite.lb.logger/src/il_master.c
    +++ /dev/null
    @@ -1,474 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/jobid/cjobid.h"
    -#include "glite/lb/context.h"
    -#include "glite/lb/events_parse.h"
    -#include "glite/lb/il_string.h"
    -
    -#include "interlogd.h"
    -
    -#ifdef LB_PERF
    -#include "glite/lb/lb_perftest.h"
    -#endif
    -
    -int
    -enqueue_msg(struct event_queue *eq, struct server_msg *msg)
    -{
    -	int ret;
    -
    -	/* fire thread to take care of this queue */
    -	if(event_queue_create_thread(eq) < 0)
    -		return(-1);
    -
    -#if defined(IL_NOTIFICATIONS)
    -	/* if there are no data to send, do not send anything
    -	   (messsage was just to change the delivery address) */
    -	/* CORRECTION - let the message pass through the output queue
    -	   to commit it properly and keep event_store in sync */
    -	/* if(msg->len == 0)
    -		return(0);
    -	*/
    -#endif
    -	/* avoid losing signal to thread */
    -	event_queue_cond_lock(eq);
    -
    -	/* insert new event */
    -	if((ret = event_queue_insert(eq, msg)) < 0) {
    -		event_queue_cond_unlock(eq);
    -		return ret;
    -	}
    -
    -	/* signal thread that we have a new message */
    -	event_queue_signal(eq);
    -
    -	/* allow thread to continue */
    -	event_queue_cond_unlock(eq);
    -
    -	return ret;
    -}
    -
    -
    -#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
    -pthread_mutex_t flush_lock = PTHREAD_MUTEX_INITIALIZER;
    -pthread_cond_t flush_cond = PTHREAD_COND_INITIALIZER;
    -#endif /* INTERLOGD_FLUSH */
    -
    -#ifdef INTERLOGD_HANDLE_CMD
    -static
    -int
    -parse_cmd(char *event, char **job_id_s, long *receipt, int *timeout)
    -{
    -	char *token, *r;
    -	int ret;
    -
    -	if(strstr(event, "DG.TYPE=\"command\"") == NULL)
    -		return(-1);
    -
    -	*job_id_s = NULL;
    -	*timeout = 0;
    -	*receipt = 0;
    -	ret = 0;
    -
    -	for(token = strtok(event, " "); token != NULL; token = strtok(NULL, " ")) {
    -		r = index(token, '=');
    -		if(r == NULL) {
    -			ret = -1;
    -			continue;
    -		}
    -		if(strncmp(token, "DG.COMMAND", r - token) == 0) {
    -#if defined(INTERLOGD_FLUSH)
    -			if(strcmp(++r, "\"flush\"")) {
    -#endif
    -				glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_WARN, "command %s not implemented", 
    -						 r);
    -				ret = -1;
    -				continue;
    -#if defined(INTERLOGD_FLUSH)
    -			}
    -#endif
    -		} else if(strncmp(token, "DG.JOBID", r - token) == 0) {
    -			char  *p;
    -
    -			r += 2; /* skip =" */
    -			p = index(r, '"');
    -			if(p == NULL) { ret = -1; continue; }
    -			*job_id_s = strndup(r, p-r);
    -
    -		} else if(strncmp(token, "DG.TIMEOUT", r - token) == 0) {
    -			sscanf(++r, "\"%d\"", timeout);
    -		} else if(strncmp(token, "DG.LLLID", r - token) == 0) {
    -			sscanf(++r, "%ld", receipt);
    -		}
    -
    -	}
    -	return(0);
    -}
    -
    -
    -/* return value:
    - *   0 - not command
    - *   1 - success
    - *  -1 - failure
    - */
    -
    -static
    -int
    -handle_cmd(il_octet_string_t *event, long offset)
    -{
    -	char *job_id_s;
    -	struct event_queue *eq;
    -	int  num_replies, num_threads = 0;
    -	int  timeout, result;
    -	long receipt;
    -	struct timespec endtime;
    -	struct timeval  tv;
    -
    -	/* parse command */
    -	if(parse_cmd(event->data, &job_id_s, &receipt, &timeout) < 0)
    -		return(0);
    -
    -#if defined(INTERLOGD_FLUSH)
    -	glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, "received FLUSH command");
    -
    -	/* catchup with all neccessary event files */
    -	if(job_id_s) {
    -		struct event_store *es = event_store_find(job_id_s, NULL);
    -
    -		if(es == NULL) {
    -			goto cmd_error;
    -		}
    -		result = event_store_recover(es);
    -		/* NOTE: if flush had been stored in file, there would have been
    -		   no need to lock the event_store at all */
    -		event_store_release(es);
    -		if(result < 0) {
    -			glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_ERROR, 
    -					 "  error trying to catch up with event file: %s",
    -					 error_get_msg());
    -			clear_error();
    -		}
    -	} else
    -	  /* this call does not fail :-) */
    -	  event_store_recover_all();
    -
    -	glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, "  alerting threads to report status");
    -
    -	/* prevent threads from reporting too early */
    -	if(pthread_mutex_lock(&flush_lock) < 0) {
    -		/*** this error is considered too serious to allow the program run anymore!
    -		     set_error(IL_SYS, errno, "pthread_mutex_lock: error locking flush lock");
    -		     goto cmd_error;
    -		*/
    -		abort();
    -	}
    -
    -	/* wake up all threads */
    -	if(job_id_s) {
    -		/* find appropriate queue */
    -		eq = queue_list_get(job_id_s);
    -		if(eq == NULL) goto cmd_error;
    -		if(!event_queue_empty(eq) && !queue_list_is_log(eq)) {
    -			num_threads++;
    -			event_queue_cond_lock(eq);
    -			eq->flushing = 1;
    -			event_queue_wakeup(eq);
    -			event_queue_cond_unlock(eq);
    -		}
    -	} else {
    -		/* iterate over event queues */
    -		for(eq=queue_list_first(); eq != NULL; eq=queue_list_next()) {
    -			if(!event_queue_empty(eq) && !queue_list_is_log(eq)) {
    -				num_threads++;
    -				event_queue_cond_lock(eq);
    -				eq->flushing = 1;
    -				event_queue_wakeup(eq);
    -				event_queue_cond_unlock(eq);
    -			}
    -		}
    -	}
    -	if(!bs_only) {
    -		eq = queue_list_get(NULL);
    -		if(eq == NULL) goto cmd_error;
    -		if(!event_queue_empty(eq)) {
    -			num_threads++;
    -			event_queue_cond_lock(eq);
    -			eq->flushing = 1;
    -			event_queue_wakeup(eq);
    -			event_queue_cond_unlock(eq);
    -		}
    -	}
    -
    -	/* wait for thread replies */
    -	num_replies = 0;
    -	result = 1;
    -	gettimeofday(&tv, NULL);
    -	endtime.tv_sec = tv.tv_sec + timeout;
    -	endtime.tv_nsec = 1000 * tv.tv_usec;
    -	while(num_replies < num_threads) {
    -		int ret;
    -		if((ret=pthread_cond_timedwait(&flush_cond, &flush_lock, &endtime)) < 0) {
    -			glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_ERROR, 
    -					 "    error waiting for thread reply: %s", 
    -					 strerror(errno));
    -			result = (ret == ETIMEDOUT) ? 0 : -1;
    -			break;
    -		}
    -
    -		/* collect results from reporting threads */
    -		if(job_id_s) {
    -			/* find appropriate queue */
    -			eq = queue_list_get(job_id_s);
    -			if(eq == NULL) goto cmd_error;
    -			if(!queue_list_is_log(eq)) {
    -				event_queue_cond_lock(eq);
    -				if(eq->flushing == 2) {
    -					eq->flushing = 0;
    -					num_replies++;
    -					result = ((result == 1) || (eq->flush_result < 0))  ?
    -						eq->flush_result : result;
    -				}
    -				event_queue_cond_unlock(eq);
    -			}
    -		} else {
    -			/* iterate over event queues */
    -			for(eq=queue_list_first(); eq != NULL; eq=queue_list_next()) {
    -				if(!queue_list_is_log(eq)) {
    -					event_queue_cond_lock(eq);
    -					if(eq->flushing == 2) {
    -						eq->flushing = 0;
    -						num_replies++;
    -						glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -								 "    thread reply: %d", 
    -								 eq->flush_result);
    -						result = ((result == 1) || (eq->flush_result < 0))  ?
    -							eq->flush_result : result;
    -					}
    -					event_queue_cond_unlock(eq);
    -				}
    -			}
    -		}
    -		if(!bs_only) {
    -			eq = queue_list_get(NULL);
    -			if(eq == NULL) goto cmd_error;
    -			event_queue_cond_lock(eq);
    -			if(eq->flushing == 2) {
    -				eq->flushing = 0;
    -				num_replies++;
    -				result = ((result == 1) || (eq->flush_result < 0))  ?
    -					eq->flush_result : result;
    -			}
    -			event_queue_cond_unlock(eq);
    -		}
    -	}
    -
    -	/* prevent deadlock in next flush */
    -	if(pthread_mutex_unlock(&flush_lock) < 0)
    -		abort();
    -
    -
    -	/* report back to local logger */
    -	switch(result) {
    -	case 1:
    -		result = 0; break;
    -	case 0:
    -		result = EDG_WLL_IL_EVENTS_WAITING; break;
    -	default:
    -		result = EDG_WLL_IL_SYS; break;
    -	}
    -	if(job_id_s) free(job_id_s);
    -	result = send_confirmation(receipt, result);
    -	if(result <= 0)
    -		glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_ERROR, 
    -				 "handle_cmd: error sending status: %s", 
    -				 error_get_msg());
    -	return(1);
    -
    -
    -cmd_error:
    -	if(job_id_s) free(job_id_s);
    -	return(-1);
    -#else
    -	return(0);
    -#endif /* INTERLOGD_FLUSH */
    -}
    -#endif /* INTERLOGD_HANDLE_CMD */
    -
    -
    -static
    -int
    -handle_msg(il_octet_string_t *event, long offset)
    -{
    -	struct server_msg *msg = NULL;
    -#if !defined(IL_NOTIFICATIONS)
    -	struct event_queue *eq_l;
    -#endif
    -	struct event_queue *eq_s;
    -	struct event_store *es;
    -
    -	int ret;
    -
    -	/* convert event to message for server */
    -	if((msg = server_msg_create(event, offset)) == NULL) {
    -		glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_WARN, 
    -				 "    handle_msg: error parsing event '%s': %s", 
    -				 event, error_get_msg());
    -		return(0);
    -	}
    -
    -	/* sync event store with IPC (if neccessary)
    -	 * This MUST be called before inserting event into output queue! */
    -	if((es = event_store_find(msg->job_id_s, NULL)) == NULL)
    -		return(-1);
    -	msg->es = es;
    -
    -#ifdef LB_PERF
    -	if(nosync)
    -		ret = 1;
    -	else
    -#endif
    -		ret = event_store_sync(es, offset);
    -	/* no longer informative:
    -	il_log(LOG_DEBUG, "  syncing event store at %d with event at %d, result %d\n", es->offset, offset, ret);
    -	*/
    -	if(ret < 0) {
    -		glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_ERROR, 
    -				 "    handle_msg: error syncing event store: %s", 
    -				 error_get_msg());
    -		/* XXX should error during event store recovery cause us to drop the message? */
    -		/* Probably no, because the attempt to recover means we have missed some events,
    -		   and delivery of this one will not move offset ahead. So try our best and deliver it
    -		   even if it may cause duplicates on server. */
    -		/* COMMENTED OUT: uncommented again */
    -		server_msg_free(msg);
    -		event_store_release(es);
    -		return(0);
    -		/* */
    -	} else if(ret == 0) {
    -		/* we have seen this event already */
    -		server_msg_free(msg);
    -		event_store_release(es);
    -		return(1);
    -	}
    -
    -	/* find apropriate queue for this event */
    -#if defined(IL_NOTIFICATIONS)
    -	eq_s = queue_list_get(msg->dest);
    -#else
    -	eq_s = queue_list_get(msg->job_id_s);
    -#endif
    -	if(eq_s == NULL) {
    -		glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_ERROR, 
    -				 "    handle_msg: apropriate queue not found: %s", 
    -				 error_get_msg());
    -		clear_error();
    -	} else {
    -		if(enqueue_msg(eq_s, msg) < 0)
    -			goto err;
    -	}
    -
    -#if !defined(IL_NOTIFICATIONS)
    -	eq_l = queue_list_get(NULL);
    -	if(!bs_only && eq_l != eq_s) {
    -		/* send to default queue (logging server) as well */
    -		if(enqueue_msg(eq_l, msg) < 0)
    -			goto err;
    -	}
    -#endif
    -
    -	/* if there was no error, set the next expected event offset */
    -	event_store_next(es, offset, msg->ev_len);
    -
    -	/* allow cleanup thread to check on this event_store */
    -	event_store_release(es);
    -
    -	/* free the message */
    -	server_msg_free(msg);
    -	return(1);
    -
    -err:
    -	event_store_release(es);
    -	server_msg_free(msg);
    -	return(-1);
    -}
    -
    -
    -
    -int
    -loop()
    -{
    -	/* receive events */
    -	while(1) {
    -		il_octet_string_t *msg;
    -		long offset;
    -		int ret;
    -
    -		do_handle_signal();
    -		if(killflg)
    -			return (0);
    -
    -		clear_error();
    -		if((ret = input_queue_get(&msg, &offset, INPUT_TIMEOUT)) < 0)
    -		{
    -			if(error_get_maj() == IL_PROTO) {
    -				glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -						 "  premature EOF while receiving event");
    -				/* problems with socket input, try to catch up from files */
    -#ifndef PERF_EMPTY
    -				event_store_recover_all();
    -#endif
    -				continue;
    -			} else
    -				return(-1);
    -		}
    -		else if(ret == 0) {
    -			continue;
    -		}
    -
    -#ifdef PERF_EMPTY
    -		glite_wll_perftest_consumeEventString(msg->data);
    -		free(msg->data);
    -		continue;
    -#endif
    -
    -#ifdef INTERLOGD_HANDLE_CMD
    -		ret = handle_cmd(msg, offset);
    -		if(ret == 0)
    -#endif
    -			ret = handle_msg(msg, offset);
    -		if(msg->data) free(msg->data);
    -		if(ret < 0)
    -			switch (error_get_maj()) {
    -				case IL_SYS:
    -				case IL_NOMEM:
    -					return (ret);
    -					break;
    -				default:
    -    					glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_ERROR, 
    -							 "Error: %s", 
    -							 error_get_msg());
    -					break;
    -			}
    -	} /* while */
    -}
    diff --git a/org.glite.lb.logger/src/input_queue_socket.c b/org.glite.lb.logger/src/input_queue_socket.c
    deleted file mode 100644
    index ffcca81..0000000
    --- a/org.glite.lb.logger/src/input_queue_socket.c
    +++ /dev/null
    @@ -1,292 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "interlogd.h"
    -
    -
    -static const int   SOCK_QUEUE_MAX = 50;
    -extern char *socket_path;
    -
    -static int sock;
    -static int accepted;
    -
    -int 
    -input_queue_attach()
    -{ 
    -  struct sockaddr_un saddr;
    -
    -  if((sock=socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
    -    set_error(IL_SYS, errno, "input_queue_attach: error creating socket");
    -    return(-1);
    -  }
    -
    -  memset(&saddr, 0, sizeof(saddr));
    -  saddr.sun_family = AF_UNIX;
    -  strcpy(saddr.sun_path, socket_path);
    -
    -  /* test for the presence of the socket and another instance 
    -     of interlogger listening */
    -  if(connect(sock, (struct sockaddr *)&saddr, sizeof(saddr.sun_path)) < 0) {
    -	  if(errno == ECONNREFUSED) {
    -		  /* socket present, but no one at the other end; remove it */
    -		  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, 
    -				   "  removing stale input socket %s", 
    -				   socket_path);
    -		  unlink(socket_path);
    -	  }
    -	  /* ignore other errors for now */
    -  } else {
    -	  /* connection was successful, so bail out - there is 
    -	     another interlogger running */
    -	  set_error(IL_SYS, EADDRINUSE, "input_queue_attach: another instance of interlogger is running");
    -	  return(-1);
    -  }
    -  
    -  if(bind(sock, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) {
    -    set_error(IL_SYS, errno, "input_queue_attach: error binding socket");
    -    return(-1);
    -  }
    -
    -  if (listen(sock, SOCK_QUEUE_MAX)) {
    -    set_error(IL_SYS, errno, "input_queue_attach: error listening on socket");
    -    return -1;
    -  }
    -
    -  return(0);
    -}
    -
    -void input_queue_detach()
    -{
    -  if (sock >= 0)
    -    close(sock);
    -  unlink(socket_path);
    -}
    -
    -
    -#define DEFAULT_CHUNK_SIZE 1024
    -
    -static
    -int
    -read_event(int sock, long *offset, il_octet_string_t *msg)
    -{
    -  char *buffer, *p, *n;
    -  int  len, alen, i, chunk_size = DEFAULT_CHUNK_SIZE;
    -
    -  msg->data = NULL;
    -  msg->len = 0;
    -
    -  /* receive offset */
    -  len = recv(sock, offset, sizeof(*offset), MSG_NOSIGNAL);
    -  if(len < sizeof(*offset)) {
    -    set_error(IL_PROTO, errno, "read_event: error reading offset");
    -    return(-1);
    -  }
    -  
    -  /* receive event string */
    -  buffer=malloc(8*chunk_size);
    -  if(buffer == NULL) {
    -    set_error(IL_NOMEM, ENOMEM, "read_event: no room for event");
    -    return(-1);
    -  }
    -  p = buffer;
    -  alen = 8*chunk_size;
    -
    -  /* Variables used here:
    -        - buffer points to allocated memory,
    -	- alen is the allocated memory size,
    -	- p points to the first free location in buffer,
    -	- len is the amount actually read by recv,
    -	- i is the amount of data belonging to the current event (including separator).
    -	- n points to event separator or is NULL
    -    Hence:
    -         (p - buffer) gives the amount of valid data read so far,
    -	 (alen - (p - buffer)) is the free space,
    -  */ 
    - 
    -  /* Reading events - optimized version. Attempts to increase chunks read by recv
    -   * when there are more data, reads directly into destination memory (instead of 
    -   * copying from static buffer) etc.
    -   *
    -   * For some reason it is not much faster than the old variant.
    -   */
    -  do {
    -	  /* prepare at least chunk_size bytes for next data */
    -	  if(alen - (p - buffer) < chunk_size) {
    -		  alen += (chunk_size < 8192) ? 8192 : 8*chunk_size;
    -		  n = realloc(buffer, alen);
    -		  if(n == NULL) {
    -			  free(buffer);
    -			  set_error(IL_NOMEM, ENOMEM, "read_event: no room for event");
    -			  return(-1);
    -		  }
    -		  p = n + (p - buffer);
    -		  buffer = n;
    -	  }
    -
    -	  /* read chunk */
    -	  if((len=recv(sock, p, chunk_size, MSG_PEEK | MSG_NOSIGNAL)) > 0) {
    -		  /* find the end of event, if any */
    -		  /* faster (and dirty) way of doing strnchr (which is not in libc, anyway) */
    -		  if((n=memccpy(p, p, EVENT_SEPARATOR, len)) != NULL) {
    -			  i = n - p; /* length including separator */
    -		  } else {
    -			  i = len;
    -			  /* long event, huh? try reading more data at once */
    -			  chunk_size += 1024;
    -		  }
    -		  /* remove the relevant data from input */
    -		  /* i > 0 */
    -		  if(recv(sock, p, i, MSG_NOSIGNAL) != i) {
    -			  set_error(IL_SYS, errno, "read_event: error reading data");
    -			  free(buffer);
    -			  return(-1);
    -		  }
    -		  /* move the pointer to the first free place, separator is considered free space */
    -		  p = (n == NULL) ? p + len : n - 1;
    -	  }
    -  } while ( (len > 0) && (n == NULL) );
    -
    -  /* terminate buffer */
    -  *p = 0;
    -
    -  if(len < 0) {
    -    set_error(IL_SYS, errno, "read_event: error reading data");
    -    free(buffer);
    -    return(-1);
    -  }
    -
    -  /* if len == 0, we have not encountered EVENT_SEPARATOR and thus the event is not complete */
    -  if(len == 0) {
    -    set_error(IL_PROTO, errno, "read_event: error reading data - premature EOF");
    -    free(buffer);
    -    return(-1);
    -  }
    -
    -#if 0
    -  /* this is probably not necessary at all:
    -     either len <=0, which was covered before,
    -     or 0 <= i < len => p > buffer;
    -     I would say this condition can not be satisfied.
    -  */
    -  if(p == buffer) {
    -    set_error(IL_PROTO, errno, "read_event: error reading data - no data received");
    -    free(buffer);
    -    return(-1);
    -  }
    -#endif
    -
    -  msg->data = buffer;
    -  msg->len = p - buffer;
    -  return(msg->len);
    -}
    -
    -
    -/*
    - * Returns: -1 on error, 0 if no message available, message length otherwise
    - *
    - */
    -#ifdef PERF_EVENTS_INLINE
    -int
    -input_queue_get(il_octet_string **buffer, long *offset, int timeout)
    -{
    -	static long o = 0;
    -	int len;
    -	char *jobid;
    -	static il_octet_string_t my_buffer;
    -
    -	assert(buffer != NULL);
    -
    -	*buffer = &my_buffer;
    -
    -	len = glite_wll_perftest_produceEventString(&my_buffer.data, &jobid);
    -	my_buffer.len = len;
    -	if(len) {
    -		o += len;
    -		*offset = o;
    -	} else if (len == 0) {
    -		sleep(timeout);
    -	}
    -	return(len);
    -}
    -#else
    -int
    -input_queue_get(il_octet_string_t **buffer, long *offset, int timeout)
    -{
    -  fd_set fds;
    -  struct timeval tv;
    -  int msg_len;
    -  static il_octet_string_t my_buffer;
    -
    -  assert(buffer != NULL);
    -
    -  *buffer = &my_buffer;
    -
    -  FD_ZERO(&fds);
    -  FD_SET(sock, &fds);
    -  
    -  tv.tv_sec = timeout;
    -  tv.tv_usec = 0;
    -  
    -  msg_len = select(sock + 1, &fds, NULL, NULL, timeout >= 0 ? &tv : NULL);
    -  switch(msg_len) {
    -     
    -  case 0: /* timeout */
    -    return(0);
    -    
    -  case -1: /* error */
    -	  switch(errno) {
    -	  case EINTR:
    -		  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_WARN, 
    -				   "  interrupted while waiting for event!");
    -		  return(0);
    -
    -	  default:
    -		  set_error(IL_SYS, errno, "input_queue_get: error waiting for event");
    -		  return(-1);
    -	  }
    -  default:
    -	  break;
    -  }
    -  
    -  if((accepted=accept(sock, NULL, NULL)) < 0) {
    -    set_error(IL_SYS, errno, "input_queue_get: error accepting connection");
    -    return(-1);
    -  }
    -
    -  read_event(accepted, offset, &my_buffer);
    -  close(accepted);
    -
    -  if(my_buffer.data == NULL) {
    -    if(error_get_maj() != IL_OK)
    -      return(-1);
    -    else
    -      return(0);
    -  }
    -    
    -  return(my_buffer.len);
    -}
    -#endif
    diff --git a/org.glite.lb.logger/src/input_queue_socket_http.c b/org.glite.lb.logger/src/input_queue_socket_http.c
    deleted file mode 100644
    index fd0e303..0000000
    --- a/org.glite.lb.logger/src/input_queue_socket_http.c
    +++ /dev/null
    @@ -1,184 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "interlogd.h"
    -
    -static const int   SOCK_QUEUE_MAX = 50;
    -extern char *socket_path;
    -extern char *file_prefix;
    -
    -static int sock;
    -static int accepted;
    -
    -static
    -int plain_reader(void *user_data, char *buffer, const int len)
    -{
    -	return (recv(*(int*)user_data, buffer, len, MSG_NOSIGNAL));
    -}
    -
    -		 
    -int 
    -input_queue_attach()
    -{ 
    -  struct sockaddr_un saddr;
    -
    -  if((sock=socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
    -    set_error(IL_SYS, errno, "input_queue_attach: error creating socket");
    -    return(-1);
    -  }
    -
    -  memset(&saddr, 0, sizeof(saddr));
    -  saddr.sun_family = AF_UNIX;
    -  strcpy(saddr.sun_path, socket_path);
    -
    -  /* test for the presence of the socket and another instance 
    -     of interlogger listening */
    -  if(connect(sock, (struct sockaddr *)&saddr, sizeof(saddr.sun_path)) < 0) {
    -	  if(errno == ECONNREFUSED) {
    -		  /* socket present, but no one at the other end; remove it */
    -		  il_log(LOG_WARNING, "  removing stale input socket %s\n", socket_path);
    -		  unlink(socket_path);
    -	  }
    -	  /* ignore other errors for now */
    -  } else {
    -	  /* connection was successful, so bail out - there is 
    -	     another interlogger running */
    -	  set_error(IL_SYS, EADDRINUSE, "input_queue_attach: another instance of interlogger is running");
    -	  return(-1);
    -  }
    -  
    -  if(bind(sock, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) {
    -    set_error(IL_SYS, errno, "input_queue_attach: error binding socket");
    -    return(-1);
    -  }
    -
    -  if (listen(sock, SOCK_QUEUE_MAX)) {
    -    set_error(IL_SYS, errno, "input_queue_attach: error listening on socket");
    -    return -1;
    -  }
    -
    -  return(0);
    -}
    -
    -
    -void input_queue_detach()
    -{
    -  if (sock >= 0)
    -    close(sock);
    -  unlink(socket_path);
    -}
    -
    -
    -
    -/*
    - * Returns: -1 on error, 0 if no message available, message length otherwise
    - *
    - */
    -#ifdef PERF_EVENTS_INLINE
    -int
    -input_queue_get(il_octet_string_t **buffer, long *offset, int timeout)
    -{
    -	static long o = 0;
    -	int len;
    -	char *jobid;
    -	static il_octet_string_t my_buffer;
    -	
    -	assert(buffer != NULL);
    -
    -	*buffer = &my_buffer;
    -
    -	len = glite_wll_perftest_produceEventString(&my_buffer.data, &jobid);
    -	my_buffer.len = len;
    -	if(len) {
    -		o += len;
    -		*offset = o;
    -	} else if (len == 0) {
    -		sleep(timeout);
    -	}
    -	return(len);
    -}
    -#else
    -int
    -input_queue_get(il_octet_string_t **buffer, long *offset, int timeout)
    -{
    -  fd_set fds;
    -  struct timeval tv;
    -  int msg_len;
    -  static il_http_message_t msg;
    -
    -  assert(buffer != NULL);
    -
    -  *buffer = (il_octet_string_t *)&msg;
    -
    -  FD_ZERO(&fds);
    -  FD_SET(sock, &fds);
    -  
    -  tv.tv_sec = timeout;
    -  tv.tv_usec = 0;
    -  
    -  msg_len = select(sock + 1, &fds, NULL, NULL, timeout >= 0 ? &tv : NULL);
    -  switch(msg_len) {
    -     
    -  case 0: /* timeout */
    -    return(0);
    -    
    -  case -1: /* error */
    -	  switch(errno) {
    -	  case EINTR:
    -		  il_log(LOG_DEBUG, "  interrupted while waiting for event!\n");
    -		  return(0);
    -
    -	  default:
    -		  set_error(IL_SYS, errno, "input_queue_get: error waiting for event");
    -		  return(-1);
    -	  }
    -  default:
    -	  break;
    -  }
    -  
    -  if((accepted=accept(sock, NULL, NULL)) < 0) {
    -    set_error(IL_SYS, errno, "input_queue_get: error accepting connection");
    -    return(-1);
    -  }
    -
    -  msg_len = receive_http(&accepted, plain_reader, &msg);
    -
    -  if(msg_len < 0) {
    -	  close(accepted);
    -	  if(error_get_maj() != IL_OK) 
    -		  return -1;
    -	  else
    -		  return 0;
    -  }
    -
    -  close(accepted);
    -  *offset = -1;
    -  return(msg.len);
    -}
    -#endif
    -
    diff --git a/org.glite.lb.logger/src/interlogd.c b/org.glite.lb.logger/src/interlogd.c
    deleted file mode 100644
    index f1afa5a..0000000
    --- a/org.glite.lb.logger/src/interlogd.c
    +++ /dev/null
    @@ -1,613 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -/*
    -   interlogger - collect events from local-logger and send them to logging and bookkeeping servers
    -
    -*/
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "interlogd.h"
    -#include "glite/lb/log_proto.h"
    -#include "glite/security/glite_gss.h"
    -#ifdef LB_PERF
    -#include "glite/lb/lb_perftest.h"
    -#endif
    -
    -#define EXIT_FAILURE 1
    -#if defined(IL_NOTIFICATIONS)
    -#define DEFAULT_PREFIX "/tmp/notif_events"
    -#define DEFAULT_SOCKET "/tmp/notif_interlogger.sock"
    -#define DEFAULT_PIDFILE "/var/glite/glite-lb-notif-interlogd.pid"
    -#else
    -#define DEFAULT_PREFIX EDG_WLL_LOG_PREFIX_DEFAULT
    -#define DEFAULT_SOCKET "/tmp/interlogger.sock"
    -#define DEFAULT_PIDFILE  "/var/glite/glite-lb-interlogd.pid"
    -#endif
    -
    -
    -
    -/* The name the program was run with, stripped of any leading path. */
    -char *program_name;
    -int killflg = 0;
    -
    -int TIMEOUT = DEFAULT_TIMEOUT;
    -
    -cred_handle_t *cred_handle = NULL;
    -pthread_mutex_t cred_handle_lock = PTHREAD_MUTEX_INITIALIZER;
    -
    -time_t key_mtime = 0, cert_mtime = 0;
    -
    -static char *pidfile = DEFAULT_PIDFILE;
    -
    -static void usage (int status)
    -{
    -	printf("%s - \n"
    -	       "  collect events from local-logger and send them to logging and bookkeeping servers\n"
    -	       "Usage: %s [OPTION]... [FILE]...\n"
    -	       "Options:\n"
    -	       "  -h, --help                 display this help and exit\n"
    -	       "  -V, --version              output version information and exit\n"
    -	       "  -d, --debug                do not run as daemon\n"
    -	       "  -v, --verbose              print extensive debug output\n"
    -	       "  -f, --file-prefix  path and prefix for event files\n"
    -	       "  -c, --cert           location of server certificate\n"
    -	       "  -k, --key            location of server private key\n"
    -	       "  -C, --CAdir           directory containing CA certificates\n"
    -	       "  -b, --book                 send events to bookkeeping server only\n"
    -	       "  -i, --pidfile		         pid file\n"
    -	       "  -l, --log-server     specify address of log server\n"
    -	       "  -s, --socket         non-default path of local socket\n"
    -	       "  -L, --lazy []     be lazy when closing connections to servers (default, timeout==0 means turn lazy off)\n"
    -	       "  -p, --parallel []     use  parallel streams to the same server\n"
    -	       "  -q, --queue-low       queue length that enables another insertions\n"
    -	       "  -Q, --queue-high      max queue length\n"
    -		   "  -F, --conf 			 load configuration from config file\n"
    -#ifdef LB_PERF
    -	       "  -n, --nosend               PERFTEST: consume events instead of sending\n"
    -	       "  -S, --nosync               PERFTEST: do not check logd files for lost events\n"
    -	       "  -R, --norecover            PERFTEST: do not start recovery thread\n"
    -	       "  -P, --noparse              PERFTEST: do not parse messages, use built-in server address\n"
    -#ifdef PERF_EVENTS_INLINE
    -	       "  -e, --event_file     PERFTEST: file to read test events from\n"
    -	       "  -j, --njobs             PERFTEST: number of jobs to send\n"
    -#endif
    -#endif
    -	       , program_name, program_name);
    -	exit(status);
    -}
    -
    -
    -/* Option flags and variables */
    -static int debug;
    -static int verbose = 0;
    -char *file_prefix = DEFAULT_PREFIX;
    -int bs_only = 0;
    -int lazy_close = 1;
    -int default_close_timeout;
    -size_t max_store_size;
    -size_t queue_size_low = 0;
    -size_t queue_size_high = 0;
    -int parallel = 0;
    -#ifdef LB_PERF
    -int nosend = 0, norecover=0, nosync=0, noparse=0;
    -char *event_source = NULL;
    -int njobs = 0;
    -#endif
    -
    -char *cert_file = NULL;
    -char *key_file  = NULL;
    -char *CAcert_dir = NULL;
    -char *log_server = NULL;
    -char *socket_path = DEFAULT_SOCKET;
    -static char *conf_file = NULL;
    -static char *config = NULL;
    -
    -static struct option const long_options[] =
    -{
    -  {"help", no_argument, 0, 'h'},
    -  {"version", no_argument, 0, 'V'},
    -  {"verbose", no_argument, 0, 'v'},
    -  {"debug", no_argument, 0, 'd'},
    -  {"file-prefix", required_argument, 0, 'f'},
    -  {"cert", required_argument, 0, 'c'},
    -  {"key", required_argument, 0, 'k'},
    -  {"book", no_argument, 0, 'b'},
    -  {"CAdir", required_argument, 0, 'C'},
    -  {"pidfile", required_argument, 0, 'i'},
    -  {"log-server", required_argument, 0, 'l'},
    -  {"socket", required_argument, 0, 's'},
    -  {"lazy", optional_argument, 0, 'L'},
    -  {"max-store", required_argument, 0, 'M'},
    -  {"parallel", optional_argument, 0, 'p'},
    -  {"queue_size_low", required_argument, 0, 'q'},
    -  {"queue_size_high", required_argument, 0, 'Q'},
    -  {"conf", required_argument, 0, 'F'},
    -#ifdef LB_PERF
    -  {"nosend", no_argument, 0, 'n'},
    -  {"nosync", no_argument, 0, 'S'},
    -  {"norecover", no_argument, 0, 'R'},
    -  {"noparse", no_argument, 0, 'P'},
    -#ifdef PERF_EVENTS_INLINE
    -  {"event_file", required_argument, 0, 'e'},
    -  {"njobs", required_argument, NULL, 'j'},
    -#endif
    -#endif
    -  {NULL, 0, NULL, 0}
    -};
    -
    -
    -
    -/* Set all the option flags according to the switches specified.
    -   Return the index of the first non-option argument.  */
    -static int
    -decode_switches (int argc, char **argv)
    -{
    -  int c;
    -
    -  debug = 0;
    -
    -  while ((c = getopt_long (argc, argv,
    -			   "f:"  /* file prefix */
    -			   "h"	/* help */
    -			   "V"	/* version */
    -			   "v"  /* verbose */
    -			   "c:"          /* certificate */
    -			   "k:"          /* key */
    -			   "C:"          /* CA dir */
    -			   "b"  /* only bookeeping */
    -			   "i:"  /* pidfile*/
    -               "l:" /* log server */
    -			   "d" /* debug */
    -			   "p" /* parallel */
    -			   "q:"
    -			   "Q:"
    -			   "F:" /* conf file */
    -#ifdef LB_PERF
    -			   "n" /* nosend */
    -			   "S" /* nosync */
    -			   "R" /* norecover */
    -			   "P" /* noparse */
    -#ifdef PERF_EVENTS_INLINE
    -			   "e:" /* event file */
    -			   "j:" /* num jobs */
    -#endif
    -#endif
    -			   "L::" /* lazy */
    -			   "s:" /* socket */
    -			   "M:" /* max-store */,
    -			   long_options, (int *) 0)) != EOF)
    -    {
    -      switch (c)
    - 	{
    -	case 'V':
    -	  printf ("interlogger %s\n", VERSION);
    -	  exit (0);
    -
    -	case 'v':
    -	  verbose = 1;
    -	  break;
    -
    -	case 'h':
    -	  usage (0);
    -
    -	case 'd':
    -	  debug = 1;
    -	  break;
    -
    -	case 'f':
    -	  file_prefix = strdup(optarg);
    -	  break;
    -
    -	case 'c':
    -	  cert_file = strdup(optarg);
    -	  break;
    -
    -	case 'k':
    -	  key_file = strdup(optarg);
    -	  break;
    -
    -	case 'b':
    -	  bs_only = 1;
    -	  break;
    -
    -	case 'l':
    -	  log_server = strdup(optarg);
    -	  break;
    -
    -	case 'i': 
    -	  pidfile = strdup(optarg);
    -	  break;
    -
    -	case 'C':
    -	  CAcert_dir = strdup(optarg);
    -	  break;
    -
    -	case 's':
    -	  socket_path = strdup(optarg);
    -	  break;
    -
    -	case 'L':
    -		lazy_close = 1;
    -		if(optarg)
    -		        default_close_timeout = atoi(optarg);
    -			if(default_close_timeout == 0) {
    -				default_close_timeout = TIMEOUT;
    -				lazy_close = 0;
    -			}
    -		else
    -			default_close_timeout = TIMEOUT;
    -		break;
    -
    -	case 'M':
    -		max_store_size = atoi(optarg);
    -		break;
    -
    -	case 'p':
    -		if(optarg)
    -			parallel = atoi(optarg);
    -		else
    -			parallel = 4;
    -		break;
    -
    -	case 'q':
    -		queue_size_low = atoi(optarg);
    -		break;
    -
    -	case 'Q':
    -		queue_size_high = atoi(optarg);
    -		break;
    -
    -	case 'F':
    -		conf_file = strdup(optarg);
    -		break;
    -
    -#ifdef LB_PERF
    -	case 'n':
    -		nosend = 1;
    -		break;
    -
    -	case 'R':
    -		norecover = 1;
    -		break;
    -
    -	case 'S':
    -		nosync = 1;
    -		break;
    -
    -	case 'P':
    -		noparse = 1;
    -		break;
    -
    -#ifdef PERF_EVENTS_INLINE
    -	case 'e':
    -		event_source = strdup(optarg);
    -		break;
    -
    -	case 'j':
    -		njobs = atoi(optarg);
    -		break;
    -#endif
    -#endif
    -
    -	default:
    -	  usage (EXIT_FAILURE);
    -	}
    -    }
    -
    -  return optind;
    -}
    -
    -
    -char *load_conf_file(char *filename)
    -{
    -	struct stat fs;
    -	FILE *cf;
    -	char *s;
    -
    -	if(stat(filename, &fs) < 0) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR,
    -				"Could not stat config file %s: %s\n", filename, strerror(errno));
    -		exit(EXIT_FAILURE);
    -	}
    -	s = malloc(fs.st_size + 1);
    -	if(s == NULL) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, "Not enough memory for config file");
    -		exit(EXIT_FAILURE);
    -	}
    -	cf = fopen(filename, "r");
    -	if(cf == NULL) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR,
    -				"Error opening config file %s: %s\n", filename, strerror(errno));
    -		exit(EXIT_FAILURE);
    -	}
    -	if(fread(s, fs.st_size, 1, cf) != 1) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR,
    -				"Error reading config file %s: %s\n", filename, strerror(errno));
    -		exit(EXIT_FAILURE);
    -	}
    -	fclose(cf);
    -	s[fs.st_size] = 0;
    -	return s;
    -}
    -
    -static int	received_signal = 0;
    -
    -static void handle_signal(int num)
    -{
    -	received_signal	= num;
    -}
    -
    -
    -void do_handle_signal() {
    -
    -	if (received_signal == 0) return;
    -
    -	glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Received signal %d\n", received_signal);
    -
    -	switch(received_signal) {
    -	case SIGHUP:
    -		/* TODO: reload all external configurations, see
    -		https://rt3.cesnet.cz/rt/Ticket/Display.html?id=24879 */
    -		glite_common_log_reread();
    -		break;
    -
    -	case SIGUSR1:
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO,
    -				 "Logging priority is now %s for %s, %s for %s and %s for %s\n", 
    -				 glite_common_log_priority_to_string(glite_common_log_get_priority(LOG_CATEGORY_SECURITY)),
    -				 LOG_CATEGORY_SECURITY,
    -				 glite_common_log_priority_to_string(glite_common_log_get_priority(LOG_CATEGORY_ACCESS)),
    -				 LOG_CATEGORY_ACCESS,
    -				 glite_common_log_priority_to_string(glite_common_log_get_priority(LOG_CATEGORY_CONTROL)),
    -				 LOG_CATEGORY_CONTROL);
    -		break;
    -
    -	case SIGUSR2:
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO,
    -				 "Logging priority is now %s for %s and %s for %s\n", 
    -				 glite_common_log_priority_to_string(glite_common_log_get_priority(LOG_CATEGORY_LB)),
    -				 LOG_CATEGORY_LB,
    -				 glite_common_log_priority_to_string(glite_common_log_get_priority(LOG_CATEGORY_LB_IL)),
    -				 IL_LOG_CATEGORY);
    -		break;
    -
    -	case SIGPIPE:
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Broken pipe, lost communication channel.\n");
    -		break;
    -
    -	case SIGINT:
    -	case SIGTERM:
    -	case SIGQUIT:
    -		killflg++;
    -		break;
    -
    -	}
    -
    -	received_signal = 0;
    -}
    -
    -
    -
    -int
    -main (int argc, char **argv)
    -{
    -  int i;
    -  char *p;
    -  edg_wll_GssStatus gss_stat;
    -  int ret;
    -  FILE *pidf;
    -
    -  program_name = argv[0];
    -
    -  setlinebuf(stdout);
    -  setlinebuf(stderr);
    -
    -  if ((p = getenv("EDG_WL_INTERLOG_TIMEOUT"))) TIMEOUT = atoi(p);
    -
    -  i = decode_switches (argc, argv);
    -
    -  if(glite_common_log_init()) {
    -	  fprintf(stderr, "glite_common_log_init() failed, exiting.\n");
    -	  exit(EXIT_FAILURE);
    -  }
    -
    -  /* parse config file, if any */
    -  if(conf_file != NULL) {
    -	  config = load_conf_file(conf_file);
    -  }
    -
    -  /* check for reasonable queue lengths */
    -  if((queue_size_low == 0 && queue_size_high > 0) ||
    -     (queue_size_low > queue_size_high)) {
    -	  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "max queue length -Q must be greater than low queue length -q, both or none must be specified!");
    -	  exit(EXIT_FAILURE);
    -  }
    -
    -  /* force -b if we do not have log server */
    -  if(log_server == NULL) {
    -    log_server = strdup(DEFAULT_LOG_SERVER);
    -    bs_only = 1;
    -  }
    -
    -  /* initialize error reporting */
    -  if(init_errors()) {
    -	  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "Failed to initialize error message subsystem. Exiting.");
    -	  exit(EXIT_FAILURE);
    -  }
    -
    -  if (signal(SIGPIPE, SIG_IGN) == SIG_ERR
    -      || signal(SIGABRT, handle_signal) == SIG_ERR
    -      || signal(SIGTERM, handle_signal) == SIG_ERR
    -      || signal(SIGINT, handle_signal) == SIG_ERR) {
    -	  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "Failed to setup signal handlers: %s, exiting.",
    -			   strerror(errno));
    -	  exit(EXIT_FAILURE);
    -  }
    -
    -/* just try it before deamonizing to be able to complain aloud */
    -  if (!(pidf = fopen(pidfile,"w"))) {
    -	perror(pidfile);
    -	exit(EXIT_FAILURE);
    -  }
    -  fclose(pidf);
    -
    -  if(!debug &&
    -     (daemon(0,0) < 0)) {
    -	  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "Failed to daemonize itself: %s, exiting.",
    -			   strerror(errno));
    -	  exit(EXIT_FAILURE);
    -  }
    -
    -  pidf = fopen(pidfile,"w"); assert(pidf); /* XXX */
    -  fprintf(pidf,"%d\n",getpid());
    -  fclose(pidf);
    -
    -#ifdef LB_PERF
    -  /* this must be called after installing signal handlers */
    -  glite_wll_perftest_init(NULL, /* host */
    -			  NULL, /* user */
    -			  NULL, /* test name */
    -			  event_source,
    -			  njobs);
    -#endif
    -
    -  if(input_queue_attach() < 0) {
    -	  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "Failed to initialize input queue: %s", 
    -			   error_get_msg());
    -	  exit(EXIT_FAILURE);
    -  }
    -  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Initialized input queue.");
    -
    -  /* initialize output queues */
    -  if(queue_list_init(log_server) < 0) {
    -	  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "Failed to initialize output event queues: %s", 
    -			   error_get_msg());
    -	  exit(EXIT_FAILURE);
    -  }
    -  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Initialized event queues.");
    -  if(lazy_close)
    -	  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "  using lazy mode when closing connections, timeout %d",
    -			   default_close_timeout);
    -
    -  /* get credentials */
    -  if (CAcert_dir)
    -     setenv("X509_CERT_DIR", CAcert_dir, 1);
    -  edg_wll_gss_watch_creds(cert_file,&cert_mtime);
    -  cred_handle = malloc(sizeof(*cred_handle));
    -  if(cred_handle == NULL) {
    -	  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "Failed to allocate structure for credentials.");
    -	  exit(EXIT_FAILURE);
    -  }
    -  cred_handle->creds = NULL;
    -  cred_handle->counter = 0;
    -  ret = edg_wll_gss_acquire_cred_gsi(cert_file, key_file, &cred_handle->creds, &gss_stat);
    -  if (ret) {
    -     char *gss_err = NULL;
    -
    -     if (ret == EDG_WLL_GSS_ERROR_GSS)
    -	edg_wll_gss_get_error(&gss_stat, "edg_wll_gss_acquire_cred_gsi()", &gss_err);
    -     glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_FATAL, "Failed to load GSI credential: %s, exiting.",
    -		      (gss_err) ? gss_err : "edg_wll_gss_acquire_cred_gsi() failed");
    -     if (gss_err)
    -	free(gss_err);
    -     exit(EXIT_FAILURE);
    -  }
    -  glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_INFO, "Using certificate %s", cred_handle->creds->name);
    -
    -  /* parse config, initialize plugins */
    -  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Initializing plugins:\n");
    -  if(config) {
    -	  char *s = strstr(config, "[interlogd]");
    -	  char *p;
    -	  char name[MAXPATHLEN+1];
    -
    -	  /* next line */
    -	  s = strchr(s, '\n');
    -	  if(s) s++;
    -	  while(s) {
    -		  if(*s == 0 || *s == '[')
    -			  break;
    -		  /* parse line */
    -		  p = strchr(s, '\n');
    -		  if(p) {
    -			  *p = 0;
    -		  }
    -		  /* XXX possible overflow by long line in config file */
    -		  ret = sscanf(s, " plugin =%s", name);
    -		  if(p) *p = '\n';
    -		  if(ret > 0) {
    -			  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "  loading plugin %s\n", name);
    -			  if(plugin_mgr_init(name, config) < 0) {
    -				  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, "Failed to load plugin %s: %s\n", name, error_get_msg());
    -			  }
    -		  }
    -		  s = p;
    -	  }
    -  }
    -
    -#ifndef PERF_EMPTY
    -  /* find all unsent events waiting in files */
    -#ifdef LB_PERF
    -  if(norecover) {
    -	  if(event_store_init(file_prefix) < 0) {
    -		  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "Failed to initialize event stores: %s", 
    -				   error_get_msg());
    -		  exit(EXIT_FAILURE);
    -	  }
    -  } else
    -#endif
    -  {
    -	  pthread_t rid;
    -
    -	  if(pthread_create(&rid, NULL, recover_thread, NULL) < 0) {
    -		  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "Failed to start recovery thread: %s", strerror(errno));
    -		  exit(EXIT_FAILURE);
    -	  }
    -	  pthread_detach(rid);
    -	  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Started recovery thread.");
    -  }
    -#endif
    -
    -  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Entering main loop.");
    -
    -  /* do the work */
    -  if(loop() < 0) {
    -	  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "Fatal error: %s", error_get_msg());
    -	  if (killflg) {
    -		  input_queue_detach();
    -		  unlink(pidfile);
    -		  exit(EXIT_FAILURE);
    -	  }
    -  }
    -  glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Done!");
    -  input_queue_detach();
    -  unlink(pidfile);
    -
    -  exit (0);
    -}
    diff --git a/org.glite.lb.logger/src/interlogd.h b/org.glite.lb.logger/src/interlogd.h
    deleted file mode 100644
    index bdf0146..0000000
    --- a/org.glite.lb.logger/src/interlogd.h
    +++ /dev/null
    @@ -1,326 +0,0 @@
    -#ifndef INTERLOGGER_P_H
    -#define INTERLOGGER_P_H
    -
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -#include "il_error.h"
    -#include "glite/security/glite_gss.h"
    -#include "glite/lb/il_msg.h"
    -#include "glite/lbu/log.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#ifdef HAVE_UNISTD_H
    -#include 
    -#endif
    -#include 
    -#ifdef HAVE_DMALLOC_H
    -#include 
    -#endif
    -
    -#define INTERLOGD_HANDLE_CMD
    -#define INTERLOGD_FLUSH
    -#define INTERLOGD_EMS
    -
    -#define DEFAULT_USER "michal"
    -#define DEFAULT_LOG_SERVER "localhost"
    -#define DEFAULT_TIMEOUT 60
    -
    -#ifdef LB_PERF
    -#include "glite/lb/lb_perftest.h"
    -#endif
    -
    -#if defined(IL_NOTIFICATIONS)
    -
    -#include "glite/lb/notifid.h"
    -
    -#undef INTERLOGD_HANDLE_CMD
    -#undef INTERLOGD_FLUSH
    -#undef INTERLOGD_EMS
    -#define IL_EVENT_ID_T          edg_wll_NotifId
    -#define IL_EVENT_GET_UNIQUE(a) edg_wll_NotifIdGetUnique((a))
    -#define IL_EVENT_ID_FREE(a)    edg_wll_NotifIdFree((a))
    -#define IL_EVENT_ID_PARSE(a,b) edg_wll_NotifIdParse((a),(b))
    -#define IL_LOG_CATEGORY        LOG_CATEGORY_LB_ILNOTIF
    -
    -#else
    -
    -#define INTERLOGD_HANDLE_CMD
    -#define INTERLOGD_FLUSH
    -#define INTERLOGD_EMS
    -#define IL_EVENT_ID_T          edg_wlc_JobId
    -#define IL_EVENT_GET_UNIQUE(a) edg_wlc_JobIdGetUnique((a))
    -#define IL_EVENT_ID_FREE(a)    edg_wlc_JobIdFree((a))
    -#define IL_EVENT_ID_PARSE(a,b) edg_wlc_JobIdParse((a),(b))
    -#define IL_LOG_CATEGORY        LOG_CATEGORY_LB_IL
    -
    -#endif
    -
    -
    -#define EVENT_SEPARATOR '\n'
    -
    -// #define TIMEOUT      5
    -extern int TIMEOUT;
    -#ifdef LB_PERF
    -#define INPUT_TIMEOUT (1)
    -#define EXIT_TIMEOUT  (20)
    -#else
    -#define INPUT_TIMEOUT (5)
    -#define EXIT_TIMEOUT (1*60)
    -#endif
    -#define RECOVER_TIMEOUT (60)
    -
    -typedef struct cred_handle {
    -	edg_wll_GssCred creds;
    -	int counter;
    -} cred_handle_t;
    -extern cred_handle_t *cred_handle;
    -
    -extern pthread_mutex_t cred_handle_lock;
    -extern pthread_key_t cred_handle_key;
    -extern char *cert_file;
    -extern char *key_file;
    -extern char *CAcert_dir;
    -extern int bs_only;
    -extern int killflg;
    -extern int lazy_close;
    -extern int default_close_timeout;
    -extern size_t max_store_size;
    -extern size_t queue_size_high;
    -extern size_t queue_size_low;
    -extern int parallel;
    -#ifdef LB_PERF
    -extern int nosend, nosync, norecover, noparse;
    -#ifdef PERF_EVENTS_INLINE
    -extern char *event_source;
    -#endif
    -#endif
    -
    -/* shared data for thread communication */
    -#ifdef INTERLOGD_FLUSH
    -extern pthread_mutex_t flush_lock;
    -extern pthread_cond_t flush_cond;
    -#endif
    -
    -typedef struct {
    -	/* il_octet_string_t */
    -	int       len;
    -	char     *data;
    -	/* http message specific */
    -	enum { IL_HTTP_OTHER,
    -	       IL_HTTP_GET,
    -	       IL_HTTP_POST,
    -	       IL_HTTP_REPLY
    -	} msg_type;
    -	int       reply_code;
    -	char      *reply_string;
    -	size_t    content_length;
    -	char     *host;
    -} il_http_message_t;
    -
    -/* this struct can be passed instead of il_octet_string as parameter */
    -typedef union {
    -	il_octet_string_t bin_msg;
    -	il_http_message_t http_msg;
    -} il_message_t;
    -
    -
    -struct event_store {
    -	char     *event_file_name;         /* file with events from local logger */
    -	char     *control_file_name;       /* file with control information */
    -	char     *job_id_s;                /* string form of the job id */
    -	long      last_committed_bs;       /* offset behind event that was last committed by BS */
    -	long      last_committed_ls;       /*  -"-                                           LS */
    -	long      offset;                  /* expected file position of next event */
    -	time_t    last_modified;           /* time of the last file modification */
    -	int       generation;              /* cleanup counter, scopes the offset */
    -	long long		  rotate_index;			   /* rotation counter */
    -	struct 	event_store_list *le;	   /* points back to the list */
    -	pthread_rwlock_t commit_lock;      /* lock to prevent simultaneous updates to last_committed_* */
    -	pthread_rwlock_t offset_lock;      /* lock to prevent simultaneous updates offset */
    -	pthread_rwlock_t use_lock;         /* lock to prevent struct deallocation */
    -#if defined(IL_NOTIFICATIONS)
    -	char     *dest;                    /* host:port destination */
    -#endif
    -};
    -
    -
    -struct server_msg {
    -	char                   *job_id_s;       /* necessary for commit */
    -	long                    offset;         /* just for printing more information to debug */
    -	char                   *msg;
    -	int                     len;
    -	int                     ev_len;
    -	struct event_store     *es;             /* cache for corresponding event store */
    -	int                     generation;     /* event store genereation */
    -	long                    receipt_to;     /* receiver (long local-logger id - LLLID) of delivery confirmation (for priority messages) */
    -#if defined(IL_NOTIFICATIONS)
    -	char                   *dest_name;
    -	int                     dest_port;
    -	char                   *dest;
    -#endif
    -	time_t                  expires;        /* time (in seconds from epoch) the message expires */
    -};
    -
    -
    -struct event_queue {
    -	edg_wll_GssConnection   gss;            /* GSS connection */
    -	char                   *dest_name;
    -	int                     dest_port;
    -	char		       	   *dest;
    -	int                     timeout;        /* queue timeout */
    -	struct event_queue_msg *tail;           /* last message in the queue */
    -	struct event_queue_msg *head;           /* first message in the queue */
    -#if defined(INTERLOGD_EMS)
    -	struct event_queue_msg *tail_ems;       /* last priority message in the queue (or NULL) */
    -	struct event_queue_msg *mark_this;      /* mark message for removal */
    -	struct event_queue_msg *mark_prev;      /* predecessor of the marked message */
    -#endif
    -	pthread_t               thread_id;      /* id of associated thread */
    -	pthread_rwlock_t        update_lock;    /* mutex for queue updates */
    -	pthread_mutex_t         cond_lock;      /* mutex for condition variable */
    -	pthread_cond_t          ready_cond;     /* condition variable for message arrival */
    -#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
    -	int                     flushing;
    -	int                     flush_result;   /* result of flush operation */
    -	pthread_cond_t          flush_cond;     /* condition variable for flush operation */
    -#endif
    -	/* statistics */
    -	int                     times_empty;    /* number of times the queue was emptied */
    -	int                     max_len;        /* max queue length */
    -	int                     cur_len;        /* current length */
    -	int						throttling;		/* event insertion suspend flag */
    -	int						first_event_sent; /* connection can be preempted by server */
    -	/* delivery methods */
    -	int 		(*event_queue_connect)(struct event_queue *);
    -	int 		(*event_queue_send)(struct event_queue *);
    -	int 		(*event_queue_close)(struct event_queue *);
    -	void				   *plugin_data;	/* opaque data used by output plugins */
    -};
    -
    -struct il_output_plugin {
    -	int 	(*event_queue_connect)(struct event_queue *);
    -	int 	(*event_queue_send)(struct event_queue *);
    -	int 	(*event_queue_close)(struct event_queue *);
    -	int		(*plugin_init)(char *);
    -	int		(*plugin_supports_scheme)(const char *);
    -};
    -
    -/* credential destructor */
    -void cred_handle_destroy(void *);
    -
    -/* server msg methods */
    -struct server_msg *server_msg_create(il_octet_string_t *, long);
    -struct server_msg *server_msg_copy(struct server_msg *);
    -int server_msg_init(struct server_msg *, il_octet_string_t *);
    -#if defined(INTERLOGD_EMS)
    -int server_msg_is_priority(struct server_msg *);
    -#endif
    -int server_msg_free(struct server_msg *);
    -
    -/* general event queue methods */
    -struct event_queue *event_queue_create(char *, struct il_output_plugin *);
    -int event_queue_free(struct event_queue *);
    -int event_queue_empty(struct event_queue *);
    -int event_queue_insert(struct event_queue *, struct server_msg *);
    -int event_queue_get(struct event_queue *, struct server_msg **);
    -int event_queue_remove(struct event_queue *);
    -int event_queue_enqueue(struct event_queue *, char *);
    -/* helper */
    -int enqueue_msg(struct event_queue *, struct server_msg *);
    -int event_queue_move_events(struct event_queue *, struct event_queue *, int (*)(struct server_msg *, void *), void *);
    -
    -/* protocol event queue methods */
    -int event_queue_connect(struct event_queue *);
    -int event_queue_send(struct event_queue *);
    -int event_queue_close(struct event_queue *);
    -int send_confirmation(long, int);
    -
    -/* thread event queue methods */
    -int event_queue_create_thread(struct event_queue *);
    -int event_queue_lock(struct event_queue *);
    -int event_queue_unlock(struct event_queue *);
    -int event_queue_lock_ro(struct event_queue *);
    -int event_queue_signal(struct event_queue *);
    -int event_queue_wait(struct event_queue *, int);
    -int event_queue_sleep(struct event_queue *);
    -int event_queue_wakeup(struct event_queue *);
    -int event_queue_cond_lock(struct event_queue *);
    -int event_queue_cond_unlock(struct event_queue *);
    -
    -/* input queue */
    -int input_queue_attach();
    -void input_queue_detach();
    -int input_queue_get(il_octet_string_t **, long *, int);
    -
    -/* queue management functions */
    -int queue_list_init(char *);
    -struct event_queue *queue_list_get(char *);
    -struct event_queue *queue_list_first();
    -struct event_queue *queue_list_next();
    -int queue_list_is_log(struct event_queue *);
    -
    -#if defined(IL_NOTIFICATIONS)
    -struct event_queue *notifid_map_get_dest(const char *);
    -int notifid_map_set_dest(const char *, struct event_queue *);
    -time_t notifid_map_get_expiration(const char *);
    -int notifid_map_set_expiration(const char *, time_t);
    -#endif
    -
    -/* event store functions */
    -int event_store_init(char *);
    -int event_store_cleanup();
    -int event_store_recover_all(void);
    -struct event_store *event_store_find(char *, const char *);
    -int event_store_sync(struct event_store *, long);
    -int event_store_next(struct event_store *, long, int);
    -int event_store_commit(struct event_store *, int, int, int);
    -int event_store_recover(struct event_store *);
    -int event_store_release(struct event_store *);
    -/* int event_store_remove(struct event_store *); */
    -
    -#if defined(IL_WS)
    -/* http functions */
    -int parse_header(const char *, il_http_message_t *);
    -int receive_http(void *, int (*)(void *, char *, const int), il_http_message_t *);
    -#endif
    -
    -/* plugin functions */
    -int plugin_mgr_init(const char *, char *);
    -struct il_output_plugin *plugin_get(const char *);
    -
    -/* master main loop */
    -int loop();
    -void do_handle_signal();
    -
    -/* recover thread */
    -void *recover_thread(void*);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif
    diff --git a/org.glite.lb.logger/src/logd.c b/org.glite.lb.logger/src/logd.c
    deleted file mode 100644
    index d2aaf76..0000000
    --- a/org.glite.lb.logger/src/logd.c
    +++ /dev/null
    @@ -1,582 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include  
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#if defined(FREEBSD) || defined(__FreeBSD__)
    -#define TCP_CORK TCP_NOPUSH
    -#endif
    -
    -#include "glite/lbu/log.h"
    -#include "glite/lb/context-int.h"
    -#include "glite/lb/timeouts.h"
    -#include "logd_proto.h"
    -#include "glite/security/glite_gss.h"
    -#ifdef LB_PERF
    -#include "glite/lb/lb_perftest.h"
    -#endif
    -
    -#define DEFAULT_PIDFILE "/var/glite/glite-lb-logd.pid"
    -
    -typedef void (*logd_handler_t)(int);
    -
    -static const char rcsid[] = "@(#)$Id$";
    -static int debug = 0;
    -static int port = EDG_WLL_LOG_PORT_DEFAULT;
    -static char *prefix = EDG_WLL_LOG_PREFIX_DEFAULT;
    -static char *pidfile = DEFAULT_PIDFILE;
    -static char *cert_file = NULL;
    -static char *key_file = NULL;
    -static char *CAcert_dir = NULL;
    -static int noAuth = 0;
    -static int noIPC = 0;
    -static int noParse = 0;
    -
    -#define DEFAULT_SOCKET "/tmp/interlogger.sock"
    -char *socket_path = DEFAULT_SOCKET;
    -
    -extern int confirm_sock;
    -extern char confirm_sock_name[256];
    -
    -static struct option const long_options[] = {
    -	{ "help", no_argument, 0, 'h' },
    -	{ "version", no_argument, 0, 'V' },
    -	{ "debug", no_argument, 0, 'd' },
    -	{ "port", required_argument, 0, 'p' },
    -	{ "file-prefix", required_argument, 0, 'f' },
    -	{ "cert", required_argument, 0, 'c' },
    -	{ "key", required_argument, 0, 'k' },
    -	{ "CAdir", required_argument, 0, 'C' },
    -	{ "pidfile",required_argument, 0, 'i' },
    -	{ "socket",required_argument, 0, 's' },
    -	{ "noAuth", no_argument, 0, 'x' },
    -	{ "noIPC", no_argument, 0, 'y' },
    -	{ "noParse", no_argument, 0, 'z' },
    -	{ NULL, 0, NULL, 0}
    -};
    -
    -/*
    - *----------------------------------------------------------------------
    - *
    - * usage - print usage
    - *
    - *----------------------------------------------------------------------
    - */
    -
    -static void
    -usage(char *program_name) {
    -	fprintf(stdout,"%s\n"
    -		"- collect events from logging API calls,\n"
    -		"- save them to files and\n"
    -		"- send them to inter-logger\n\n"
    -		"Usage: %s [option]\n"
    -		"-h, --help                 display this help and exit\n"
    -		"-V, --version              output version information and exit\n"
    -		"-d, --debug                do not run as daemon\n"
    -		"-p, --port            port to listen\n"
    -		"-f, --file-prefix  path and prefix for event files\n"
    -		"-c, --cert           location of server certificate\n"
    -		"-k, --key            location of server private key\n"
    -		"-C, --CAdir           directory containing CA certificates\n"
    -		"-s, --socket          interlogger's socket to send messages to\n"
    -		"-i, --pidfile        pid file\n"
    -		"--noAuth                   do not check caller's identity\n"
    -		"--noIPC                    do not send messages to inter-logger\n"
    -		"--noParse                  do not parse messages for correctness\n",
    -		program_name,program_name);
    -}
    -
    -static logd_handler_t mysignal(int num,logd_handler_t handler)
    -{
    -	struct sigaction	sa,osa;
    -
    -	memset(&sa,0,sizeof(sa));
    -	sa.sa_handler = handler;
    -	return sigaction(num,&sa,&osa) ? SIG_ERR : osa.sa_handler;
    -}
    -
    -/*
    - *----------------------------------------------------------------------
    - *
    - * handle_signal -
    - *      HUP  - reread log4crc
    - *	USR1 - print priorities of all standard categories
    - *	USR2 - print priorities of all LB categories
    - *
    - *----------------------------------------------------------------------
    - */
    -
    -static int received_signal = 0;
    -
    -static void handle_signal(int num)
    -{
    -	received_signal = num;
    -}
    -
    -void do_handle_signal() {
    -
    -	if (received_signal == 0) return;
    -	
    -	if (received_signal != SIGCHLD) glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_INFO,"Received signal %d\n", received_signal);
    -	switch (received_signal) {
    -	case SIGHUP:
    -		/* TODO: reload all external configurations, see
    -		https://rt3.cesnet.cz/rt/Ticket/Display.html?id=24879 */
    -		glite_common_log_reread();
    -		break;
    -	case SIGUSR1:
    -		glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_INFO,
    -			"Logging priority is now %s for %s, %s for %s and %s for %s\n", 
    -			glite_common_log_priority_to_string(glite_common_log_get_priority(LOG_CATEGORY_SECURITY)),
    -			LOG_CATEGORY_SECURITY,
    -			glite_common_log_priority_to_string(glite_common_log_get_priority(LOG_CATEGORY_ACCESS)),
    -			LOG_CATEGORY_ACCESS,
    -			glite_common_log_priority_to_string(glite_common_log_get_priority(LOG_CATEGORY_CONTROL)),
    -			LOG_CATEGORY_CONTROL);
    -		break;
    -	case SIGUSR2:
    -		glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_INFO,
    -			"Logging priority is now %s for %s and %s for %s\n", 
    -			glite_common_log_priority_to_string(glite_common_log_get_priority(LOG_CATEGORY_LB)),
    -			LOG_CATEGORY_LB,
    -			glite_common_log_priority_to_string(glite_common_log_get_priority(LOG_CATEGORY_LB_LOGD)),
    -			LOG_CATEGORY_LB_LOGD);
    -		break;
    -	case SIGPIPE:
    -		glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_INFO,"Broken pipe, lost communication channel.\n");
    -		break;
    -	case SIGCHLD:
    -		while (wait3(NULL,WNOHANG,NULL) > 0);
    -		break;
    -	case SIGINT:
    -	case SIGTERM:
    -	case SIGQUIT:
    -		if (confirm_sock) {
    -			glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_INFO,"Closing confirmation socket.\n");
    -			close(confirm_sock);
    -			unlink(confirm_sock_name);
    -		}
    -		unlink(pidfile);
    -		exit(1);
    -		break;
    -	default: break;
    -	}
    -
    -	received_signal = 0;
    -}
    -
    -/*
    - *----------------------------------------------------------------------
    - *
    - * doit - do all the dirty work
    - *
    - *----------------------------------------------------------------------
    - */
    -static int
    -doit(int socket, edg_wll_GssCred cred_handle, char *file_name_prefix, int noipc, int noparse)
    -{
    -    char 	*subject;
    -    int 	ret,fd,count;
    -    struct timeval timeout;
    -    edg_wll_GssConnection	con;
    -    edg_wll_GssStatus	gss_stat;
    -    edg_wll_GssPrincipal client = NULL;
    -    fd_set fdset;
    -    struct sockaddr_storage	peer;
    -    socklen_t	alen = sizeof peer;
    -    char 	peerhost[64], peerserv[16];
    -
    -    ret = count = 0;
    -    FD_ZERO(&fdset);
    -
    -    /* accept */
    -    timeout.tv_sec = ACCEPT_TIMEOUT;
    -    timeout.tv_usec = 0;
    -    getpeername(socket,(struct sockaddr *) &peer,&alen);
    -    glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Accepting connection (remaining timeout %d.%06d sec)\n",
    -		(int)timeout.tv_sec, (int) timeout.tv_usec);
    -    
    -    ret = getnameinfo ((struct sockaddr *) &peer, alen, 
    -		peerhost, sizeof(peerhost), peerserv, sizeof(peerserv), NI_NUMERICHOST | NI_NUMERICSERV);
    -    if (ret) {
    -	glite_common_log(LOG_CATEGORY_ACCESS, LOG_PRIORITY_WARN, "getnameinfo: %s", gai_strerror (ret));
    -	strcpy(peerhost, "unknown"); strcpy(peerserv, "unknown"); 
    -    }
    -
    -/* XXX: ugly workaround, we may detect false expired certificated
    - * probably due to bug in Globus GSS/SSL. */
    -#define _EXPIRED_CERTIFICATE_MESSAGE "certificate has expired"
    -
    -    if ((ret = edg_wll_gss_accept(cred_handle,socket,&timeout,&con, &gss_stat)) < 0) {
    -	glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_DEBUG,"timeout after gss_accept is %d.%06d sec\n",
    -		(int)timeout.tv_sec, (int) timeout.tv_usec);
    -	if ( ret == EDG_WLL_GSS_ERROR_TIMEOUT ) {
    -		glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"%s: Client authentication failed - timeout reached, closing.\n",peerhost);
    -	} else if (ret == EDG_WLL_GSS_ERROR_GSS) {
    -		char *gss_err;
    -
    -		edg_wll_gss_get_error(&gss_stat, "Client authentication failed", &gss_err);
    -		if (strstr(gss_err,_EXPIRED_CERTIFICATE_MESSAGE)) {
    -			glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"%s: false expired certificate: %s\n",peerhost,gss_err);
    -			free(gss_err);
    -			return -1;
    -		}
    -		glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"%s: GSS error: %s, closing.\n",peerhost,gss_err);
    -		free(gss_err);
    -	} else {
    -		glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"%s: Client authentication failed, closing.\n",peerhost);
    -	}
    -	return 1;
    -    }
    -
    -    /* authenticate */
    -    glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_DEBUG,"Processing authentication:\n");
    -    ret = edg_wll_gss_get_client_conn(&con, &client, &gss_stat);
    -    if (ret) {
    -        char *gss_err;
    -        edg_wll_gss_get_error(&gss_stat, "Cannot read client identification", &gss_err);
    -        glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN, "%s: %s\n", peerhost,gss_err);
    -        free(gss_err);
    -    }
    -
    -    if (ret || client->flags & EDG_WLL_GSS_FLAG_ANON) {
    -	glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"  User not authenticated, setting as \"%s\". \n",EDG_WLL_LOG_USER_DEFAULT);
    -	subject=strdup(EDG_WLL_LOG_USER_DEFAULT);
    -    } else {
    -	glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_INFO,"  User successfully authenticated as: %s\n",client->name);
    -	subject=strdup(client->name);
    -    }
    -    if (client)
    -	edg_wll_gss_free_princ(client);
    -
    -    /* get and process the data */
    -    timeout.tv_sec = CONNECTION_TIMEOUT;
    -    timeout.tv_usec = 0;
    -    
    -    while (timeout.tv_sec > 0) {
    -	count++;
    -	glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Waiting for data delivery no. %d (remaining timeout %d.%06d sec)\n",
    -		count, (int)timeout.tv_sec, (int) timeout.tv_usec);
    -	FD_SET(con.sock,&fdset);
    -	fd = select(con.sock+1,&fdset,NULL,NULL,&timeout);
    -	switch (fd) {
    -	case 0: /* timeout */
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Connection timeout expired\n");
    -		timeout.tv_sec = 0; 
    -		break;
    -	case -1: /* error */
    -		switch(errno) {
    -		case EINTR:
    -			glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"XXX: Waking up (remaining timeout %d.%06d sec)\n",
    -				(int)timeout.tv_sec, (int) timeout.tv_usec);
    -			continue;
    -		default:
    -			glite_common_log_SYS_ERROR("select");
    -			timeout.tv_sec = 0;
    -			break;
    -		}
    -		break;
    -	default:
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Waking up (remaining timeout %d.%06d sec)\n",
    -			(int)timeout.tv_sec, (int) timeout.tv_usec);
    -		break;
    -	}
    -	if (FD_ISSET(con.sock,&fdset)) {
    -		ret = edg_wll_log_proto_server(&con,&timeout,subject,file_name_prefix,noipc,noparse);
    -		// TODO: put into edg_wll_log_proto_server?
    -		if (ret != 0) {
    -			glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"timeout after edg_wll_log_proto_server is %d.%06d sec\n",
    -				(int)timeout.tv_sec, (int) timeout.tv_usec);
    -			if (ret != EDG_WLL_GSS_ERROR_EOF) 
    -				glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"edg_wll_log_proto_server(): Error\n");
    -			else if (count == 1)
    -				glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"edg_wll_log_proto_server(): Error. EOF occured.\n");
    -			timeout.tv_sec = 0;
    -			timeout.tv_usec = 0;
    -			break;
    -		} else {
    -			timeout.tv_sec = CONNECTION_TIMEOUT;
    -			timeout.tv_usec = 0;
    -		}
    -	}
    -
    -    }
    -
    -	glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG, "Closing descriptor %d.",con.sock);
    -	edg_wll_gss_close(&con, NULL);
    -	if (subject) free(subject);
    -	return ret;
    -}
    -
    -/*
    - *----------------------------------------------------------------------
    - *
    - * Main -
    - *
    - *----------------------------------------------------------------------
    - */
    -int main(int argc, char *argv[])
    -{
    -   int ret;
    -   int childpid;
    -   int opt;
    -   FILE *pidf;
    -
    -   int listener_fd;
    -   int client_fd;
    -   struct sockaddr_storage client_addr;
    -   socklen_t client_addr_len;
    -
    -   time_t	cert_mtime = 0;
    -   edg_wll_GssStatus	gss_stat;
    -   edg_wll_GssCred	cred = NULL;
    -
    -
    -   setlinebuf(stdout);
    -   setlinebuf(stderr);
    -
    -   /* welcome */
    -   fprintf(stdout,"\
    -This is LocalLogger, part of Workload Management System in EU DataGrid & EGEE.\n");
    -
    -   /* get arguments */
    -   while ((opt = getopt_long(argc,argv,
    -	"h"  /* help */
    -	"V"  /* version */
    -	"d"  /* debug */
    -	"p:" /* port */
    -	"f:" /* file prefix */
    -	"c:" /* certificate */
    -	"k:" /* key */
    -	"C:" /* CA dir */
    -	"s:" /* socket */
    -	"i:" /* pidfile */
    -	"x"  /* noAuth */
    -	"y"  /* noIPC */
    -	"z",  /* noParse */
    -	long_options, (int *) 0)) != EOF) {
    -
    -	switch (opt) {
    -		case 'V': fprintf(stdout,"%s:\t%s\n",argv[0],rcsid); exit(0);
    -		case 'd': debug = 1; break;
    -		case 'p': port = atoi(optarg); break;
    -		case 'f': prefix = optarg; break;
    -		case 'c': cert_file = optarg; break;
    -		case 'k': key_file = optarg; break;
    -		case 'C': CAcert_dir = optarg; break;
    -		case 's': socket_path = optarg; break;
    -		case 'i': pidfile = optarg; break;
    -		case 'x': noAuth = 1; break;
    -		case 'y': noIPC = 1; break;
    -		case 'z': noParse = 1; break;
    -		case 'h':
    -		default:
    -			usage(argv[0]); exit(0);
    -	}
    -   }
    -   if (glite_common_log_init()) {
    -	fprintf(stderr,"glite_common_log_init() failed, exiting.");
    -	exit(1);
    -   }
    -   glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_INFO,"Initializing...\n");
    -
    -   /* check noParse */
    -   if (noParse) {
    -	glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_INFO,"Parse messages for correctness... [no]\n");
    -   } else {
    -	glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_INFO,"Parse messages for correctness... [yes]\n");
    -   }
    -
    -   /* check noIPC */
    -   if (noIPC) {
    -	glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_INFO,"Send messages also to inter-logger... [no]\n");
    -   } else {
    -	glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_INFO,"Send messages also to inter-logger... [yes]\n");
    -   }
    -
    -   /* check prefix correctness */
    -   if (strlen(prefix) > FILENAME_MAX - 34) {
    -	glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_FATAL,"Too long prefix (%s) for file names, would not be able to write to log files. Exiting.\n",prefix);
    -	exit(1);
    -   }
    -   /* TODO: check for write permisions */
    -   glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_INFO,"Messages will be stored with the filename prefix \"%s\".\n",prefix);
    -
    -   if (CAcert_dir)
    -	setenv("X509_CERT_DIR", CAcert_dir, 1);
    -
    -   /* initialize signal handling */
    -   if (mysignal(SIGUSR1, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
    -   if (mysignal(SIGUSR2, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
    -   if (mysignal(SIGPIPE, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
    -   if (mysignal(SIGHUP,  handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
    -   if (mysignal(SIGINT,  handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
    -   if (mysignal(SIGQUIT, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
    -   if (mysignal(SIGTERM, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
    -   if (mysignal(SIGCHLD, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
    -
    -#ifdef LB_PERF
    -   glite_wll_perftest_init(NULL, NULL, NULL, NULL, 0);
    -#endif
    - 
    -   edg_wll_gss_watch_creds(cert_file,&cert_mtime);
    -   /* XXX DK: support noAuth */
    -   ret = edg_wll_gss_acquire_cred_gsi(cert_file, key_file, &cred, &gss_stat);
    -   if (ret) {
    -	/* XXX DK: call edg_wll_gss_get_error() */
    -	glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_FATAL,"Failed to get GSI credentials. Exiting.\n");
    -	exit(1);
    -   }
    -
    -   if (cred->name!=NULL) {
    -	glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_INFO,"Server running with certificate: %s\n",cred->name);
    -   } else if (noAuth) {
    -	glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_INFO,"Server running without certificate\n");
    -   }
    -
    -   /* do listen */
    -   glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_INFO,"Listening on port %d\n",port);
    -   listener_fd = do_listen(port);
    -   if (listener_fd == -1) {
    -	glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_FATAL,"Failed to listen on port %d\n",port);
    -	edg_wll_gss_release_cred(&cred, NULL);
    -	exit(-1);
    -   } else {
    -	glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_DEBUG,"Listener's socket descriptor is '%d'\n",listener_fd);
    -   }
    -
    -   client_addr_len = sizeof(client_addr);
    -   bzero((char *) &client_addr, client_addr_len);
    -
    -/* just try it before deamonizing to be able to complain aloud */
    -  if (!(pidf = fopen(pidfile,"w"))) {
    -        perror(pidfile);
    -        exit(-1);
    -  }
    -  fclose(pidf);
    -
    -
    -   /* daemonize */
    -   if (debug) {
    -	glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_INFO,"Running as daemon... [no]\n");
    -   } else {
    -	glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_INFO,"Running as daemon... [yes]\n");
    -	if (daemon(0,0) < 0) {
    -		glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_FATAL,"Failed to run as daemon. Exiting.\n");
    -		glite_common_log_SYS_ERROR("daemon");
    -		exit(1);
    -	}
    -   }
    -
    -  pidf = fopen(pidfile,"w"); assert(pidf); /* XXX */
    -  fprintf(pidf,"%d\n",getpid());
    -  fclose(pidf);
    -
    -   /*
    -    * Main loop
    -    */
    -   while (1) {
    -        int opt,my_errno;
    -
    -	glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_INFO,"Accepting incomming connections...\n");
    -	client_fd = accept(listener_fd, (struct sockaddr *) &client_addr,
    -			&client_addr_len);
    -	my_errno = errno;
    -	do_handle_signal();
    -	if (client_fd < 0) {
    -		if (my_errno == EINTR) continue;
    -		close(listener_fd);
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_FATAL,"Failed to accept incomming connections\n");
    -		glite_common_log_SYS_ERROR("accept");
    -		edg_wll_gss_release_cred(&cred, NULL);
    -		exit(-1);
    -	} else {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Incomming connection on socket '%d'\n",client_fd);
    -	}
    -
    -	opt = 0;
    -	if (setsockopt(client_fd,IPPROTO_TCP,TCP_CORK,(const void *) &opt,sizeof opt)) {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"Can't reset TCP_CORK\n");
    -	}
    -	opt = 1;
    -	if (setsockopt(client_fd,IPPROTO_TCP,TCP_NODELAY,(const void *) &opt,sizeof opt)) {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"Can't set TCP_NODELAY\n");
    -	}
    -
    -	switch (edg_wll_gss_watch_creds(cert_file,&cert_mtime)) {
    -	edg_wll_GssCred newcred;
    -	case 0: break;
    -	case 1:
    -		ret = edg_wll_gss_acquire_cred_gsi(cert_file,key_file,&newcred,&gss_stat);
    -		if (ret) {
    -			glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"Reloading credentials failed, continue with older\n");
    -		} else {
    -			glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_DEBUG,"Reloading credentials succeeded\n");
    -			edg_wll_gss_release_cred(&cred, NULL);
    -			cred = newcred;
    -		}
    -		break;
    -	case -1:
    -		glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"edg_wll_gss_watch_creds failed\n");
    -		break;
    -	}
    -
    -	/* FORK - change next line if fork() is not needed (for debugging for example) */
    -#if 1
    -	if ((childpid = fork()) < 0) {
    -		glite_common_log_SYS_ERROR("fork");
    -		if (client_fd) close(client_fd);
    -	}
    -	if (childpid == 0) {
    -		ret = doit(client_fd,cred,prefix,noIPC,noParse);
    -		if (client_fd) close(client_fd);
    -		glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_DEBUG,"Exiting.\n", 
    -			CONNECTION_TIMEOUT);
    -		exit(0);
    -	}
    -	if (childpid > 0) {
    -		glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_DEBUG,"Forked a new child with PID %d\n",childpid);
    -		if (client_fd) close(client_fd);
    -	}
    -#else
    -	ret = doit(client_fd,cred,prefix,noIPC,noParse);
    -	if (client_fd) close(client_fd);
    -
    -#endif
    -    } /* while */
    -
    -	if (listener_fd) close(listener_fd);
    -	edg_wll_gss_release_cred(&cred, NULL);
    -	exit(ret);
    -}
    diff --git a/org.glite.lb.logger/src/logd_proto.c b/org.glite.lb.logger/src/logd_proto.c
    deleted file mode 100644
    index 3e766d6..0000000
    --- a/org.glite.lb.logger/src/logd_proto.c
    +++ /dev/null
    @@ -1,647 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/lbu/escape.h"
    -#include "glite/lbu/log.h"
    -#include "glite/lb/context-int.h"
    -#include "glite/lb/events_parse.h"
    -
    -#include "logd_proto.h"
    -
    -static const int one = 1;
    -
    -extern char* socket_path;
    -
    -int glite_common_log_priority_security;
    -int glite_common_log_priority_access;
    -int glite_common_log_priority_control;
    -
    -#define tv_sub(a,b) {\
    -	(a).tv_usec -= (b).tv_usec;\
    -	(a).tv_sec -= (b).tv_sec;\
    -	if ((a).tv_usec < 0) {\
    -		(a).tv_sec--;\
    -		(a).tv_usec += 1000000;\
    -	}\
    -}
    -
    -/*
    - *----------------------------------------------------------------------
    - *
    - * handle_gss_failures - handle GSS failures on the server side
    - *
    - * Returns: errno
    - *
    - *----------------------------------------------------------------------
    - */
    -static int handle_gss_failures(int code, edg_wll_GssStatus *gss_code, const char *text)
    -{
    -	const char	*func = "edg_wll_log_proto_server()";
    -        int             ret = 0;
    -
    -	if(code>0) {
    -                return(0);
    -	}
    -	switch(code) {
    -		case EDG_WLL_GSS_ERROR_EOF: 
    -			glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"%s: %s, EOF occured\n", func, text);	
    -			ret = EAGAIN;
    -			break;
    -		case EDG_WLL_GSS_ERROR_TIMEOUT: 
    -			glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"%s: %s, timeout expired\n", func, text);	
    -			ret = EAGAIN;
    -			break;
    -		case EDG_WLL_GSS_ERROR_ERRNO: 
    -			glite_common_log_SYS_ERROR(func);
    -			glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"%s: %s, system error occured\n", func, text);	
    -			ret = EAGAIN;
    -			break;
    -		case EDG_WLL_GSS_ERROR_GSS:
    -			{
    -			   char *gss_err;
    -
    -			   edg_wll_gss_get_error(gss_code, "GSS error occured", &gss_err);
    -			   glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"%s: %s, %s\n", func, text, gss_err);
    -			   free(gss_err);
    -			   ret = EAGAIN;
    -			   break;
    -			}
    -		default:
    -			glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_ERROR,"%s: %s, unknown error occured\n");
    -			break;
    -	}
    -	return ret;
    -}
    -
    -/*
    - *----------------------------------------------------------------------
    - *
    - * send_answer_back - 
    - *                     
    - *----------------------------------------------------------------------
    - */
    -static int send_answer_back(edg_wll_GssConnection *con, int answer, struct timeval *timeout) {
    -	size_t count = 0;
    -	int err = 0;
    -	int ans = answer;
    -	u_int8_t ans_end[4];
    -	edg_wll_GssStatus	gss_stat;
    -
    -        ans_end[0] = ans & 0xff; ans >>= 8;
    -        ans_end[1] = ans & 0xff; ans >>= 8;
    -        ans_end[2] = ans & 0xff; ans >>= 8;
    -        ans_end[3] = ans;
    -	if ((err = edg_wll_gss_write_full(con,ans_end,4,timeout,&count, &gss_stat)) < 0 ) {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_INFO,"Error sending answer \"%d\" back to client.\n",answer);
    -		return handle_gss_failures(err,&gss_stat,"Error sending answer");
    -	} else {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Answer \"%d\" succesfully sent back to client.\n",answer);
    -		return 0;
    -	}
    -}
    -
    -/*
    - *----------------------------------------------------------------------
    - *
    - * wait_for_confirmation -
    - *
    - * Args:    timeout - number of seconds to wait, 0 => wait indefinitely
    - *
    - * Returns:  1 => OK, *code contains error code sent by interlogger
    - *           0 => timeout expired before anything interesting happened
    - *          -1 => some error (see errno for details)
    - *
    - *----------------------------------------------------------------------
    - */
    -int confirm_sock;
    -char confirm_sock_name[256];
    -
    -static
    -int init_confirmation()
    -{
    -	struct sockaddr_un saddr;
    -
    -	/* create socket */
    -	if((confirm_sock=socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
    -		glite_common_log_SYS_ERROR("socket");
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_ERROR,"init_confirmation(): error creating socket\n");
    -		return(-1);
    -	}
    -
    -	/* set the socket parameters */
    -	memset(&saddr, 0, sizeof(saddr));
    -	saddr.sun_family = AF_UNIX;
    -	strcpy(saddr.sun_path, confirm_sock_name);
    -
    -	/* bind the socket */
    -	if(bind(confirm_sock, (struct sockaddr *)&saddr, sizeof(saddr.sun_path)) < 0) {
    -		glite_common_log_SYS_ERROR("bind");
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_ERROR,"init_confirmation(): error binding socket\n");
    -		close(confirm_sock);
    -		unlink(confirm_sock_name);
    -		return(-1);
    -	}
    -
    -	/* and listen */
    -	if(listen(confirm_sock, 5) < 0) {
    -		glite_common_log_SYS_ERROR("listen");
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_ERROR,"init_confirmation(): error listening on socket\n");
    -		close(confirm_sock);
    -		unlink(confirm_sock_name);
    -		return(-1);
    -	}
    -
    -	return(0);
    -}
    -
    -
    -int wait_for_confirmation(struct timeval *timeout, int *code)
    -{
    -	fd_set fds;
    -	struct timeval  to,before,after;
    -	int ret = 0, tmp = 0;
    -
    -	*code = 0;
    -
    -	FD_ZERO(&fds);
    -	FD_SET(confirm_sock, &fds);
    -
    -	/* set timeout */
    -	if (timeout) {
    -		memcpy(&to,timeout,sizeof to);
    -		gettimeofday(&before,NULL);
    -	}
    -
    -	/* wait for confirmation at most timeout seconds */
    -	if ((tmp=select(confirm_sock+1, &fds, NULL, NULL, timeout?&to:NULL)) < 0) {
    -		glite_common_log_SYS_ERROR("select");
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_ERROR,"wait_for_confirmation(): error selecting socket\n");
    -		ret = -1;
    -	} else {
    -		if (tmp == 0)
    -			ret = 0;
    -		else {
    -			int nsd = accept(confirm_sock, NULL, NULL);
    -			ret = 1;
    -			if(nsd < 0) {
    -				glite_common_log_SYS_ERROR("accept");
    -				glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_ERROR,"wait_for_confirmation(): error accepting a connection on a socket\n");
    -				ret = -1;
    -			} else {
    -				if(recv(nsd, code, sizeof(*code), MSG_NOSIGNAL) < 0) {
    -					glite_common_log_SYS_ERROR("recv");
    -					glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_ERROR,"wait_for_confirmation(): error receiving a message from a socket\n");
    -					ret = -1;
    -				}
    -				close(nsd);
    -			}
    -		}
    -	}
    -	close(confirm_sock);
    -	unlink(confirm_sock_name);
    -        if (timeout) {
    -           gettimeofday(&after,NULL);
    -           tv_sub(after,before);
    -           tv_sub(*timeout,after);
    -           if (timeout->tv_sec < 0) {
    -                timeout->tv_sec = 0;
    -                timeout->tv_usec = 0;
    -           }
    -	}
    -	return ret;
    -}
    -
    -/*
    - *----------------------------------------------------------------------
    - *
    - * do_listen - listen on given port
    - *
    - * Returns: socket handle or -1 if something fails
    - *
    - * Calls: socket, bind, listen
    - *
    - * Algorithm:
    - *
    - *----------------------------------------------------------------------
    - */
    -int do_listen(int port)
    -{
    -	int                ret;
    -	int                sock;
    -	struct addrinfo	*ai;
    -	struct addrinfo	hints;
    -	char 		*portstr = NULL;
    -
    -	asprintf(&portstr, "%d", port);
    -	if (portstr == NULL) {
    -		glite_common_log(LOG_CATEGORY_CONTROL,LOG_PRIORITY_FATAL,"do_listen(): ENOMEM converting port number\n");
    -		return -1;
    -	}
    -
    -	memset (&hints, '\0', sizeof (hints));
    -	hints.ai_flags = AI_NUMERICSERV | AI_PASSIVE | AI_ADDRCONFIG;
    -	hints.ai_socktype = SOCK_STREAM;
    -
    -	ret = getaddrinfo (NULL, portstr, &hints, &ai);
    -	if (ret != 0) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "getaddrinfo: %s", gai_strerror (ret));
    -		return -1;
    -	}
    -	if (ai == NULL) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "getaddrinfo: no return");
    -		return -1;
    -	}
    -
    -	sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
    -	if (sock == -1) { 
    -		glite_common_log_SYS_ERROR("socket"); 
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_ERROR,"do_listen(): error creating socket\n");
    -		freeaddrinfo(ai);
    -		return -1; 
    -	}
    -
    -	setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
    -	ret = bind(sock, ai->ai_addr, ai->ai_addrlen);
    -	if (ret == -1) { 
    -		glite_common_log_SYS_ERROR("bind"); 
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_ERROR,"do_listen(): error binding socket\n");
    -		freeaddrinfo(ai);
    -		return -1; 
    -	}
    -	freeaddrinfo(ai);
    -
    -	ret = listen(sock, 5);
    -	if (ret == -1) { 
    -		glite_common_log_SYS_ERROR("listen"); 
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_ERROR,"do_listen(): error listening on socket\n");
    -		close(sock); 
    -		return -1; 
    -	}
    -
    -	return sock;
    -}
    -
    -/*
    - *----------------------------------------------------------------------
    - *
    - * edg_wll_log_proto_server - handle incoming data
    - *
    - * Returns: 0 if done properly or errno
    - *
    - * Calls:
    - *
    - * Algorithm:
    - *
    - *----------------------------------------------------------------------
    - */
    -int edg_wll_log_proto_server(edg_wll_GssConnection *con, struct timeval *timeout, char *name, char *prefix, int noipc, int noparse)
    -{
    -	char	*buf,*dglllid,*dguser,*jobId,*name_esc;
    -	char	header[EDG_WLL_LOG_SOCKET_HEADER_LENGTH+1];
    -	char	outfilename[FILENAME_MAX];
    -	size_t	count;
    -	int	count_total,size;
    -	u_int8_t size_end[4];
    -	size_t  msg_size,dglllid_size,dguser_size;
    -	int	i,answer,answer_sent;
    -	int	msg_sock;
    -	char    *msg,*msg_begin;
    -	int	filedesc,filelock_status;
    -	long	filepos;
    -	int	priority;
    -	long	lllid;
    -	int	unique;
    -	int	err;
    -	edg_wll_Context	context;
    -	edg_wll_Event	*event;
    -	edg_wlc_JobId	j;
    -	edg_wll_GssStatus	gss_stat;
    -                
    -	errno = i = answer = answer_sent = size = msg_size = dglllid_size = dguser_size = count = count_total = msg_sock = filedesc = filelock_status = /* priority */ unique = err = 0;     
    -        buf = dglllid = dguser = jobId = name_esc = msg = msg_begin = NULL;
    -	event = NULL;
    -
    -	/* init */
    -	if (edg_wll_InitContext(&context) != 0) {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_ERROR,"edg_wll_InitContex(): error.\n");
    -		answer = ENOMEM; 
    -		goto edg_wll_log_proto_server_end; 
    -	}
    -	if (edg_wll_ResetError(context) != 0) { 
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_ERROR,"edg_wll_ResetError(): error.\n");
    -		answer = ENOMEM; 
    -		goto edg_wll_log_proto_server_end;
    -	}
    -
    -	/* look for the unique unused long local-logger id (LLLID) */
    -	lllid = 1000*getpid();
    -	for (i=0; (i<1000)&&(!unique); i++) {
    -		lllid += i;
    -		snprintf(confirm_sock_name, sizeof(confirm_sock_name), "/tmp/dglogd_sock_%ld", lllid);
    -		if ((filedesc = open(confirm_sock_name,O_CREAT)) == -1) {
    -			if (errno == EEXIST) {
    -				glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"Warning: LLLID %ld already in use.\n",lllid);
    -			} else {
    -				glite_common_log_SYS_ERROR("open");
    -			}
    -		} else {
    -			unique = 1;
    -			close(filedesc); filedesc = 0;
    -			unlink(confirm_sock_name);
    -		}
    -	}
    -	if (!unique) {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_ERROR,"Cannot determine the unique long local-logger id (LLLID)!\n",lllid);
    -		return EAGAIN;
    -	}
    -	glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_INFO,"Long local-logger id (LLLID): %ld ... [ok]\n",lllid);
    -
    -	/* receive socket header */
    -	memset(header, 0, EDG_WLL_LOG_SOCKET_HEADER_LENGTH+1);
    -	if ((err = edg_wll_gss_read_full(con, header, EDG_WLL_LOG_SOCKET_HEADER_LENGTH, timeout, &count, &gss_stat)) < 0) {
    -		if (err == EDG_WLL_GSS_ERROR_EOF) {
    -			glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"Reading socket header - no data available.\n");
    -			answer = err;
    -			answer_sent = 1; /* i.e. do not try to send answer back */
    -		} else {
    -			glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"Error reading socket header.\n");
    -			answer = handle_gss_failures(err,&gss_stat,"Error reading socket header");
    -		}
    -		goto edg_wll_log_proto_server_end;
    -	} else {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Reading socket header... [ok]\n");
    -	}
    -
    -	/* Check socket header */
    -	header[EDG_WLL_LOG_SOCKET_HEADER_LENGTH] = '\0';
    -	if (strncmp(header,EDG_WLL_LOG_SOCKET_HEADER,EDG_WLL_LOG_SOCKET_HEADER_LENGTH)) {
    -		/* not the proper socket header text */
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"edg_wll_log_proto_server(): invalid socket header\n");
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"edg_wll_log_proto_server(): read header '%s' instead of '%s'\n",
    -				header,EDG_WLL_LOG_SOCKET_HEADER);
    -		answer = EINVAL;
    -		goto edg_wll_log_proto_server_end;
    -	} else {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Read socket header: \"%s\" [ok]\n",header);
    -	}
    -
    -/* XXX: obsolete
    -	count = 0;
    -	if ((err = edg_wll_gss_read_full(con, &priority, sizeof(priority), timeout, &count, &gss_stat)) < 0) {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"Error reading message priority.\n");
    -		answer = handle_gss_failures(err,&gss_stat,"Error receiving message priority");
    -                goto edg_wll_log_proto_server_end;
    -        } else {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Read message priority: %d [ok]\n",priority);
    -	}
    -*/
    -
    -        /* read message size */
    -	count = 0;
    -	if ((err = edg_wll_gss_read_full(con, size_end, 4, timeout, &count,&gss_stat)) < 0) {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Error reading message size.\n");
    -		answer = handle_gss_failures(err,&gss_stat,"Error reading message size");
    -                goto edg_wll_log_proto_server_end;
    -	} else {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Reading message size... [ok]\n");
    -	}
    -	size = size_end[3]; size <<=8; 
    -	size |= size_end[2]; size <<=8; 
    -	size |= size_end[1]; size <<=8; 
    -	size |= size_end[0];
    -	if (size <= 0) {
    -		/* probably wrong size in the header or nothing to read */
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"edg_wll_log_proto_server(): invalid size read from socket header\n");
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Read message size '%d' [error].\n",size);
    -		answer = EINVAL;
    -		goto edg_wll_log_proto_server_end;
    -	} else {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Read message size: %d bytes [ok].\n",size);
    -	}
    -
    -	/* format the DG.LLLID string */
    -	if (asprintf(&dglllid,"DG.LLLID=%ld ",lllid) == -1) {
    -		glite_common_log_SYS_ERROR("asprintf");
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"edg_wll_log_proto_server(): nomem for DG.LLLID\n");
    -		answer = ENOMEM;
    -		goto edg_wll_log_proto_server_end;
    -	}
    -	dglllid_size = strlen(dglllid);
    -
    -	/* format the DG.USER string */
    -	name_esc = glite_lbu_EscapeULM(name);
    -	if (asprintf(&dguser,"DG.USER=\"%s\" ",name_esc) == -1) {
    -		glite_common_log_SYS_ERROR("asprintf");
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"edg_wll_log_proto_server(): nomem for DG.USER\n");
    -		answer = ENOMEM;
    -		goto edg_wll_log_proto_server_end;
    -	}
    -	dguser_size = strlen(dguser);
    -
    -	/* allocate enough memory for all data */
    -	msg_size = dglllid_size + dguser_size + size + 1;
    -	if ((msg = malloc(msg_size)) == NULL) {
    -		glite_common_log_SYS_ERROR("malloc");
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"edg_wll_log_proto_server(): out of memory for allocating message\n");
    -		answer = ENOMEM;
    -		goto edg_wll_log_proto_server_end;
    -	}
    -	strncpy(msg,dglllid,dglllid_size);
    -	msg_begin = msg + dglllid_size; // this is the "official" beginning of the message
    -	strncpy(msg_begin,dguser,dguser_size);
    -
    -	/* receive message */
    -	buf = msg_begin + dguser_size;
    -	count = 0;
    -	if ((err = edg_wll_gss_read_full(con, buf, size, timeout, &count, &gss_stat)) < 0) {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"Error reading message from socket.\n");
    -		answer = handle_gss_failures(err,&gss_stat,"Error reading message from socket.");
    -		goto edg_wll_log_proto_server_end;
    -	} else {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Reading message... [ok]\n");
    -		// glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_TRACE,"Read message: \"%s\"\n",msg);
    -	}       
    -
    -	if (buf[count] != '\0') buf[count] = '\0';
    -
    -	/* parse message and get jobId and priority from it */
    -	if (!noparse && strstr(msg, "DG.TYPE=\"command\"") == NULL) {
    -		if (edg_wll_ParseEvent(context,msg_begin,&event) != 0) { 
    -			glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"edg_wll_log_proto_server(): edg_wll_ParseEvent error\n");
    -			glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"edg_wll_ParseEvent(): %s\n",context->errDesc);
    -			answer = edg_wll_Error(context,NULL,NULL);
    -			goto edg_wll_log_proto_server_end;
    -		} else {
    -			glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Parsing message for correctness...[ok]\n");
    -		}
    -		jobId = edg_wlc_JobIdGetUnique(event->any.jobId);
    -		priority = event->any.priority;
    -		edg_wll_FreeEvent(event);
    -		event->any.priority = priority;
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Getting jobId from message...[ok]\n");
    -	} else {
    -		if ((event = edg_wll_InitEvent(EDG_WLL_EVENT_UNDEF)) == NULL) {
    -			glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN, "edg_wll_InitEvent(): out of memory\n");
    -			answer = ENOMEM;
    -			goto edg_wll_log_proto_server_end;
    -		}
    -		jobId = edg_wll_GetJobId(msg);
    -		if (!jobId || edg_wlc_JobIdParse(jobId,&j)) {
    -			glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"Error getting jobId from message.\n");
    -			glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"edg_wlc_JobIdParse(%s)\n",jobId?jobId:"NULL");
    -			answer = EINVAL;
    -			goto edg_wll_log_proto_server_end;
    -		} else {
    -			glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Getting jobId from message...[ok]\n");
    -		}
    -		free(jobId);
    -		jobId = edg_wlc_JobIdGetUnique(j);
    -		edg_wlc_JobIdFree(j);
    -
    -/* TODO: get the priority from message some better way */
    -		if (strstr(msg, "DG.PRIORITY=1") != NULL)
    -			event->any.priority = 1;
    -		else event->any.priority = 0;
    -	}
    -
    -	/* if not command, save message to file */
    -	if(strstr(msg, "DG.TYPE=\"command\"") == NULL) {
    -		/* compose the name of the log file */
    -		count = strlen(prefix);
    -		strncpy(outfilename,prefix,count); count_total=count;
    -		strncpy(outfilename+count_total,".",1); count_total+=1; count=strlen(jobId);
    -		strncpy(outfilename+count_total,jobId,count); count_total+=count;
    -		outfilename[count_total]='\0';
    -//		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Composing filename from prefix \"%s\" and unique jobId \"%s\"...[ok]",prefix,jobId);
    -
    -		/* fopen and properly handle the filelock */
    -#ifdef LOGD_NOFILE
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_INFO,"NOT writing message to \"%s\".\n",outfilename);
    -		filepos = 0;
    -#else
    -		if ( edg_wll_log_event_write(context, outfilename, msg, FCNTL_ATTEMPTS, FCNTL_TIMEOUT, &filepos) ) {
    -			char *errd;
    -			// FIXME: there is probably not a correct errno
    -			glite_common_log_SYS_ERROR("edg_wll_log_event_write");
    -			answer = edg_wll_Error(context, NULL, &errd);
    -			glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"edg_wll_log_event_write error: %s\n",errd);
    -			free(errd);
    -			goto edg_wll_log_proto_server_end;
    -		} else glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_INFO,"Writing message to \"%s\"... [ok]",outfilename);
    -#endif
    -	} else {
    -		filepos = 0;
    -	}
    -
    -#ifdef LB_PERF
    -	glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_INFO,"Calling perftest\n");
    -	glite_wll_perftest_consumeEventString(msg);
    -	glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_INFO,"Calling perftest... [done]\n");
    -#endif
    -
    -	/* if not priority send now the answer back to client */
    -	if (!(event->any.priority & (EDG_WLL_LOGFLAG_SYNC|EDG_WLL_LOGFLAG_SYNC_COMPAT))) {
    -		if (!send_answer_back(con,answer,timeout)) { 
    -			answer_sent = 1;
    -		}
    -	} 
    -
    -	/* send message via IPC (UNIX socket) */
    -	if (!noipc) {
    -		if (event->any.priority & (EDG_WLL_LOGFLAG_SYNC|EDG_WLL_LOGFLAG_SYNC_COMPAT)) {
    -			if(init_confirmation() < 0) { 
    -				glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"Error initializing 2nd UNIX socket (%s) for priority messages confirmation.\n",confirm_sock_name); 
    -				answer = errno; 
    -				goto edg_wll_log_proto_server_end; 
    -			} else {
    -				glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Initializing 2nd UNIX socket (%s) for priority messages confirmation...[ok]\n",confirm_sock_name);
    -			}
    -		}	  
    -
    -		if ( edg_wll_log_event_send(context, socket_path, filepos, msg, msg_size, CONNECT_ATTEMPTS, timeout) ) {
    -			char *errd;
    -			// XXX: probably not a SYSTEM ERROR
    -			// glite_common_log_SYS_ERROR("edg_wll_log_event_send");
    -			answer = edg_wll_Error(context, NULL, &errd);
    -			glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"edg_wll_log_event_send error: %s\n",errd);
    -			free(errd);
    -			goto edg_wll_log_proto_server_end_1;
    -		} else glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,
    -			"Sending via IPC (UNIX socket \"%s\")\n\t"
    -			"the message position %ld (%d bytes)... [ok]",
    -			socket_path, filepos, sizeof(filepos));
    -
    -		if (event->any.priority & (EDG_WLL_LOGFLAG_SYNC|EDG_WLL_LOGFLAG_SYNC_COMPAT)) {
    -			if ((count = wait_for_confirmation(timeout, &answer)) < 0) {
    -				glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_WARN,"Error waiting for confirmation.\n");
    -				answer = errno;
    -			} else {
    -				glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Waiting for confirmation... [ok].\n");
    -				if (count == 0) {
    -					glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Waking up, timeout expired.\n");
    -					answer = EAGAIN;
    -				} else {
    -					glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Confirmation received, waking up.\n");
    -				}
    -			}
    -		}
    -	} else {
    -		glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"NOT sending via IPC.\n");
    -	}
    -
    -edg_wll_log_proto_server_end:
    -	/* if not sent already, send the answer back to client */
    -	if (!answer_sent) {
    -		answer = send_answer_back(con,answer,timeout);
    -	} 
    -	/* clean */
    -	edg_wll_FreeContext(context);
    -	if (name_esc) free(name_esc);
    -	if (dglllid) free(dglllid);
    -	if (dguser) free(dguser);
    -	if (jobId) free(jobId);
    -	if (msg) free(msg);
    -	if (event) free(event);
    -
    -//	glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_INFO,"Done.\n");
    -
    -	return answer;
    -
    -edg_wll_log_proto_server_end_1:
    -	if (event->any.priority) {
    -		close(confirm_sock);
    -		unlink(confirm_sock_name);
    -	}	
    -	goto edg_wll_log_proto_server_end;
    -}
    -
    diff --git a/org.glite.lb.logger/src/logd_proto.h b/org.glite.lb.logger/src/logd_proto.h
    deleted file mode 100644
    index 993eec3..0000000
    --- a/org.glite.lb.logger/src/logd_proto.h
    +++ /dev/null
    @@ -1,62 +0,0 @@
    -#ifndef __EDG_WORKLOAD_LOGGING_LOCALLOGGER_LOGD_PROTO_H__
    -#define __EDG_WORKLOAD_LOGGING_LOCALLOGGER_LOGD_PROTO_H__
    -
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -/**
    - * \file edg/workload/logging/locallogger/logd_proto.h
    - * \brief server part of the logging protocol
    - * \note private
    - */
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -#include 
    -
    -#include "glite/lb/log_proto.h"
    -#include "glite/security/glite_gss.h"
    -
    -int edg_wll_log_proto_server(edg_wll_GssConnection *con, struct timeval *timeout, char *name, char *prefix, int noipc, int noparse);
    -
    -/* fcntl defaults */
    -#define FCNTL_ATTEMPTS		5
    -#define FCNTL_TIMEOUT		1
    -
    -/* connect defaults */
    -#define CONNECT_ATTEMPTS	5
    -
    -/* accept defaults */
    -#define ACCEPT_TIMEOUT		30
    -
    -/* connection defaults */
    -#define CONNECTION_TIMEOUT	EDG_WLL_LOG_SYNC_TIMEOUT_MAX
    -
    -/* locallogger daemon listen and connect functions prototypes */
    -int do_listen(int port);
    -int do_connect(char *hostname, int port);
    -
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* __EDG_WORKLOAD_LOGGING_LOCALLOGGER_LOGD_PROTO_H__ */
    diff --git a/org.glite.lb.logger/src/perftest_il.sh b/org.glite.lb.logger/src/perftest_il.sh
    deleted file mode 100644
    index 45d16df..0000000
    --- a/org.glite.lb.logger/src/perftest_il.sh
    +++ /dev/null
    @@ -1,385 +0,0 @@
    -#!/bin/bash
    -#
    -# Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -# See http://www.eu-egee.org/partners for details on the copyright holders.
    -# 
    -# Licensed under the Apache License, Version 2.0 (the "License");
    -# you may not use this file except in compliance with the License.
    -# You may obtain a copy of the License at
    -# 
    -#     http://www.apache.org/licenses/LICENSE-2.0
    -# 
    -# Unless required by applicable law or agreed to in writing, software
    -# distributed under the License is distributed on an "AS IS" BASIS,
    -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -# See the License for the specific language governing permissions and
    -# limitations under the License.
    -#
    -
    -numjobs=10
    -
    -# XXX - there must be better way to find stage
    -if [ -z "${GLITE_LOCATION}" ]; then
    -	STAGEDIR=/home/michal/shared/egee/jra1-head/stage
    -else
    -	STAGEDIR=${GLITE_LOCATION}
    -fi
    -
    -. $STAGEDIR/sbin/perftest_common.sh
    -
    -DBNAME=${DBNAME:-lbserver20}
    -export LBDB=lbserver/@localhost:$DBNAME
    -
    -DEBUG=${DEBUG:-0}
    -# CONSUMER_ARGS=
    -# PERFTEST_COMPONENT=
    -# COMPONENT_ARGS=
    -LOGJOBS_ARGS="-s /tmp/interlogger.perftest" 
    -
    -check_test_files || exit 1
    -
    -COMM_ARGS="-s /tmp/interlogger.perftest --file-prefix=/tmp/perftest.log"
    -
    -#TEST_GROUP=
    -#TEST_VARIANT=
    -
    -SILENT=0
    -while getopts "G:t:n:s" OPTION 
    -do
    -    case "$OPTION" in 
    -    "G") TEST_GROUP=$OPTARG
    -    ;;
    -
    -    "t") TEST_VARIANT=$OPTARG
    -    ;;
    -
    -    "n") numjobs=$OPTARG
    -    ;;
    -
    -    "s") SILENT=1
    -    ;;
    -
    -    esac
    -done
    -
    -
    -group_a () 
    -{
    -if [[ $SILENT -eq 0 ]]
    -then
    -echo "-------------------------------------------"
    -echo "Logging test:"
    -echo "  - events sent through IPC and/or files"
    -echo "  - events discarded by IL immediately"
    -echo "-------------------------------------------"
    -echo "a) events sent only by IPC"
    -echo "b) events stored to files and sent by IPC"
    -echo ""
    -fi
    -
    -PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-interlogd-perf-empty
    -CONSUMER_ARGS="-i /tmp/perftest_il.pid -d $COMM_ARGS"
    -}
    -
    -group_a_test_a () 
    -{
    -    LOGJOBS_ARGS="--nofile $COMM_ARGS"
    -    echo -n "a)"
    -    run_test il $numjobs
    -    print_result
    -}
    -
    -group_a_test_b () {
    -    LOGJOBS_ARGS=" $COMM_ARGS"
    -    echo -n "b)"
    -    run_test il $numjobs
    -    print_result
    -    find /tmp -maxdepth 1 -name perftest.log.\* -exec rm -f \{\} \;
    -}
    -
    -
    -
    -# echo "--------------------------------"
    -# echo "Interlogger test:"
    -# echo "  - events sent through IPC only"
    -# echo "  - events discarded in IL"
    -# echo "--------------------------------"
    -# echo "a) disabled event parsing, the server address (jobid) is hardcoded"
    -# echo "b) disabled event synchronization from files"
    -# echo "c) disabled recovery thread"
    -# echo "d) lazy bkserver connection close"
    -# echo "e) normal operation"
    -# echo ""
    -# echo -e "\tavg_job \t big_job \t avg_dag \t big_dag"
    -
    -# PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-interlogd-perf
    -# LOGJOBS_ARGS="--nofile $COMM_ARGS"
    -
    -# CONSUMER_ARGS="-d --nosend --noparse $COMM_ARGS"
    -# echo -n "a)"
    -# run_test il $numjobs
    -# print_result
    -
    -# CONSUMER_ARGS="-d --nosend --nosync $COMM_ARGS"
    -# echo -n "b)"
    -# run_test il $numjobs
    -# print_result
    -
    -# CONSUMER_ARGS="-d --nosend --norecover $COMM_ARGS"
    -# echo -n "c)"
    -# run_test il $numjobs
    -# print_result
    -
    -# echo "d)  this test is not yet implemented"
    -
    -# CONSUMER_ARGS="-d --nosend $COMM_ARGS"
    -# echo -n "e)"
    -# run_test il $numjobs
    -# print_result
    -
    -
    -group_b () {
    -if [[ $SILENT -eq 0 ]]
    -then
    -echo "-----------------------------------"
    -echo "Interlogger test:"
    -echo "  - events sent through IPC & files"
    -echo "  - events discarded in IL"
    -echo "-----------------------------------"
    -echo "a) disabled event parsing, the server address (jobid) is hardcoded"
    -echo "b) disabled event synchronization from files"
    -echo "c) disabled recovery thread"
    -echo "x) disabled sync and recovery"
    -echo "d) lazy bkserver connection close"
    -echo "e) normal operation"
    -echo ""
    -fi
    -PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-interlogd-perf
    -LOGJOBS_ARGS=" $COMM_ARGS"
    -}
    -
    -group_b_test_a ()
    -{
    -    CONSUMER_ARGS="-i /tmp/perftest_il.pid -d --nosend --noparse $COMM_ARGS"
    -    echo -n "a)"
    -    run_test il $numjobs
    -    print_result
    -    find /tmp -maxdepth 1 -name perftest.log.\* -exec rm \{\} \;
    -}
    -
    -group_b_test_b () 
    -{
    -    CONSUMER_ARGS="-i /tmp/perftest_il.pid -d --nosend --nosync $COMM_ARGS"
    -    echo -n "b)"
    -    run_test il $numjobs
    -    print_result
    -    find /tmp -maxdepth 1 -name perftest.log.\* -exec rm \{\} \;
    -}
    -
    -group_b_test_c () 
    -{
    -    CONSUMER_ARGS="-i /tmp/perftest_il.pid -d --nosend --norecover $COMM_ARGS"
    -    echo -n "c)"
    -    run_test il $numjobs
    -    print_result
    -    find /tmp -maxdepth 1 -name perftest.log.\* -exec rm \{\} \;
    -}
    -
    -group_b_test_x ()
    -{
    -    CONSUMER_ARGS="-i /tmp/perftest_il.pid -d --nosend --nosync --norecover $COMM_ARGS"
    -    echo -n "x)"
    -    run_test il $numjobs
    -    print_result
    -    find /tmp -maxdepth 1 -name perftest.log.\* -exec rm \{\} \;
    -}
    -
    -group_b_test_d ()
    -{
    -    echo "d)  this test is not applicable"
    -}
    -
    -group_b_test_e ()
    -{
    -    CONSUMER_ARGS="-i /tmp/perftest_il.pid -d --nosend $COMM_ARGS"
    -    echo -n "e)"
    -    run_test il $numjobs
    -    print_result
    -    find /tmp -maxdepth 1 -name perftest.log.\* -exec rm \{\} \;
    -}
    -
    -# echo "-------------------------------"
    -# echo "Interlogger test:"
    -# echo "  - events sent through IPC"
    -# echo "  - events consumed by empty BS"
    -# echo "-------------------------------"
    -# echo "a) disabled event parsing, the server address (jobid) is hardcoded"
    -# echo "b) disabled event synchronization from files"
    -# echo "c) disabled recovery thread"
    -# echo "d) lazy bkserver connection close"
    -# echo "e) normal operation"
    -# echo ""
    -# echo -e "\tavg_job \t big_job \t avg_dag \t big_dag"
    -
    -# PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-bkserverd
    -# CONSUMER_ARGS="-d --perf-sink=1"
    -# PERFTEST_COMPONENT=$STAGEDIR/bin/glite-lb-interlogd-perf
    -# LOGJOBS_ARGS="--nofile $COMM_ARGS"
    -
    -
    -# COMPONENT_ARGS="-d  --noparse $COMM_ARGS"
    -# echo -n "a)"
    -# run_test il $numjobs
    -# print_result
    -# rm -f /tmp/perftest.log.*
    -
    -# COMPONENT_ARGS="-d  --nosync $COMM_ARGS"
    -# echo -n "b)"
    -# run_test il $numjobs
    -# print_result
    -# rm -f /tmp/perftest.log.*
    -
    -# COMPONENT_ARGS="-d  --norecover $COMM_ARGS"
    -# echo -n "c)"
    -# run_test il $numjobs
    -# print_result
    -# rm -f /tmp/perftest.log.*
    -
    -# echo "d) this test is not yet implemented"
    -
    -# COMPONENT_ARGS="-d $COMM_ARGS"
    -# echo -n "e)"
    -# run_test il $numjobs
    -# print_result
    -# rm -f /tmp/perftest.log.*
    -
    -
    -group_c () 
    -{
    -if [[ $SILENT -eq 0 ]]
    -then
    -echo "-----------------------------------"
    -echo "Interlogger test:"
    -echo "  - events sent through IPC & files"
    -echo "  - events consumed by empty BS"
    -echo "-----------------------------------"
    -echo "a) disabled event parsing, the server address (jobid) is hardcoded"
    -echo "b) disabled event synchronization from files"
    -echo "c) disabled recovery thread"
    -echo "x) disabled sync and recovery"
    -echo "d) lazy bkserver connection close"
    -echo "e) normal operation"
    -echo ""
    -fi
    -
    -PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-bkserverd
    -CONSUMER_ARGS="--silent -S /tmp -D /tmp -t 1 -d --perf-sink=1 -p 10500 -w 10503"
    -PERFTEST_COMPONENT=$STAGEDIR/bin/glite-lb-interlogd-perf
    -LOGJOBS_ARGS=" -m localhost:10500 $COMM_ARGS"
    -}
    -
    -group_c_test_a ()
    -{
    -    COMPONENT_ARGS="-i /tmp/perftest_il.pid -d  --noparse $COMM_ARGS"
    -    echo -n "a)"
    -    run_test il $numjobs
    -    print_result
    -    find /tmp -maxdepth 1 -name perftest.log.\* -exec rm \{\} \;
    -}
    -
    -group_c_test_b ()
    -{
    -    COMPONENT_ARGS="-i /tmp/perftest_il.pid -d  --nosync $COMM_ARGS"
    -    echo -n "b)"
    -    run_test il $numjobs
    -    print_result
    -    find /tmp -maxdepth 1 -name perftest.log.\* -exec rm \{\} \;
    -}
    -
    -group_c_test_c ()
    -{
    -    COMPONENT_ARGS="-i /tmp/perftest_il.pid -d  --norecover $COMM_ARGS"
    -    echo -n "c)"
    -    run_test il $numjobs
    -    print_result
    -    find /tmp -maxdepth 1 -name perftest.log.\* -exec rm \{\} \;
    -}
    -
    -group_c_test_x () 
    -{
    -    COMPONENT_ARGS="-i /tmp/perftest_il.pid -d  --nosync --norecover $COMM_ARGS"
    -    echo -n "x)"
    -    run_test il $numjobs
    -    print_result
    -    find /tmp -maxdepth 1 -name perftest.log.\* -exec rm \{\} \;
    -}
    -
    -group_c_test_d ()
    -{
    -    COMPONENT_ARGS="-i /tmp/perftest_il.pid -d  --lazy=10 --nosync --norecover $COMM_ARGS"
    -    echo -n "d)"
    -    run_test il $numjobs
    -    print_result
    -    find /tmp -maxdepth 1 -name perftest.log.\* -exec rm \{\} \;
    -}
    -
    -group_c_test_e ()
    -{
    -    COMPONENT_ARGS="-i /tmp/perftest_il.pid -d $COMM_ARGS"
    -    echo -n "e)"
    -    run_test il $numjobs
    -    print_result
    -    find /tmp -maxdepth 1 -name perftest.log.\* -exec rm \{\} \;
    -}
    -
    -   
    -if [[ $SILENT -eq 0 ]]
    -then
    -    while [[ -z $TEST_GROUP ]]
    -    do
    -	echo "Choose test group:"
    -	echo "  a) logging source tests"
    -	echo "  b) interlogger tests"
    -	echo "  c) interlogger with external consumer tests"
    -	echo -n "Your choice: "
    -	read TEST_GROUP
    -    done
    -fi
    -TEST_GROUP=`echo $TEST_GROUP | tr '[A-Z]' '[a-z]'`
    -
    -if [[ "x$TEST_GROUP" = "x*" ]]
    -then
    -    TEST_GROUP="a b c"
    -fi
    -
    -for group in $TEST_GROUP
    -do
    -    group_$group
    -
    -    if [[ $SILENT -eq 0 ]]
    -    then
    -	while [[ -z $TEST_VARIANT ]]
    -	do
    -	    echo -n "Your choice: "
    -	    read -e TEST_VARIANT
    -	done
    -	print_result_header
    -    fi
    -
    -    if [[ "x$TEST_VARIANT" = "x*" ]]
    -    then
    -	case $TEST_GROUP in
    -	    "a") TEST_VARIANT="a b" ;;
    -	    *)	 TEST_VARIANT="a b c x d e" ;;
    -	esac
    -    fi
    -
    -    for variant in $TEST_VARIANT
    -    do
    -    	export PERFTEST_NAME="il_${group}${variant}"
    -	group_${group}_test_${variant}
    -    done
    -done
    -
    -exit;
    -
    diff --git a/org.glite.lb.logger/src/perftest_ll.sh b/org.glite.lb.logger/src/perftest_ll.sh
    deleted file mode 100644
    index d8eec47..0000000
    --- a/org.glite.lb.logger/src/perftest_ll.sh
    +++ /dev/null
    @@ -1,144 +0,0 @@
    -#!/bin/bash
    -#
    -# Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -# See http://www.eu-egee.org/partners for details on the copyright holders.
    -# 
    -# Licensed under the Apache License, Version 2.0 (the "License");
    -# you may not use this file except in compliance with the License.
    -# You may obtain a copy of the License at
    -# 
    -#     http://www.apache.org/licenses/LICENSE-2.0
    -# 
    -# Unless required by applicable law or agreed to in writing, software
    -# distributed under the License is distributed on an "AS IS" BASIS,
    -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -# See the License for the specific language governing permissions and
    -# limitations under the License.
    -#
    -
    -numjobs=1
    -
    -# XXX - there must be better way to find stage
    -if [ -z "${GLITE_LOCATION}" ]; then
    -	STAGEDIR=/home/michal/shared/egee/jra1-head/stage
    -else
    -	STAGEDIR=${GLITE_LOCATION}
    -fi
    -
    -. $STAGEDIR/sbin/perftest_common.sh
    -
    -SILENT=0
    -while getopts "t:n:s" OPTION 
    -do
    -    case "$OPTION" in 
    -    "t") TEST_VARIANT=$OPTARG
    -    ;;
    -
    -    "n") numjobs=$OPTARG
    -    ;;
    -
    -    "s") SILENT=1
    -    ;;
    -
    -    esac
    -done
    -
    -DEBUG=${DEBUG:-0}
    -# CONSUMER_ARGS=
    -# PERFTEST_COMPONENT=
    -# COMPONENT_ARGS=
    -# LOGJOBS_ARGS="" 
    -COMM_ARGS="--file-prefix /tmp/perftest.log -p 45678"
    -export EDG_WL_LOG_DESTINATION="localhost:45678"
    -
    -check_test_files || exit 1
    -
    -group_a () {
    -echo "----------------
    -Locallogger test
    -----------------
    -a) glite-lb-logd-perf-nofile --noParse --noIPC
    -b) glite-lb-logd-perf-nofile --noIPC
    -c) glite-lb-logd-perf --noIPC
    -d) glite-lb-logd-perf
    -
    -Number of jobs: $numjobs
    -"
    -}
    -
    -
    -# a)
    -group_a_test_a ()
    -{
    -echo -n "a)"
    -PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-logd-perf-nofile
    -CONSUMER_ARGS="-d --noIPC --noParse $COMM_ARGS"
    -init_result
    -run_test ll $numjobs
    -#print_result_ev
    -print_result
    -}
    -
    -# b)
    -group_a_test_b ()
    -{
    -echo -n "b)"
    -PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-logd-perf-nofile
    -CONSUMER_ARGS="-d --noIPC $COMM_ARGS"
    -init_result
    -run_test ll $numjobs
    -#print_result_ev
    -print_result
    -}
    -
    -# c)
    -group_a_test_c () 
    -{
    -echo -n "c)"
    -PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-logd-perf
    -CONSUMER_ARGS="-d --noIPC $COMM_ARGS"
    -init_result
    -run_test ll $numjobs
    -#print_result_ev
    -print_result
    -rm -f /tmp/perftest.log.*
    -}
    -
    -# d)
    -group_a_test_d ()
    -{
    -echo -n "d)"
    -PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-interlogd-perf-empty
    -CONSUMER_ARGS="-d -s /tmp/perftest.sock"
    -PERFTEST_COMPONENT=$STAGEDIR/bin/glite-lb-logd-perf
    -COMPONENT_ARGS="-d -s /tmp/perftest.sock $COMM_ARGS"
    -init_result
    -run_test ll $numjobs
    -#print_result_ev
    -print_result
    -rm -f /tmp/perftest.log.*
    -}
    -
    -group="a"
    -
    -group_$group
    -
    -if [[ $SILENT -eq 0 ]]
    -then
    -    while [[ -z $TEST_VARIANT ]]
    -    do
    -	echo -n "Your choice: "
    -	read -e TEST_VARIANT
    -    done
    -    print_result_header
    -fi
    -
    -if [[ "x$TEST_VARIANT" = "x*" ]]
    -then
    -   TEST_VARIANT="a b c d"
    -fi
    -
    -for variant in $TEST_VARIANT
    -do
    -    group_${group}_test_${variant}
    -done
    diff --git a/org.glite.lb.logger/src/plugin_mgr.c b/org.glite.lb.logger/src/plugin_mgr.c
    deleted file mode 100644
    index 8f32a67..0000000
    --- a/org.glite.lb.logger/src/plugin_mgr.c
    +++ /dev/null
    @@ -1,87 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include "interlogd.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -struct plugin_list {
    -	struct il_output_plugin plugin_def;
    -	struct plugin_list *next;
    -};
    -
    -static struct plugin_list *plugins = NULL;
    -
    -#define DL_RESOLVESYM(var, handle, name, type) \
    -	dlerror(); \
    -	var = (type) dlsym(handle, name); \
    -	if(var == NULL) { \
    -		snprintf(err, sizeof(err), "plugin_init: error resolving %s: %s", name, dlerror()); \
    -		set_error(IL_DL, ENOENT, err); \
    -		return -1; \
    -	}
    -
    -int plugin_mgr_init(const char *plugin_name, char *cfg)
    -{
    -	char err[256];
    -	void *dl_handle;
    -	struct plugin_list *plugin;
    -
    -	dlerror();
    -	dl_handle = dlopen(plugin_name, RTLD_LAZY);
    -	if(dl_handle == NULL) {
    -		snprintf(err, sizeof(err), "plugin_init: error opening dynamic library: %s", dlerror());
    -		set_error(IL_SYS, errno, err);
    -		return -1;
    -	}
    -	dlerror();
    -
    -	plugin = malloc(sizeof(*plugin));
    -	if(plugin == NULL) {
    -		set_error(IL_NOMEM, ENOMEM, "plugin_init: error allocating plugin description");
    -		return -1;
    -	}
    -
    -	plugin->next = plugins;
    -	DL_RESOLVESYM(plugin->plugin_def.plugin_init, dl_handle, "plugin_init", int(*)(char *));
    -	DL_RESOLVESYM(plugin->plugin_def.plugin_supports_scheme, dl_handle,  "plugin_supports_scheme", int(*)(const char *));
    -	DL_RESOLVESYM(plugin->plugin_def.event_queue_connect, dl_handle, "event_queue_connect", int (*)(struct event_queue*));
    -	DL_RESOLVESYM(plugin->plugin_def.event_queue_send, dl_handle, "event_queue_send", int (*)(struct event_queue *));
    -	DL_RESOLVESYM(plugin->plugin_def.event_queue_close, dl_handle, "event_queue_close", int (*)(struct event_queue *));
    -
    -	return (*plugin->plugin_def.plugin_init)(cfg);
    -}
    -
    -
    -struct il_output_plugin *
    -plugin_get(const char *scheme)
    -{
    -	struct plugin_list *outp;
    -
    -	for(outp = plugins; outp != NULL; outp = outp->next) {
    -		if((outp->plugin_def.plugin_supports_scheme)(scheme)) {
    -			return &outp->plugin_def;
    -		}
    -	}
    -
    -	return NULL;
    -}
    diff --git a/org.glite.lb.logger/src/queue_mgr.c b/org.glite.lb.logger/src/queue_mgr.c
    deleted file mode 100644
    index ac05324..0000000
    --- a/org.glite.lb.logger/src/queue_mgr.c
    +++ /dev/null
    @@ -1,293 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/jobid/cjobid.h"
    -#include "glite/lb/context.h"
    -
    -#include "interlogd.h"
    -
    -struct queue_list {
    -  struct event_queue *queue;
    -  char   *dest;
    -  struct queue_list *next;
    -#if defined(IL_NOTIFICATIONS)
    -  time_t expires;
    -#endif
    -};
    -
    -#if !defined(IL_NOTIFICATIONS)
    -static struct event_queue *log_queue;
    -#endif
    -static struct queue_list  *queues;
    -
    -
    -static 
    -int
    -queue_list_create()
    -{
    -  queues = NULL;
    -
    -  return(0);
    -}
    -
    -
    -static
    -int
    -queue_list_find(struct queue_list *ql, const char *dest, struct queue_list **el, struct queue_list **prev)
    -{
    -  struct queue_list *q, *p;
    -
    -  assert(el != NULL);
    -
    -  *el = NULL;
    -  if(prev)
    -    *prev = NULL;
    -
    -  if(ql == NULL) 
    -    return(0);
    -
    -  q = NULL;
    -  p = ql;
    -
    -  while(p) {
    -    if(strcmp(p->dest, dest) == 0) {
    -      *el = p;
    -      if(prev)
    -	*prev = q;
    -      return(1);
    -    }
    -
    -    q = p;
    -    p = p->next;
    -  };
    -
    -  return(0);
    -}
    -
    -
    -static
    -int
    -queue_list_add(struct queue_list **ql, const char *dest, struct event_queue *eq)
    -{
    -  struct queue_list *el;
    -  
    -  assert(dest != NULL);
    -  assert(eq != NULL);
    -  assert(ql != NULL);
    -
    -  el = malloc(sizeof(*el));
    -  if(el == NULL) {
    -    set_error(IL_NOMEM, ENOMEM, "queue_list_add: not enough room for new queue");
    -    return(-1);
    -  }
    -
    -  el->dest = strdup(dest);
    -  if(el->dest == NULL) {
    -    free(el);
    -    set_error(IL_NOMEM, ENOMEM, "queue_list_add: not enough memory for new queue");
    -    return(-1);
    -  }
    -  el->queue = eq;
    -  el->next = *ql;
    -  *ql = el;
    -  return 0;
    -}
    -
    -
    -#if !defined(IL_NOTIFICATIONS)
    -static
    -char *
    -jobid2dest(edg_wlc_JobId jobid)
    -{
    -  char *server_name,*out;
    -  unsigned int	server_port;
    -
    -  if (!jobid) {
    -    set_error(IL_PROTO, EDG_WLL_ERROR_PARSE_BROKEN_ULM, "jobid2dest: invalid job id");
    -    return(NULL);
    -  }
    -  edg_wlc_JobIdGetServerParts(jobid,&server_name,&server_port);
    -
    -  asprintf(&out,"%s:%d",server_name,server_port);
    -  free(server_name);
    -  if(!out)
    -    set_error(IL_SYS, ENOMEM, "jobid2dest: error creating server name");
    -  return(out);
    -}
    -#endif
    -
    -struct event_queue *
    -queue_list_get(char *job_id_s)
    -{
    -  char *dest;
    -  struct queue_list *q;
    -  struct event_queue *eq;
    -  struct il_output_plugin *outp;
    -
    -#if !defined(IL_NOTIFICATIONS)
    -  IL_EVENT_ID_T job_id;
    -
    -  if(job_id_s == NULL || strcmp(job_id_s, "default") == 0)
    -    return(log_queue);
    -
    -  if(edg_wlc_JobIdParse(job_id_s, &job_id)) {
    -    set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM, "queue_list_get: invalid job id");
    -    return(NULL);
    -  }
    -
    -  dest = jobid2dest(job_id);
    -  edg_wlc_JobIdFree(job_id);
    -  outp = NULL;
    -#else
    -  dest = job_id_s;
    -  outp = plugin_get(dest);
    -#endif
    -
    -  if(dest == NULL) 
    -    return(NULL);
    -  
    -  if(queue_list_find(queues, dest, &q, NULL)) {
    -#if !defined(IL_NOTIFICATIONS)
    -    free(dest);
    -#endif
    -    return(q->queue);
    -  } else {
    -    eq = event_queue_create(dest, outp);
    -    if(eq)
    -      queue_list_add(&queues, dest, eq);
    -#if !defined(IL_NOTIFICATIONS)
    -    free(dest);
    -#endif
    -    return(eq);
    -  }
    -}
    -
    -
    -int
    -queue_list_is_log(struct event_queue *eq)
    -{
    -  return(eq == queue_list_get(NULL));
    -}
    -
    -
    -int
    -queue_list_init(char *ls)
    -{
    -#if !defined(IL_NOTIFICATIONS)
    -  /* create queue for log server */
    -  log_queue = event_queue_create(ls, NULL);
    -  if(log_queue == NULL)
    -    return(-1);
    -#endif
    -
    -  return(queue_list_create());
    -}
    -
    -
    -static struct queue_list *current;
    -
    -
    -struct event_queue *
    -queue_list_first()
    -{
    -  current = queues;
    -  return(current ? current->queue : NULL);
    -}
    -
    -
    -struct event_queue *
    -queue_list_next()
    -{
    -  current = current ? current->next : NULL;
    -  return(current ? current->queue : NULL);
    -}
    -
    -
    -int
    -queue_list_remove_queue(struct event_queue *eq)
    -{
    -  assert(eq != NULL);
    -
    -  free(eq);
    -  return(1);
    -}
    -
    -
    -#if defined(IL_NOTIFICATIONS)
    -
    -static struct queue_list  *notifid_map = NULL;
    -
    -struct event_queue *
    -notifid_map_get_dest(const char * notif_id)
    -{
    -	struct queue_list *q = NULL;
    -
    -	queue_list_find(notifid_map, notif_id, &q, NULL);
    -	return(q ? q->queue : NULL);
    -}
    -
    -
    -/* returns 1 if mapping was changed, 0 if new one had to be created, -1 on error */
    -int
    -notifid_map_set_dest(const char *notif_id, struct event_queue *eq)
    -{
    -	struct queue_list *q;
    -
    -	if(queue_list_find(notifid_map, notif_id, &q, NULL)) {
    -		q->queue = eq;
    -		return(1);
    -	} else {
    -		return(queue_list_add(¬ifid_map, notif_id, eq));
    -	}
    -}
    -
    -
    -time_t
    -notifid_map_get_expiration(const char * notif_id)
    -{
    -  struct queue_list *q;
    -
    -  queue_list_find(notifid_map, notif_id, &q, NULL);
    -  return(q ? q->expires : 0);
    -}
    -
    -
    -int
    -notifid_map_set_expiration(const char *notif_id, time_t exp)
    -{
    -  struct queue_list *q;
    -
    -  if(queue_list_find(notifid_map, notif_id, &q, NULL)) {
    -    q->expires = exp;
    -    return(1);
    -  } else {
    -    return(0);
    -  }
    -}
    -
    -#endif
    -
    -/* Local Variables:           */
    -/* c-indentation-style: gnu   */
    -/* End:                       */
    diff --git a/org.glite.lb.logger/src/queue_mgr_http.c b/org.glite.lb.logger/src/queue_mgr_http.c
    deleted file mode 100644
    index f5e767f..0000000
    --- a/org.glite.lb.logger/src/queue_mgr_http.c
    +++ /dev/null
    @@ -1,181 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/jobid/cjobid.h"
    -#include "glite/lb/context.h"
    -
    -#include "interlogd.h"
    -
    -struct queue_list {
    -  struct event_queue *queue;
    -  char   *dest;
    -  struct queue_list *next;
    -  time_t expires;
    -};
    -
    -static struct event_queue *log_queue;
    -static struct queue_list  *queues;
    -
    -
    -static 
    -int
    -queue_list_create()
    -{
    -  queues = NULL;
    -
    -  return(0);
    -}
    -
    -
    -static
    -int
    -queue_list_find(struct queue_list *ql, const char *dest, struct queue_list **el, struct queue_list **prev)
    -{
    -  struct queue_list *q, *p;
    -
    -  assert(el != NULL);
    -
    -  *el = NULL;
    -  if(prev)
    -    *prev = NULL;
    -
    -  if(ql == NULL) 
    -    return(0);
    -
    -  q = NULL;
    -  p = ql;
    -
    -  while(p) {
    -    if(strcmp(p->dest, dest) == 0) {
    -      *el = p;
    -      if(prev)
    -	*prev = q;
    -      return(1);
    -    }
    -
    -    q = p;
    -    p = p->next;
    -  };
    -
    -  return(0);
    -}
    -
    -
    -static
    -int
    -queue_list_add(struct queue_list **ql, const char *dest, struct event_queue *eq)
    -{
    -  struct queue_list *el;
    -  
    -  assert(dest != NULL);
    -  assert(eq != NULL);
    -  assert(ql != NULL);
    -
    -  el = malloc(sizeof(*el));
    -  if(el == NULL) {
    -    set_error(IL_NOMEM, ENOMEM, "queue_list_add: not enough room for new queue");
    -    return(-1);
    -  }
    -
    -  el->dest = strdup(dest);
    -  if(el->dest == NULL) {
    -    free(el);
    -    set_error(IL_NOMEM, ENOMEM, "queue_list_add: not enough memory for new queue");
    -    return(-1);
    -  }
    -  el->queue = eq;
    -  el->next = *ql;
    -  *ql = el;
    -  return 0;
    -}
    -
    -
    -struct event_queue *
    -queue_list_get(char *job_id_s)
    -{
    -  char *dest;
    -  struct queue_list *q;
    -  struct event_queue *eq;
    -  dest = job_id_s;
    -
    -  if(dest == NULL) 
    -    return(NULL);
    -  
    -  if(queue_list_find(queues, dest, &q, NULL)) {
    -    return(q->queue);
    -  } else {
    -    eq = event_queue_create(dest);
    -    if(eq)
    -      queue_list_add(&queues, dest, eq);
    -    return(eq);
    -  }
    -}
    -
    -
    -int
    -queue_list_is_log(struct event_queue *eq)
    -{
    -  return(eq == queue_list_get(NULL));
    -}
    -
    -
    -int
    -queue_list_init(char *ls)
    -{
    -  return(queue_list_create());
    -}
    -
    -
    -static struct queue_list *current;
    -
    -
    -struct event_queue *
    -queue_list_first()
    -{
    -  current = queues;
    -  return(current ? current->queue : NULL);
    -}
    -
    -
    -struct event_queue *
    -queue_list_next()
    -{
    -  current = current ? current->next : NULL;
    -  return(current ? current->queue : NULL);
    -}
    -
    -
    -int
    -queue_list_remove_queue(struct event_queue *eq)
    -{
    -  assert(eq != NULL);
    -
    -  free(eq);
    -  return(1);
    -}
    -
    -
    -
    -/* Local Variables:           */
    -/* c-indentation-style: gnu   */
    -/* End:                       */
    diff --git a/org.glite.lb.logger/src/queue_thread.c b/org.glite.lb.logger/src/queue_thread.c
    deleted file mode 100644
    index ebcb820..0000000
    --- a/org.glite.lb.logger/src/queue_thread.c
    +++ /dev/null
    @@ -1,469 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "interlogd.h"
    -
    -static 
    -void 
    -queue_thread_cleanup(void *q)
    -{
    -	struct event_queue *eq = (struct event_queue *)q;
    -
    -	glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "thread %d exits", eq->thread_id);
    -
    -	/* unlock all held locks */
    -	/* FIXME: check that the thread always exits when holding these locks;
    -	   unlock them at appropriate places if this condition is not met  
    -	   event_queue_unlock(eq);
    -	   event_queue_cond_unlock(eq);
    -	*/
    -  
    -	/* clear thread id */
    -	eq->thread_id = 0;
    -}
    -
    -
    -static time_t now;
    -
    -static
    -int
    -cmp_expires(struct server_msg *msg, void *data)
    -{
    -  time_t *t = (time_t*)data;
    -  return (msg->expires > 0) && (msg->expires < *t);
    -}
    -
    -static
    -void *
    -queue_thread(void *q)
    -{
    -	struct event_queue *eq = (struct event_queue *)q;
    -	int ret, exit;
    -	int retrycnt;
    -	int close_timeout = 0;
    -	int exit_timeout = EXIT_TIMEOUT;
    -
    -	if(init_errors(0) < 0) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, 
    -				 "Error initializing thread specific data, exiting!");
    -		pthread_exit(NULL);
    -	}
    -  
    -	glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, 
    -			 "  started new thread for delivery to %s",
    -			 eq->dest);
    -
    -	pthread_cleanup_push(queue_thread_cleanup, q); 
    -
    -	event_queue_cond_lock(eq);
    -
    -	exit = 0;
    -	retrycnt = 0;
    -	while(!exit) {
    -    
    -		clear_error();
    -
    -		/* if there are no events, wait for them */
    -		ret = 0;
    -		while (event_queue_empty(eq) 
    -#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
    -		       && (eq->flushing != 1)
    -#endif
    -			) {
    -			if(lazy_close && close_timeout) {
    -				ret = event_queue_wait(eq, close_timeout);
    -				if(ret == 1) {/* timeout? */
    -					(*eq->event_queue_close)(eq);
    -					glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -							 "  connection to %s closed",
    -							 eq->dest);
    -				}
    -				close_timeout = 0;
    -			} else {
    -				ret = event_queue_wait(eq, exit_timeout);
    -				if(ret == 1) {
    -					glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, 
    -							 "  thread idle for more than %d seconds, exiting", 
    -							 exit_timeout);
    -					(*eq->event_queue_close)(eq);
    -					event_queue_cond_unlock(eq);
    -					pthread_exit((void*)0);
    -				}
    -			}
    -			if(ret < 0) {
    -				/* error waiting */
    -				glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, 
    -						 "queue_thread: %s", 
    -						 error_get_msg());
    -				event_queue_cond_unlock(eq);
    -				pthread_exit((void*)-1);
    -			}
    -		}  /* END while(empty) */
    -    
    -
    -		/* allow other threads to signal us, ie. insert new events while
    -		 * we are sending or request flush operation
    -		 */
    -		event_queue_cond_unlock(eq);
    -		
    -		/* discard expired events */
    -		glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, "  discarding expired events");
    -		now = time(NULL);
    -		event_queue_move_events(eq, NULL, cmp_expires, &now);
    -		if(!event_queue_empty(eq)) {
    -
    -			/* deliver pending events */
    -			glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -					 "  attempting delivery to %s",
    -					 eq->dest);
    -			/* connect to server */
    -			if((ret=(*eq->event_queue_connect)(eq)) == 0) {
    -				/* not connected */
    -				if(error_get_maj() != IL_OK)
    -					glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_WARN, 
    -							 "queue_thread: %s", error_get_msg());
    -#if defined(IL_NOTIFICATIONS)
    -				glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_INFO, 
    -						 "    could not connect to client %s, waiting for retry", 
    -						 eq->dest);
    -#else
    -				glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_INFO, 
    -						 "    could not connect to bookkeeping server %s, waiting for retry", 
    -						 eq->dest);
    -#endif
    -				retrycnt++;
    -			} else {
    -				retrycnt = 0;
    -				/* connected, send events */
    -				switch(ret=(*eq->event_queue_send)(eq)) {
    -					
    -				case 0:
    -					/* there was an error and we still have events to send */
    -					if(error_get_maj() != IL_OK)
    -						glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_WARN, 
    -								 "queue_thread: %s", 
    -								 error_get_msg());
    -					glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -							 "  events still waiting");
    -					break;
    -					
    -				case 1:
    -					/* hey, we are done for now */
    -					glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -							 "  all events for %s sent", 
    -							 eq->dest);
    -					break;
    -					
    -				default:
    -					/* internal error */
    -					glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_ERROR, 
    -							 "queue_thread: %s", 
    -							 error_get_msg());
    -					exit = 1;      
    -					break;
    -					
    -				} /* switch */
    -			
    -				/* we are done for now anyway, so close the queue */
    -				if((ret == 1) && lazy_close)
    -					close_timeout = default_close_timeout;
    -				else {
    -					(*eq->event_queue_close)(eq);
    -					glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG,
    -							 "  connection to %sclosed",
    -							 eq->dest);
    -				}
    -			}
    -		} 
    -
    -#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
    -		if(pthread_mutex_lock(&flush_lock) < 0)
    -			abort();
    -		event_queue_cond_lock(eq);
    -
    -		/* Check if we are flushing and if we are, report status to master */
    -		if(eq->flushing == 1) {
    -			glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -					 "    flushing mode detected, reporting status");
    -			/* 0 - events waiting, 1 - events sent, < 0 - some error */
    -			eq->flush_result = ret;
    -			eq->flushing = 2;
    -			if(pthread_cond_signal(&flush_cond) < 0)
    -				abort();
    -		}
    -		if(pthread_mutex_unlock(&flush_lock) < 0)
    -			abort();
    -#else
    -#endif
    -
    -		/* if there was some error with server, sleep for a while */
    -		/* iff !event_queue_empty() */
    -		/* also allow for one more try immediately after server disconnect,
    -		   which may cure server kicking us out after given number of connections */
    -#ifndef LB_PERF
    -		if((ret == 0) && (retrycnt > 0)) {
    -			glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -					 "    sleeping");
    -			event_queue_sleep(eq);
    -		}
    -#endif
    -
    -#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
    -#else
    -		event_queue_cond_lock(eq);
    -#endif
    -
    -		if(exit) {
    -			/* we have to clean up before exiting */
    -			event_queue_cond_unlock(eq);
    -		}
    -    
    -	} /* while */
    -
    -	pthread_cleanup_pop(1);
    -
    -	return(eq);
    -}
    -
    -
    -int
    -event_queue_create_thread(struct event_queue *eq)
    -{
    -	assert(eq != NULL);
    -
    -	event_queue_lock(eq);
    -
    -	/* if there is a thread already, just return */
    -	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);
    -}
    -
    -
    -
    -int
    -event_queue_lock(struct event_queue *eq)
    -{
    -	assert(eq != NULL);
    -
    -	if(pthread_rwlock_wrlock(&eq->update_lock)) {
    -		/*** abort instead, this is too serious
    -		set_error(IL_SYS, errno, "event_queue_lock: error acquiring write lock");
    -		return(-1);
    -		*/
    -		abort();
    -	}
    -
    -	return(0);
    -}
    -
    -
    -int
    -event_queue_lock_ro(struct event_queue *eq)
    -{
    -	assert(eq != NULL);
    -
    -	if(pthread_rwlock_rdlock(&eq->update_lock)) {
    -		/*** abort instead, this is too serious
    -		set_error(IL_SYS, errno, "event_queue_lock_ro: error acquiring read lock");
    -		return(-1);
    -		*/
    -		abort();
    -	}
    -
    -	return(0);
    -}
    -
    -
    -int
    -event_queue_unlock(struct event_queue *eq)
    -{
    -	assert(eq != NULL);
    -
    -	if(pthread_rwlock_unlock(&eq->update_lock)) {
    -		/*** abort instead, this is too serious
    -		set_error(IL_SYS, errno, "event_queue_unlock: error releasing lock");
    -		return(-1);
    -		*/
    -		abort();
    -	}
    -
    -	return(0);
    -}
    -
    -
    -int
    -event_queue_signal(struct event_queue *eq)
    -{
    -	assert(eq != NULL);
    -
    -	if(pthread_cond_signal(&eq->ready_cond)) {
    -		/*** abort instead, this is too serious
    -		set_error(IL_SYS, errno, "event_queue_signal: error signaling queue thread");
    -		return(-1);
    -		*/
    -		abort();
    -	}
    -	return(0);
    -}
    -
    -
    -int
    -event_queue_wait(struct event_queue *eq, int timeout)
    -{
    -	assert(eq != NULL);
    -
    -	if(timeout) {
    -		struct timespec endtime;
    -		int  ret = 0;
    -
    -		endtime.tv_sec = time(NULL) + timeout;
    -		endtime.tv_nsec = 0;
    -		
    -		if((ret=pthread_cond_timedwait(&eq->ready_cond, &eq->cond_lock, &endtime))) {
    -			if(ret == ETIMEDOUT) 
    -				return(1);
    -			/*** abort instead, this is too serious
    -			set_error(IL_SYS, errno, "event_queue_wait: error waiting on condition variable");
    -			return(-1);
    -			*/
    -			abort();
    -		}
    -	} else {
    -		if(pthread_cond_wait(&eq->ready_cond, &eq->cond_lock)) {
    -			/*** abort instead, this is too serious
    -			set_error(IL_SYS, errno, "event_queue_wait: error waiting on condition variable");
    -			return(-1);
    -			*/
    -			abort();
    -		}
    -	}
    -	return(0);
    -}
    -
    -
    -int event_queue_sleep(struct event_queue *eq)
    -{
    -#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
    -	struct timespec ts;
    -	struct timeval tv;
    -	int ret;
    -
    -	assert(eq != NULL);
    -
    -	gettimeofday(&tv, NULL);
    -	ts.tv_sec = tv.tv_sec + eq->timeout;
    -	ts.tv_nsec = 1000 * tv.tv_usec;
    -	if((ret=pthread_cond_timedwait(&eq->flush_cond, &eq->cond_lock, &ts)) < 0) {
    -		if(ret != ETIMEDOUT) {
    -			/*** abort instead, this is too serious
    -			set_error(IL_SYS, errno, "event_queue_sleep: error waiting on condition");
    -			return(-1);
    -			*/
    -			abort();
    -		}
    -	}
    -#else
    -	sleep(eq->timeout);
    -#endif
    -	return(0);
    -}
    -
    -
    -#if defined(INTERLOGD_HANDLE_CMD)
    -int event_queue_wakeup(struct event_queue *eq)
    -{
    -	assert(eq != NULL);
    -
    -	if(pthread_cond_signal(&eq->ready_cond)) {
    -		/**
    -		set_error(IL_SYS, errno, "event_queue_wakeup: error signaling queue thread");
    -		return(-1);
    -		*/
    -		abort();
    -	}
    -#if defined(INTERLOGD_FLUSH)
    -	if(pthread_cond_signal(&eq->flush_cond)) {
    -		/**
    -		set_error(IL_SYS, errno, "event_queue_wakeup: error signaling queue thread");
    -		return(-1);
    -		*/
    -		abort();
    -	}
    -#endif
    -	return(0);
    -}
    -#endif
    -
    -int event_queue_cond_lock(struct event_queue *eq)
    -{
    -	assert(eq != NULL);
    -
    -	if(pthread_mutex_lock(&eq->cond_lock)) {
    -		/**
    -		set_error(IL_SYS, errno, "event_queue_cond_lock: error locking condition mutex");
    -		return(-1);
    -		*/
    -		abort();
    -	}
    -
    -	return(0);
    -}
    -
    -
    -int event_queue_cond_unlock(struct event_queue *eq)
    -{
    -	assert(eq != NULL);
    -
    -	if(pthread_mutex_unlock(&eq->cond_lock)) {
    -		/**
    -		set_error(IL_SYS, errno, "event_queue_cond_unlock: error locking condition mutex");
    -		return(-1);
    -		*/
    -		abort();
    -	}
    -
    -	return(0);
    -}
    -
    -/* Local Variables:           */
    -/* c-indentation-style: linux */
    -/* End:                       */
    diff --git a/org.glite.lb.logger/src/recover.c b/org.glite.lb.logger/src/recover.c
    deleted file mode 100644
    index 250a40a..0000000
    --- a/org.glite.lb.logger/src/recover.c
    +++ /dev/null
    @@ -1,92 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "interlogd.h"
    -
    -extern char *file_prefix;
    -
    -extern time_t cert_mtime, key_mtime;
    -
    -void *
    -recover_thread(void *q)
    -{
    -	if(init_errors(0) < 0) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, 
    -				 "Error initializing thread specific data, exiting!");
    -		pthread_exit(NULL);
    -	}
    -
    -	while(1) {
    -		glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -				 "Looking up event files.");
    -		if(event_store_init(file_prefix) < 0) {
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, 
    -					 "recover_thread: %s", error_get_msg());
    -			exit(1);
    -		}
    -		if(event_store_recover_all() < 0) {
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, 
    -					 "recover_thread: %s", error_get_msg());
    -			exit(1);
    -		}
    -		if(event_store_cleanup() < 0) {
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, 
    -					 "recover_thread: %s", error_get_msg());
    -			exit(1);
    -		}
    -		glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_DEBUG, "Checking for new certificate.");
    -		if (edg_wll_gss_watch_creds(cert_file, &cert_mtime) > 0) {
    -			edg_wll_GssCred new_creds = NULL;
    -			int ret;
    -
    -			ret = edg_wll_gss_acquire_cred_gsi(cert_file,key_file, 
    -				&new_creds, NULL);
    -			if (new_creds != NULL) {
    -				if(pthread_mutex_lock(&cred_handle_lock) < 0)
    -					abort();
    -				/* if no one is using the old credentials, release them */
    -				if(cred_handle && cred_handle->counter == 0) {
    -					edg_wll_gss_release_cred(&cred_handle->creds, NULL);
    -					free(cred_handle);
    -					glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_DEBUG, 
    -							 "  freed old credentials");
    -				}
    -				cred_handle = malloc(sizeof(*cred_handle));
    -				if(cred_handle == NULL) {
    -					glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, 
    -							 "Failed to allocate structure for credentials.");
    -					exit(EXIT_FAILURE);
    -				}
    -				cred_handle->creds = new_creds;
    -				cred_handle->counter = 0;
    -				if(pthread_mutex_unlock(&cred_handle_lock) < 0)
    -					abort();
    -				glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_INFO, 
    -						 "New certificate %s found and deployed.",
    -						 new_creds->name);
    -			}
    -		}
    -		sleep(RECOVER_TIMEOUT);
    -	}
    -}
    diff --git a/org.glite.lb.logger/src/send_event.c b/org.glite.lb.logger/src/send_event.c
    deleted file mode 100644
    index b48ab23..0000000
    --- a/org.glite.lb.logger/src/send_event.c
    +++ /dev/null
    @@ -1,394 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -
    -/*
    - *   - L/B server protocol handling routines 
    - */
    -
    -#include "glite/jobid/cjobid.h"
    -#include "glite/lb/il_string.h"
    -#include "glite/lb/context.h"
    -
    -#include "interlogd.h"
    -
    -#if defined(INTERLOGD_EMS) || (defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH))
    -/* 
    - * Send confirmation to client.
    - *
    - */
    -int
    -send_confirmation(long lllid, int code)
    -{
    -  struct sockaddr_un saddr;
    -  char sname[256];
    -  int  sock, ret;
    -
    -  if((sock=socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
    -    set_error(IL_SYS, errno, "send_confirmation: error creating socket");
    -    return(-1);
    -  }
    -
    -  if(fcntl(sock, F_SETFL, O_NONBLOCK) < 0) {
    -	  set_error(IL_SYS, errno, "send_confirmation: error setting socket options");
    -	  return(-1);
    -  }
    -
    -  ret = 0;
    -  memset(&saddr, 0, sizeof(saddr));
    -  saddr.sun_family = AF_UNIX;
    -  snprintf(sname, sizeof(sname), "/tmp/dglogd_sock_%ld", lllid);
    -  strcpy(saddr.sun_path, sname);
    -  if(connect(sock, (struct sockaddr *)&saddr, sizeof(saddr.sun_path)) < 0) {
    -    set_error(IL_SYS, errno, "send_confirmation: error connecting socket");
    -    goto out;
    -  }
    -
    -  if(send(sock, &code, sizeof(code), MSG_NOSIGNAL) < 0) {
    -    set_error(IL_SYS, errno, "send_confirmation: error sending data");
    -    goto out;
    -  }
    -  ret = 1;
    -
    -  glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		   "  sent code %d back to client", 
    -		   code);
    -
    - out:
    -  close(sock);
    -  return(ret);
    -}
    -
    -
    -static 
    -int
    -confirm_msg(struct server_msg *msg, int code, int code_min)
    -{
    -	switch(code) {
    -	case LB_OK:
    -		code_min = 0;
    -		break;
    -	case LB_DBERR:
    -		/* code_min already contains apropriate error code */
    -		break;
    -	case LB_PROTO:
    -		code_min = EDG_WLL_IL_PROTO;
    -		break;
    -	default:
    -		code_min = EDG_WLL_IL_SYS;
    -		break;
    -	}
    -  
    -	return(send_confirmation(msg->receipt_to, code_min));
    -}
    -#endif
    -
    -
    -
    -struct reader_data {
    -	edg_wll_GssConnection *gss;
    -	struct timeval *timeout;
    -};
    -
    -
    -static
    -int
    -gss_reader(void *user_data, char *buffer, int max_len)
    -{
    -  int ret;
    -  size_t len;
    -  struct reader_data *data = (struct reader_data *)user_data;
    -  edg_wll_GssStatus gss_stat;
    -
    -  ret = edg_wll_gss_read_full(data->gss, buffer, max_len, data->timeout, &len, &gss_stat);
    -  if(ret < 0) {
    -    char *gss_err = NULL;
    -
    -    if(ret == EDG_WLL_GSS_ERROR_GSS) {
    -      edg_wll_gss_get_error(&gss_stat, "get_reply", &gss_err);
    -      set_error(IL_DGGSS, ret, gss_err);
    -      free(gss_err);
    -    } else 
    -      set_error(IL_DGGSS, ret, "get_reply");
    -  }
    -  return(ret);
    -}
    -
    -
    -/*
    - * Read reply from server.
    - *  Returns: -1 - error reading message, 
    - *         code > 0 - error code from server
    - */
    -static
    -int 
    -get_reply(struct event_queue *eq, char **buf, int *code_min)
    -{
    -  char *msg=NULL;
    -  int ret, code;
    -  int len;
    -  struct timeval tv;
    -  struct reader_data data;
    -
    -  tv.tv_sec = TIMEOUT;
    -  tv.tv_usec = 0;
    -  data.gss = &eq->gss;
    -  data.timeout = &tv;
    -  len = read_il_data(&data, &msg, gss_reader);
    -  if(len < 0) {
    -    set_error(IL_PROTO, LB_PROTO, "get_reply: error reading server reply");
    -    return(-1);
    -  }
    -  ret = decode_il_reply(&code, code_min, buf, msg);
    -  if(msg) free(msg);
    -  if(ret < 0) {
    -    set_error(IL_PROTO, LB_PROTO, "get_reply: error decoding server reply");
    -    return(-1);
    -  }
    -  return(code);
    -}
    -
    -
    -
    -/*
    - *  Returns: 0 - not connected, timeout set, 1 - OK
    - */
    -int 
    -event_queue_connect(struct event_queue *eq)
    -{
    -  int ret;
    -  struct timeval tv;
    -  edg_wll_GssStatus gss_stat;
    -  cred_handle_t *local_cred_handle;
    -
    -  assert(eq != NULL);
    -
    -#ifdef LB_PERF
    -  if(!nosend) {
    -#endif
    -
    -  if(eq->gss.context == NULL) {
    -
    -    tv.tv_sec = TIMEOUT;
    -    tv.tv_usec = 0;
    -
    -    /* get pointer to the credentials */
    -    if(pthread_mutex_lock(&cred_handle_lock) < 0)
    -	    abort();
    -    local_cred_handle = cred_handle;
    -    local_cred_handle->counter++;
    -    if(pthread_mutex_unlock(&cred_handle_lock) < 0)
    -	    abort();
    -    
    -    glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		     "    trying to connect to %s:%d", 
    -		     eq->dest_name, eq->dest_port);
    -    ret = edg_wll_gss_connect(local_cred_handle->creds, eq->dest_name, eq->dest_port, &tv, &eq->gss, &gss_stat);
    -    if(pthread_mutex_lock(&cred_handle_lock) < 0)
    -	    abort();
    -    /* check if we need to release the credentials */
    -    --local_cred_handle->counter;
    -    if(local_cred_handle != cred_handle && local_cred_handle->counter == 0) {
    -	    edg_wll_gss_release_cred(&local_cred_handle->creds, NULL);
    -	    free(local_cred_handle);
    -	    glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, "   freed credentials, not used anymore");
    -    }
    -    if(pthread_mutex_unlock(&cred_handle_lock) < 0) 
    -	    abort();
    -
    -    if(ret < 0) {
    -      char *gss_err = NULL;
    -
    -      if (ret == EDG_WLL_GSS_ERROR_GSS)
    -	 edg_wll_gss_get_error(&gss_stat, "event_queue_connect: edg_wll_gss_connect", &gss_err);
    -      set_error(IL_DGGSS, ret,
    -	        (ret == EDG_WLL_GSS_ERROR_GSS) ? gss_err : "event_queue_connect: edg_wll_gss_connect");
    -      if (gss_err) free(gss_err);
    -      eq->gss.context = NULL;
    -      eq->timeout = TIMEOUT;
    -      return(0);
    -    }
    -    eq->first_event_sent = 0;
    -  }
    -
    -#ifdef LB_PERF
    -  }
    -#endif
    -
    -  return(1);
    -}
    -
    -
    -int
    -event_queue_close(struct event_queue *eq)
    -{
    -  assert(eq != NULL);
    -
    -#ifdef LB_PERF
    -  if(!nosend) {
    -#endif
    -
    -  if(eq->gss.context != NULL) {
    -    edg_wll_gss_close(&eq->gss, NULL);
    -    eq->gss.context = NULL;
    -  }
    -  eq->first_event_sent = 0;
    -#ifdef LB_PERF
    -  }
    -#endif
    -  return(0);
    -}
    -
    -
    -/* 
    - * Send all events from the queue.
    - *   Returns: -1 - system error, 0 - not send, 1 - queue empty
    - */
    -int 
    -event_queue_send(struct event_queue *eq)
    -{
    -  assert(eq != NULL);
    -
    -#ifdef LB_PERF
    -  if(!nosend) {
    -#endif
    -  if(eq->gss.context == NULL)
    -    return(0);
    -#ifdef LB_PERF
    -  }
    -#endif
    -
    -  /* feed the server with events */
    -  while (!event_queue_empty(eq)) {
    -    struct server_msg *msg;
    -    char *rep;
    -    int  ret, code, code_min;
    -    size_t bytes_sent;
    -    struct timeval tv;
    -    edg_wll_GssStatus gss_stat;
    -
    -    clear_error();
    -
    -    if(event_queue_get(eq, &msg) < 0) 
    -      return(-1);
    -
    -    glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		     "    trying to deliver event at offset %d for job %s", 
    -		     msg->offset, msg->job_id_s);
    -
    -#ifdef LB_PERF
    -    if(!nosend) {
    -#endif
    -	if (msg->len) {
    -	    tv.tv_sec = TIMEOUT;
    -	    tv.tv_usec = 0;
    -	    ret = edg_wll_gss_write_full(&eq->gss, msg->msg, msg->len, &tv, &bytes_sent, &gss_stat);
    -	    if(ret < 0) {
    -	      if (ret == EDG_WLL_GSS_ERROR_ERRNO && errno == EPIPE && eq->first_event_sent )
    -	        eq->timeout = 0;
    -	      else
    -	        eq->timeout = TIMEOUT;
    -	      return(0);
    -	    }
    - 	    
    -	    if((code = get_reply(eq, &rep, &code_min)) < 0) {
    -		    /* could not get the reply properly, so try again later */
    -		    if (eq->first_event_sent) {
    -			/* could be expected server connection preemption */
    -			clear_error();
    -			eq->timeout = 1;
    -		    } else {
    -			eq->timeout = TIMEOUT;
    -		        glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_WARN, "  error reading server %s reply: %s", 
    -					 eq->dest_name, error_get_msg());
    -                    }
    -		    return(0);
    -	    }
    -	}
    -	else { code = LB_OK; code_min = 0; rep = strdup("not sending empty message"); }
    -#ifdef LB_PERF
    -    } else {
    -	    glite_wll_perftest_consumeEventIlMsg(msg->msg+17);
    -	    code = LB_OK;
    -	    rep = strdup("OK");
    -    }
    -#endif
    -    
    -    glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, 
    -		     "    event sent, server %s replied with %d, %s", 
    -		     eq->dest_name, code, rep);
    -    free(rep);
    -
    -    /* the reply is back here */
    -    switch(code) {
    -      
    -	    /* NOT USED: case LB_TIME: */
    -    case LB_NOMEM:
    -	    /* NOT USED: case LB_SYS:  */
    -	    /* NOT USED: case LB_AUTH: */
    -	case LB_PERM:
    -	case LB_DBERR:
    -      /* non fatal errors (for us) */
    -      eq->timeout = TIMEOUT;
    -      return(0);
    -	
    -    case LB_OK:
    -      /* event succesfully delivered */
    -      
    -    default: /* LB_PROTO */
    -      /* the event was not accepted by the server */
    -      /* update the event pointer */
    -        if(event_store_commit(msg->es, msg->ev_len, queue_list_is_log(eq), msg->generation) < 0)
    -	/* failure committing message, this is bad */
    -	return(-1);
    -      /* if we have just delivered priority message from the queue, send confirmation */
    -      ret = 1;
    -#if defined(INTERLOGD_EMS)
    -      if(server_msg_is_priority(msg) &&
    -	 ((ret=confirm_msg(msg, code, code_min)) < 0))
    -	return(ret);
    -#endif
    -
    -      if((ret == 0) &&
    -	 (error_get_maj() != IL_OK))
    -	      glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_ERROR, 
    -			       "send_event: %s", 
    -			       error_get_msg());
    -	
    -      event_queue_remove(eq);
    -      eq->first_event_sent = 1;
    -      break;
    -      
    -    } /* switch */
    -  } /* while */
    -
    -  return(1);
    -
    -} /* send_events */
    -
    -
    diff --git a/org.glite.lb.logger/src/send_event_http.c b/org.glite.lb.logger/src/send_event_http.c
    deleted file mode 100644
    index ce79f73..0000000
    --- a/org.glite.lb.logger/src/send_event_http.c
    +++ /dev/null
    @@ -1,299 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#ifdef HAVE_UNISTD_H
    -#include 
    -#endif
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -
    -/*
    - *   - L/B server protocol handling routines 
    - */
    -
    -#include "glite/jobid/cjobid.h"
    -#include "glite/lb/il_string.h"
    -#include "glite/lb/context.h"
    -
    -#include "interlogd.h"
    -
    -struct reader_data {
    -	edg_wll_GssConnection *gss;
    -	struct timeval *timeout;
    -};
    -
    -
    -static
    -int
    -gss_reader(void *user_data, char *buffer, int max_len)
    -{
    -  int ret;
    -  struct reader_data *data = (struct reader_data *)user_data;
    -  edg_wll_GssStatus gss_stat;
    -
    -  ret = edg_wll_gss_read(data->gss, buffer, max_len, data->timeout, &gss_stat);
    -  if(ret < 0) {
    -    char *gss_err = NULL;
    -
    -    if(ret == EDG_WLL_GSS_ERROR_GSS) {
    -      edg_wll_gss_get_error(&gss_stat, "get_reply", &gss_err);
    -      set_error(IL_DGGSS, ret, gss_err);
    -      free(gss_err);
    -    } else 
    -      set_error(IL_DGGSS, ret, "get_reply");
    -  }
    -  return(ret);
    -}
    -
    -
    -/*
    - * Read reply from server.
    - *  Returns: -1 - error reading message, 
    - *         code > 0 - http status code from server
    - */
    -static
    -int 
    -get_reply(struct event_queue *eq, char **buf, int *code_min)
    -{
    -  int ret, code;
    -  int len;
    -  struct timeval tv;
    -  struct reader_data data;
    -  il_http_message_t msg;
    -
    -  tv.tv_sec = TIMEOUT;
    -  tv.tv_usec = 0;
    -  data.gss = &eq->gss;
    -  data.timeout = &tv;
    -  len = receive_http(&data, gss_reader, &msg);
    -  if(len < 0) {
    -    set_error(IL_PROTO, LB_PROTO, "get_reply: error reading server reply");
    -    return(-1);
    -  }
    -  if(msg.data) free(msg.data);
    -  if(msg.reply_string) *buf = msg.reply_string;
    -  *code_min = 0; /* XXX fill in flag for fault */
    -  return(msg.reply_code);
    -}
    -
    -
    -
    -/*
    - *  Returns: 0 - not connected, timeout set, 1 - OK
    - */
    -int 
    -event_queue_connect(struct event_queue *eq)
    -{
    -  int ret;
    -  struct timeval tv;
    -  edg_wll_GssStatus gss_stat;
    -  cred_handle_t *local_cred_handle;
    -
    -  assert(eq != NULL);
    -
    -#ifdef LB_PERF
    -  if(!nosend) {
    -#endif
    -
    -  if(eq->gss.context == NULL) {
    -
    -    tv.tv_sec = TIMEOUT;
    -    tv.tv_usec = 0;
    -
    -    /* get pointer to the credentials */
    -    if(pthread_mutex_lock(&cred_handle_lock) < 0)
    -	    abort();
    -    local_cred_handle = cred_handle;
    -    local_cred_handle->counter++;
    -    if(pthread_mutex_unlock(&cred_handle_lock) < 0)
    -	    abort();
    -    
    -    il_log(LOG_DEBUG, "    trying to connect to %s:%d\n", eq->dest_name, eq->dest_port);
    -    ret = edg_wll_gss_connect(local_cred_handle->creds, eq->dest_name, eq->dest_port, &tv, &eq->gss, &gss_stat);
    -    if(pthread_mutex_lock(&cred_handle_lock) < 0)
    -	    abort();
    -    /* check if we need to release the credentials */
    -    --local_cred_handle->counter;
    -    if(local_cred_handle != cred_handle && local_cred_handle->counter == 0) {
    -	    edg_wll_gss_release_cred(&local_cred_handle->creds, NULL);
    -	    free(local_cred_handle);
    -	    il_log(LOG_DEBUG, "   freed credentials, not used anymore\n");
    -    }
    -    if(pthread_mutex_unlock(&cred_handle_lock) < 0) 
    -	    abort();
    -
    -    if(ret < 0) {
    -      char *gss_err = NULL;
    -
    -      if (ret == EDG_WLL_GSS_ERROR_GSS)
    -	 edg_wll_gss_get_error(&gss_stat, "event_queue_connect: edg_wll_gss_connect", &gss_err);
    -      set_error(IL_DGGSS, ret,
    -	        (ret == EDG_WLL_GSS_ERROR_GSS) ? gss_err : "event_queue_connect: edg_wll_gss_connect");
    -      if (gss_err) free(gss_err);
    -      eq->gss.context = NULL;
    -      eq->timeout = TIMEOUT;
    -      return(0);
    -    }
    -  }
    -
    -#ifdef LB_PERF
    -  }
    -#endif
    -
    -  return(1);
    -}
    -
    -
    -int
    -event_queue_close(struct event_queue *eq)
    -{
    -  assert(eq != NULL);
    -
    -#ifdef LB_PERF
    -  if(!nosend) {
    -#endif
    -
    -  if(eq->gss.context != NULL) {
    -    edg_wll_gss_close(&eq->gss, NULL);
    -    eq->gss.context = NULL;
    -  }
    -#ifdef LB_PERF
    -  }
    -#endif
    -  return(0);
    -}
    -
    -
    -/* 
    - * Send all events from the queue.
    - *   Returns: -1 - system error, 0 - not sent, 1 - queue empty
    - */
    -int 
    -event_queue_send(struct event_queue *eq)
    -{
    -  int events_sent = 0;
    -  assert(eq != NULL);
    -
    -#ifdef LB_PERF
    -  if(!nosend) {
    -#endif
    -  if(eq->gss.context == NULL)
    -    return(0);
    -#ifdef LB_PERF
    -  }
    -#endif
    -
    -  /* feed the server with events */
    -  while (!event_queue_empty(eq)) {
    -    struct server_msg *msg;
    -    char *rep;
    -    int  ret, code, code_min;
    -    size_t bytes_sent;
    -    struct timeval tv;
    -    edg_wll_GssStatus gss_stat;
    -
    -    clear_error();
    -
    -    if(event_queue_get(eq, &msg) < 0) 
    -      return(-1);
    -
    -    il_log(LOG_DEBUG, "    trying to deliver event at offset %d for job %s\n", msg->offset, msg->job_id_s);
    -
    -#ifdef LB_PERF
    -    if(!nosend) {
    -#endif
    -        /* XXX: ljocha -- does it make sense to send empty messages ? */
    -	if (msg->len) {
    -	    tv.tv_sec = TIMEOUT;
    -	    tv.tv_usec = 0;
    -	    ret = edg_wll_gss_write_full(&eq->gss, msg->msg, msg->len, &tv, &bytes_sent, &gss_stat);
    -	    if(ret < 0) {
    -		    if (ret == EDG_WLL_GSS_ERROR_ERRNO && errno == EPIPE && events_sent > 0) {
    -			    eq->timeout = 0;
    -		    }  else {
    -			    il_log(LOG_ERR, "send_event: %s\n", error_get_msg());
    -			    eq->timeout = TIMEOUT;
    -		    }
    -		    return(0);
    - 	    }
    -	    if((code = get_reply(eq, &rep, &code_min)) < 0) {
    -		    /* could not get the reply properly, so try again later */
    -		    if (events_sent>0) 
    -			    eq->timeout = 1;
    -		    else {
    -			    eq->timeout = TIMEOUT;
    -			    il_log(LOG_ERR, "  error reading server %s reply:\n    %s\n", eq->dest_name, error_get_msg());
    -		    }
    -		    return(0);
    -	    }
    -	}
    -	else { code = 200; code_min = 0; rep = strdup("not sending empty message"); }
    -#ifdef LB_PERF
    -    } else {
    -	    glite_wll_perftest_consumeEventIlMsg(msg->msg+17);
    -	    code = 200;
    -	    rep = strdup("OK");
    -    }
    -#endif
    -    
    -    il_log(LOG_DEBUG, "    event sent, server %s replied with %d, %s\n", eq->dest_name, code, rep);
    -    free(rep);
    -
    -    /* the reply is back here, decide what to do with message */
    -    /* HTTP error codes:
    -       1xx - informational (eg. 100 Continue)
    -       2xx - successful (eg. 200 OK)
    -       3xx - redirection (eg. 301 Moved Permanently)
    -       4xx - client error (eq. 400 Bad Request)
    -       5xx - server error (eq. 500 Internal Server Error)
    -    */
    -    if(code >= 100 && code < 200) {
    -
    -	    /* non fatal errors (for us), try to deliver later */
    -	    eq->timeout = TIMEOUT;
    -	    return(0);
    -    }
    -
    -    /* the message was consumed (successfully or not) */
    -    /* update the event pointer */
    -    if(event_store_commit(msg->es, msg->ev_len, queue_list_is_log(eq)) < 0) 
    -	    /* failure committing message, this is bad */
    -	    return(-1);
    -    
    -    event_queue_remove(eq);
    -    events_sent++;
    -  } /* while */
    -
    -  return(1);
    -
    -} /* send_events */
    -
    -
    -/* this is just not used */
    -int
    -send_confirmation(long lllid, int code)
    -{
    -	return 0;
    -}
    diff --git a/org.glite.lb.logger/src/server_msg.c b/org.glite.lb.logger/src/server_msg.c
    deleted file mode 100644
    index aa57e1a..0000000
    --- a/org.glite.lb.logger/src/server_msg.c
    +++ /dev/null
    @@ -1,245 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "interlogd.h"
    -#include "glite/lb/il_msg.h" 
    -#include "glite/lb/events_parse.h"
    -#include "glite/lb/context.h"
    -
    -static
    -int 
    -create_msg(il_octet_string_t *ev, char **buffer, long *receipt, time_t *expires)
    -{
    -  char *p;  int  len;
    -  char *event = ev->data;
    -
    -  *receipt = 0L;
    -
    -#if defined(INTERLOGD_EMS)
    -  /* find DG.LLLID */
    -  if(strncmp(event, "DG.LLLID",8) == 0 ||
    -	strncmp(event, "DG.LLPID",8) == 0) { /* 8 == strlen("DG.LLLID") */
    -
    -    /* skip the key */
    -    event += 9;  /* 9 = strlen("DG.LLLID=") */
    -    *receipt = atol(event);
    -    p = strchr(event, ' ');
    -    if(!p) {
    -      set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM, 
    -		"create_msg: error parsing locallogger PID");
    -      return(-1);
    -    }
    -    /* skip the value */
    -    event = p + 1;
    -
    -    /* find DG.PRIORITY */
    -    p = strstr(event, "DG.PRIORITY");
    -    if(p) {
    -      int n;
    -      
    -      p += 12; /* skip the key and = */
    -      n = atoi(p);
    -      if((n & (EDG_WLL_LOGFLAG_SYNC|EDG_WLL_LOGFLAG_SYNC_COMPAT)) == 0) {
    -	/* normal asynchronous message */
    -	      *receipt = 0L;
    -      }
    -    } else {
    -      /* could not find priority key */
    -      *receipt = 0L;
    -    }
    -    
    -  } else {
    -    /* could not find local logger PID, confirmation can not be sent */
    -    *receipt = 0L;
    -  }
    -#endif
    -
    -  if((p = strstr(event, "DG.EXPIRES")) != NULL) {
    -	  p += 11;
    -	  *expires = atoi(p);
    -  }
    -  len = encode_il_msg(buffer, ev);
    -  if(len < 0) {
    -    set_error(IL_NOMEM, ENOMEM, "create_msg: out of memory allocating message");
    -    return(-1);
    -  }
    -  return(len);
    -}
    -
    -
    -struct server_msg *
    -server_msg_create(il_octet_string_t *event, long offset)
    -{
    -  struct server_msg *msg;
    -
    -  msg = malloc(sizeof(*msg));
    -  if(msg == NULL) {
    -    set_error(IL_NOMEM, ENOMEM, "server_msg_create: out of memory allocating message");
    -    return(NULL);
    -  }
    -
    -  if(server_msg_init(msg, event) < 0) {
    -    server_msg_free(msg);
    -    return(NULL);
    -  }
    -  msg->offset = offset;
    -
    -  return(msg);
    -}
    -
    -
    -struct server_msg *
    -server_msg_copy(struct server_msg *src)
    -{
    -  struct server_msg *msg;
    -
    -  msg = malloc(sizeof(*msg));
    -  if(msg == NULL) {
    -    set_error(IL_NOMEM, ENOMEM, "server_msg_copy: out of memory allocating message");
    -    return(NULL);
    -  }
    -  
    -  msg->msg = malloc(src->len);
    -  if(msg->msg == NULL) {
    -    set_error(IL_NOMEM, ENOMEM, "server_msg_copy: out of memory allocating server message");
    -    server_msg_free(msg);
    -    return(NULL);
    -  }
    -  msg->len = src->len;
    -  memcpy(msg->msg, src->msg, src->len);
    -
    -  msg->job_id_s = strdup(src->job_id_s);
    -  msg->ev_len = src->ev_len;
    -  msg->es = src->es;
    -  msg->receipt_to = src->receipt_to;
    -  msg->offset = src->offset;
    -#if defined(IL_NOTIFICATIONS)
    -  msg->dest_name = src->dest_name ? strdup(src->dest_name) : NULL;
    -  msg->dest_port = src->dest_port;
    -  msg->dest = src->dest ? strdup(src->dest) : NULL;
    -#endif
    -  msg->expires = src->expires;
    -  msg->generation = src->generation;
    -  return(msg);
    -}
    -
    -
    -int
    -server_msg_init(struct server_msg *msg, il_octet_string_t *event)
    -{
    -#if defined(IL_NOTIFICATIONS)
    -	edg_wll_Context context;
    -	edg_wll_Event *notif_event;
    -	int ret;
    -#endif
    -
    -	assert(msg != NULL);
    -	assert(event != NULL);
    -
    -	memset(msg, 0, sizeof(*msg));
    -
    -
    -#if defined(IL_NOTIFICATIONS)
    -
    -	/* parse the notification event */
    -	edg_wll_InitContext(&context);
    -	ret=edg_wll_ParseNotifEvent(context, event->data, ¬if_event);
    -	edg_wll_FreeContext(context);
    -	if(ret) {
    -		set_error(IL_LBAPI, ret, "server_msg_init: error parsing notification event");
    -		return(-1);
    -	}
    -
    -	/* FIXME: check for allocation error */
    -	if(notif_event->notification.dest_url &&
    -		(strlen(notif_event->notification.dest_url) > 0)) {
    -		/* destination URL */
    -		msg->dest = strdup(notif_event->notification.dest_url);
    -		msg->dest_name = NULL;
    -		msg->dest_port = 0;
    -	} else if(notif_event->notification.dest_host &&
    -	   (strlen(notif_event->notification.dest_host) > 0)) {
    -		/* destination host and port */
    -		msg->dest_name = strdup(notif_event->notification.dest_host);
    -		msg->dest_port = notif_event->notification.dest_port;
    -		asprintf(&msg->dest, "%s:%d", msg->dest_name, msg->dest_port);
    -	}
    -	msg->job_id_s = edg_wll_NotifIdUnparse(notif_event->notification.notifId);
    -	if(notif_event->notification.jobstat && 
    -	   (strlen(notif_event->notification.jobstat) > 0)) {
    -		msg->len = create_msg(event, &msg->msg, &msg->receipt_to, &msg->expires);
    -	}
    -	msg->expires = notif_event->notification.expires;
    -	edg_wll_FreeEvent(notif_event);
    -	free(notif_event);
    -	if(msg->len < 0) {
    -		return(-1);
    -	}
    -#else
    -	msg->len = create_msg(event, &msg->msg, &msg->receipt_to, &msg->expires);
    -	if(msg->len < 0) {
    -		return(-1);
    -	}
    -#ifdef LB_PERF
    -	if(noparse) {
    -		msg->job_id_s = strdup("https://localhost:9000/not_so_unique_string");
    -	} else 
    -#endif
    -		msg->job_id_s = edg_wll_GetJobId(event->data);
    -#endif
    -	/* remember to add event separator to the length */
    -	msg->ev_len = event->len + 1;
    -
    -	if(msg->job_id_s == NULL) {
    -		set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM, "server_msg_init: error getting id");
    -		return(-1);
    -	}
    -	
    -	return(0);
    -}
    -
    -
    -int
    -server_msg_is_priority(struct server_msg *msg)
    -{
    -  assert(msg != NULL);
    -
    -  return(msg->receipt_to != 0);
    -}
    -
    -
    -int
    -server_msg_free(struct server_msg *msg)
    -{
    -  assert(msg != NULL);
    -
    -  if(msg->msg) free(msg->msg);
    -  if(msg->job_id_s) free(msg->job_id_s);
    -#if defined(IL_NOTIFICATIONS)
    -  if(msg->dest_name) free(msg->dest_name);
    -  if(msg->dest) free(msg->dest);
    -#endif
    -  free(msg);
    -  return 0;
    -}
    diff --git a/org.glite.lb.logger/src/server_msg_http.c b/org.glite.lb.logger/src/server_msg_http.c
    deleted file mode 100644
    index 3a0209a..0000000
    --- a/org.glite.lb.logger/src/server_msg_http.c
    +++ /dev/null
    @@ -1,145 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -
    -#include "interlogd.h"
    -#include "glite/lb/il_msg.h" 
    -#include "glite/lb/events_parse.h"
    -#include "glite/lb/context.h"
    -
    -static
    -int 
    -create_msg(il_http_message_t *ev, char **buffer, long *receipt, time_t *expires)
    -{
    -  char *event = ev->data;
    -
    -  *receipt = 0;
    -  *expires = 0;
    -
    -  *buffer = ev->data;
    -  return ev->len;;
    -}
    -
    -
    -struct server_msg *
    -server_msg_create(il_octet_string_t *event, long offset)
    -{
    -  struct server_msg *msg;
    -
    -  msg = malloc(sizeof(*msg));
    -  if(msg == NULL) {
    -    set_error(IL_NOMEM, ENOMEM, "server_msg_create: out of memory allocating message");
    -    return(NULL);
    -  }
    -
    -  if(server_msg_init(msg, event) < 0) {
    -    server_msg_free(msg);
    -    return(NULL);
    -  }
    -  msg->offset = offset;
    -
    -  return(msg);
    -}
    -
    -
    -struct server_msg *
    -server_msg_copy(struct server_msg *src)
    -{
    -  struct server_msg *msg;
    -
    -  msg = malloc(sizeof(*msg));
    -  if(msg == NULL) {
    -    set_error(IL_NOMEM, ENOMEM, "server_msg_copy: out of memory allocating message");
    -    return(NULL);
    -  }
    -  
    -  msg->msg = malloc(src->len);
    -  if(msg->msg == NULL) {
    -    set_error(IL_NOMEM, ENOMEM, "server_msg_copy: out of memory allocating server message");
    -    server_msg_free(msg);
    -    return(NULL);
    -  }
    -  msg->len = src->len;
    -  memcpy(msg->msg, src->msg, src->len);
    -
    -  msg->job_id_s = strdup(src->job_id_s);
    -  msg->ev_len = src->ev_len;
    -  msg->es = src->es;
    -  msg->receipt_to = src->receipt_to;
    -  msg->offset = src->offset;
    -#if defined(IL_NOTIFICATIONS)
    -  msg->dest_name = strdup(src->dest_name);
    -  msg->dest_port = src->dest_port;
    -  msg->dest = strdup(src->dest);
    -#endif
    -  msg->expires = src->expires;
    -  return(msg);
    -}
    -
    -
    -int
    -server_msg_init(struct server_msg *msg, il_octet_string_t *event)
    -{
    -	il_http_message_t *hmsg = (il_http_message_t *)event;
    -
    -	assert(msg != NULL);
    -	assert(event != NULL);
    -
    -	memset(msg, 0, sizeof(*msg));
    -
    -
    -	msg->job_id_s = hmsg->host;
    -	if(msg->job_id_s == NULL) {
    -		set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM, "server_msg_init: error getting id");
    -		return -1;
    -	}
    -	msg->len = create_msg(hmsg, &msg->msg, &msg->receipt_to, &msg->expires);
    -	if(msg->len < 0)
    -		return -1;
    -	/* set this to indicate new data owner */
    -	hmsg->data = NULL;
    -	hmsg->host = NULL;
    -	msg->ev_len = hmsg->len + 1; /* must add separator size too */
    -	return 0;
    -
    -}
    -
    -
    -int
    -server_msg_is_priority(struct server_msg *msg)
    -{
    -  assert(msg != NULL);
    -
    -  return(msg->receipt_to != 0);
    -}
    -
    -
    -int
    -server_msg_free(struct server_msg *msg)
    -{
    -  assert(msg != NULL);
    -
    -  if(msg->msg) free(msg->msg);
    -  if(msg->job_id_s) free(msg->job_id_s);
    -  free(msg);
    -  return 0;
    -}
    diff --git a/org.glite.lb.logger/test/IlTestBase.cpp b/org.glite.lb.logger/test/IlTestBase.cpp
    deleted file mode 100644
    index 4ef7301..0000000
    --- a/org.glite.lb.logger/test/IlTestBase.cpp
    +++ /dev/null
    @@ -1,32 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include "IlTestBase.h"
    -
    -#include 
    -
    -const char *IlTestBase::msg = "DATE=20040831150159.702224 HOST=\"some.host\" PROG=edg-wms LVL=USAGE DG.PRIORITY=0 DG.SOURCE=\"UserInterface\" DG.SRC_INSTANCE=\"\" DG.EVNT=\"RegJob\" DG.JOBID=\"https://some.host:1234/x67qr549qc\" DG.SEQCODE=\"UI=2:NS=0:WM=0:BH=1:JSS=0:LM=0:LRMS=0:APP=0\" DG.USER=\"/C=CZ/O=Cesnet/CN=Michal Vocu\" DG.REGJOB.JDL=\"\" DG.REGJOB.NS=\"ns address\" DG.REGJOB.PARENT=\"\" DG.REGJOB.JOBTYPE=\"SIMPLE\" DG.REGJOB.NSUBJOBS=\"0\" DG.REGJOB.SEED=\"\"";
    -
    -const char *IlTestBase::msg_enc = "             429\n6 michal\n415 DATE=20040831150159.702224 HOST=\"some.host\" PROG=edg-wms LVL=USAGE DG.PRIORITY=0 DG.SOURCE=\"UserInterface\" DG.SRC_INSTANCE=\"\" DG.EVNT=\"RegJob\" DG.JOBID=\"https://some.host:1234/x67qr549qc\" DG.SEQCODE=\"UI=2:NS=0:WM=0:BH=1:JSS=0:LM=0:LRMS=0:APP=0\" DG.USER=\"/C=CZ/O=Cesnet/CN=Michal Vocu\" DG.REGJOB.JDL=\"\" DG.REGJOB.NS=\"ns address\" DG.REGJOB.PARENT=\"\" DG.REGJOB.JOBTYPE=\"SIMPLE\" DG.REGJOB.NSUBJOBS=\"0\" DG.REGJOB.SEED=\"\"\n";
    -
    -const struct server_msg IlTestBase::smsg = {
    -	"https://some.host:1234/x67qr549qc",
    -	(char*)IlTestBase::msg_enc,
    -	strlen(IlTestBase::msg_enc),
    -	strlen(IlTestBase::msg) + 1,
    -	NULL
    -};
    diff --git a/org.glite.lb.logger/test/IlTestBase.h b/org.glite.lb.logger/test/IlTestBase.h
    deleted file mode 100644
    index 449dbee..0000000
    --- a/org.glite.lb.logger/test/IlTestBase.h
    +++ /dev/null
    @@ -1,27 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -extern "C" {
    -#include "interlogd.h"
    -}
    -
    -class IlTestBase {
    -public:
    -	static const char *msg;
    -	static const char *msg_enc;
    -	static const struct server_msg smsg;
    -};
    diff --git a/org.glite.lb.logger/test/event_queueTest.cpp b/org.glite.lb.logger/test/event_queueTest.cpp
    deleted file mode 100644
    index e07c19f..0000000
    --- a/org.glite.lb.logger/test/event_queueTest.cpp
    +++ /dev/null
    @@ -1,162 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    - 
    -#include "IlTestBase.h"
    -
    -extern "C" {
    -struct event_queue_msg {
    -  struct server_msg *msg;
    -  struct event_queue_msg *prev;
    -};
    -}
    -
    -#include 
    -using namespace std;
    -
    -class event_queueTest: public CppUnit::TestFixture
    -{
    -	CPPUNIT_TEST_SUITE( event_queueTest );
    -	CPPUNIT_TEST( testEventQueueCreate );
    -	CPPUNIT_TEST( testEventQueueInsert );
    -	CPPUNIT_TEST( testEventQueueGet );
    -	CPPUNIT_TEST( testEventQueueRemove );
    -	CPPUNIT_TEST_SUITE_END();
    -
    -public:
    -	void setUp() {
    -		server = strdup("localhost:8080");
    -		eq = event_queue_create(server);
    -		free(server);
    -	}
    -
    -	void tearDown() {
    -		struct event_queue_msg *mp;
    -		struct server_msg *m;
    -
    -		for(mp = eq->head; mp != NULL; ) {
    -			struct event_queue_msg *mq;
    -
    -			server_msg_free(mp->msg);
    -			mq = mp;
    -			mp = mp->prev;
    -			free(mq);
    -		}
    -		eq->head = NULL;
    -		event_queue_free(eq);
    -	}
    -
    -	void testEventQueueCreate() {
    -		CPPUNIT_ASSERT( eq != NULL );
    -		CPPUNIT_ASSERT_EQUAL( string(eq->dest_name), string("localhost") );
    -		CPPUNIT_ASSERT_EQUAL( eq->dest_port, 8081 );
    -		CPPUNIT_ASSERT( eq->tail == NULL );
    -		CPPUNIT_ASSERT( eq->head == NULL );
    -		CPPUNIT_ASSERT( eq->tail_ems == NULL );
    -		CPPUNIT_ASSERT( eq->mark_this == NULL );
    -		CPPUNIT_ASSERT( eq->mark_prev == NULL );
    -		CPPUNIT_ASSERT( eq->thread_id == 0 );
    -		CPPUNIT_ASSERT( eq->flushing == 0 );
    -		CPPUNIT_ASSERT( eq->flush_result == 0 );
    -	}
    -
    -	void testEventQueueInsert() {
    -		struct event_queue_msg *mp;
    -		struct server_msg *m;
    -
    -		doSomeInserts();
    -		mp = eq->head;
    -		m = mp->msg;
    -		CPPUNIT_ASSERT_EQUAL( string(m->job_id_s), string("2") );
    -		CPPUNIT_ASSERT_EQUAL( mp, eq->tail_ems );
    -		mp = mp->prev;
    -		m = mp->msg;
    -		CPPUNIT_ASSERT_EQUAL( string(m->job_id_s), string("1") );
    -		mp = mp->prev;
    -		m = mp->msg;
    -		CPPUNIT_ASSERT_EQUAL( string(m->job_id_s), string("3") );
    -		CPPUNIT_ASSERT_EQUAL( mp, eq->tail );
    -		CPPUNIT_ASSERT( mp->prev == NULL );
    -	}
    -
    -	void testEventQueueGet() {
    -		struct event_queue_msg *mp;
    -		struct server_msg *m,sm;
    -		int ret;
    -
    -		doSomeInserts();
    -		mp = eq->head;
    -		eq->head = mp->prev;
    -		eq->tail_ems = NULL;
    -		server_msg_free(mp->msg);
    -		free(mp);
    -		ret = event_queue_get(eq, &m);
    -		CPPUNIT_ASSERT( ret == 0 );
    -		CPPUNIT_ASSERT( eq->mark_this == eq->head );
    -		CPPUNIT_ASSERT( eq->mark_prev == NULL );
    -		CPPUNIT_ASSERT_EQUAL( string("1"), string(m->job_id_s) );
    -		sm = IlTestBase::smsg;
    -		sm.job_id_s = "4";
    -		sm.receipt_to = 1;
    -		ret = event_queue_insert(eq, &sm);
    -		CPPUNIT_ASSERT( ret == 0 );
    -		CPPUNIT_ASSERT( eq->mark_prev == eq->head );
    -		CPPUNIT_ASSERT( eq->mark_this == eq->head->prev );
    -		ret = event_queue_insert(eq, &sm);
    -		CPPUNIT_ASSERT( ret == 0 );
    -		CPPUNIT_ASSERT( eq->mark_prev == eq->head->prev );
    -		CPPUNIT_ASSERT( eq->mark_this == eq->head->prev->prev );
    -	}
    -
    -	void testEventQueueRemove() {
    -		struct event_queue_msg *mp;
    -		struct server_msg *m,sm;
    -		int ret;
    -
    -		doSomeInserts();
    -		ret = event_queue_get(eq, &m);
    -		mp = eq->mark_this->prev;
    -		sm = IlTestBase::smsg;
    -		sm.job_id_s = "4";
    -		sm.receipt_to = 1;
    -		event_queue_insert(eq, &sm);
    -		ret = event_queue_remove(eq);
    -		CPPUNIT_ASSERT( eq->head->prev == mp );
    -		CPPUNIT_ASSERT( eq->mark_this == NULL );
    -		CPPUNIT_ASSERT( eq->mark_prev == NULL );
    -	}
    -
    -protected:
    -	char *server;
    -	struct event_queue *eq;
    -
    -	void doSomeInserts() {
    -		struct server_msg m = IlTestBase::smsg;
    -
    -		m.job_id_s = "1";
    -		event_queue_insert(eq, &m);
    -		m.receipt_to = 1;
    -		m.job_id_s = "2";
    -		event_queue_insert(eq, &m);
    -		m.job_id_s = "3";
    -		m.receipt_to = 0;
    -		event_queue_insert(eq, &m);
    -	}
    -};
    -
    -CPPUNIT_TEST_SUITE_REGISTRATION( event_queueTest );
    diff --git a/org.glite.lb.logger/test/event_storeTest.cpp b/org.glite.lb.logger/test/event_storeTest.cpp
    deleted file mode 100644
    index 982c7ff..0000000
    --- a/org.glite.lb.logger/test/event_storeTest.cpp
    +++ /dev/null
    @@ -1,75 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    - 
    -#include "IlTestBase.h"
    -
    -class event_storeTest: public CppUnit::TestFixture
    -{
    -	CPPUNIT_TEST_SUITE( event_storeTest );
    -	CPPUNIT_TEST( event_store_recoverTest );
    -	CPPUNIT_TEST( event_store_syncTest );
    -	CPPUNIT_TEST( event_store_nextTest );
    -	CPPUNIT_TEST( event_store_commitTest );
    -	CPPUNIT_TEST( event_store_cleanTest );
    -	CPPUNIT_TEST( event_store_findTest );
    -	CPPUNIT_TEST( event_store_releaseTest );
    -	CPPUNIT_TEST( event_store_initTest );
    -	CPPUNIT_TEST( event_store_recover_allTest );
    -	CPPUNIT_TEST( event_store_cleanupTest );
    -	CPPUNIT_TEST_SUITE_END();
    -
    -public:
    -	void setUp() {
    -	}
    -
    -	void tearDown() {
    -	}
    -
    -	void event_store_recoverTest() {
    -	}
    -
    -	void event_store_syncTest() {
    -	}
    -
    -	void event_store_nextTest() {
    -	}
    -
    -	void event_store_commitTest() {
    -	}
    -
    -	void event_store_cleanTest() {
    -	}
    -
    -	void event_store_findTest() {
    -	}
    -
    -	void event_store_releaseTest() {
    -	}
    -
    -	void event_store_initTest() {
    -	}
    -
    -	void event_store_recover_allTest() {
    -	}
    -
    -	void event_store_cleanupTest() {
    -	}
    -};
    -
    -CPPUNIT_TEST_SUITE_REGISTRATION( event_storeTest );
    diff --git a/org.glite.lb.logger/test/il_test.cpp b/org.glite.lb.logger/test/il_test.cpp
    deleted file mode 100644
    index 3d1d554..0000000
    --- a/org.glite.lb.logger/test/il_test.cpp
    +++ /dev/null
    @@ -1,61 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    -#include 
    -
    -extern "C" {
    -#include 
    -#include "glite/wmsutils/tls/ssl_helpers/ssl_inits.h"
    -#include "glite/wmsutils/tls/ssl_helpers/ssl_pthreads.h"
    -#include "glite/security/glite_gss.h"
    -#include "interlogd.h"
    -#include "glite/lb/consumer.h"
    -}
    -
    -#if defined(IL_NOTIFICATIONS)
    -#define DEFAULT_PREFIX "/tmp/notif_events"
    -#define DEFAULT_SOCKET "/tmp/notif_interlogger.sock"
    -#else
    -#define DEFAULT_PREFIX "/tmp/dglogd.log"
    -#define DEFAULT_SOCKET "/tmp/interlogger.sock"
    -#endif
    -                                                                                
    -int TIMEOUT = DEFAULT_TIMEOUT;
    -                                                                                
    -gss_cred_id_t cred_handle = GSS_C_NO_CREDENTIAL;
    -pthread_mutex_t cred_handle_lock = PTHREAD_MUTEX_INITIALIZER;
    -                                                                                
    -char *file_prefix = DEFAULT_PREFIX;
    -int bs_only = 0;
    - 
    -char *cert_file = NULL;
    -char *key_file  = NULL;
    -char *CAcert_dir = NULL;
    -char *log_server = NULL;
    -char *socket_path = DEFAULT_SOCKET;
    - 
    -
    -int 
    -main (int ac,const char *av[])
    -{
    -	CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
    -	CppUnit::TextUi::TestRunner runner;
    -	
    -	runner.addTest(suite);
    -	return runner.run() ? 0 : 1;
    -}
    diff --git a/org.glite.lb.logger/test/input_queue_socketTest.cpp b/org.glite.lb.logger/test/input_queue_socketTest.cpp
    deleted file mode 100644
    index dd53f52..0000000
    --- a/org.glite.lb.logger/test/input_queue_socketTest.cpp
    +++ /dev/null
    @@ -1,86 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    - 
    -#include "IlTestBase.h"
    -
    -extern "C" {
    -#include 
    -#include 
    -#include 
    -
    -#include "interlogd.h"
    -
    -	extern char *socket_path;
    -}
    -
    -#include 
    -using namespace std;
    - 
    -class input_queue_socketTest: public CppUnit::TestFixture
    -{
    -	CPPUNIT_TEST_SUITE( input_queue_socketTest );
    -	CPPUNIT_TEST( input_queue_getTest );
    -	CPPUNIT_TEST_SUITE_END();
    -
    -public:
    -
    -	void setUp() {
    -		struct sockaddr_un saddr;
    -		int sock;
    -		long offset = 0;
    -
    -		int ret = input_queue_attach();
    -		CPPUNIT_ASSERT(ret == 0);
    -
    -		sock=socket(PF_UNIX, SOCK_STREAM, 0);
    -		CPPUNIT_ASSERT(sock >= 0);
    -		
    -		memset(&saddr, 0, sizeof(saddr));
    -		saddr.sun_family = AF_UNIX;
    -		strcpy(saddr.sun_path, socket_path);
    -		ret = connect(sock, (struct sockaddr *)&saddr, sizeof(saddr.sun_path));
    -		CPPUNIT_ASSERT(ret >= 0);
    -		
    -		ret = write(sock, &offset, sizeof(offset));
    -		CPPUNIT_ASSERT( ret == sizeof(offset) );
    -		ret = write(sock, IlTestBase::msg, strlen(IlTestBase::msg));
    -		CPPUNIT_ASSERT( ret == strlen(IlTestBase::msg) );
    -		ret = write(sock, "\n", 1);
    -		CPPUNIT_ASSERT( ret == 1 );
    -	}
    -
    -	void tearDown() {
    -		input_queue_detach();
    -	}
    -
    -
    -	void input_queue_getTest() {
    -		char *event;
    -		long offset;
    -		int ret;
    -
    -		ret = input_queue_get(&event, &offset, 10);
    -		CPPUNIT_ASSERT( ret >= 0 );
    -		CPPUNIT_ASSERT_EQUAL( 0L, offset );
    -		CPPUNIT_ASSERT_EQUAL( string(IlTestBase::msg), string(event) );
    -		free(event);
    -	}
    -};
    -
    -CPPUNIT_TEST_SUITE_REGISTRATION(input_queue_socketTest);
    diff --git a/org.glite.lb.logger/test/ll_test.cpp b/org.glite.lb.logger/test/ll_test.cpp
    deleted file mode 100644
    index 1ac340a..0000000
    --- a/org.glite.lb.logger/test/ll_test.cpp
    +++ /dev/null
    @@ -1,136 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -extern "C" {
    -#define DEFAULT_SOCKET "/tmp/interlogger.sock"
    -char *socket_path = DEFAULT_SOCKET;
    -int edg_wll_log_proto_server(int *,char *,char *,int,int);
    -void edg_wll_ll_log_init(int);
    -}
    -
    -class LLTest: public  CppUnit::TestFixture
    -{
    -	CPPUNIT_TEST_SUITE(LLTest);
    -	CPPUNIT_TEST(testProtoServer);
    -	CPPUNIT_TEST_SUITE_END();
    -
    -public:
    -
    -  void setUp() {
    -    char *msg = "DATE=20040831150159.702224 HOST=\"some.host\" PROG=edg-wms LVL=USAGE DG.PRIORITY=0 DG.SOURCE=\"UserInterface\" DG.SRC_INSTANCE=\"\" DG.EVNT=\"RegJob\" DG.JOBID=\"https://some.host:1234/x67qr549qc\" DG.SEQCODE=\"UI=2:NS=0:WM=0:BH=1:JSS=0:LM=0:LRMS=0:APP=0\" DG.REGJOB.JDL=\"\" DG.REGJOB.NS=\"ns address\" DG.REGJOB.PARENT=\"\" DG.REGJOB.JOBTYPE=\"SIMPLE\" DG.REGJOB.NSUBJOBS=\"0\" DG.REGJOB.SEED=\"\"";
    -    pipe(pd);
    -    log_proto_client(pd[1], msg);
    -    input_queue_attach();
    -  }
    -
    -  void tearDown() {
    -    close(pd[0]);
    -    close(pd[1]);
    -    input_queue_detach();
    -  }
    -
    -  void testProtoServer() {
    -    int ret;
    -    edg_wll_ll_log_init(255);
    -    ret = edg_wll_log_proto_server(&pd[0], 
    -				       "michal",
    -				       "/tmp/dglogd.log",
    -				       0,
    -				       0);
    -    CPPUNIT_ASSERT( ret == 0 );
    -  }
    -
    -private:
    -  int  pd[2];
    -
    -  int log_proto_client(int con, char *logline) {
    -    char	header[32];
    -    int	err;
    -    int	size;
    -    u_int8_t size_end[4];
    -
    -    err = 0;
    -    size = strlen(logline)+1;
    -    size_end[0] = size & 0xff; size >>= 8;
    -    size_end[1] = size & 0xff; size >>= 8;
    -    size_end[2] = size & 0xff; size >>= 8;
    -    size_end[3] = size;
    -    size = strlen(logline)+1;
    -
    -    err = write(con, "DGLOG", 5);
    -    CPPUNIT_ASSERT(err == 5);
    -    err = write(con, size_end, 4);
    -    CPPUNIT_ASSERT(err == 4);
    -    err = write(con, logline, size);
    -    CPPUNIT_ASSERT( err == size );
    -}
    -
    - int sock;
    - int accepted;
    -
    -int 
    -input_queue_attach()
    -{ 
    -  struct sockaddr_un saddr;
    -
    -  CPPUNIT_ASSERT((sock=socket(PF_UNIX, SOCK_STREAM, 0)) >= 0);
    -
    -  memset(&saddr, 0, sizeof(saddr));
    -  saddr.sun_family = AF_UNIX;
    -  strcpy(saddr.sun_path, socket_path);
    -
    -  CPPUNIT_ASSERT(bind(sock, (struct sockaddr *)&saddr, sizeof(saddr)) >= 0); 
    -  CPPUNIT_ASSERT(listen(sock, 5) >= 0 );
    -  return(0);
    -}
    -
    -void input_queue_detach()
    -{
    -  if (sock >= 0)
    -    close(sock);
    -  unlink(socket_path);
    -}
    -
    -};
    -
    -
    -CPPUNIT_TEST_SUITE_REGISTRATION( LLTest );
    -
    -int 
    -main (int ac,const char *av[])
    -{
    -	CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
    -	CppUnit::TextUi::TestRunner runner;
    -	
    -	runner.addTest(suite);
    -	return runner.run() ? 0 : 1;
    -}
    diff --git a/org.glite.lb.logger/test/logd_proto_test.c b/org.glite.lb.logger/test/logd_proto_test.c
    deleted file mode 100644
    index fcd78cf..0000000
    --- a/org.glite.lb.logger/test/logd_proto_test.c
    +++ /dev/null
    @@ -1,60 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#define edg_wll_gss_read_full(a,b,c,d,e,f)  test_edg_wll_gss_read_full(a,b,c,d,e,f)
    -#define edg_wll_gss_write_full(a,b,c,d,e,f) test_edg_wll_gss_write_full(a,b,c,d,e,f)
    -#define edg_wll_GssConnection               int
    -
    -#include "logd_proto.h"
    -#include "glite/lb/context-int.h"
    -#include "glite/lb/escape.h"
    -#include "glite/lb/events_parse.h"
    -
    -int
    -test_edg_wll_gss_read_full(int *fd,
    -			   void *buf,
    -			   size_t bufsize,
    -			   struct timeval *timeout,
    -			   size_t *total,
    -			   edg_wll_GssStatus *code) 
    -{
    -  *total = read(*fd, buf, bufsize);
    -  return(*total < 0 ? *total : 0);
    -}
    -
    -int
    -test_edg_wll_gss_write_full(int *fd,
    -			    const void *buf,
    -			    size_t bufsize,
    -			    struct timeval *timeout,
    -			    size_t *total,
    -			    edg_wll_GssStatus *code) 
    -{
    -  return(0);
    -}
    -
    -#include "logd_proto.c"
    diff --git a/org.glite.lb.logger/test/server_msgTest.cpp b/org.glite.lb.logger/test/server_msgTest.cpp
    deleted file mode 100644
    index 2bdc50d..0000000
    --- a/org.glite.lb.logger/test/server_msgTest.cpp
    +++ /dev/null
    @@ -1,74 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    - 
    -#include "IlTestBase.h"
    -
    -#include 
    -
    -using namespace std;
    -
    -class server_msgTest: public CppUnit::TestFixture 
    -{
    -	CPPUNIT_TEST_SUITE(server_msgTest);
    -	CPPUNIT_TEST( server_msg_createTest );
    -	CPPUNIT_TEST( server_msg_copyTest );
    -	CPPUNIT_TEST_SUITE_END();
    -
    -public:
    -
    -	void setUp() {
    -		msg = server_msg_create((char *)IlTestBase::msg);
    -	}
    -
    -	void tearDown() {
    -		server_msg_free(msg);
    -	}
    -
    -	void server_msg_createTest() {
    -		CPPUNIT_ASSERT( msg != NULL );
    -		CPPUNIT_ASSERT_EQUAL( string(msg->job_id_s), string(IlTestBase::smsg.job_id_s) );
    -		CPPUNIT_ASSERT_EQUAL( string(msg->msg), string(IlTestBase::smsg.msg) );
    -		CPPUNIT_ASSERT_EQUAL( msg->len, IlTestBase::smsg.len );
    -		CPPUNIT_ASSERT_EQUAL( msg->ev_len, IlTestBase::smsg.ev_len );
    -		CPPUNIT_ASSERT_EQUAL( msg->es, IlTestBase::smsg.es );
    -		CPPUNIT_ASSERT( !server_msg_is_priority(msg) );
    -	}
    -
    -	void server_msg_copyTest() {
    -		struct server_msg *msg2;
    -
    -		msg2 = server_msg_copy(msg);
    -		CPPUNIT_ASSERT( msg2 != NULL );
    -		CPPUNIT_ASSERT( msg2 != msg );
    -		CPPUNIT_ASSERT_EQUAL( string(msg->job_id_s), string(msg2->job_id_s) );
    -		CPPUNIT_ASSERT( msg->job_id_s != msg2->job_id_s);
    -		CPPUNIT_ASSERT_EQUAL( string(msg->msg), string(msg2->msg) );
    -		CPPUNIT_ASSERT( msg->msg != msg2->msg );
    -		CPPUNIT_ASSERT_EQUAL( msg->len, msg2->len );
    -		CPPUNIT_ASSERT_EQUAL( msg->ev_len, msg2->ev_len );
    -		CPPUNIT_ASSERT_EQUAL( msg->es, msg2->es );
    -		server_msg_free(msg2);
    -	}
    -
    -private:
    -	struct server_msg *msg;
    -};
    -
    -
    -CPPUNIT_TEST_SUITE_REGISTRATION(server_msgTest);
    diff --git a/org.glite.lb.server/.cvsignore b/org.glite.lb.server/.cvsignore
    deleted file mode 100644
    index 1df717b..0000000
    --- a/org.glite.lb.server/.cvsignore
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -.project
    -.cdtproject
    \ No newline at end of file
    diff --git a/org.glite.lb.server/LICENSE b/org.glite.lb.server/LICENSE
    deleted file mode 100644
    index 259a91f..0000000
    --- a/org.glite.lb.server/LICENSE
    +++ /dev/null
    @@ -1,69 +0,0 @@
    -LICENSE file for EGEE Middleware
    -================================
    -
    -Copyright (c) 2004 on behalf of the EU EGEE Project: 
    -The European Organization for Nuclear Research (CERN), 
    -Istituto Nazionale di Fisica Nucleare (INFN), Italy
    -Datamat Spa, Italy
    -Centre National de la Recherche Scientifique (CNRS), France
    -CS Systeme d'Information (CSSI), France
    -Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
    -Universiteit van Amsterdam (UvA), Netherlands
    -University of Helsinki (UH.HIP), Finlan
    -University of Bergen (UiB), Norway
    -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
    -
    -Redistribution and use in source and binary forms, with or without
    -modification, are permitted provided that the following conditions are
    -met: 
    -
    -1. Redistributions of source code must retain the above copyright
    -notice, this list of conditions and the following disclaimer.
    -
    -2. Redistributions in binary form must reproduce the above copyright
    -notice, this list of conditions and the following disclaimer in the
    -documentation and/or other materials provided with the distribution.
    -
    -3. The end-user documentation included with the redistribution, if
    -any, must include the following acknowledgment: "This product includes
    -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)."
    -Alternatively, this acknowledgment may appear in the software itself, if
    -and wherever such third-party acknowledgments normally appear.
    -
    -4. The names EGEE and the EU EGEE Project must not be
    -used to endorse or promote products derived from this software without
    -prior written permission. For written permission, please contact
    -.
    -
    -5. You are under no obligation whatsoever to provide anyone with any
    -bug fixes, patches, or upgrades to the features, functionality or
    -performance of the Software ("Enhancements") that you may develop over
    -time; however, if you choose to provide your Enhancements to The EU
    -EGEE Project, or if you choose to otherwise publish or distribute your
    -Enhancements, in source code form without contemporaneously requiring
    -end users of The EU EGEE Proejct to enter into a separate written license
    -agreement for such Enhancements, then you hereby grant The EU EGEE Project
    -a non-exclusive, royalty-free perpetual license to install, use, copy,
    -modify, prepare derivative works, incorporate into the EGEE Middleware
    -or any other computer software, distribute, and sublicense your
    -Enhancements or derivative works thereof, in binary and source code
    -form (if any), whether developed by The EU EGEE Project or third parties.
    -
    -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
    -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE
    -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
    -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
    -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
    -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    -
    -This software consists of voluntary contributions made by many
    -individuals on behalf of the EU EGEE Prject. For more information on The
    -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on
    -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/
    -
    -
    diff --git a/org.glite.lb.server/Makefile b/org.glite.lb.server/Makefile
    deleted file mode 100644
    index 2fd66fd..0000000
    --- a/org.glite.lb.server/Makefile
    +++ /dev/null
    @@ -1,420 +0,0 @@
    -# defaults
    -top_srcdir=..
    -stagedir=.
    -globalprefix=glite
    -lbprefix=lb
    -package=glite-lb-server
    -version=0.2.0
    -PREFIX=/opt/glite
    -
    -# gridsite requires openssl libraries, we want to include the ones from globus
    -globus_prefix=/opt/globus
    -nothrflavour=gcc32
    -thrflavour=gcc32pthr
    -expat_prefix=/opt/expat
    -cares_prefix=/opt/c-ares
    -gsoap_prefix=/opt/gsoap
    -classads_prefix=/opt/classads
    -voms_prefix=/opt/glite
    -lcas_prefix=/opt/glite
    -gridsite_prefix=/opt/glite
    -
    --include Makefile.inc
    --include ../project/version.properties
    -
    -version=${module.version}
    -
    -default all: compile
    -
    -GLITE_LB_SERVER_WITH_WS=yes
    -
    -ifdef LB_STANDALONE
    -	LB_STANDALONE_FLAGS:=-DLB_STANDALONE
    -#	GLITE_LB_SERVER_WITH_WS=no
    -endif
    -
    -ifdef LB_PERF
    -	STATIC_LIB_BK:=libglite_lb_bkserver_perf.a
    -	LB_PERF_FLAGS:=-DLB_PERF
    -else
    -	STATIC_LIB_BK:=libglite_lb_bkserver.a
    -endif
    -
    -ifeq ($(GLITE_LB_SERVER_WITH_WS),yes)
    -	WS_CFLAGS=-DGLITE_LB_SERVER_WITH_WS 
    -	NSMAP=LoggingAndBookkeeping.nsmap
    -else
    -	WS_CFLAGS=
    -endif
    -
    -GSOAP_FILES_PREFIX:= bk_ws_
    -
    -YACC=bison -y
    -CC=gcc
    -CXX=g++
    -
    -ifeq ($(gsoap_version),2.7.0)
    -	VPATH=${top_srcdir}/interface:${top_srcdir}/src:${top_srcdir}/test:${top_srcdir}/doc:${top_srcdir}/examples:${top_srcdir}/project:${gsoap_prefix}
    -else
    -	VPATH=${top_srcdir}/interface:${top_srcdir}/src:${top_srcdir}/test:${top_srcdir}/doc:${top_srcdir}/examples:${top_srcdir}/project
    -endif
    -AT3=${stagedir}/sbin/glite-lb-at3
    -
    -SUFFIXES = .T 
    -
    -DEBUG:=-g -O0 -Wall
    -
    -GRIDSITE_CFLAGS = -I${gridsite_prefix}/include `xml2-config --cflags`
    -GRIDSITE_LIBS = -L${gridsite_prefix}/${libdir} -L${gridsite_prefix}/lib -lgridsite_globus `xml2-config --libs`
    -
    -LCAS_CFLAGS=-I${lcas_prefix}/include
    -
    -CFLAGS:= \
    -	${WS_CFLAGS} ${DEBUG} \
    -	-DVERSION=\"${version}\" \
    -	-I${gsoap_prefix}/include -I${gsoap_prefix}/ \
    -	-I${stagedir}/include -I${top_srcdir}/src -I. \
    -	-I${top_srcdir}/interface \
    -	-I${expat_prefix}/include \
    -	-I${cares_prefix}/include \
    -	-I${classads_prefix}/include -I${classads_prefix}/include/classad \
    -	-I${voms_prefix}/include \
    -	${COVERAGE_FLAGS} \
    -	$(GRIDSITE_CFLAGS) ${LCAS_CFLAGS} \
    -	-D_GNU_SOURCE ${LB_STANDALONE_FLAGS} ${LB_PERF_FLAGS} -DLB_EVENTS_BLOB \
    -	-I${globus_prefix}/include/${nothrflavour} #gridsite needs this
    -
    -CXXFLAGS:=${CFLAGS}
    -
    -ifdef LB_PROF
    -	SRVBONES_LIB:= ${stagedir}/${libdir}/libglite_lbu_server_bones.la
    -	LB_COMMON_LIB:=${stagedir}/${libdir}/libglite_lb_common_${nothrflavour}.la
    -	LB_UTILS_DB_LIB:=${stagedir}/${libdir}/libglite_lbu_db.la
    -	CFLAGS:=${CFLAGS} -pg -g
    -	LDFLAGS:=${LDFLAGS} -pg
    -else
    -	SRVBONES_LIB:= -L${stagedir}/${libdir} -lglite_lbu_server_bones
    -	LB_COMMON_LIB:=-L${stagedir}/${libdir} -lglite_lb_common_${nothrflavour}
    -	LB_UTILS_DB_LIB:=-L${stagedir}/${libdir} -lglite_lbu_db
    -	LDFLAGS:= -L${stagedir}/${libdir}
    -endif
    -
    -# LB_MACHINE_LIB:=${stagedir}/${libdir}/libglite_lb_statemachine.a
    -LB_MACHINE_LIB:=-L${stagedir}/${libdir} -lglite_lb_statemachine
    -
    -ifdef LBS_DB_PROFILE
    -	CFLAGS:=${CFLAGS} -DLBS_DB_PROFILE
    -endif
    -
    -TEST_LIBS:=-L${cppunit_prefix}/${libdir} -lcppunit
    -TEST_INC:=-I${cppunit_prefix}/include
    -
    -COMPILE:=libtool --mode=compile ${CC} ${CFLAGS}
    -CXXCOMPILE:=libtool --mode=compile ${CXX} ${CXXFLAGS}
    -LINK:=libtool --mode=link ${CC} -rpath ${stagedir}/${libdir}  ${LDFLAGS} 
    -SOLINK:=libtool --mode=link ${CC} -module ${LDFLAGS} -rpath ${stagedir}/${libdir}
    -# XXX: not used? LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS} 
    -INSTALL:=libtool --mode=install install
    -LINKXX:=libtool --mode=link  ${CXX} -rpath ${stagedir}/${libdir} ${LDFLAGS}
    -XSLTPROC:=xsltproc --novalid
    -
    -#ifeq ($(shell ls ${gsoap_prefix}/bin/soapcpp2),${gsoap_prefix}/bin/soapcpp2)
    -#	gsoap_bin_prefix := ${gsoap_prefix}/bin
    -#else
    -#	gsoap_bin_prefix := ${gsoap_prefix}
    -#endif
    -
    -gsoap_bin_prefix:=${shell if [ -x  ${gsoap_prefix}/bin/soapcpp2 ]; then echo ${gsoap_prefix}/bin; else echo ${gsoap_prefix}; fi }
    -
    -ifneq (${expat_prefix},/usr)
    -	expatlib := -L${expat_prefix}/${libdir} -L${expat_prefix}/lib
    -endif
    -
    -vomsflavour := _${nothrflavour}
    -ifeq (${nothrflavour},gcc32) 
    -	vomsflavour :=
    -endif 
    -ifeq (${nothrflavour},gcc32dbg)
    -	vomsflavour :=
    -endif
    -VOMS_LIBS:=-L${voms_prefix}/${libdir} -lvomsapi${vomsflavour}
    -LCAS_LIBS:=-L${lcas_prefix}/${libdir} -llcas
    -
    -#EXT_LIBS:= \
    -#	${expatlib} -lexpat \
    -#	${GRIDSITE_LIBS} \
    -#	-lvomsc${vomsflavour} \
    -
    -ifneq (${classads_prefix},/usr)
    -	CLASSADS_LIBS := -L${classads_prefix}/${libdir} -L${classads_prefix}/lib
    -endif
    -CLASSADS_LIBS := ${CLASSADS_LIBS} -lclassad
    -
    -ifneq (${cares_prefix},/usr)
    -	CARES_LIBS := -L${cares_prefix}/${libdir} -L${cares_prefix}/lib
    -endif
    -CARES_LIBS := ${CARES_LIBS} -lcares
    -
    -EXT_LIBS:=  \
    -	-lz \
    -	${GRIDSITE_LIBS} \
    -	${CLASSADS_LIBS} \
    -	${CARES_LIBS} \
    -	${LCAS_LIBS} \
    -	${VOMS_LIBS}
    -
    -COMMON_LIBS:= -L${stagedir}/${libdir} -lglite_lb_common_${nothrflavour} -lglite_security_gss_${nothrflavour} -lglite_lbu_trio -lglite_lbu_maildir -lglite_lbu_log
    -
    -BKSERVER_BASE_OBJS:= \
    -	bkserverd.o il_lbproxy.o get_events.o index.o jobstat.o jobstat_supp.o \
    -	seqcode.o write2rgma.o lb_html.o lb_http.o lb_proto.o cond_dump.o lb_xml_parse.o \
    -	lb_xml_parse_V21.o lb_text.o \
    -	openserver.o query.o userjobs.o db_store.o request.o store.o \
    -	stored_master.o srv_purge.o server_state.o dump.o lb_authz.o load.o \
    -	notification.o il_notification.o notif_match.o stats.o db_calls.o db_supp.o lb_rss.o pretty_print_wrapper.o \
    -	policy_gram.o policy_lex.o authz_policy.o
    -
    -gsoap_version ?= ${gsoap_default_version}
    -
    -dotless_gsoap_ver:=${shell echo ${gsoap_version} | tr -d . }
    -ifeq ($(shell test -f ${stagedir}/${libdir}/libglite_security_gsoap_plugin_${dotless_gsoap_ver}_${nothrflavour}_c.so && echo ok),ok)
    -	langflavour:=_c
    -endif
    -GSOAP_LIB:=-L${stagedir}/${libdir} -lglite_security_gsoap_plugin_${dotless_gsoap_ver}_${nothrflavour}${langflavour}
    -
    -ifeq ($(GLITE_LB_SERVER_WITH_WS),yes)
    -	BKSERVER_OBJS:= \
    -		${BKSERVER_BASE_OBJS} \
    -		${GSOAP_FILES_PREFIX}C.o ${GSOAP_FILES_PREFIX}Server.o \
    -		ws_query.o ws_lb4agu.o ws_fault.o ws_typeref.o
    -
    -	BKSERVER_LIBS= \
    -		${SRVBONES_LIB} \
    -		${LB_COMMON_LIB} \
    -		${LB_MACHINE_LIB} \
    -		${LB_UTILS_DB_LIB} \
    -		${GSOAP_LIB} \
    -		${EXT_LIBS} \
    -		${classadslib} \
    -		-lglite_lbu_maildir \
    -		-lglite_lbu_log
    -else
    -	BKSERVER_OBJS:= ${BKSERVER_BASE_OBJS}
    -		
    -	BKSERVER_LIBS= \
    -		${SRVBONES_LIB} \
    -		${LB_COMMON_LIB} \
    -		${LB_MACHINE_LIB} \
    -		${LB_UTILS_DB_LIB} \
    -		-lglite_security_gss_${nothrflavour} \
    -		${EXT_LIBS} \
    -		${classadslib} \
    -		-lglite_lbu_maildir \
    -		-lglite_lbu_log
    -endif
    -
    -INDEX_OBJS:= index.o index_parse.o jobstat_supp.o openserver.o \
    -	jobstat.o query.o get_events.o write2rgma.o index_lex.o \
    -	lb_authz.o store.o bkindex.o stats.o\
    -	request.o db_store.o srv_purge.o notif_match.o il_lbproxy.o dump.o lb_xml_parse.o il_notification.o lb_proto.o lb_text.o server_state.o lb_xml_parse_V21.o lb_html.o cond_dump.o notification.o seqcode.o userjobs.o load.o db_calls.o db_supp.o lb_rss.o pretty_print_wrapper.o authz_policy.o
    -
    -INDEX_LIBS:= ${SRVBONES_LIB} ${COMMON_LIBS} ${LB_MACHINE_LIB} ${EXT_LIBS} ${LB_UTILS_DB_LIB}
    -
    -WS_CLIENT_OBJS:= $(GSOAP_FILES_PREFIX)C.o $(GSOAP_FILES_PREFIX)Client.o ws_fault.o ws_typeref.o
    -WS_CLIENT_LIBS:= ${GSOAP_LIB} -lglite_lb_common_${nothrflavour} \
    -	-lglite_lb_common_${nothrflavour}
    -
    -# WS_CLIENT_LIBS:= -L${stagedir}/${libdir} \
    -#                 -lglite_lb_client_${nothrflavour} \
    -#                 -lglite_lb_common_${nothrflavour} \
    -#                 -L${gsoap_prefix}/${libdir} -lgsoap \
    -#                 -lglite_security_gsoap_plugin_${nothrflavour} \
    -#                 ${EXT_LIBS}
    -# 
    -
    -HDRS=index.h lb_authz.h store.h
    -
    -MAN_GZ:=glite-lb-bkindex.8.gz glite-lb-bkserverd.8.gz glite-lb-mon-db.1.gz
    -MAN = $(MAN_GZ:.gz=)
    -
    -LIB_OBJS_BK:= \
    -	il_lbproxy.o get_events.o index.o jobstat.o jobstat_supp.o \
    -	seqcode.o lb_html.o lb_http.o lb_proto.o cond_dump.o lb_xml_parse.o \
    -	lb_xml_parse_V21.o lb_text.o \
    -	openserver.o query.o userjobs.o db_store.o request.o store.o \
    -	stored_master.o srv_purge.o server_state.o dump.o lb_authz.o load.o \
    -	notification.o il_notification.o notif_match.o stats.o write2rgma.o \
    -	db_calls.o db_supp.o lb_rss.o pretty_print_wrapper.o authz_policy.o
    -
    -MONDB_OBJS:=mon-db.o ${LIB_OBJS_BK}
    -MONDB_LIBS:=${COMMON_LIBS} ${LB_MACHINE_LIB} ${LB_UTILS_DB_LIB} ${EXT_LIBS}
    -
    -LCAS_PLUGIN_OBJS:=lcas_lb.o
    -LCAS_PLUGIN_LOBJS:=${LCAS_PLUGIN_OBJS:.o=.lo}
    -LCAS_PLUGIN_LIB:=liblcas_lb.la
    -
    -EXAMPLES=
    -
    -glite-lb-bkserverd: ${NSMAP} ${BKSERVER_OBJS}
    -	${LINKXX} -o $@ ${BKSERVER_OBJS} ${BKSERVER_LIBS} -Wl,--export-dynamic
    -
    -glite-lb-bkindex: ${INDEX_OBJS}
    -	${LINKXX} -o $@ ${INDEX_OBJS} ${INDEX_LIBS}
    -
    -glite-lb-mon-db: ${MONDB_OBJS}
    -	${LINKXX} -o $@ ${MONDB_OBJS} ${MONDB_LIBS}
    -
    -compile: generate glite-lb-bkserverd glite-lb-bkindex glite-lb-mon-db ${STATIC_LIB_BK} ${LCAS_PLUGIN_LIB} ${MAN_GZ}
    -
    -generate: store.c index.c 
    -
    -check: compile test.xml test.query
    -	-echo check.query not complete yet
    -
    -test_coverage:
    -	-mkdir coverage
    -	cd coverage && $(MAKE) -f ../Makefile top_srcdir=../../ COVERAGE_FLAGS="-fprofile-arcs -ftest-coverage" check
    -	cd coverage && for i in `echo ${INDEX_OBJS} ${BKSERVER_OBJS} | tr ' ' '\012' | sort -u`; do gcov $$i ; done
    -
    -lb_xml_parse.c: lb_xml_parse.c.T
    -	rm -f $@
    -	${AT3} $< >$@ || rm -f $@
    -	chmod -w $@ >/dev/null
    -
    -${GSOAP_FILES_PREFIX}H.h ${GSOAP_FILES_PREFIX}C.c ${GSOAP_FILES_PREFIX}Server.c ${GSOAP_FILES_PREFIX}Client.c ${GSOAP_FILES_PREFIX}ServerLib.c ${GSOAP_FILES_PREFIX}ClientLib.c LoggingAndBookkeeping.nsmap: LB.xh
    -	${gsoap_bin_prefix}/soapcpp2 -w -c -p ${GSOAP_FILES_PREFIX} LB.xh
    -
    -# try several times -- LB.wsdl downloads BaseFault.xsd from www.ibm.com which may be failing
    -# not used right now but may be useful one day
    -# LB.xh: ws_typemap.dat
    -#	${gsoap_prefix}/bin/wsdl2h -c -t ${top_srcdir}/src/ws_typemap.dat -o $@ ${stagedir}/interface/LB.wsdl || \
    -#	{ sleep 1 ; ${gsoap_prefix}/bin/wsdl2h -c -t ${top_srcdir}/src/ws_typemap.dat -o $@ ${stagedir}/interface/LB.wsdl; } || \
    -#	{ sleep 4 ; ${gsoap_prefix}/bin/wsdl2h -c -t ${top_srcdir}/src/ws_typemap.dat -o $@ ${stagedir}/interface/LB.wsdl; } || \
    -#	{ sleep 16 ; ${gsoap_prefix}/bin/wsdl2h -c -t ${top_srcdir}/src/ws_typemap.dat -o $@ ${stagedir}/interface/LB.wsdl; }
    -
    -LB.xh: ws_typemap.dat ${stagedir}/interface/LB.wsdl
    -	${gsoap_bin_prefix}/wsdl2h -c -t ${top_srcdir}/src/ws_typemap.dat -I${stagedir}/interface -o $@ ${stagedir}/interface/LB.wsdl
    -
    -test.xml: test_xml
    -	LD_LIBRARY_PATH=${cares_prefix}/${libdir}:${classads_prefix}/${libdir}:${LD_LIBRARY_PATH} ./test_xml
    -
    -test_xml: test_xml.cpp
    -	${CXX} -c ${CFLAGS} ${TEST_INC} $<
    -	${LINKXX} -o $@ test_xml.o lb_xml_parse.o ${LB_COMMON_LIB} ${TEST_LIBS}
    -
    -test.query: test_query_events
    -	# XXX coredumps ./test_query_events
    -
    -#query_events_objs:=`echo ${BKSERVER_BASE_OBJS} |sed 's/bkserverd\.o//;s/db_store\.o//;s/stored_master\.o//;s/store\.o//;s/srv_purge\.o//;s/load\.o//;s/dump\.o//;s/lb_proto\.o//;s/lb_html\.o//;s/lb_http\.o//;'`
    -
    -query_events_objs := test_query_events.o query.o get_events.o jobstat_supp.o index.o db_supp.o
    -
    -test_query_events: ${query_events_objs}
    -	${LINKXX} -o $@ ${query_events_objs} \
    -	${TEST_LIBS} ${LB_COMMON_LIB} ${LB_MACHINE_LIB} ${classadslib} -lglite_lbu_log
    -
    -test.soapconv: test_soap_conv
    -	LD_LIBRARY_PATH=${cares_prefix}/${libdir}:${classads_prefix}/${libdir}:${LD_LIBRARY_PATH} ./test_soap_conv
    -
    -test_soap_conv: test_soap_conv.cpp ${WS_CLIENT_OBJS}
    -	${CXX} -c ${CFLAGS} ${TEST_INC} $<
    -	${LINKXX} -o $@ test_soap_conv.o ${WS_CLIENT_OBJS} ${WS_CLIENT_LIBS} ${TEST_LIBS}
    -
    -examples: ${EXAMPLES}
    -
    -${STATIC_LIB_BK}: ${LIB_OBJS_BK}
    -	ar crv $@ ${LIB_OBJS_BK}
    -	ranlib $@
    -
    -${LCAS_PLUGIN_LIB}: ${LCAS_PLUGIN_LOBJS}
    -	${LINK} -o $@ $^
    -
    -doc: ${MAN_GZ}
    -
    -man: ${MAN_GZ}
    -
    -${MAN_GZ}: ${MAN}
    -	cp $? .
    -	gzip -f $(notdir $?)
    -
    -stage: compile
    -	$(MAKE) install PREFIX=${stagedir} DOSTAGE=yes
    -
    -install:
    -	-mkdir -p ${PREFIX}/bin ${PREFIX}/etc/glite-lb ${PREFIX}/etc/init.d ${PREFIX}/interface
    -	-mkdir -p ${PREFIX}/share/doc/${package}-${version}
    -	-mkdir -p ${PREFIX}/share/man/man1
    -	-mkdir -p ${PREFIX}/${libdir}
    -	-mkdir -p ${PREFIX}/include/${globalprefix}/${lbprefix}
    -	mkdir -p ${PREFIX}/share/man/man8
    -	${INSTALL} -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version}
    -	( cd ${top_srcdir}/project && ${INSTALL} -m 644 ChangeLog package.description package.summary ${PREFIX}/share/doc/${package}-${version} )
    -	${INSTALL} -m 644 ${MAN_GZ} ${PREFIX}/share/man/man1
    -	for p in bkserverd bkindex mon-db; do \
    -		${INSTALL} -m 755 "glite-lb-$$p" "${PREFIX}/bin/glite-lb-$$p"; \
    -	done
    -	-mkdir -p ${PREFIX}/${libdir}/modules
    -	${INSTALL} -m 755 ${LCAS_PLUGIN_LIB} ${PREFIX}/${libdir}/modules
    -	ln -sf liblcas_lb.so ${PREFIX}/${libdir}/modules/lcas_lb.mod
    -
    -	for f in dbsetup.sql index.conf.template; do \
    -		${INSTALL} -m 644 ${top_srcdir}/config/"glite-lb-$$f" ${PREFIX}/etc/glite-lb; \
    -		ln -sf "glite-lb/glite-lb-$$f" "${PREFIX}/etc/glite-lb-$$f"; \
    -	done
    -	${INSTALL} -m 755 ${top_srcdir}/config/glite-lb-migrate_db2version20 ${PREFIX}/etc/glite-lb
    -
    -	${INSTALL} -m 755 ${top_srcdir}/config/startup ${PREFIX}/etc/init.d/glite-lb-bkserverd
    -
    -	mkdir -p ${PREFIX}/include/${globalprefix}/${lbprefix}
    -	(cd ${top_srcdir}/interface && install -m 644 ${HDRS} ${PREFIX}/include/${globalprefix}/${lbprefix})
    -	install -m 644 ${STATIC_LIB_BK} ${PREFIX}/${libdir}
    -	${INSTALL} -m 644 ${top_srcdir}/interface/srv_perf.h ${PREFIX}/include/${globalprefix}/${lbprefix}
    -	${INSTALL} -m 644 ${MAN_GZ} ${PREFIX}/share/man/man8
    -ifdef LB_PERF
    -	-mkdir -p ${PREFIX}/sbin
    -	${INSTALL} -m 755 ${top_srcdir}/src/perftest_proxy.sh ${PREFIX}/sbin
    -endif
    -
    -clean:
    -	rm -rvf *.c *.h *.ch *.xh *.xml *.nsmap *.o *.lo .libs glite-lb-* ${STATIC_LIB_BK} ${LCAS_PLUGIN_LIB} test* ${MAN_GZ} ${EXAMPLES}
    -	rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/
    -
    -%.c: %.c.T
    -	rm -f $@
    -	${AT3} $< >$@ || rm -f $@
    -	chmod -w $@ >/dev/null
    -
    -%.o: %.y
    -	${YACC} -d ${YFLAGS} $<
    -	mv y.tab.c $*.c
    -	mv y.tab.h $*.h
    -	${CC} -c ${CFLAGS} $*.c
    -	rm $*.c
    -
    -%.cpp: %.cpp.T
    -	rm -f $@
    -	${AT3} $< >$@ || rm -f $@
    -	chmod -w $@ >/dev/null
    -
    -%.o %.lo: %.c
    -	${COMPILE} -c $<
    -
    -%.o %.lo: %.cpp
    -	${CXXCOMPILE} -c $<
    -
    -test_query_events.o: %.o: %.cpp
    -	${CXX} -c ${CFLAGS} ${TEST_INC} $<
    -
    -
    -%.lo: %.c
    -	${COMPILE} -o $@ -c $<
    -
    -soap_version.h:
    -	${gsoap_bin_prefix}/soapcpp2 /dev/null
    -	perl -ne '$$. == 2 && /.*([0-9]+)\.([0-9]+)\.([0-9]+)([a-z]?).*/ && printf "#define GSOAP_VERSION %d%02d%02d\n#define GSOAP_VERSION_LETTER '\''".($$4?$$4:"\\0")."'\''\n",$$1,$$2,$$3' soapH.h >$@
    -	-rm soapC.cpp soapH.h soapStub.h soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp
    -
    -ifeq ($(GLITE_LB_SERVER_WITH_WS),yes)
    -bkserverd.o ws_fault.o: soap_version.h
    -endif
    -
    diff --git a/org.glite.lb.server/config/glite-lb-dbsetup.sql b/org.glite.lb.server/config/glite-lb-dbsetup.sql
    deleted file mode 100644
    index 72513ba..0000000
    --- a/org.glite.lb.server/config/glite-lb-dbsetup.sql
    +++ /dev/null
    @@ -1,158 +0,0 @@
    -create table jobs (
    -	jobid		char(32)	binary not null,
    -	dg_jobid	varchar(255)	binary not null,
    -	userid		char(32)	binary not null,
    -	aclid		char(32)	binary null,
    -	proxy		bool		not null,
    -	server		bool		not null,
    -	grey		bool		not null,
    -	nevents		int		not null,
    -
    -	primary key (jobid),
    -	unique (dg_jobid),
    -	index (userid)
    -) engine=innodb;
    -
    -create table users (
    -	userid		char(32)	binary not null,
    -	cert_subj	varchar(255)	binary not null,
    -
    -	primary key (userid),
    -	unique (cert_subj)
    -) engine=innodb;
    -
    -create table events (
    -	jobid		char(32)	binary not null,
    -	event		int		not null,
    -	code		int		not null,
    -	prog		varchar(255)	binary not null,
    -	host		varchar(255)	binary not null,
    -	time_stamp	datetime	not null,
    -	userid		char(32)	binary null,
    -	usec		int		null,
    -	level		int		null,
    -
    -	arrived		datetime	not null,
    -	seqcode		varchar(255)	binary not null,
    -
    -	primary key (jobid,event),
    -	index (time_stamp),
    -	index (host),
    -	index (arrived)
    -) engine=innodb;
    -
    -create table events_flesh (
    -	jobid		char(32)	binary not null,
    -	event		int		not null,
    -	ulm		mediumblob	not null,
    -	
    -	primary key (jobid,event)
    -) engine=innodb;
    -
    --- for compatibility
    -create table short_fields (
    -	jobid		char(32)	binary not null,
    -	event		int		not null,
    -	name		varchar(200)	binary not null,
    -	value		varchar(255)	binary null,
    -
    -	primary key (jobid,event,name)
    -) engine=innodb;
    -
    --- for compatibility
    -create table long_fields (
    -	jobid		char(32)	binary not null,
    -	event		int		not null,
    -	name		varchar(200)	binary not null,
    -	value		mediumblob	null,
    -
    -	primary key (jobid,event,name)
    -) engine=innodb;
    -
    -create table states (
    -	jobid		char(32)	binary not null,
    -	status		int		not null,
    -	seq		int		not null,
    -	int_status	mediumblob	not null,
    -	version		varchar(32)	not null,
    -	parent_job	varchar(32)	binary not null,
    -
    -	primary key (jobid),
    -	index (parent_job)
    -	
    -) engine=innodb;
    -
    -create table status_tags (
    -	jobid		char(32)	binary not null,
    -	seq		int		not null,
    -	name		varchar(200)	binary not null,
    -	value		varchar(255)	binary null,
    -
    -	primary key (jobid,seq,name)
    -) engine=innodb;
    -
    -create table server_state (
    -	prefix		varchar(100)	not null,
    -	name		varchar(100)	binary not null,
    -	value		varchar(255)	binary not null,
    -
    -	primary key (prefix,name)
    -) engine=innodb;
    -
    -create table acls (
    -	aclid		char(32)	binary not null,
    -	value		mediumblob	not null,
    -	refcnt		int		not null,
    -
    -	primary key (aclid)
    -) engine=innodb;
    -
    -create table notif_registrations (
    -	notifid		char(32)	binary not null,
    -	destination	varchar(200)	not null,
    -	valid		datetime	not null,
    -	userid		char(32)	binary not null,
    -	conditions	mediumblob	not null,
    -	flags		int		not null,
    -
    -	`STD_owner`	varchar(200)	null,
    -	`STD_network_server`	varchar(200)	null,
    -	`JDL_VirtualOrganisation`	varchar(200)	null,
    -
    -	primary key (notifid),
    -	index (`STD_owner`),
    -	index (`STD_network_server`),
    -	index (`JDL_VirtualOrganisation`)
    -) engine=innodb;
    -
    -create table notif_jobs (
    -	notifid		char(32)	binary not null,
    -	jobid		char(32)	binary not null,
    -
    -	primary key (notifid,jobid),
    -	index (jobid)
    -) engine=innodb;
    -
    -create table zombie_jobs (
    -	jobid	varchar(32)	not null,
    -	prefix_id       tinyint unsigned not null,
    -	suffix_id       tinyint unsigned not null,
    -
    -	primary key (jobid)
    -) engine=innodb;
    -
    -create table zombie_prefixes (
    -	prefix_id       tinyint unsigned not null auto_increment,
    -	prefix		varchar(255)	binary not null,
    -
    -	primary key (prefix_id)
    -) engine=innodb;
    -
    -create table zombie_suffixes (
    -	suffix_id       tinyint unsigned not null auto_increment,
    -	suffix		varchar(255)	binary not null,
    -
    -	primary key (suffix_id)
    -) engine=innodb;
    -
    -
    diff --git a/org.glite.lb.server/config/glite-lb-index.conf.template b/org.glite.lb.server/config/glite-lb-index.conf.template
    deleted file mode 100644
    index 915df1f..0000000
    --- a/org.glite.lb.server/config/glite-lb-index.conf.template
    +++ /dev/null
    @@ -1,8 +0,0 @@
    -[
    -	JobIndices = {
    -		[ type = "system"; name = "owner" ],
    -		[ type = "system"; name = "location" ],
    -		[ type = "system"; name = "destination" ],
    -		[ type = "system"; name = "lastUpdateTime" ]
    -	}
    -]
    diff --git a/org.glite.lb.server/config/glite-lb-migrate_db2version20 b/org.glite.lb.server/config/glite-lb-migrate_db2version20
    deleted file mode 100644
    index a547fbf..0000000
    --- a/org.glite.lb.server/config/glite-lb-migrate_db2version20
    +++ /dev/null
    @@ -1,166 +0,0 @@
    -# This script is intendent to be used to extend bkserver database to 
    -# to be able to hold both bkserver and lbproxy jobs.
    -# The operation should be non-destructive, i.e. all data should persist
    -# and continue to be fully usable.
    -
    -#!/bin/bash
    - 
    -usage() {
    -cat </dev/null
    -	if [ $? != 0 ]; then
    -		echo "ALTER TABLE $table ENGINE=InnoDB" | mysql -u lbserver $DB_NAME
    -	fi
    -done
    -
    -
    -# add new columns
    -mysql -u lbserver $DB_NAME -e "ALTER TABLE jobs ADD proxy bool not null"
    -mysql -u lbserver $DB_NAME -e "ALTER TABLE jobs ADD server bool not null"
    -mysql -u lbserver $DB_NAME -e "ALTER TABLE jobs ADD grey bool not null"
    -mysql -u lbserver $DB_NAME -e "ALTER TABLE jobs ADD nevents int not null"
    -
    -
    -# flag all jobs as server jobs
    -if [ "$SERVER" ]; then
    -	mysql -u lbserver $DB_NAME -e "UPDATE jobs SET proxy='0'"
    -	mysql -u lbserver $DB_NAME -e "UPDATE jobs SET server='1'"
    -else
    -	mysql -u lbserver $DB_NAME -e "UPDATE jobs SET proxy='1'"
    -	mysql -u lbserver $DB_NAME -e "UPDATE jobs SET server='0'"
    -fi
    -
    -
    -# for all greyjobs set a flag
    -mysql -u lbserver $DB_NAME -e "UPDATE jobs,grey_jobs SET jobs.grey='1' WHERE jobs.jobid=grey_jobs.jobid"
    -
    -
    -# erase grey_jobs table
    -mysql -u lbserver $DB_NAME -e "DROP TABLE grey_jobs"
    -
    -
    -# set nevents field
    -mysql -u lbserver $DB_NAME -e "UPDATE jobs SET nevents=(SELECT max(event) FROM events where events.jobid=jobs.jobid)+1"
    -
    -
    -# seqcode
    -mysql -u lbserver $DB_NAME -e "ALTER TABLE events ADD seqcode varchar(255) binary not null"
    -mysql -u lbserver $DB_NAME -e "UPDATE events,short_fields SET events.seqcode=short_fields.value WHERE events.event=short_fields.event AND events.jobid=short_fields.jobid AND short_fields.name='SEQCODE'"
    -mysql -u lbserver $DB_NAME -e "DELETE FROM short_fields where name='SEQCODE'"
    -
    -
    -# create events_flesh table
    -mysql -u lbserver $DB_NAME -e "\
    -\
    -create table events_flesh (\
    -        jobid           char(32)        binary not null,\
    -        event           int             not null,\
    -        ulm             mediumblob      not null,\
    -\
    -        primary key (jobid,event)\
    -) engine=innodb"
    -
    -
    -# notif_registrations UPDATE
    -mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD flags int not null"
    -
    -mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD STD_owner varchar(200) null" && \
    -mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD index(STD_owner)"
    -
    -mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD STD_network_server varchar(200) null" && \
    -mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD index(STD_network_server)"
    -
    -mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD JDL_VirtualOrganisation varchar(200) null" && \
    -mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD index(JDL_VirtualOrganisation)"
    -
    -
    -# zombie jobs
    -mysql -u lbserver $DB_NAME -e "\
    -\
    -create table zombie_jobs (\
    -        jobid		varchar(32)	not null,\
    -        prefix_id	tinyint		unsigned not null,\
    -        suffix_id	tinyint		unsigned not null,\
    -\
    -        primary key (jobid)\
    -) engine=innodb"
    -
    -mysql -u lbserver $DB_NAME -e "\
    -\
    -create table zombie_prefixes (\
    -        prefix_id	tinyint		unsigned not null auto_increment,\
    -        prefix          varchar(255)    binary not null,\
    -\
    -        primary key (prefix_id)\
    -) engine=innodb"
    -
    -mysql -u lbserver $DB_NAME -e "\
    -\
    -create table zombie_suffixes (\
    -        suffix_id       tinyint unsigned not null auto_increment,\
    -        suffix          varchar(255)    binary not null,\
    -\
    -        primary key (suffix_id)\
    -) engine=innodb"
    -
    diff --git a/org.glite.lb.server/config/startup b/org.glite.lb.server/config/startup
    deleted file mode 100755
    index d0a6ce9..0000000
    --- a/org.glite.lb.server/config/startup
    +++ /dev/null
    @@ -1,278 +0,0 @@
    -#!/bin/sh
    -# chkconfig: 345 75 25
    -#
    -# Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -# See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -# 
    -# Licensed under the Apache License, Version 2.0 (the "License");
    -# you may not use this file except in compliance with the License.
    -# You may obtain a copy of the License at
    -# 
    -#     http://www.apache.org/licenses/LICENSE-2.0
    -# 
    -# Unless required by applicable law or agreed to in writing, software
    -# distributed under the License is distributed on an "AS IS" BASIS,
    -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -# See the License for the specific language governing permissions and
    -# limitations under the License.
    -#
    -
    -GLITE_LOCATION=${GLITE_LOCATION:-/opt/glite}
    -GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-/var/glite}
    -GLITE_JP_LOCATION=${GLITE_JP_LOCATION:-$GLITE_LOCATION}
    -
    -[ -f /etc/glite.conf ] && . /etc/glite.conf
    -[ -f $GLITE_LOCATION/etc/glite-wms.conf ] && . $GLITE_LOCATION/etc/glite-wms.conf
    -
    -[ -f $GLITE_LOCATION/etc/lb.conf ] && . $GLITE_LOCATION/etc/lb.conf
    -[ -f $GLITE_LOCATION_VAR/etc/lb.conf ] && . $GLITE_LOCATION_VAR/etc/lb.conf
    -
    -[ -f $HOME/.glite.conf ] && . $HOME/.glite.conf
    -
    -[ -n "$GLITE_LB_SERVER_PIDFILE" ] && BK_PIDFILE=$GLITE_LB_SERVER_PIDFILE ||
    -	BK_PIDFILE=$GLITE_LOCATION_VAR/glite-lb-bkserverd.pid
    -[ -z "$GLITE_LB_NOTIF_SOCK" ] && GLITE_LB_NOTIF_SOCK="/tmp/glite-lb-notif.sock"
    -[ -n "$GLITE_JP_IMPORTER_PIDFILE" ] && jp_importer_pidfile=$GLITE_JP_IMPORTER_PIDFILE ||
    -	jp_importer_pidfile=$GLITE_LOCATION_VAR/glite-jp-importer.pid
    -
    -GLITE_LB_TYPE=${GLITE_LB_TYPE:-'server'} # server, proxy, both
    -GLITE_LB_PROXY_SOCK=${GLITE_LB_PROXY_SOCK:-'/tmp/glite-lbproxy-ilog.sock'}
    -GLITE_LB_PROXY_FPREFIX=${GLITE_LB_PROXY_FPREFIX:-'/tmp/glite-lbproxy-ilog_events'}
    -
    -PROXY_IL_PIDFILE=$GLITE_LOCATION_VAR/glite-lb-proxy-interlogd.pid
    -NOTIF_IL_PIDFILE=$GLITE_LOCATION_VAR/glite-lb-notif-interlogd.pid
    -
    -unset creds port log4c
    -
    -start_daemon()
    -{
    -	local name="$1"
    -	local pidfile="$2"
    -	local cmd="$3"
    -
    -	if [ -f "$pidfile" ]; then
    -		if kill -0 `cat $pidfile`; then
    -			return 0
    -		fi
    -		echo -n "Warning: stalled $pidfile for $name"
    -		rm -f "$pidfile"
    -	fi
    -	echo -n "Starting $name ..."
    -	su - $GLITE_USER -c "$log4c $cmd" && echo " done" || echo " FAILED"
    -}
    -
    -stop_daemon()
    -{
    -	name="$1"
    -	local pidfile="$2"
    -
    -	if [ -f "$pidfile" ]; then
    -		pid=`cat "$pidfile"`
    -		echo -n Stopping $name \($pid\) ...
    -		kill $pid
    -		try=0
    -		while kill -0 $pid >/dev/null 2>&1; do 
    -			sleep 1;
    -			try=`expr $try + 1`
    -			if [ $try = 20 ]; then
    -				kill -9 $pid
    -				echo " force quit after $try retries"
    -				return 1
    -			fi
    -	 	done
    -		echo " done"
    -		rm -f $pidfile
    -	else
    -		echo $name not running
    -		return 1
    -	fi
    -}
    -
    -status_daemon()
    -{
    -	local name="$1"
    -	local pidfile="$2"
    -
    -	if [ -f "$pidfile" ]; then
    -		pid=`cat "$pidfile"`
    -		if kill -0 $pid >/dev/null 2>&1; then
    -			echo $name running as $pid 
    -		else
    -			echo $name not running
    -			return 1
    -		fi
    -	else
    -		echo $name not running
    -		return 1
    -	fi
    -
    -	return 0
    -}
    -
    -start()
    -{
    -	if test -z "$GLITE_USER" ;then
    -		echo 'Error: GLITE_USER is not set'
    -		echo FAILED
    -		return 1
    -	fi
    -
    -	[ -n "$GLITE_HOST_CERT" -a -n "$GLITE_HOST_KEY" ] &&
    -		creds="-c $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="-c /etc/grid-security/hostcert.pem -k /etc/grid-security/hostkey.pem"
    -		fi
    -	fi
    -
    -	log4c="LOG4C_RCPATH='$GLITE_LOCATION/etc/glite-lb'"
    -
    -	policy="$GLITE_LOCATION/etc/glite-lb/glite-lb-authz.conf"
    -	lcas_log="LCAS_LOG_FILE='/var/log/glite/glite-lb-lcas.log' LCAS_ETC_DIR='/opt/glite/etc/glite-lb'"
    -	if test -f "$policy"; then
    -		# lcas not enabled by default yet
    -		policy="--policy '$policy'"
    -	else
    -		unset policy
    -		unset lcas_log
    -	fi
    -
    -	[ -z "$GLITE_LB_EXPORT_DUMPDIR" ] && GLITE_LB_EXPORT_DUMPDIR=$GLITE_LOCATION_VAR/dump
    -	dumpdir="--dump-prefix $GLITE_LB_EXPORT_DUMPDIR"
    -	[ -d "$GLITE_LB_EXPORT_DUMPDIR" ] || mkdir -p "$GLITE_LB_EXPORT_DUMPDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_DUMPDIR"
    -
    -	[ -z "$GLITE_LB_EXPORT_PURGEDIR" ] && GLITE_LB_EXPORT_PURGEDIR=$GLITE_LOCATION_VAR/purge
    -	purgedir="--purge-prefix $GLITE_LB_EXPORT_PURGEDIR"
    -	[ -d "$GLITE_LB_EXPORT_PURGEDIR" ] || mkdir -p "$GLITE_LB_EXPORT_PURGEDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_PURGEDIR"
    -
    -	if [ x"$GLITE_LB_EXPORT_ENABLED" = x"true" ]; then
    -		if [ ! -x $GLITE_JP_LOCATION/bin/glite-jp-importer ]; then
    -			echo "glite-jp-importer needed for export to Job Provenace, install glite-jp-client package too."
    -			exit 1
    -		fi
    -
    -		# registrations
    -		[ -z "$GLITE_LB_EXPORT_JPREG_MAILDIR" ] && GLITE_LB_EXPORT_JPREG_MAILDIR=$GLITE_LOCATION_VAR/jpreg
    -		jpreg_maildir="--reg-mdir $GLITE_LB_EXPORT_JPREG_MAILDIR"
    -		lbreg_maildir="--jpreg-dir $GLITE_LB_EXPORT_JPREG_MAILDIR"
    -		[ -d "$GLITE_LB_EXPORT_JPREG_MAILDIR" ] || mkdir -p "$GLITE_LB_EXPORT_JPREG_MAILDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_JPREG_MAILDIR"
    -
    -		# dumps
    -		[ -z "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" ] && GLITE_LB_EXPORT_JPDUMP_MAILDIR=$GLITE_LOCATION_VAR/jpdump
    -		jpdump_maildir="--dump-mdir $GLITE_LB_EXPORT_JPDUMP_MAILDIR"
    -		[ -d "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" ] || mkdir -p "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_JPDUMP_MAILDIR"
    -
    -		# sandboxes
    -		[ -z "$GLITE_LB_EXPORT_SANDBOX_MAILDIR" ] && GLITE_LB_EXPORT_SANDBOX_MAILDIR=$GLITE_LOCATION_VAR/sandbox
    -		sandbox_maildir="--sandbox-mdir $GLITE_LB_EXPORT_SANDBOX_MAILDIR"
    -		[ -d "$GLITE_LB_EXPORT_SANDBOX_MAILDIR" ] || mkdir -p "$GLITE_LB_EXPORT_SANDBOX_MAILDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_SANDBOX_MAILDIR"
    -
    -		# target Job Provenance
    -		[ -n "$GLITE_LB_EXPORT_JPPS" ] && jpps="--jpps $GLITE_LB_EXPORT_JPPS"
    -	fi
    -
    -	[ -z "$creds" ] && echo $0: WARNING: No credentials specified. Using default lookup which is dangerous. >&2
    -
    -	[ -n "$GLITE_LB_SERVER_PORT" ] && port="-p $GLITE_LB_SERVER_PORT"
    -	[ -n "$GLITE_LB_SERVER_WPORT" ] && wport="-w $GLITE_LB_SERVER_WPORT"
    -	[ -z "$GLITE_LB_NOTIF_FPREFIX" ] && GLITE_LB_NOTIF_FPREFIX="/var/tmp/glite-lb-notif"
    -	if [ -n "$GLITE_LB_SERVER_DEBUG" ] ; then
    -		if which tscat >/dev/null; then
    -			GLITE_LB_SERVER_OTHER_OPTIONS="$GLITE_LB_SERVER_OTHER_OPTIONS -d -s 1 2>&1 | tscat >> $GLITE_LOCATION_VAR/lb.log &"
    -			GLITE_LB_NOTIF_OTHER_OPTIONS="$GLITE_LB_NOTIF_OTHER_OPTIONS -v -d 2>&1 | tscat >> $GLITE_LOCATION_VAR/notif-il.log &"
    -		else
    -			GLITE_LB_SERVER_OTHER_OPTIONS="$GLITE_LB_SERVER_OTHER_OPTIONS -d -s 1 >> $GLITE_LOCATION_VAR/lb.log 2>&1 &"
    -			GLITE_LB_NOTIF_OTHER_OPTIONS="$GLITE_LB_NOTIF_OTHER_OPTIONS -v -d >> $GLITE_LOCATION_VAR/notif-il.log 2>&1 &"
    -		fi
    -	fi
    -	case "$GLITE_LB_TYPE" in
    -	proxy)
    -		proxy="-P --proxy-il-sock $GLITE_LB_PROXY_SOCK --proxy-il-fprefix $GLITE_LB_PROXY_FPREFIX"
    -		;;
    -	both)
    -		proxy="-B --proxy-il-sock $GLITE_LB_PROXY_SOCK --proxy-il-fprefix $GLITE_LB_PROXY_FPREFIX"
    -		;;
    -	*)
    -		proxy=''
    -		;;
    -	esac
    -
    -	start_daemon glite-lb-bkserver "$BK_PIDFILE" "$lcas_log $GLITE_LOCATION/bin/glite-lb-bkserverd \
    -		--notif-il-sock=$GLITE_LB_NOTIF_SOCK \
    -		--notif-il-fprefix=$GLITE_LB_NOTIF_FPREFIX \
    -		$super $creds -i $BK_PIDFILE $port $wport $dumpdir $purgedir $lbreg_maildir $proxy $policy\
    -		$GLITE_LB_SERVER_OTHER_OPTIONS"
    -
    -	if test -x $GLITE_LOCATION/bin/glite-lb-notif-interlogd; then
    -		start_daemon glite-lb-notif-interlogd "$NOTIF_IL_PIDFILE" "$GLITE_LOCATION/bin/glite-lb-notif-interlogd \
    -			-f $GLITE_LB_NOTIF_FPREFIX -s $GLITE_LB_NOTIF_SOCK \
    -			-i $NOTIF_IL_PIDFILE -M 10485760 \
    -			$creds $GLITE_LB_NOTIF_IL_OTHER_OPTIONS"
    -	else
    -		echo Warning: glite-lb-notif-interlogd not installed, LB notifications will not work
    -	fi
    -
    -	if test x"$GLITE_LB_EXPORT_ENABLED" = x"true" ; then
    -		start_daemon glite-jp-importer "$jp_importer_pidfile" "\
    -		LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GLITE_JP_LOCATION/lib \
    -		$GLITE_JP_LOCATION/bin/glite-jp-importer \
    -			-i $jp_importer_pidfile $jpreg_maildir $jpdump_maildir $sandbox_maildir \
    -			$jpps $creds $GLITE_JP_IMPORTER_ARGS"
    -	fi
    -
    -	if test x"$GLITE_LB_TYPE" = x"proxy" -o x"$GLITE_LB_TYPE" = x"both" ; then
    -		if test -x $GLITE_LOCATION/bin/glite-lb-interlogd; then
    -			start_daemon "glite-lb-interlog for proxy" "$PROXY_IL_PIDFILE" "$GLITE_LOCATION/bin/glite-lb-interlogd \
    -				-f $GLITE_LB_PROXY_FPREFIX -s $GLITE_LB_PROXY_SOCK \
    -				-i $PROXY_IL_PIDFILE \
    -				$creds $GLITE_LB_PROXY_IL_OTHER_OPTIONS"
    -		else
    -			echo Warning: glite-lb-interlogd not installed, logging to LB proxy will not work
    -		fi
    -	fi
    -}
    -
    -stop()
    -{
    -	stop_daemon "glite-lb-notif-interlogd" $NOTIF_IL_PIDFILE
    -
    -	stop_daemon "glite-lb-bkserverd" $BK_PIDFILE
    -	stop_daemon "glite-jp-importer" $jp_importer_pidfile
    -
    -	stop_daemon "glite-lb-interlogd" $PROXY_IL_PIDFILE
    -
    -	# for L&B <= 2.0
    -	LC_ALL=C
    -	if netstat -an --unix | grep "^unix .* LISTEN.* $GLITE_LB_NOTIF_SOCK" >/dev/null 2>&1 ;then
    -		killall -9 glite-lb-notif-interlogd
    -	fi
    -	if netstat -an --unix | grep "^unix .* LISTEN.* $GLITE_LB_PROXY_SOCK" >/dev/null 2>&1 ;then
    -		killall -9 glite-lb-interlogd
    -	fi
    -}
    -
    -status()
    -{
    -	retval=0
    -
    -	status_daemon "glite-lb-notif-interlogd" "$NOTIF_IL_PIDFILE" || retval=1
    -	status_daemon "glite-lb-interlogd for proxy" "$PROXY_IL_PIDFILE" || retval=1
    -
    -	status_daemon "glite-lb-bkserverd" "$BK_PIDFILE" || retval=1
    -	if test x"$GLITE_LB_EXPORT_ENABLED" = x"true"; then
    -		status_daemon "glite-jp-importer" "$jp_importer_pidfile" || retval=1
    -	fi
    -
    -	return $retval
    -}
    -
    -case x$1 in
    -	xstart)	start;;
    -	xstop)	stop;;
    -	xrestart) stop; start;;
    -	xstatus) status;;
    -	x*)	echo usage: $0 start,stop,restart,status >&2
    -		exit 1;;
    -esac
    diff --git a/org.glite.lb.server/configure b/org.glite.lb.server/configure
    deleted file mode 100755
    index c82ed75..0000000
    --- a/org.glite.lb.server/configure
    +++ /dev/null
    @@ -1,843 +0,0 @@
    -#!/usr/bin/perl
    -
    -# WARNING: Don't edit this file unless it is the master copy in org.glite.lb
    -#
    -# For the purpose of standalone builds of lb/jobid/lbjp-common components
    -# it is copied on tagging 
    -
    -# $Header$
    -#
    -# Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -# See http://www.eu-egee.org/partners/ for details on the copyright holders.
    -# 
    -# Licensed under the Apache License, Version 2.0 (the "License");
    -# you may not use this file except in compliance with the License.
    -# You may obtain a copy of the License at
    -# 
    -#     http://www.apache.org/licenses/LICENSE-2.0
    -# 
    -# Unless required by applicable law or agreed to in writing, software
    -# distributed under the License is distributed on an "AS IS" BASIS,
    -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -# See the License for the specific language governing permissions and
    -# limitations under the License.
    -#
    -
    -use Getopt::Long;
    -
    -my $pwd = `pwd`; chomp $pwd;
    -my $prefix = $pwd.'/stage';
    -my $stagedir;
    -my $staged;
    -my $module;
    -my $thrflavour = 'gcc64dbgpthr';
    -my $nothrflavour = 'gcc64dbg';
    -my $mode = 'build';
    -my $help = 0;
    -my $listmodules;
    -my $version;
    -my $branch;
    -my $output;
    -my $lb_tag = '';
    -my $lbjp_tag = '';
    -my $jp_tag = '';
    -my $sec_tag = '';
    -my $jobid_tag = '';
    -my $libdir = getlibdir();
    -
    -my @nodes = qw/client server logger utils client-java doc ws-test db jpprimary jpindex jpclient harvester/;
    -my %enable_nodes;
    -my %disable_nodes;
    -
    -my %extern_prefix = (
    -	cares => '/opt/c-ares',
    -	classads => '/opt/classads',
    -	cppunit => '/usr',
    -	expat => '/usr',
    -	globus => '/opt/globus',
    -	gsoap => '/usr',
    -	mysql => '/usr',
    -	'mysql-devel' => '',
    -	'mysql-server' => '',
    -	voms => '/opt/glite',
    -	gridsite => '/opt/glite',
    -	lcas => '/opt/glite',
    -	trustmanager => '/opt/glite',
    -	utiljava => '/opt/glite',
    -	ant => '/usr',
    -	jdk => '/usr',
    -	libtar => '/usr',
    -	axis => '/usr',
    -	log4c => '/usr',
    -	postgresql => '/usr'
    -);
    -
    -my %jar = (
    -	'commons-codec' => '/usr/share/java/commons-codec.jar',
    -	'commons-lang' => '/usr/share/java/commons-lang.jar',
    -);
    -
    -
    -my %glite_prefix;
    -my %need_externs;
    -my %need_externs_type;
    -my %need_jars;
    -my %extrafull;
    -my %extranodmod;
    -my %deps;
    -my %deps_type;
    -my %topbuild;
    -
    -my %lbmodules = (
    -	'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim glite-LB/], 
    -	'security' => [qw/gss gsoap-plugin/],
    -	'lbjp-common' => [qw/db log maildir server-bones trio jp-interface/],
    -	'jobid' => [qw/api-c api-cpp api-java/],
    -	'jp' => [ qw/client doc index primary server-common ws-interface/ ],
    -	);
    -
    -
    -my @opts = (
    -	'prefix=s' => \$prefix,
    -	'staged=s' => \$staged,
    -	'module=s' => \$module,
    -	'thrflavour=s' => \$thrflavour,
    -	'nothrflavour=s' => \$nothrflavour,
    -	'mode=s' => \$mode,
    -	'listmodules=s' => \$listmodules,
    -	'version=s' => \$version,
    -	'branch=s' => \$branch,
    -	'output=s' => \$output,
    -	'stage=s' => \$stagedir,
    -	'lb-tag=s' => \$lb_tag,
    -	'lbjp-common-tag=s' => \$lbjp_tag,
    -	'jp-tag=s' => \$jp_tag,
    -	'security-tag=s' => \$sec_tag,
    -	'jobid-tag=s' => \$jobid_tag,
    -	'help' => \$help,
    -	'libdir=s' => \$libdir,
    -);
    -
    -for (@nodes) {
    -	$enable_nodes{$_} = 0;
    -	$disable_nodes{$_} = 0;
    -	
    -	push @opts,"disable-$_",\$disable_nodes{$_};
    -	push @opts,"enable-$_",\$enable_nodes{$_};
    -}
    -
    -push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix;
    -push @opts,"with-$_=s",\$jar{$_} for keys %jar;
    -
    -my @keeparg = @ARGV;
    -
    -GetOptions @opts or die "Errors parsing command line\n";
    -
    -$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq '';
    -$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq '';
    -
    -if ($help) { usage(); exit 0; }
    -
    -if ($listmodules) {
    -	my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}};
    -	print "@m\n";
    -	exit 0;
    -}
    -
    -warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
    -	if ($version || $output || $branch) && $mode ne 'etics';
    -
    -my $en;
    -for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; }
    -
    -my $dis;
    -for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; }
    -
    -die "--enable-* and --disable-* are mutually exclusive\n"
    -	if $en && $dis;
    -
    -die "--module cannot be used with --enable-* or --disable-*\n"
    -	if $module && ($en || $dis);
    -
    -die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}};
    -
    -if ($dis) {
    -	for (@nodes) {
    -		$enable_nodes{$_} = 1 unless $disable_nodes{$_};
    -	}
    -}
    -
    -if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ;
    -
    -for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; }
    -
    -$stagedir = $prefix unless $stagedir;
    -
    -if ($mode eq 'build') {
    -	print "Writing config.status\n";
    -	open CONF,">config.status" or die "config.status: $!\n";
    -	print CONF "$0 @keeparg\n";
    -	close CONF;
    -}
    -
    -
    -my @modules;
    -my %aux;
    -
    -if ($module) {
    -#	push @modules,split(/[,.]+/,$module);
    -	push @modules,$module;
    -}
    -else {
    -	@modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes));
    -	
    -	my $n;
    -
    -	do {
    -		local $"="\n";
    - 		$n = $#modules;
    -		push @modules,(map @{$deps{$_}},@modules);
    -
    -		undef %aux; @aux{@modules} = (1) x ($#modules+1);
    -		@modules = keys %aux;
    -	} while ($#modules > $n);
    -}
    -
    -@aux{@modules} = (1) x ($#modules+1);
    -delete $aux{$_} for (split /,/,$staged);
    -@modules = keys %aux;
    -
    -mode_build() if $mode eq 'build';
    -mode_checkout() if $mode eq 'checkout';
    -mode_etics($module) if $mode eq 'etics';
    -
    -sub mode_build {
    -	print "\nBuilding modules: @modules\n";
    -	
    -	my @ext = map @{$need_externs{$_}},@modules;
    -	my @myjars = map @{$need_jars{$_}},@modules;
    -	undef %aux; @aux{@ext} = 1;
    -	@ext = keys %aux;
    -	undef %aux; @aux{@myjars} = (1) x ($#myjars+1);
    -	@myjars = keys %aux;
    -	
    -	print "\nRequired externals:\n";
    -	print "\t$_: $extern_prefix{$_}\n" for @ext;
    -	print "\t$_: $jar{$_}\n" for @myjars;
    -	print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n";
    -	
    -	mkinc($_) for @modules;
    -	
    -	print "Creating Makefile\n";
    -	
    -	open MAK,">Makefile" or die "Makefile: $!\n";
    -	
    -	print MAK "all: @modules\n\nclean:\n";
    -	
    -	for (@modules) {
    -		my $full = full($_);
    -		my $build = $topbuild{$_} ? '': '/build';
    -		print MAK "\tcd $full$build && \${MAKE} clean\n"
    -	}
    -	
    -	print MAK "\ndistclean:\n";
    -	
    -	for (@modules) {
    -		my $full = full($_);
    -		print MAK $topbuild{$_} ?
    -			"\tcd $full$build && \${MAKE} distclean\n" :
    -			"\trm -rf $full$build\n"
    -	}
    -	
    -	print MAK "\n";
    -	
    -	for (@modules) {
    -		my %ldeps; undef %ldeps;  
    -		@ldeps{@{$deps{$_}}} = 1;
    -		for my $x (split /,/,$staged) { delete $ldeps{$x}; }
    -		my @dnames = $module ? () : keys %ldeps;
    -	
    -		my $full = full($_);
    -		my $build = $topbuild{$_} ? '': '/build';
    -	
    -		print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n";
    -	}
    -	
    -	close MAK;
    -}
    -	
    -sub mode_checkout() {
    -	for (@modules) {
    -		my $module = $_;
    -		my $tag = "";
    -		if ($lb_tag){
    -			for (@{$lbmodules{lb}}){
    -				if ("lb.".$_ eq $module){
    -					$tag = '-r '.$lb_tag;
    -				}
    -			}	
    -		}
    -		if ($lbjp_tag){
    -			for (@{$lbmodules{'lbjp-common'}}){
    -				if ("lbjp-common.".$_ eq $module){
    -                                        $tag = '-r '.$lbjp_tag;
    -                                }
    -			}
    -		}
    -		if ($jp_tag){
    -			for (@{$lbmodules{'jp'}}){
    -	                        if ("jp.".$_ eq $module){
    -                                        $tag = '-r '.$jp_tag;
    -	                        }
    -                        }
    -		}
    -		if ($sec_tag){
    -			for (@{$lbmodules{security}}){
    -				if ("security.".$_ eq $module){
    -                                        $tag = '-r '.$sec_tag;
    -                                }
    -			}
    -		}
    -		if ($jobid_tag){
    -			for (@{$lbmodules{jobid}}){
    -				if ("jobid.".$_ eq $module){
    -                                        $tag = '-r '.$jobid_tag;
    -                                }
    -			}
    -		}
    -		#if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){
    -		#	print "found";
    -		#}
    -		$_ = full($_);
    -		print "\n*** Checking out $_\n";
    -		system("cvs checkout  $tag $_") == 0 or die "cvs checkout $tag $_: $?\n";
    -	}
    -}
    -
    -BEGIN{
    -%need_externs_aux = (
    -	'lb.client' => [ qw/cppunit:B classads/ ],
    -	'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava/ ],
    -	'lb.common' => [ qw/expat cares:B cppunit:B classads/ ],
    -	'lb.doc' => [],
    -	'lb.logger' => [ qw/cppunit:B/ ],
    -	'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ],
    -	'lb.state-machine' => [ qw/classads/ ],
    -	'lb.utils' => [ qw/cppunit:B/ ],
    -	'lb.ws-interface' => [],
    -	'lb.ws-test' => [ qw/gsoap:B/ ],
    -	'lb.types' => [ qw// ],
    -	'lb.harvester' => [ qw// ],
    -	'lb.yaim' => [ qw/yaim_core:R/ ],
    -	'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ],
    -	'lbjp-common.db' => [ qw/mysql:B mysql-devel:B postgresql:B cppunit:B log4c:B/ ],
    -	'lbjp-common.log' => [ qw/log4c/ ],
    -	'lbjp-common.maildir' => [ qw// ],
    -	'lbjp-common.server-bones' => [ qw// ],
    -	'lbjp-common.trio' => [ qw/cppunit:B/ ],
    -	'lbjp-common.jp-interface' => [ qw/cppunit:B log4c:B/ ],
    -	'security.gss' =>  [ qw/globus_essentials:R globus:B cares cppunit:B/ ],
    -	'security.gsoap-plugin' =>  [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap:B/ ],
    -	'jobid.api-c' =>  [ qw/cppunit:B/ ],
    -	'jobid.api-cpp' =>  [ qw/cppunit:B/ ],
    -	'jobid.api-java' =>  [ qw/ant:B jdk:B/ ],
    -	'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ],
    -        'jp.doc' => [],
    -        'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ],
    -        'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ],
    -        'jp.server-common' => [],
    -        'jp.ws-interface' => [],
    -);
    -
    -for my $ext (keys %need_externs_aux) {
    -	for (@{$need_externs_aux{$ext}}) {
    -		/([^:]*)(?::(.*))?/;
    -		push @{$need_externs{$ext}},$1;
    -		my $type = $2 ? $2 : 'BR';
    -		$need_externs_type{$ext}->{$1} = $type;
    -	}
    -}
    -
    -%need_jars = (
    -	'jobid.api-java' => [ qw/commons-codec/ ],
    -	'lb.client-java' => [ qw/commons-lang/ ],
    -);
    -
    -for my $jar (keys %need_jars) {
    -	for (@{$need_jars{$jar}}) {
    -		$need_externs_type{$jar}->{$_} = 'BR'; 	# XXX
    -	}
    -}
    -
    -%deps_aux = (
    -	'lb.client' => [ qw/
    -		lb.types:B lb.common
    -		lbjp-common.trio
    -		jobid.api-cpp:B jobid.api-c
    -		security.gss
    -	/ ],
    -	'lb.client-java' => [ qw/
    -		lb.types:B
    -		lb.ws-interface:B
    -		jobid.api-java
    -	/ ],
    -	'lb.common' => [ qw/
    -		jobid.api-cpp:B jobid.api-c
    -		lb.types:B lbjp-common.trio security.gss
    -	/ ],
    -	'lb.doc' => [ qw/lb.types:B/ ],
    -	'lb.logger' => [ qw/
    -		lbjp-common.trio
    -		lbjp-common.log
    -		jobid.api-c
    -		lb.common
    -		security.gss
    -	/ ],
    -	'lb.server' => [ qw/
    -		lb.ws-interface lb.types:B lb.common lb.state-machine
    -		lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log
    -		jobid.api-c
    -		security.gsoap-plugin security.gss
    -	/ ],
    -	'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ],
    -	'lb.utils' => [ qw/
    -		lbjp-common.jp-interface
    -		jobid.api-c
    -		lbjp-common.trio lbjp-common.maildir
    -		lb.client lb.state-machine
    -	/ ],
    -	'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ],
    -	'lb.ws-interface' => [ qw/lb.types:B/ ],
    -	'lb.types' => [ qw// ],
    -	'lb.harvester' => [ qw/
    -		jobid.api-c lbjp-common.trio lbjp-common.db lb.common lb.client
    -		security.gss lbjp-common.log
    -	/ ],
    -	'lb.yaim' => [ qw// ],
    -	'lb.glite-LB' => [ qw/
    -		lb.logger:R lb.server:R lb.utils:R lb.doc:R
    -		lb.ws-test:R lb.harvester:R lb.yaim:R lb.client-java:R
    -	/ ],
    -	'lbjp-common.db' => [ qw/lbjp-common.trio lbjp-common.log/ ],
    -	'lbjp-common.maildir' => [ qw// ],
    -	'lbjp-common.server-bones' => [ qw/lbjp-common.log/ ],
    -	'lbjp-common.trio' => [ qw// ],
    -	'security.gss' =>  [ qw// ],
    -	'security.gsoap-plugin' =>  [ qw/security.gss/ ],
    -	'jobid.api-c' =>  [ qw// ],
    -	'jobid.api-cpp' =>  [ qw/jobid.api-c/ ],
    -	'jobid.api-java' =>  [ qw// ],
    -
    -	'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ],
    -
    -	'jp.client' => [ qw/
    -                jp.ws-interface
    -                lbjp-common.jp-interface lbjp-common.maildir
    -                jobid.api-c
    -                security.gsoap-plugin
    -        / ],
    -	'jp.doc' => [ qw// ],
    -	'jp.index' => [ qw/
    -                jp.server-common jp.ws-interface
    -                lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones
    -                security.gsoap-plugin
    -        / ],
    -	'jp.primary' => [ qw/
    -                jobid.api-c
    -                jp.server-common jp.ws-interface
    -                lb.state-machine
    -                lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones
    -                security.gsoap-plugin
    -        / ],
    -	'jp.server-common' => [ qw/ 
    -                lbjp-common.jp-interface lbjp-common.db
    -        / ],
    -	'jp.ws-interface' => [ qw// ],
    -);
    -
    -for my $ext (keys %deps_aux) {
    -	for (@{$deps_aux{$ext}}) {
    -		/([^:]*)(?::(.*))?/;
    -		push @{$deps{$ext}},$1;
    -		my $type = $2 ? $2 : 'BR';
    -		$deps_type{$ext}->{$1} = $type;
    -	}
    -}
    -
    -
    -%extrafull = ( gridsite=>'org.gridsite.core');
    -
    -#( java => 'client-java' );
    -%extranodmod = (
    -	db => 'lbjp-common.db',
    -	jpprimary => 'jp.primary',
    -	jpindex => 'jp.index',
    -	jpclient => 'jp.client',
    -);
    -
    -%obsoletes = (
    -	'lb.yaim' => [ qq/glite-yaim-lb/ ],
    -);
    -
    -my @t = qw/lb.client-java jobid.api-java lb.types/;
    -@topbuild{@t} = (1) x ($#t+1);
    -}
    -
    -sub full
    -{
    -	my $short = shift;
    -	return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short;
    -}
    -
    -sub mkinc
    -{
    -	my %aux;
    -	undef %aux;
    -	my @m=qw/
    -lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB
    -security.gss security.gsoap-plugin
    -jobid.api-c jobid.api-cpp jobid.api-java
    -lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface
    -jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface
    -/;
    -	@aux{@m} = (1) x ($#m+1);
    -
    -	my $short = shift;
    -	my $full = full $short;
    -
    -	unless ($aux{$short}) {
    -		print "Makefile.inc not needed in $full\n";
    -		return;
    -	}
    -
    -	my $build = '';
    -	
    -	unless ($topbuild{$_}) {
    -		$build = '/build';
    -		unless (-d "$full/build") {
    -			mkdir "$full/build" or die "mkdir $full/build: $!\n";
    -		}
    -		unlink "$full/build/Makefile";
    -		symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n";
    -	}
    -
    -	open MKINC,">$full$build/Makefile.inc"
    -		or die "$full$build/Makefile.inc: $!\n";
    -
    -	print "Creating $full$build/Makefile.inc\n";
    -
    -	print MKINC qq{
    -PREFIX = $prefix
    -stagedir = $stagedir
    -thrflavour = $thrflavour
    -nothrflavour = $nothrflavour
    -libdir = $libdir
    -};
    -
    -	for (@{$need_externs{$short}}) {
    -		print MKINC "${_}_prefix = $extern_prefix{$_}\n"
    -	}
    -
    -	for (@{$need_jars{$short}}) {
    -		print MKINC "${_}_jar = $jar{$_}\n"
    -	}
    -
    -	my $need_gsoap = 0;
    -	for (@{$need_externs{$short}})  { $need_gsoap = 1 if $_ eq 'gsoap'; }
    -
    -	print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
    -
    -	close MKINC;
    -}
    -
    -my %etics_externs;
    -my %etics_projects;
    -BEGIN{
    -	%etics_externs = (
    -		globus_essentials=>'vdt_globus_essentials',
    -		globus=>'globus',
    -		cares=>'c-ares',
    -		voms=>'org.glite.security.voms-api-cpp',
    -		gridsite=>'org.gridsite.shared',
    -		lcas=>'org.glite.security.lcas',
    -		trustmanager=>'org.glite.security.trustmanager',
    -		utiljava=>'org.glite.security.util-java',
    -		gpt=>'gpt',
    -		fetchcrl=>'fetch-crl',
    -		gip_release=>'glite-info-provider-release',
    -		gip_service=>'glite-info-provider-service',
    -		bdii=>'bdii',
    -		glite_version=>'glite-version',
    -		glite_info_templates=>'glite-info-templates',
    -		glue_schema=>'glue-schema',
    -		yaim_core=>'org.glite.yaim.core',
    -	);
    -	%etics_projects = (
    -		vdt=>[qw/globus globus_essentials/],
    -		'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/],
    -	);
    -};
    -
    -sub mode_etics {
    -	$fmod = shift;
    -
    -	die "$0: --module required with --etics\n" unless $fmod;
    -	
    -	my ($subsys,$module) = split /\./,$fmod;
    -
    -	my ($major,$minor,$rev,$age);
    -
    -	if ($version) {
    -		$version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
    -		($major,$minor,$rev,$age) = ($1,$2,$3,$4);
    -	}
    -	else { 
    -		open V,"org.glite.$subsys.$module/project/version.properties"
    -			or die "org.glite.$subsys.$module/project/version.properties: $!\n";
    -	
    -		while ($_ = ) {
    -			chomp;
    -			($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/;
    -			$age = $1 if /module\.age\s*=\s*([[:digit:]]+)/;
    -		}
    -		close V;
    -	}
    -
    -	my @copts = ();
    -	my %ge;
    -	@ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1);
    -
    -	for (@{$need_externs{"$subsys.$module"}}) {
    -	    if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) {
    -		my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
    -		push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}";
    -	    }
    -	}
    -
    -	for (@{$need_jars{"$subsys.$module"}}) {
    -		my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
    -
    -		push @copts,"--with-$_ \${$eext.location}/$_*.jar";
    -	}
    -
    -	my $conf;
    -	my $conftag;
    -
    -	if ($branch) {
    -		$conf = "glite-${subsys}-${module}_$branch"; 
    -		$conftag = $branch; 
    -		$dwpath = ""; }
    -	else {
    -		$conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
    -		$conftag = $conf; 
    -		$dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n"; }
    -#	my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}";
    -	my $file = $output ? $output : "$conf.ini";
    -	open C,">$file" or die "$file: $!\n";
    -
    -	my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build";
    -
    -	my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..';
    -
    -	my $package_description = "";
    -	my $package_summary = "";
    -
    -	if (-e "org.glite.$subsys.$module/project/package.description") {
    -		open V, "org.glite.$subsys.$module/project/package.description";
    -		$package_description = join ("", );
    -		close V;
    -		chomp $package_description;
    -		$package_description =~ s/\n/\\n/g; 
    -		$package_description = "package.description = $package_description";
    -	} 
    -	else { 
    -		print STDERR "package.description not found for $subsys.$module!\n"; }
    -
    -	if (-e "org.glite.$subsys.$module/project/package.summary") {
    -		open V, "org.glite.$subsys.$module/project/package.summary";
    -		$package_summary = join ("", );
    -		close V;
    -		chomp $package_summary;
    -		$package_summary =~ s/\n/\\n/g; 
    -		$package_summary = "package.summary = $package_summary";
    -	} 
    -	else { 
    -		print STDERR "package.summary not found for $subsys.$module!\n"; }
    -
    -
    -	print STDERR "Writing $file\n";
    -	print C qq{
    -[Configuration-$conf]
    -profile = None
    -moduleName = org.glite.$subsys.$module
    -displayName = $conf
    -description = org.glite.$subsys.$module
    -projectName = org.glite
    -age = $age
    -deploymentType = None
    -tag = $conftag
    -version = $major.$minor.$rev
    -$dwpath
    -[Platform-default:VcsCommand]
    -displayName = None
    -description = None
    -tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName}
    -branch = None
    -commit = None
    -checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName}
    -
    -[Platform-default:BuildCommand]
    -postpublish = None
    -packaging = None
    -displayName = None
    -description = None
    -doc = None
    -prepublish = None
    -publish = None
    -compile = make
    -init = None
    -install = make install
    -clean = make clean
    -test = make check
    -configure = cd $confdir && /usr/bin/perl \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts
    -checkstyle = None
    -
    -[Platform-default:Property]
    -$buildroot
    -$package_description
    -$package_summary
    -};
    -	for (@{$obsoletes{"$subsys.$module"}}) {
    -		print C "package.obsoletes = $_\n";
    -		print C "package.replaces = $_\n";
    -	}
    -
    -	print C qq{
    -[Platform-default:DynamicDependency]
    -};
    -	for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) {
    -		my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
    -
    -		my $proj = 'externals';
    -		for my $p (keys %etics_projects) {
    -			for $m (@{$etics_projects{$p}}) {
    -				$proj = $p if $m eq $_;
    -			}
    -		}
    -
    -		my $type = $need_externs_type{"$subsys.$module"}->{$_};
    -		print C "$proj|$eext = $type\n";
    -	}
    -
    -	for (@{$deps{"$subsys.$module"}}) {
    -		my $type = $deps_type{"$subsys.$module"}->{$_};
    -		print C "org.glite|org.glite.$_ = $type\n";
    -	}
    -
    -	close C;
    -}
    -
    -sub gsoap_version {
    -	local $_;
    -	my $gsoap_version;
    -	open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n";
    -
    -	while ($_ = ) {
    -		chomp;
    -
    -		$gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/;
    -	}
    -	close S;
    -	return $gsoap_version;
    -}
    -
    -sub getlibdir {
    -	if ( -e "/etc/debian_version") { # We are on Debian
    -		$lib64="lib";
    -		$lib32="lib32";	}
    -	else { # Another distribution
    -		$lib64="lib64";
    -		$lib32="lib";	}
    -        $libdir=$lib32;
    -
    -        open INP, "uname -s | "; # Check kernel name
    -        $kname= ;
    -        chomp($kname);
    -        close INP;
    -
    -        if ( $kname == "Linux") {
    -                $arch = ("x86_64\npowerpc\nppc64\n");
    -
    -                open INP, "uname -p | "; # Check processor type
    -                $procname= ;
    -                chomp($procname);
    -                close INP;
    -
    -                if ($arch =~/^$procname\n/) {
    -                        return ($lib64); }
    -
    -                open INP, "uname -m | "; # Check machine hardware
    -                $machname= ;
    -                chomp($machname);
    -                close INP;
    -
    -                if ($arch =~/^$machname\n/) {
    -                        return ($lib64); }
    -
    -                # special cases (hyperlink lib64, Debian)
    -                if (-l "/usr/lib64") {
    -                        $libdir=$lib32; }
    -
    -                # if /usr/lib64 doesn't exist at all (AIX)
    -                unless ( -e "/usr/lib64" ) {
    -                        $libdir=$lib32; }
    -        }
    -
    -        if ( $kname == "SunOS") {
    -                if (-e "/usr/lib/64") {
    -                $libdir="lib/64"; }
    -        }
    -
    -        return $libdir;
    -}
    -
    -sub usage {
    -	my @ext = keys %extern_prefix;
    -	my @myjars, keys %jar;
    -
    -	print STDERR qq{
    -usage: $0 options
    -
    -General options (defaults in []):
    -  --prefix=PREFIX		destination directory [./stage]
    -  --staged=module,module,...	what is already in PREFIX (specify without org.glite.)
    -  --thrflavour=flavour
    -  --nothrflavour=flavour	threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg]
    -  --listmodules=subsys          list modules of a subsystem
    -  --libdir=libdir		typically [lib,lib64] postfix
    -  
    -Mode of operation:
    -  --mode={checkout|build|etics}	what to do [build]
    -  
    -What to build:
    -  --module=module		build this module only (mostly in-Etics operation)
    -  --enable-NODE			build this "node" (set of modules) only. Available nodes are
    -					@{$lbmodules{lb}},@{$lbmodules{security}}
    -  --disable-NODE		don't build this node
    -  --lb-tag=tag			checkout LB modules with specific tag
    -  --jp-tag=tag			checkout JP modules with specific tag
    -  --lbjp-common-tag=tag         checkout lbjp-common modules with specific tag
    -  --security-tag=tag		checkout security modules with specific tag
    -  --jobid-tag=tag		checkout jobid modules with specific tag
    -
    -Dependencies:
    -  --with-EXTERNAL=PATH		where to look for an external. Required externals
    - 				(not all for all modules) are:
    -					@ext
    -  --with-JAR=JAR		where to look for jars. Required jars are:
    -					@myjars
    -				Summary of what will be used is always printed
    -
    -};
    -
    -}
    diff --git a/org.glite.lb.server/doc/glite-lb-bkindex.8 b/org.glite.lb.server/doc/glite-lb-bkindex.8
    deleted file mode 100644
    index 0d43e51..0000000
    --- a/org.glite.lb.server/doc/glite-lb-bkindex.8
    +++ /dev/null
    @@ -1,171 +0,0 @@
    -.TH GLITE-LB-BKINDEX 8 "April 2008" "EU EGEE Project" "Logging&Bookkeeping"
    -
    -.SH NAME
    -glite-lb-bkindex - dump or rebuild bookkeeping server indices
    -
    -.SH SYNOPSIS
    -.B glite-lb-bkindex
    -.RB [\| -mrv\| ] 
    -.RI [ FILE ]
    -.br
    -.B glite-lb-bkindex
    -.RB [\| -dmv\| ] 
    -
    -
    -.SH DESCRIPTION
    -The bookkeeping server
    -.B glite-lb-bkserverd
    -uses database indices to support various types of user queries efficiently.
    -.B glite-lb-bkindex 
    -is a tool for dumping and manipulating the indices.
    -Both single- and multiple-column indices are supported.
    -
    -Due to performance reasons (reindexing may take rather long time)
    -the default invocation performs only "dry run" - the input is checked and intended actions
    -reported but not really performed.
    -The option -r has to be specified to do the real work.
    -
    -.B glite-lb-bkindex
    -should not be run while there is a running 
    -.B glite-lb-bkserverd
    -on top of the same database.
    -
    -.PP
    -By default the L&B server indexes data according to JobId only. Because
    -the querying capabilities of L&B release 2 were considerably extended,
    -the server refuses to process a query which would not utilize any index.
    -This prevent overloading the underlying database engine. Consequently, even a trivial query 'give me all my jobs' results in an error in the default setup  because under certain conditions processing such query may require handling gigabytes of data.
    -
    -.PP
    -The server administrator can create and modify the set of indices and control the set of supported queries. The description of columns to be indexed is given to 
    -.B glite-lb-bkindex
    -utility via 
    -.I FILE
    -that  follows this syntax (subset of ClassAd syntax):
    -
    -.PP
    -.IP
    -.I FILE
    -::= 
    -.BI [\ JobIndices\ =\ {\  index-description\ \fR[\fP ,\  index-description\fR]*\fP
    -.B  } ]
    -.br
    -.I index-description
    -::= 
    -.I column-description \fR|\fP list-of-columns
    -.br
    -.I list-of-columns 
    -::= 
    -.BI {\  column-description\ \fR+\fP\  }
    -.br
    -.I column-description 
    -::= 
    -.BI [\  column-type ;\  column-name ;\  prefix-len\  \fR?\fP\ ]
    -.br
    -.I column-type 
    -::= 
    -.B type = """user""" \fR|\fP type = """system""" \fR|\fP type = """time"""
    -.br
    -.I column-name 
    -::= 
    -.B name = """\fIactual_column_name\fP"""
    -.br
    -.I prefix-len 
    -::= 
    -.BI prefixlen\ =\  integer
    -
    -.PP
    -The only top-level attribute 
    -.B JobIndices
    -is a list (possibly empty) of index descriptions. Each index description is either a single column or a list of columns (where the order is important). The column is described by mandatory attributes 
    -.B type 
    -and 
    -.B name\fR,\fP
    -and an optional attribute 
    -.B prefixlen\fR.\fP 
    -Possible values of type are 
    -.B """system"""
    -(L&B internal attributes)
    -.B """time"""
    -("state entered" timestamps), and  
    -.B """user"""
    -(user tags).
    -Currently supported system column names are 
    -.I owner\fR,\fP destination \fRand\fP location\fR.\fP
    -and valid timestamps are the job states, i.e.
    -.I submitted, waiting, ready, scheduled, running, done, cleared, cancelled, aborted\fR.
    -Names of user tags are arbitrary as long as their length is less than 60 characters and they contain only ASCII printable characters excluding backtick (`).
    -The
    -.B prefixlen
    -value may be used to restrict indexing of columns, which may grow rather long, to a fixed size. This becomes necessary with compound indices as MySQL limits the total size of index to 250 bytes only.
    -
    -.PP
    -In the following example the index file contains two indices, the first
    -one on a single system attribute -- , the second one composed
    -from system attribute (job)  and user tag called :
    -
    -.IP
    -[
    -.br
    -\ \ JobIndices = {
    -.br
    -\ \ \ \ [ type = "system"; name = "owner" ],
    -.br
    -\ \ \ \ {
    -.br
    -\ \ \ \ \ \ [ type = "system"; name = "destination";
    -.br
    -\ \ \ \ \ \ \ \ prefixlen = 100 ],
    -.br
    -\ \ \ \ \ \ [ type = "user"; name = "experiment number"; 
    -.br
    -\ \ \ \ \ \ \ \ prefixlen = 100 ] 
    -.br
    -\ \ \ \ }
    -.br
    -\ \ }
    -.br
    -]
    -
    -.SH OPTIONS
    -.TP
    -.B "-d\fR,\fP --dump"
    -Print current setup on
    -.I stdout\fR.\fP
    -
    -.TP
    -.BI \-m " STRING" "\fR,\fP --mysql " STRING
    -.I STRING
    -is the database connect string in the form
    -
    -USER_NAME/PASSWORD@DB_HOSTNAME:DB_NAME
    -
    -It defaults to lbserver/@localhost:lbserver20 (common with
    -.B glite-lb-bkserverd\fR).
    -
    -.TP
    -.B "-r, --really"
    -Really perform reindexing.
    -
    -.TP
    -.B "-R, --remove"
    -Remove all indexes from server.
    -
    -.TP
    -.B "-v, --verbose"
    -Increase verbosity.
    -
    -
    -.\".SH USAGE
    -.\" Add any additional description here
    -
    -.PP
    -
    -.SH REPORTING BUGS
    -Please, report all bugs to EU EGEE Bug Tracking System located at https://savannah.cern.ch
    -
    -.SH SEE ALSO
    -.B glite-lb-purge\fR(8),\fP glite-lb-bkserverd\fR(8)
    -
    -.SH AUTHOR
    -EU EGEE, JRA1.
    diff --git a/org.glite.lb.server/doc/glite-lb-bkserverd.8 b/org.glite.lb.server/doc/glite-lb-bkserverd.8
    deleted file mode 100644
    index af1ce96..0000000
    --- a/org.glite.lb.server/doc/glite-lb-bkserverd.8
    +++ /dev/null
    @@ -1,338 +0,0 @@
    -.TH GLITE-LB-BKSERVERD 8 "April 2008" "EU EGEE Project" "Logging&Bookkeeping"
    -
    -.SH NAME
    -glite-lb-bkserverd - bookkeeping server daemon
    -
    -.SH SYNOPSIS
    -.B glite-lb-bkserverd
    -.RI [ options ]
    -.br
    -
    -.SH DESCRIPTION
    -.B glite-lb-bkserverd 
    -accepts L&B events from interlogger, manages the data storage,
    -and serves user queries (L&B consumer clients).
    -
    -Currently, the data are stored in MySQL database.
    -
    -.PP
    -The main process spawns several
    -.I slave
    -processes. Then it listens on 
    -.I port
    -(default value is 9000) for consumer queries and
    -.I port+1
    -for interlogger daemon requests to store events to database.
    -Requests are redirected to the slaves 
    -(and picked up by the first free slave process).
    -All the connection handling and data processing (including SSL handshake)
    -is performed by the slaves.
    -
    -The slaves voluntarily die and are resurrected periodically to workaround
    -potential resource leakage.
    -
    -
    -.SH OPTIONS
    -.TP
    -.BI \-a " HOST:PORT" "\fR,\fP --address " HOST:PORT
    -Make the server pretend (wrt. data handling) it listens on 
    -.I HOST:PORT 
    -instead of the real listening address.
    -This is used for debugging and various administrative purposes
    -(e.g. computing usage statistics on data dumped from another server).
    -
    -.TP
    -.BI \-c " FILE" "\fR,\fP --cert " FILE
    -Get certificate from
    -.I FILE\fR.\fP
    -This option overrides the
    -.B \fR$\fPX509_USER_CERT
    -environment variable.
    -
    -.TP
    -.BI \-b " SWITCH" "\fR,\fP --transactions " SWITCH
    -Set transaction on/off.
    -.I SWITCH
    -is true where its value is not 0.
    -
    -.TP
    -.BI \-C " DIR" "\fR,\fP --CAdir " DIR
    -Trusted CA's certificates directory.
    -.I DIR\fR.\fP
    -This option overrides the
    -.B \fR$\fPX509_CERT_DIR
    -environment variable.
    -
    -.TP
    -.BI \-V " DIR" "\fR,\fP --VOMSdir " DIR
    -Trusted VOMS server's certificates directory.
    -.I DIR\fR.\fP
    -This option overrides the
    -.B \fR$\fPX509_VOMS_DIR
    -environment variable.
    -
    -.TP
    -.B "-d\fR,\fP --debug"
    -Don't run as daemon, print additional diagnostics.
    -
    -.TP
    -.B "-r\fR,\fP --rgmaexport"
    -Write state info to RGMA interface.
    -
    -.TP
    -.BI \-i " FILE" "\fR,\fP --pidfile " FILE
    -Store master pid into
    -.I FILE
    -instead of the default pidfile location.
    -Unless unavoidable it is not recommended to change the pidfile location
    -as it is also used for locking to prevent starting up multiple server instances
    -and to generate the semaphore set unique key (see option -l).
    -
    -
    -.TP
    -.BI \-k " FILE" "\fR,\fP --key " FILE
    -Get private key from
    -.I FILE\fR.\fP
    -This option overrides the
    -.B \fR$\fPX509_USER_KEY
    -environment variable.
    -
    -.TP
    -.BI -l " NUM" "\fR,\fP --semaphores " NUM
    -Use 
    -.I NUM
    -semaphores (job locks).
    -
    -To prevent race conditions on simultaneous event storage and job-state updates
    -.B glite-lb-bkserverd
    -uses a set of semaphores to lock jobs.
    -Jobids are hashed to the semaphores and only one of the set of jobs that map
    -to a particular semaphore may be updated at any given time. 
    -Therefore
    -.I NUM
    -is a limit on potential processing parallelism.
    -
    -.I NUM
    -defaults to the number of slaves (see -s).
    -
    -
    -.TP
    -.BI -L " NUM:NUM:NUM" "\fR,\fP --limits " NUM:NUM:NUM
    -Limit the maximum number of returned jobs/events that match user query to 
    -.I NUM:NUM:NUM\fP in format events_limit:jobs_limit:size_limit.\
    -
    -.TP
    -.BI -N " NUM" "\fR,\fP --notif-dur " NUM
    -Maximal duration of notification registrations in hours
    -.I NUM\fR.\fP
    -
    -.TP
    -.BI -S " PREFIX" "\fR,\fP --purge-prefix " PREFIX
    -Purge files full-path prefix
    -.I PREFIX\fR.\fP
    -
    -.TP
    -.BI -D " PREFIX" "\fR,\fP --dump-prefix " PREFIX
    -Dump files full-path prefix
    -.I PREFIX\fR.\fP
    -
    -.TP
    -.BI -J " DIR" "\fR,\fP --jpreg-dir " DIR
    -JP registration temporary files prefix (implies '-j').
    -.I DIR\fR.\fP
    -
    -.TP
    -.BI "-j \fR,\fP --enable-jpreg-export"
    -Enable JP registration export (disabled by default).
    -
    -.TP
    -.BI \-m " STRING" "\fR,\fP --mysql " STRING
    -.I STRING
    -is a database connect string in the form
    - 
    -USER_NAME/PASSWORD@DB_HOSTNAME:DB_NAME
    -
    -It defaults to lbserver/@localhost:lbserver20.
    -
    -.TP
    -.B "-n, --noauth"
    -Turn off any authorization.
    -
    -.TP
    -.BI \-p " NUM" "\fR,\fP --port " NUM
    -Listen on the port
    -.I NUM\fR.\fP
    -
    -.TP
    -.BI \-w " NUM" "\fR,\fP --wsport " NUM
    -Set port to serve the web services requests to
    -.I NUM\fR.
    -
    -.TP
    -.B "-r\fR,\fP --rgmaexport"
    -Write state info into the RGMA interface. Experimental.
    -
    -.TP
    -.BI -s " NUM" "\fR,\fP --slaves " NUM
    -Fork
    -.I NUM
    -slaves.
    -
    -.TP
    -.BI --super-user " USER" "\fR,\fP  --super-user-file " FILE
    -Bypass query authorization (i.e. return results anyway) when 
    -USER (or users listed in FILE) connect.
    -
    -.TP
    -.BI --no-index " NUM"
    -Disable checking the indices for superusers (NUM=1) or entirely (NUM=2).
    -
    -.TP
    -.BI --strict-locking
    -.I (not recommended).
    -Use a more strict locking strategy -- lock jobs sooner, when events
    -are stored, not just for status update.
    -This prevents a non-probable but still possible race
    -condition with parallel purge but may slow down processing on
    -heavy loaded servers. Anyway, the only consequence of the race condition
    -is a little garbage left in the database which is cleaned 
    -form time to time anyway.
    -
    -.TP
    -.BI --notif-il-sock " SOCK
    -Socket
    -.I SOCK
    -to send notifications.
    -
    -.TP
    -.BI --notif-il-sock " PREFIX
    -File
    -.I PREFIX
    -for notifications.
    -
    -.TP
    -.BI --count-statistics " NUM
    -Count certain statistics on jobs for superusers (NUM=1) or for all (NUM=2).
    -
    -.TP
    -.BI -t " NUM" "\fR,\fP --request-timeout " NUM
    -Request timeout
    -.I NUM
    -for one client.
    -
    -.TP
    -.BI --silent
    -Do not print diagnostic, even if -d is on.
    -
    -.TP
    -.BI -g \fP --greyjobs
    -Allow delayed registration (grey jobs), implies --strict-locking.
    -
    -.TP
    -.BI -A\fR,\fP --enable-lcas
    -Activate LCAS-based authorization.
    -
    -.TP
    -.BI -I\fR,\fP --rss-time " NUM"
    -Set the maximal age (in seconds) of states published via RSS.
    -
    -.TP
    -.BI -P\fR,\fP --proxyonly          
    -Run only proxy service.
    -
    -.TP
    -.BI -B\fR,\fP --withproxy
    -Run both server and proxy service.
    -
    -.TP
    -.BI -o\fR,\fP --sock
    -Path-name to the local socket for communication with LB proxy.
    -
    -.TP
    -.BI -q\fR,\fP --con-queue
    -Size of the connection queue (accept).
    -
    -.TP
    -.BI -W\fR,\fP --proxy-il-sock
    -Socket to send events to.
    -
    -.TP
    -.BI -Z\fR,\fP --proxy-il-fprefix
    -File prefix for events.
    -
    -.TP
    -.BI -G\fR,\fP --proxy-purge
    -Enable automatic purging of the jobs in terminal state for proxy service (disabled by default, purging cron job installed by YAIM).
    -
    -.TP
    -.BI -E\fR,\fP --exclusive-zombies-off
    -Disable checking of purged jobs when registering jobs with the EDG_WLL_LOGLFLAG_EXCL flag set. 
    -
    -.\".SH USAGE
    -.\" Add any additional description here
    -
    -.PP
    -
    -.SH FILES
    -.TP
    -.I /var/run/edg-bkserverd.pid
    -if running as root (not recommended).
    -
    -.TP
    -.I $HOME/edg-bkserverd.pid
    -otherwise.
    -
    -.TP
    -File to store pid and to generate semaphores key.
    -
    -.TP
    -No configuration files needed.
    -
    -.SH ENVIRONMENT
    -.TP
    -.B X509_USER_KEY
    -If
    -.B \fR$\fPX509_USER_KEY
    -is set, it is used to locate private key file.
    -
    -.TP
    -.B X509_USER_CERT
    -If
    -.B \fR$\fPX509_USER_CERT
    -is set, it is used to locate certificate file.
    -
    -.TP
    -.B X509_CERT_DIR
    -If
    -.B \fR$\fPX509_CERT_DIR
    -is set, it is used to locate the trusted CA's certificates and ca-signing-policy files.
    -
    -.TP
    -.B X509_USER_PROXY
    -If
    -.B \fR$\fPX509USER_PROXY
    -is set, it is used to locate proxy certificate file.
    -
    -.TP
    -.B EDG_WL_RGMA_FILE
    -If
    -.B \fR$\fPEDG_WL_RGMA_FILE
    -is set, it is used as name of file for sharing data with RGMA services.
    -
    -.TP
    -.B EDG_WL_RGMA_SOCK
    -If
    -.B \fR$\fPEDG_WL_RGMA_SOCK
    -is set, it is  used as name of socket for communication with RGMA.
    -
    -.SH BUGS
    -In a case of a sudden crash, alive slave processes may survive or some resources (IPC locks, open ports) may stay allocated. Please, deal with such problems via standard commands
    -.B kill\fR and\fP ipcrm\fR.\fP
    -
    -Please, report all bugs to EU EGEE Bug Tracking System located at https://savannah.cern.ch
    -
    -.SH SEE ALSO
    -.B glite-lb-bkindex\fR(8),\fP glite-lb-purge\fR(8),\fP glite-lb-interlogd\fR(8),\fP glite-lb-logd\fR(8),\fP glite-lb-logevent\fR(1),\fP
    -
    -.SH AUTHOR
    -EU EGEE, JRA1.
    diff --git a/org.glite.lb.server/doc/glite-lb-mon-db.1 b/org.glite.lb.server/doc/glite-lb-mon-db.1
    deleted file mode 100644
    index ab0eefd..0000000
    --- a/org.glite.lb.server/doc/glite-lb-mon-db.1
    +++ /dev/null
    @@ -1,57 +0,0 @@
    -.TH GLITE-LB-MON-DB 1 "Mar 2006" "EU EGEE Project" "Logging & Bookkeeping Utils"
    -
    -.SH NAME
    -glite-lb-mon-db - program for monitoring the number of jobs in the LB system
    -
    -.SH SYNOPSIS
    -.B glite-lb-mon-db
    -.B [-m dbstring -d -v -h]
    -.br
    -
    -.SH DESCRIPTION
    -.B glite-lb-mon-db
    -is a low-level program for monitoring the the number of jobs in the LB system. 
    -Using the LB internals, it connects directly to the underlying MySQL database and reads
    -the number of jobs in each state.
    -
    -.SH OPTIONS
    -.TP
    -.B \-m dbstring, \-\-mysql=dbstring
    -Use non-default database connection string.
    -
    -.TP
    -.B \-d, \-\-debug
    -Print debug info (if any).
    -
    -.TP
    -.B \-v, \-\-verbose
    -Be verbose.
    -
    -.TP
    -.B \-h, \-\-help
    -Display help and exit.
    -
    -.SH EXAMPLES
    -.TP 
    -.BI glite-lb-mon-db 
    -this is the default usage
    -.TP
    -.BI glite-lb-mon-db \ -m \ lbserver/@localhost:lbproxy
    -use this dbstring to query the LB Proxy database. WARNING: the data in the LB Proxy may be incomplete!
    -
    -.SH ENVIRONMENT
    -.TP
    -.B MYSQL_UNIX_PORT
    -set this environment variable to specify the path to the non-default MySQL socket path
    -.TP
    -.B LBDB
    -you can set this environment variable as an alternative to specify the non-default database connection string
    -
    -.SH REPORTING BUGS
    -Please, report all bugs to EU EGEE Bug Tracking System located at https://savannah.cern.ch/bugs/?func=additem&group=jra1mdw 
    -
    -.SH SEE ALSO
    -.BR glite-lb-mon (1)
    -
    -.SH AUTHOR
    -EU EGEE JRA1, CESNET group.
    diff --git a/org.glite.lb.server/interface/index.h b/org.glite.lb.server/interface/index.h
    deleted file mode 100644
    index 4589244..0000000
    --- a/org.glite.lb.server/interface/index.h
    +++ /dev/null
    @@ -1,59 +0,0 @@
    -#ifndef GLITE_LB_INDEX_H
    -#define GLITE_LB_INDEX_H
    -
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include "glite/lb/query_rec.h"
    -
    -int edg_wll_QueryJobIndices(edg_wll_Context,edg_wll_QueryRec ***,char ***);
    -int edg_wll_QueryNotifIndices(edg_wll_Context,edg_wll_QueryRec ***,char ***);
    -int edg_wll_ColumnToQueryRec(const char *,edg_wll_QueryRec *);
    -char * edg_wll_QueryRecToColumn(const edg_wll_QueryRec *);
    -char * edg_wll_QueryRecToColumnExt(const edg_wll_QueryRec *);
    -
    -int edg_wll_ParseIndexConfig(edg_wll_Context,const char *,edg_wll_QueryRec ***);
    -int edg_wll_DumpIndexConfig(edg_wll_Context,const char *,edg_wll_QueryRec * const *);
    -
    -int edg_wll_CmpColumn(const edg_wll_QueryRec *,const edg_wll_QueryRec *);
    -
    -char *edg_wll_StatToSQL(edg_wll_JobStat const *stat,edg_wll_QueryAttr attr);
    -char *edg_wll_JDLStatToSQL(edg_wll_JobStat const *stat, edg_wll_QueryRec col_rec);
    -
    -
    -typedef struct _edg_wll_IColumnRec {
    -	edg_wll_QueryRec	qrec;
    -	char *			colname;
    -} edg_wll_IColumnRec;
    -
    -void edg_wll_FreeIColumnRec(edg_wll_IColumnRec *);
    -edg_wll_ErrorCode edg_wll_IColumnsSQLPart(edg_wll_Context, void *,  edg_wll_JobStat*, int , char **, char **);
    -
    -int yylex();
    -
    -extern int	lex_int;
    -extern char	*lex_out;
    -extern int	lex_line;
    -
    -#define STD_PREFIX	"STD_"
    -#define USR_PREFIX	"USR_"
    -#define TIME_PREFIX	"TIME_"
    -#define JDL_PREFIX	"JDL_"
    -
    -#endif /* GLITE_LB_INDEX_H */
    diff --git a/org.glite.lb.server/interface/lb_authz.h b/org.glite.lb.server/interface/lb_authz.h
    deleted file mode 100644
    index 9691526..0000000
    --- a/org.glite.lb.server/interface/lb_authz.h
    +++ /dev/null
    @@ -1,99 +0,0 @@
    -#ifndef GLITE_LB_LB_AUTHZ_H
    -#define GLITE_LB_LB_AUTHZ_H
    -
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -#ifndef NO_GACL
    -#include 
    -#endif
    -#include 
    -
    -typedef struct _edg_wll_Acl {
    -#ifndef NO_GACL
    -	GRSTgaclAcl	*value;
    -#else
    -	void	*value;	/* XXX */
    -#endif
    -	char	*string;
    -} _edg_wll_Acl;
    -typedef struct _edg_wll_Acl *edg_wll_Acl;
    -
    -#ifndef NO_GACL
    -
    -extern int
    -edg_wll_DecodeACL(char *, GRSTgaclAcl **);
    -
    -extern int
    -edg_wll_EncodeACL(GRSTgaclAcl *, char **);
    -
    -#else
    -
    -extern int
    -edg_wll_DecodeACL(char *, void **);
    -
    -extern int
    -edg_wll_EncodeACL(void *, char **);
    -
    -#endif /* NO_GACL */
    -
    -/* we have NO_VOMS||NO_GACL placeholders for following routines */
    -
    -extern int
    -edg_wll_InitAcl(edg_wll_Acl *);
    -
    -extern void
    -edg_wll_FreeAcl(edg_wll_Acl);
    -
    -extern int
    -edg_wll_UpdateACL(edg_wll_Context, glite_jobid_const_t, char *, int, int, int, int);
    -
    -extern int
    -edg_wll_CheckACL(edg_wll_Context, edg_wll_Acl, int);
    -
    -extern int
    -edg_wll_GetACL(edg_wll_Context, glite_jobid_const_t, edg_wll_Acl *);
    -
    -extern int
    -edg_wll_SetVomsGroups(edg_wll_Context, edg_wll_GssConnection *, char *, char *, char *, char *);
    -
    -extern void
    -edg_wll_FreeVomsGroups(edg_wll_VomsGroups *);
    -
    -extern int
    -check_store_authz(edg_wll_Context ctx, edg_wll_Event *ev);
    -
    -int edg_wll_amIroot(const char *subj, char **fqans,edg_wll_authz_policy policy);
    -
    -edg_wll_authz_policy
    -edg_wll_get_server_policy();
    -
    -int
    -edg_wll_get_fqans(edg_wll_Context ctx, struct vomsdata *voms_info,
    -                  char ***fqans);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* GLITE_LB_LB_AUTHZ_H */
    diff --git a/org.glite.lb.server/interface/pretty_print_wrapper.h b/org.glite.lb.server/interface/pretty_print_wrapper.h
    deleted file mode 100644
    index 8d91f8d..0000000
    --- a/org.glite.lb.server/interface/pretty_print_wrapper.h
    +++ /dev/null
    @@ -1,27 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -int pretty_print(char *jdl, char **formated_print);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    diff --git a/org.glite.lb.server/interface/query.h b/org.glite.lb.server/interface/query.h
    deleted file mode 100644
    index 43124e8..0000000
    --- a/org.glite.lb.server/interface/query.h
    +++ /dev/null
    @@ -1,36 +0,0 @@
    -#ifndef GLITE_LB_QUERY_H
    -#define GLITE_LB_QUERY_H
    -
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include "glite/jobid/cjobid.h"
    -#include "glite/lb/context.h"
    -#include "glite/lb/events.h"
    -#include "glite/lb/jobstat.h"
    -#include "glite/lb/query_rec.h"
    -
    -int convert_event_head(edg_wll_Context,char **,edg_wll_Event *);
    -int check_strict_jobid(edg_wll_Context, glite_jobid_const_t);
    -int match_status(edg_wll_Context, const edg_wll_JobStat *oldstat, const edg_wll_JobStat *stat,const edg_wll_QueryRec **conditions);
    -int check_job_query_index(edg_wll_Context, const edg_wll_QueryRec **);
    -
    -#define NOTIF_ALL_JOBS	"all_jobs"
    -
    -#endif /* GLITE_LB_QUERY_H */
    diff --git a/org.glite.lb.server/interface/srv_perf.h b/org.glite.lb.server/interface/srv_perf.h
    deleted file mode 100644
    index 9ce5e1a..0000000
    --- a/org.glite.lb.server/interface/srv_perf.h
    +++ /dev/null
    @@ -1,47 +0,0 @@
    -#ifndef GLITE_LB_SRV_PERF_H
    -#define GLITE_LB_SRV_PERF_H
    -
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -enum lb_srv_perf_sink {
    -	GLITE_LB_SINK_NONE = 0,	// standard behaviour, no sinking
    -
    -	GLITE_LB_SINK_PARSE,	// skip everything, only read message and
    -				// generate reply 
    -				// skips decode_il_msg, db_store 
    -
    -	GLITE_LB_SINK_STORE,	// do no store data to DB, only decode_il_msg
    -				// and edg_wll_ParseEvent
    -				// skips edg_wll_LockJob, edg_wll_StoreEvent 
    -				// edg_wll_UpdateACL, edg_wll_StepIntState,
    -				// edg_wll_EventSendProxy, edg_wll_NotifMatch
    -
    -	GLITE_LB_SINK_STATE,	// do not perform state computation, only save 
    -				// event to DB
    -				// skips edg_wll_StepIntState
    -				// edg_wll_EventSendProxy, edg_wll_NotifMatch
    -
    -	GLITE_LB_SINK_SEND,
    -};
    -
    -
    -extern enum lb_srv_perf_sink sink_mode;
    -
    -#endif /* GLITE_LB_SRV_PERF_H */
    diff --git a/org.glite.lb.server/interface/store.h b/org.glite.lb.server/interface/store.h
    deleted file mode 100644
    index 77c4a10..0000000
    --- a/org.glite.lb.server/interface/store.h
    +++ /dev/null
    @@ -1,69 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#ifndef GLITE_LB_STORE_H
    -#define GLITE_LB_STORE_H
    -
    -#include "jobstat.h"
    -#include "lb_authz.h"
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/* store an event into the LB database */
    -
    -int edg_wll_StoreEvent(
    -	edg_wll_Context,	/* INOUT */
    -	edg_wll_Event *,	/* IN */
    -	const char *,		/* IN */
    -	int *
    -);
    -
    -void edg_wll_StoreAnonymous(
    -	edg_wll_Context,    /* INOUT */
    -	int		/* IN (boolean) */
    -);
    -
    -int db_store(edg_wll_Context, char *);
    -int db_parent_store(edg_wll_Context, edg_wll_Event *, intJobStat *);
    -int handle_request(edg_wll_Context,char *);
    -int handle_il_message(edg_wll_Context,char *);
    -int create_reply(const edg_wll_Context,char **);
    -int is_job_local(edg_wll_Context, glite_jobid_const_t jobId);
    -int store_job_server_proxy(edg_wll_Context ctx, edg_wll_Event *event, int *register_to_JP);
    -int register_subjobs_embryonic(edg_wll_Context,const edg_wll_RegJobEvent *);
    -edg_wll_ErrorCode intJobStat_embryonic(edg_wll_Context ctx, glite_jobid_const_t jobid, const edg_wll_RegJobEvent *e, intJobStat *stat);
    -
    -
    -int edg_wll_delete_event(edg_wll_Context,const char *, int);
    -
    -
    -#define USER_UNKNOWN	"unknown"
    -
    -/* flags for JP registrations */
    -#define REG_JOB_TO_JP		1
    -#define REG_SUBJOBS_TO_JP	2
    -
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* GLITE_LB_STORE_H */
    diff --git a/org.glite.lb.server/project/.cvsignore b/org.glite.lb.server/project/.cvsignore
    deleted file mode 100644
    index 2b56473..0000000
    --- a/org.glite.lb.server/project/.cvsignore
    +++ /dev/null
    @@ -1,6 +0,0 @@
    -MultiStruct.pm
    -StructField.pm
    -at3
    -events.T
    -status.T
    -types.T
    diff --git a/org.glite.lb.server/project/ChangeLog b/org.glite.lb.server/project/ChangeLog
    deleted file mode 100644
    index e1889b6..0000000
    --- a/org.glite.lb.server/project/ChangeLog
    +++ /dev/null
    @@ -1,165 +0,0 @@
    -1.8.0-1 (lb-1.7.0-1)
    -- add FQAN-based specification of superusers
    -- avoid giving no answer to client on some errors during purge (bug #30256)
    -
    -1.8.1-1 (lb-1.7.1-1)
    -- don't propagate errors from sent notifications to IL
    -- added man pages (not perfect yet)
    -- allow setting debug flags in startup script
    -- added run-time dependence on mysql-server
    -- fixed several memleaks
    -- ignore shallow branch seqence code for events coming from UI and NS
    -  (fixes impossibility to clear jobs with ReallyRunning events)
    -
    -1.8.2-1 (lb-1.7.2-1)
    -- fix debug output redirection without tscat in startup script
    -- support notification expiration in interlogger
    -- implement expired notification purging on server
    -- rewrite internal event number increment code to avoid race & inifinit loop
    -  with read-consistent transactional database (should fix bug #27555)
    -- revert enforced "strict locking" with transcactions (not needed anymore)
    -
    -1.8.3-1 (lb-1.7.4-1)
    -- JP plugin: implementation of finalDoneStatus and history status attributes
    -- fix double-free in state machine
    -
    -1.9.0-1 (lb-1.8.0-1)
    -- store dumps in GLITE_LOCATION_VAR rather than /tmp
    -- don't waste memory while reindexing
    -- handle subjob embryos in reindexing
    -- unify error handling for store and query
    -- don't clobber store errors with job unlocking
    -- don't send CollectionState from lb proxy to server
    -- export UI host and VOMS FQAN to RGMA
    -- don't coredump on requesting notifications that are denied
    -- don't return empty results for some non-indexed queries
    -
    -1.9.1-1
    -- clarified soap error messages
    -
    -2.0.0-1
    -- LB 2.0 release
    -
    -2.0.0-2
    -- fixed configure to work in etics
    -
    -2.0.0-3
    -- configure script update (globus flavors added to configure call)
    -
    -2.0.0-4
    -- fixed server dependency on voms-api-cpp instead of voms-api-c in configure
    -
    -2.0.0-5
    -- fixed credential setting via gsoap-plugin (switching to a newly introduced API call)
    -- minor initialization/freeing fixes
    -- printout typo fix
    -
    -2.0.1-1
    -- (from 1.9.2-1) Support for chconfig in startup scripts (#27055)
    -- (from 1.9.2-1) Support for JP importer in startup scripts
    -- (from 1.9.2-1) Support for variant DN certificates (workaround for #41820)
    -- (from 1.9.2-1) Recalculate subjob states after DB version upgrade (#25871)
    -- (from 1.9.2-1) Ignore reseource_usage events when computing job states (#43767)
    -- (from 1.9.2-1) Fix sequence code processing for Change ACL events
    -- (from 1.9.2-1) WS example fix
    -- Reflect job conditions while processing queries for events (#32390)
    -- Support for 'greater' and 'smalleer' comparisons in jobids 
    -- Modified handling of state-dependent timeouts.
    -
    -2.0.1-2
    -- Notif IL installation removed from makefile
    -- configure script updated
    -
    -2.0.2-1
    -- RSS feed implementation
    -- Fixed notification expiry
    -- Fixes to ACL handling
    -- Fixed authorization in simple interface
    -- Support for JDL changes in JDL-based notifications
    -- Initial implementation of WS notifications
    -
    -2.0.2-2
    -- build wrt. voms 1.9.8 (globus-less)
    -
    -2.0.2-3
    -- Makefile relies on the libdir variable
    -- New configure script
    -
    -2.0.3-1
    -- Updated migration script
    -- Memleak fixes
    -- Support for background purge funcionality
    -
    -2.0.3-2
    -- Rebuild with lb.state-machine 1.0.2-1
    -
    -2.0.3-3
    -- install libraries into $libdir
    -- buildtime dependency pn c-ares
    -
    -2.0.4-1
    -- Consider arch libdir when linking c-ares
    -- Checking the c-ares version, fix for c-ares >= 1.5.0.
    -
    -2.0.5-1
    -- Reflect updates in the database module
    -- Adjusted grey job purges
    -- Purge undefined or unknown jobs
    -
    -2.0.6-1
    -- Fixed collection state with cancelled subjobs
    -
    -2.0.7-1
    -- Starting proxy support
    -- Fixed collection state with cancelled subjobs
    -
    -2.0.7-2
    -- Rebuild with gridsite 1.5.10.5-3
    -
    -2.0.8-1
    -- Startup script fixes
    -
    -2.0.9-1
    -- Compatibility with IPv6 compliant clients
    -
    -2.1.0-1
    -- Advanced Autorization (used by LCAS plugin too, old configuration file not supported anymore)
    -- Adoption of the Common Logging Format
    -- Fixed startup script (Savannah Bug #29081)
    -- Memory consumption limits applied to notification delivery.
    -- IPv6 fixes
    -- Automatic immediate proxy purge disabled by default
    -- WS connetions handled on main port, too
    -- Relation 'changed' implemented for other relevant attributes rather than just Job State
    -- Relation 'within' implemented for more relevant attributes
    -- Duplicated events are not reported back to sending component
    -- Cancelled subjob treated as Done when computing state of collection
    -- Support for logging sandbox transfers as jobs of a specific type
    -- Support for CREAM jobs
    -- Improved error reporting from notification calls
    -- Improved smooth purging in collections
    -- Notifications on job purge
    -- RegJob event WMS_DN implementation
    -- RegJob event EDG_WLL_LOGLFLAG_EXCL implementation
    -- Primitive AGU compatibility
    -
    -2.1.1-1
    -- Startup script update
    -
    -2.1.2-1
    -- LB internal authZ routine used as a primary option to check access rights on consumer side.
    -  - LCAS can be configured to provide additional authZ.
    -- AuthZ settings allow empty attributes
    -- Additional error handling code
    -
    -2.1.3-1
    -- Configuration files moved from /etc to /etc/lb
    -- Minor type conversion fix
    -
    -2.1.4-1
    -- Broader authorization policy format
    -
    -2.1.5-1
    -- READ_ALL and PURGE authorization
    -- Refactoring of WS error handling
    -
    diff --git a/org.glite.lb.server/project/build.number b/org.glite.lb.server/project/build.number
    deleted file mode 100644
    index 10fccab..0000000
    --- a/org.glite.lb.server/project/build.number
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -#Fri Aug 18 12:32:02 CEST 2006
    -module.build=0245
    diff --git a/org.glite.lb.server/project/build.properties b/org.glite.lb.server/project/build.properties
    deleted file mode 100644
    index e69de29..0000000
    diff --git a/org.glite.lb.server/project/package.description b/org.glite.lb.server/project/package.description
    deleted file mode 100644
    index 9468cb5..0000000
    --- a/org.glite.lb.server/project/package.description
    +++ /dev/null
    @@ -1 +0,0 @@
    -glite-lb-server is the gLite LB server. This package contains the LB server daemon (glite-lb-bkserverd) and a tool for rebuilding server indices (glite-lb-bkindex).
    diff --git a/org.glite.lb.server/project/package.summary b/org.glite.lb.server/project/package.summary
    deleted file mode 100644
    index c5ac102..0000000
    --- a/org.glite.lb.server/project/package.summary
    +++ /dev/null
    @@ -1 +0,0 @@
    -gLite Logging and Bookkeeping server
    diff --git a/org.glite.lb.server/project/tar_exclude b/org.glite.lb.server/project/tar_exclude
    deleted file mode 100644
    index b3133e4..0000000
    --- a/org.glite.lb.server/project/tar_exclude
    +++ /dev/null
    @@ -1,10 +0,0 @@
    -tar_exclude
    -CVS
    -build.xml
    -build
    -build.properties
    -properties.xml
    -configure-options.xml
    -.cvsignore
    -.project
    -.cdtproject
    diff --git a/org.glite.lb.server/project/version.properties b/org.glite.lb.server/project/version.properties
    deleted file mode 100644
    index 1f8b44c..0000000
    --- a/org.glite.lb.server/project/version.properties
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -# : /cvs/jra1mw/org.glite.lb.server/project/version.properties,v 1.185 2008/06/25 13:12:58 akrenek Exp $
    -module.version=2.1.5
    -module.age=1
    diff --git a/org.glite.lb.server/src/authz_policy.c b/org.glite.lb.server/src/authz_policy.c
    deleted file mode 100644
    index bbc5492..0000000
    --- a/org.glite.lb.server/src/authz_policy.c
    +++ /dev/null
    @@ -1,179 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    -#include 
    -
    -#include 
    -#include "authz_policy.h"
    -
    -struct action_name action_names[] = {
    -    { ADMIN_ACCESS,	"ADMIN_ACCESS" },
    -    { STATUS_FOR_MONITORING,	"STATUS_FOR_MONITORING" },
    -    { LOG_WMS_EVENTS,	"LOG_WMS_EVENTS" },
    -    { LOG_CE_EVENTS,	"LOG_CE_EVENTS" },
    -    { LOG_GENERAL_EVENTS,	"LOG_GENERAL_EVENTS" },
    -    { GET_STATISTICS,	"GET_STATISTICS" },
    -    { REGISTER_JOBS,	"REGISTER_JOBS" },	
    -    { READ_ALL, "READ_ALL" },
    -    { PURGE, "PURGE" },
    -};
    -
    -static int num_actions =
    -    sizeof(action_names) / sizeof(action_names[0]);
    -
    -struct attr_id_name attr_id_names[] = {
    -    { ATTR_SUBJECT,	"subject" },
    -    { ATTR_FQAN,	"fqan" },
    -};
    -
    -static int num_attrs =
    -    sizeof(attr_id_names) / sizeof(attr_id_names[0]);
    -
    -static int
    -check_rule(_edg_wll_authz_rule *rule, edg_wll_GssPrincipal principal)
    -{
    -    int i, found;
    -    char **f;
    -    _edg_wll_authz_attr *a;
    -
    -    if (rule->attrs_num == 0)
    -	return 0;
    -
    -    for (i = 0; i < rule->attrs_num; i++) {
    -	a = rule->attrs + i;
    -	if (strcmp(a->value, ".*") == 0)
    -	    continue;
    -
    -	switch (a->id) {
    -	    case ATTR_SUBJECT:
    -		if (!edg_wll_gss_equal_subj(a->value, principal->name))
    -		    return 0;
    -		break;
    -	    case ATTR_FQAN:
    -		found = 0;
    -		for (f = principal->fqans; f && *f; f++)
    -		    if (strcmp(a->value, *f) == 0) {
    -			found = 1;
    -			break;
    -		}
    -		if (!found)
    -		    return 0;
    -		break;
    -	    default:
    -		return 0;
    -	}
    -    }
    -
    -    return 1;
    -}
    -
    -
    -int
    -check_authz_policy(edg_wll_authz_policy policy,
    -		   edg_wll_GssPrincipal principal,
    -		   authz_action action)
    -{
    -    int i;
    -    _edg_wll_authz_action *a;
    -
    -    if (policy == NULL)
    -        return 0;
    -
    -    for (i = 0; i < policy->actions_num; i++) {
    -	if (policy->actions[i].id == action)
    -	   break;
    -    }
    -    if (i == policy->actions_num)
    -	/* Access denied by default */
    -	return 0;
    -
    -    a = policy->actions + i;
    -    for (i = 0; i < a->rules_num; i++) {
    -	if (check_rule(a->rules+i, principal))
    -	    return 1;
    -    }
    -    return 0;
    -}
    -
    -authz_action
    -find_authz_action(const char *name)
    -{
    -    int i;
    -    
    -    for (i = 0; i < num_actions; i++)
    -	if (strcmp(action_names[i].name, name) == 0)
    -	    return action_names[i].action;
    -    return ACTION_UNDEF;
    -}
    -
    -const char *
    -action2name(authz_action a)
    -{
    -    int i;
    -
    -    for (i = 0; i < num_actions; i++)
    -	if (action_names[i].action == a)
    -	    return action_names[i].name;
    -    return NULL;
    -}
    -
    -authz_attr_id
    -find_authz_attr(const char *name)
    -{
    -    int i;
    -
    -    for (i = 0; i < num_attrs; i++)
    -	if (strcmp(attr_id_names[i].name, name) == 0)
    -	    return attr_id_names[i].id;
    -    return ATTR_UNDEF;
    -}
    -
    -int
    -blacken_fields(edg_wll_JobStat *stat, int flags)
    -{
    -    edg_wll_JobStat new_stat;
    -
    -    edg_wll_InitStatus(&new_stat);
    -
    -    if (flags & STATUS_FOR_MONITORING) {
    -	new_stat.state = stat->state;
    -	edg_wlc_JobIdDup(stat->jobId, &new_stat.jobId);
    -	if (stat->jdl)
    -	    new_stat.jdl = strdup(stat->jdl);
    -	if (stat->destination)
    -	    new_stat.destination = strdup(stat->destination);
    -	if (stat->network_server)
    -	    new_stat.network_server = strdup(stat->network_server);
    -	new_stat.stateEnterTime = stat->stateEnterTime;
    -	new_stat.lastUpdateTime = stat->lastUpdateTime;
    -	if (stat->stateEnterTimes) {
    -	    int i = 1 + stat->stateEnterTimes[0];
    -	    new_stat.stateEnterTimes = malloc(sizeof(*stat->stateEnterTimes)*i);
    -	    memcpy(new_stat.stateEnterTimes, stat->stateEnterTimes,
    -		   sizeof(*stat->stateEnterTimes)*i);
    -	}
    -	if (stat->ui_host)
    -	    new_stat.ui_host = strdup(stat->ui_host);
    -    }
    -
    -    edg_wll_FreeStatus(stat);
    -    memset(stat, 0, sizeof(*stat));
    -    edg_wll_CpyStatus(&new_stat, stat);
    -    edg_wll_FreeStatus(&new_stat);
    -    return 0;
    -}
    diff --git a/org.glite.lb.server/src/authz_policy.h b/org.glite.lb.server/src/authz_policy.h
    deleted file mode 100644
    index c335fb3..0000000
    --- a/org.glite.lb.server/src/authz_policy.h
    +++ /dev/null
    @@ -1,72 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef GLITE_LB_AUTHZ_POLICY_H
    -#define GLITE_LB_AUTHZ_POLICY_H
    -
    -#include 
    -#include 
    -#include 
    -
    -typedef enum {
    -    ACTION_UNDEF	= 0,
    -    ADMIN_ACCESS	= ~0,
    -    STATUS_FOR_MONITORING = 1 << 1,
    -    LOG_WMS_EVENTS	= 1 << 2,
    -    LOG_CE_EVENTS	= 1 << 3,
    -    LOG_GENERAL_EVENTS	= 1 << 4,
    -    GET_STATISTICS	= 1 << 5,
    -    REGISTER_JOBS	= 1 << 6,
    -    READ_ALL		= 1 << 7,
    -    PURGE		= 1 << 8,
    -} authz_action;
    -
    -typedef struct action_name {
    -    authz_action action;
    -    const char *name;
    -} action_name;
    -
    -typedef enum {
    -    ATTR_UNDEF		= 0,
    -    ATTR_SUBJECT	= 1,
    -    ATTR_FQAN		= 2,
    -} authz_attr_id;
    -
    -struct attr_id_name {
    -    authz_attr_id id;
    -    const char *name;
    -} attr_id_name;
    -
    -int
    -parse_server_policy(edg_wll_Context ctx, const char *filename, edg_wll_authz_policy policy);
    -
    -int
    -check_authz_policy(edg_wll_authz_policy, edg_wll_GssPrincipal, authz_action);
    -
    -authz_action
    -find_authz_action(const char *name);
    -
    -const char *
    -action2name(authz_action);
    -
    -authz_attr_id
    -find_authz_attr(const char *name);
    -
    -int
    -blacken_fields(edg_wll_JobStat *, int flags);
    -
    -#endif
    diff --git a/org.glite.lb.server/src/bkindex.c b/org.glite.lb.server/src/bkindex.c
    deleted file mode 100644
    index e0d302b..0000000
    --- a/org.glite.lb.server/src/bkindex.c
    +++ /dev/null
    @@ -1,467 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/jobid/strmd5.h"
    -#include "glite/lbu/trio.h"
    -#include "glite/lb/context-int.h"
    -#include "index.h"
    -#include "jobstat.h"
    -#include "db_supp.h"
    -#include "openserver.h"
    -#include "db_calls.h"
    -
    -#ifdef LB_PERF
    -#include "glite/lb/lb_perftest.h"
    -#include "srv_perf.h"
    -
    -enum lb_srv_perf_sink sink_mode;
    -#endif
    -
    -/* XXX: referenced global variables, unsed in bkindex */
    -char	*server_key,*server_cert;
    -int	enable_lcas;
    -int	proxy_purge;
    -struct _edg_wll_authz_policy authz_policy;
    -char    *policy_file = NULL;
    -int	exclusive_zombies;
    -
    -static struct option opts[] = {
    -	{ "mysql",1,NULL,'m' },
    -	{ "remove",0,NULL,'R' },
    -	{ "really",0,NULL,'r' },
    -	{ "dump",0,NULL,'d' },
    -	{ "verbose",0,NULL,'v' },
    -	{ NULL, 0, NULL, 0 }
    -};
    -
    -static void usage(const char *);
    -static void do_exit(edg_wll_Context,int);
    -static char *col_list(const edg_wll_QueryRec *);
    -static char *db_col_type(const edg_wll_QueryRec *);
    -static edg_wll_ErrorCode edg_wll_RefreshIColumns(edg_wll_Context, void *);
    -
    -/* XXX: don't bother with malloc() of arrays that are tiny in real life */
    -#define CI_MAX	200
    -
    -int debug;
    -
    -int main(int argc,char **argv)
    -{
    -	int	opt;
    -	char	*dbstring = getenv("LBDB");
    -	char	*fname = "-";
    -	int	dump = 0, really = 0, verbose = 0, remove_all = 0;
    -	edg_wll_Context	ctx;
    -	edg_wll_QueryRec	**old_indices = NULL,**new_indices;
    -	edg_wll_QueryRec	*new_columns[CI_MAX],*old_columns[CI_MAX];
    -	int	add_columns[CI_MAX],drop_columns[CI_MAX];
    -	int	add_indices[CI_MAX],drop_indices[CI_MAX];
    -	edg_wll_IColumnRec *added_icols;
    -	int	nadd_icols;
    -	char	**index_names = NULL;
    -	int	i,j,k;
    -	int	nnew,nold,nadd,ndrop;
    -	char	*stmt;
    -
    -	for (i=0; idbcaps = glite_lbu_DBQueryCaps(ctx->dbctx)) == -1) do_exit(ctx, EX_SOFTWARE);
    -	if (!(ctx->dbcaps & GLITE_LBU_DB_CAP_INDEX)) {
    -		edg_wll_SetError(ctx, EDG_WLL_ERROR_DB_CALL, "index capability not available");
    -		do_exit(ctx, EX_SOFTWARE);
    -	}
    -	if (!(ctx->dbcaps & GLITE_LBU_DB_CAP_TRANSACTIONS)) {
    -		edg_wll_SetError(ctx, EDG_WLL_ERROR_DB_CALL, "transactions capability not available");
    -		do_exit(ctx, EX_SOFTWARE);
    -	}
    -	glite_lbu_DBSetCaps(ctx->dbctx, ctx->dbcaps);
    -
    -	if (edg_wll_QueryJobIndices(ctx,&old_indices,&index_names)) do_exit(ctx,EX_SOFTWARE);
    -
    -	if (dump) {
    -		if (edg_wll_DumpIndexConfig(ctx,fname,old_indices)) do_exit(ctx,EX_SOFTWARE);
    -		else if ( !remove_all ) goto quit;
    -	}
    -
    -	if (remove_all) {
    -		if (verbose) printf("Dropping all indices");
    -		for (i=0; index_names && index_names[i]; i++) {
    -			asprintf(&stmt,"alter table states drop index `%s`",index_names[i]);
    -			if (verbose) putchar('.');
    -			if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) do_exit(ctx,EX_SOFTWARE);
    -			free(stmt);
    -		}
    -		if (verbose) puts(" done");
    -		if (verbose) printf("Dropping index columns");
    -		for (i=0; old_indices && old_indices[i]; i++) {
    -			char *cname = edg_wll_QueryRecToColumn(old_indices[i]);
    -			asprintf(&stmt,"alter table states drop column `%s`",cname);
    -			if (verbose) putchar('.');
    -			if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) do_exit(ctx,EX_SOFTWARE);
    -			free(stmt);
    -			free(cname);
    -		}
    -		if (verbose) puts(" done");
    -		goto quit;
    -	}
    -
    -	if (edg_wll_ParseIndexConfig(ctx,fname,&new_indices))
    -		do_exit(ctx,edg_wll_Error(ctx,NULL,NULL) == EINVAL ? EX_DATAERR : EX_IOERR);
    -
    -	/* FIXME: check duplicate columns in indices */
    -
    -/* indices to add & drop */
    -	nadd = ndrop = 0;
    -	if (old_indices && new_indices) {
    -		for (i=0; old_indices[i]; i++) {
    -			for (j=0; new_indices[j]; j++) {
    -				for (k=0; old_indices[i][k].attr &&
    -					!edg_wll_CmpColumn(&old_indices[i][k],&new_indices[j][k]);
    -					k++);
    -				if (!old_indices[i][k].attr && !new_indices[j][k].attr) break;
    -			}
    -			if (!new_indices[j]) drop_indices[ndrop++] = i;
    -		}
    -					
    -		for (i=0; new_indices[i]; i++) {
    -			for (j=0; old_indices[j]; j++) {
    -				for (k=0; new_indices[i][k].attr &&
    -					!edg_wll_CmpColumn(&new_indices[i][k],&old_indices[j][k]);
    -					k++);
    -				if (!new_indices[i][k].attr && !old_indices[j][k].attr) break;
    -			}
    -			if (!old_indices[j]) add_indices[nadd++] = i;
    -		}
    -	}
    -	else if (new_indices) for (i=0; new_indices[i]; i++) add_indices[i] = i;
    -	else if (old_indices) for (i=0; old_indices[i]; i++) drop_indices[i] = i;
    -
    -/* old and new column sets */
    -	nold = nnew = 0;
    -	if (old_indices) for (i=0; old_indices[i]; i++) 
    -		for (j=0; old_indices[i][j].attr; j++) {
    -			for (k=0; k= 0; i++) {
    -		if (verbose) { 
    -			char	*n = col_list(old_indices[drop_indices[i]]);
    -			printf("\t%s(%s) ... ",index_names[drop_indices[i]],n); fflush(stdout);
    -			free(n);
    -		}
    -		if (really) {
    -			asprintf(&stmt,"alter table states drop index `%s`",index_names[drop_indices[i]]);
    -			if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) do_exit(ctx,EX_SOFTWARE);
    -			free(stmt);
    -		}
    -		if (verbose) puts(really ? "done" : "");
    -	}
    -
    -	if (verbose) puts("Dropping columns ...");
    -	for (i=0; iattr == EDG_WLL_QUERY_ATTR_USERTAG)
    -				added_icols[nadd_icols].qrec.attr_id.tag =
    -					strdup(new_columns[i]->attr_id.tag);
    -			nadd_icols++;
    -			free(cname);
    -		}
    -	}
    -
    -	if (nadd_icols) {
    -		added_icols[nadd_icols].qrec.attr = EDG_WLL_QUERY_ATTR_UNDEF;
    -		added_icols[nadd_icols].colname = NULL;
    -		if (verbose) puts("Refreshing data ...");
    -		if (really && edg_wll_RefreshIColumns(ctx, (void*) added_icols)) do_exit(ctx,EX_SOFTWARE);
    -	}
    -	else if (verbose) puts("No data refresh required");
    -
    -	for (nadd_icols--; nadd_icols >= 0; nadd_icols--)
    -		edg_wll_FreeIColumnRec(&added_icols[nadd_icols]);
    -	free(added_icols);
    -
    -	if (verbose) puts("Creating indices ...");
    -	for (i=0; add_indices[i] >= 0; i++) {
    -		char	*l = col_list(new_indices[add_indices[i]]);
    -		char	*n = str2md5base64(l);
    -		if (verbose) { printf("\t%s(%s) ... ",n,l); fflush(stdout); }
    -		if (really) {
    -			asprintf(&stmt,"create index `%s` on states(%s)",n,l);
    -			if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) do_exit(ctx,EX_SOFTWARE);
    -			free(stmt);
    -		}
    -		free(n); free(l);
    -		if (verbose) puts(really ? "done" : "");
    -	}
    -
    -quit:
    -	if (index_names) {
    -		for (i = 0; index_names[i]; i++) free(index_names[i]);
    -		free(index_names);
    -	}
    -	if (old_indices) {
    -		for (i = 0; old_indices[i]; i++) {
    -			for (j = 0; old_indices[i][j].attr; j++) edg_wll_QueryRecFree(&old_indices[i][j]);
    -			free(old_indices[i]);
    -		}
    -		free(old_indices);
    -	}
    -	edg_wll_Close(ctx);
    -	edg_wll_FreeContext(ctx);
    -
    -	return 0;
    -}
    -
    -static char *col_list(const edg_wll_QueryRec *ind)
    -{
    -	char	*ret,*aux,size[50] = "";
    -	int	j;
    -
    -	aux = edg_wll_QueryRecToColumn(ind);
    -	if (ind->value.i) sprintf(size,"(%d)",ind->value.i);
    -	asprintf(&ret,"`%s`%s",aux,size);
    -	free(aux);
    -
    -	for (j=1; ind[j].attr; j++) {
    -		char	*n = edg_wll_QueryRecToColumn(ind+j),size[50] = "";
    -		if (ind[j].value.i) sprintf(size,"(%d)",ind[j].value.i);
    -		aux = ret;
    -		asprintf(&ret,"%s,`%s`%s",aux,n,size);
    -		free(n); free(aux);
    -	}
    -	return ret;
    -}
    -
    -static char *db_col_type(const edg_wll_QueryRec *r)
    -{
    -	switch (r->attr) {
    -		case EDG_WLL_QUERY_ATTR_OWNER:
    -		case EDG_WLL_QUERY_ATTR_LOCATION:
    -		case EDG_WLL_QUERY_ATTR_DESTINATION:
    -		case EDG_WLL_QUERY_ATTR_USERTAG:
    -		case EDG_WLL_QUERY_ATTR_HOST:
    -		case EDG_WLL_QUERY_ATTR_CHKPT_TAG:
    -		case EDG_WLL_QUERY_ATTR_NETWORK_SERVER:
    -		case EDG_WLL_QUERY_ATTR_JDL_ATTR:
    -			/* XXX: 255 may not be enough for location or destination */
    -			return "varchar(255) binary null"; 
    -
    -		case EDG_WLL_QUERY_ATTR_TIME:
    -		case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
    -		case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
    -			return "datetime null";
    -		default:
    -			return NULL;
    -	}
    -}
    -
    -static void do_exit(edg_wll_Context ctx,int code)
    -{
    -	char	*et,*ed;
    -
    -	edg_wll_Error(ctx,&et,&ed);
    -	fprintf(stderr,"glite-lb-bkindex: %s (%s)\n",et,ed);
    -	edg_wll_Close(ctx);
    -	edg_wll_FreeContext(ctx);
    -	exit(code);
    -}
    -
    -static void usage(const char *me)
    -{
    -	fprintf(stderr,"usage: %s  [file]\n"
    -			"	-m,--mysql 	use non-default database connection\n"
    -			"	-r,--really		really perform reindexing\n"
    -			"	-R,--remove		remove all indexes from server\n"
    -			"	-d,--dump		dump current setup\n"
    -			"	-v,--verbose		increase verbosity (2 levels)\n"
    -			"\n	-r and -d are mutually exlusive\n"
    -			"\n	-r and -R are mutually exlusive\n"
    -			"	[file] is applicable only without -d and -R\n",
    -			me);
    -}
    -
    -/*
    - * Set values of index columns in state table (after index reconfiguration)
    - */
    -
    -static edg_wll_ErrorCode edg_wll_RefreshIColumns(edg_wll_Context ctx, void *job_index_cols) {
    -
    -	glite_lbu_Statement sh;
    -	glite_lbu_Statement sh0;
    -	int njobs, ret = -1;
    -	intJobStat *stat;
    -	edg_wlc_JobId jobid;
    -	char *res[5];
    -	char *res0[1];
    -	char *rest;
    -	char *icvalues, *stmt;
    -	int i;
    -
    -	edg_wll_ResetError(ctx);
    -	if (!job_index_cols) return 0;
    -
    -	if ((njobs = edg_wll_ExecSQL(ctx, "select jobid from states", &sh0)) < 0) {
    -		glite_lbu_FreeStmt(&sh0);
    -		return edg_wll_Error(ctx, NULL, NULL);
    -	}
    -	while ((ret=edg_wll_FetchRow(ctx,sh0,sizeof(res0)/sizeof(res0[0]),NULL,res0)) >0) {
    -		do {
    -	                if (edg_wll_Transaction(ctx)) goto rollback;
    -			trio_asprintf(&stmt, "select s.jobid,s.int_status,s.seq,s.version,j.dg_jobid"
    -					" from states s, jobs j where s.jobid='%|Ss' and s.jobid=j.jobid"
    -					" for update",
    -					res0[0]);
    -			if ((edg_wll_ExecSQL(ctx, stmt ,&sh)) < 1) {
    -				glite_lbu_FreeStmt(&sh);
    -				free(stmt); stmt = NULL;
    -				goto rollback;
    -			}
    -			free(stmt); stmt = NULL;
    -			if ((ret=edg_wll_FetchRow(ctx,sh,sizeof(res)/sizeof(res[0]),NULL,res)) <= 0) {
    -				glite_lbu_FreeStmt(&sh);
    -				goto rollback;
    -			}
    -
    -			if (strcmp(res[3], INTSTAT_VERSION)) {
    -				stat = NULL;
    -				if (!edg_wlc_JobIdParse(res[4], &jobid)) {
    -					if ((stat = malloc(sizeof(intJobStat))) != NULL) {
    -						if (!edg_wll_LoadIntState(ctx, jobid, 0 /* DONT_LOCK */, -1 /*all events*/, &stat)) {
    -							destroy_intJobStat_extension(stat);
    -							free(stat);
    -							stat = NULL;
    -						} else {
    -							if (edg_wll_intJobStatus(ctx, jobid, 0, stat, 1, 0)) {
    -								free(stat);
    -								stat = NULL;
    -								if (edg_wll_Error(ctx,NULL,NULL) != 0) {
    -									if (edg_wll_Error(ctx,NULL,NULL) != ENOENT) do_exit(ctx, EX_SOFTWARE);
    -									edg_wll_ResetError(ctx);
    -								}
    -							}
    -						}
    -					}
    -					edg_wlc_JobIdFree(jobid);
    -				}
    -			} else {
    -				stat = dec_intJobStat(res[1], &rest);
    -				if (rest == NULL) stat = NULL;
    -				if (stat == NULL) fprintf(stderr,"glite-lb-bkindex: warning: "
    -							"cannot decode int_status for %s\n",res[4]);
    -			}
    -			if (stat != NULL) {
    -				edg_wll_IColumnsSQLPart(ctx, job_index_cols, &stat->pub, 0, NULL, &icvalues);
    -				trio_asprintf(&stmt, "update states set seq=%s%s where jobid='%|Ss'", res[2], icvalues, res[0]);
    -				ret = edg_wll_ExecSQL(ctx, stmt, NULL);
    -				free(icvalues);
    -				free(stmt);
    -				destroy_intJobStat(stat); free(stat);
    -			}
    -
    -			for (i = 0; i < 5; i++) free(res[i]);
    -			free(res0[0]);
    -			glite_lbu_FreeStmt(&sh);
    -
    -			if (ret < 0) goto rollback;
    -rollback:;
    -		}  while (edg_wll_TransNeedRetry(ctx));
    -		if (edg_wll_Error(ctx, NULL, NULL))  goto err;
    -	}
    -err:
    -	glite_lbu_FreeStmt(&sh0);
    -	return edg_wll_Error(ctx, NULL, NULL);
    -}
    -
    diff --git a/org.glite.lb.server/src/bkserverd.c b/org.glite.lb.server/src/bkserverd.c
    deleted file mode 100644
    index 878257c..0000000
    --- a/org.glite.lb.server/src/bkserverd.c
    +++ /dev/null
    @@ -1,1978 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -#include "soap_version.h"
    -#include 
    -#include "glite/security/glite_gsplugin.h"
    -#endif /* GLITE_LB_SERVER_WITH_WS */
    -
    -#include "glite/jobid/cjobid.h"
    -#include "glite/security/glite_gss.h"
    -#include "glite/lbu/srvbones.h"
    -#include "glite/lbu/maildir.h"
    -#include "glite/lb/context.h"
    -#include "glite/lb/mini_http.h"
    -#include "glite/lb/context-int.h"
    -#include "glite/lbu/log.h"
    -
    -#ifdef LB_PERF
    -#include "glite/lb/lb_perftest.h"
    -#include "srv_perf.h"
    -
    -enum lb_srv_perf_sink sink_mode;
    -#endif
    -
    -#include "lb_http.h"
    -#include "lb_proto.h"
    -#include "index.h"
    -#include "lb_authz.h"
    -#include "il_notification.h"
    -#include "stats.h"
    -#include "db_calls.h"
    -#include "db_supp.h"
    -#include "openserver.h"
    -#include "authz_policy.h"
    -
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -#  if GSOAP_VERSION < 20700
    -	 /*	defined in  and it's includes
    -	  *	break the build
    -	  */
    -#    undef STATUS
    -#    undef REFUSED
    -#  endif
    -#include "LoggingAndBookkeeping.nsmap"
    -#endif /* GLITE_LB_SERVER_WITH_WS */
    -
    -extern int edg_wll_StoreProto(edg_wll_Context ctx);
    -
    -extern char *lbproxy_ilog_socket_path;
    -extern char *lbproxy_ilog_file_prefix;
    -
    -
    -#ifdef LB_PERF
    -extern void _start (void), etext (void);
    -#endif
    -
    -#define CON_QUEUE		20	/* accept() */
    -#define SLAVE_OVERLOAD		10	/* queue items per slave */
    -#define CONNECT_TIMEOUT		30
    -#define IDLE_TIMEOUT		10	/* keep idle connection that many seconds */
    -#define REQUEST_TIMEOUT		120	/* one client may ask one slave multiple times */
    -					/* but only limited time to avoid DoS attacks */
    -#define DNS_TIMEOUT      	5	/* how long wait for DNS lookup */
    -#define SLAVE_CONNS_MAX		500	/* commit suicide after that many connections */
    -
    -#ifndef EDG_PURGE_STORAGE
    -#define EDG_PURGE_STORAGE	"/tmp/purge"
    -#endif
    -
    -#ifndef EDG_DUMP_STORAGE
    -#define EDG_DUMP_STORAGE	"/tmp/dump"
    -#endif
    -
    -#ifndef JPREG_DEF_DIR
    -#define JPREG_DEF_DIR		"/tmp/jpreg"
    -#endif
    -
    -/* file to store pid and generate semaphores key */
    -#ifndef EDG_BKSERVERD_PIDFILE
    -#define EDG_BKSERVERD_PIDFILE	"/var/run/glite-lb-bkserverd.pid"
    -#endif
    -
    -#ifndef GLITE_LBPROXY_SOCK_PREFIX
    -#define GLITE_LBPROXY_SOCK_PREFIX       "/tmp/lb_proxy_"
    -#endif
    -
    -#ifndef dprintf
    -#define dprintf(x)		{ if (debug) printf x; }
    -#endif
    -
    -#define sizofa(a)		(sizeof(a)/sizeof((a)[0]))
    -
    -#define	SERVICE_PROXY		DB_PROXY_JOB
    -#define SERVICE_SERVER		DB_SERVER_JOB
    -#define SERVICE_PROXY_SERVER	SERVICE_PROXY+SERVICE_SERVER
    -
    -
    -
    -int					enable_lcas = 0;
    -int						debug  = 0;
    -int						rgma_export = 0;
    -static const int		one = 1;
    -static int				noAuth = 0;
    -static int				noIndex = 0;
    -static int				strict_locking = 0;
    -static int greyjobs = 0;
    -static int count_statistics = 0;
    -static int				hardJobsLimit = 0;
    -static int				hardEventsLimit = 0;
    -static int				hardRespSizeLimit = 0;
    -static char			   *dbstring = NULL,*fake_host = NULL;
    -int        				transactions = -1;
    -int					use_dbcaps = 0;
    -static int				fake_port = 0;
    -static int				slaves = 10;
    -static char			   *purgeStorage = EDG_PURGE_STORAGE;
    -static char			   *dumpStorage = EDG_DUMP_STORAGE;
    -static char			   *jpregDir = JPREG_DEF_DIR;
    -static int				jpreg = 0;
    -static char				*server_subject = NULL;
    -
    -
    -static time_t			purge_timeout[EDG_WLL_NUMBER_OF_STATCODES];
    -static time_t			notif_duration_max = 60*60*24,
    -				notif_duration = 60*60*2;
    -int				proxy_purge = 0;
    -
    -static edg_wll_GssCred	mycred = NULL;
    -time_t					cert_mtime = 0;
    -char				   *cadir = NULL,
    -					   *vomsdir = NULL,
    -					   *server_key = NULL,
    -					   *server_cert = NULL;
    -static int		mode = SERVICE_SERVER;
    -static char             sock_store[PATH_MAX],
    -                        sock_serve[PATH_MAX];
    -static int		con_queue = CON_QUEUE;
    -static char             host[300];
    -static char *           port;
    -static time_t		rss_time = 60*60;
    -char *		policy_file = NULL;
    -struct _edg_wll_authz_policy	authz_policy = { NULL, 0};
    -static int 		exclusive_zombies = 1;
    -
    -
    -
    -
    -static struct option opts[] = {
    -        {"enable-lcas", 0, NULL,	'A'},
    -	{"cert",	1, NULL,	'c'},
    -	{"key",		1, NULL,	'k'},
    -	{"CAdir",	1, NULL,	'C'},
    -	{"VOMSdir",	1, NULL,	'V'},
    -	{"port",	1, NULL,	'p'},
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -	{"wsport",  1, NULL,    'w'},
    -#endif	/* GLITE_LB_SERVER_WITH_WS */
    -	{"address",	1, NULL,	'a'},
    -	{"debug",	0, NULL,	'd'},
    -	{"rgmaexport",	0, NULL,	'r'},
    -	{"mysql",	1, NULL,	'm'},
    -	{"noauth",	0, NULL,	'n'},
    -	{"slaves",	1, NULL,	's'},
    -	{"pidfile",	1, NULL,	'i'},
    -	{"purge-prefix",	1, NULL,	'S'},
    -	{"dump-prefix",	1, NULL,	'D'},
    -	{"jpreg-dir",	1, NULL,	'J'},
    -	{"enable-jpreg-export",	1, NULL,	'j'},
    -	{"super-user",	1, NULL,	'R'},
    -	{"super-users-file",	1, NULL,'F'},
    -	{"no-index",	1, NULL,	'x'},
    -	{"strict-locking",0, NULL,	'O'},
    -	{"limits",	1, NULL,	'L'},
    -	{"notif-dur",	1, NULL,	'N'},
    -	{"notif-il-sock",	1, NULL,	'X'},
    -	{"notif-il-fprefix",	1, NULL,	'Y'},
    -	{"count-statistics",	1, NULL,	'T'},
    -	{"request-timeout",	1, NULL,	't'},
    -	{"silent",	0, NULL, 'z' },
    -#ifdef LB_PERF
    -	{"perf-sink",           1, NULL,        'K'},
    -#endif
    -	{"transactions",	1,	NULL,	'b'},
    -	{"greyjobs",	0,	NULL,	'g'},
    -	{"withproxy",	0,	NULL,	'B'},
    -	{"proxyonly",	0,	NULL,	'P'},
    -	{"sock",	1,	NULL,	'o'},
    -	{"con-queue",	1,	NULL,	'q'},
    -	{"proxy-il-sock",	1,	NULL,	'W'},
    -	{"proxy-il-fprefix",	1,	NULL,	'Z'},
    -	{"proxy-purge",	0,	NULL,	'G'},
    -	{"rss-time", 	1,	NULL,	'I'},
    -	{"policy",	1,	NULL,	'l'},
    -	{"exclusive-zombies-off",	0,	NULL,	'E'},
    -	{NULL,0,NULL,0}
    -};
    -
    -static const char *get_opt_string = "Ac:k:C:V:p:a:drm:ns:i:S:D:J:jR:F:xOL:N:X:Y:T:t:zb:gPBo:q:W:Z:GI:l:E"
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -	"w:"
    -#endif
    -#ifdef LB_PERF
    -	"K:"
    -#endif
    -;
    -
    -static void usage(char *me) 
    -{
    -	fprintf(stderr,"usage: %s [option]\n"
    -		"\t-A, --enable-lcas\t activate LCAS-based authorization\n"
    -		"\t-a, --address\t use this server address (may be faked for debugging)\n"
    -		"\t-b, --transactions\t transactions switch (0, 1)\n"
    -		"\t-k, --key\t private key file\n"
    -		"\t-c, --cert\t certificate file\n"
    -		"\t-C, --CAdir\t trusted certificates directory\n"
    -		"\t-V, --VOMSdir\t trusted VOMS servers certificates directory\n"
    -		"\t-p, --port\t port to listen\n"
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -		"\t-w, --wsport\t port to serve the web services requests\n"
    -#endif	/* GLITE_LB_SERVER_WITH_WS */
    -		"\t-m, --mysql\t database connect string\n"
    -		"\t-d, --debug\t don't run as daemon, additional diagnostics\n"
    -		"\t-r, --rgmaexport write state info to RGMA interface\n"
    -		"\t-n, --noauth\t don't check user identity with result owner\n"
    -		"\t-s, --slaves\t number of slave servers to fork\n"
    -		"\t-i, --pidfile\t file to store master pid\n"
    -		"\t-L, --limits\t query limits numbers in format \"events_limit:jobs_limit:size_limit\"\n"
    -		"\t-N, --notif-dur default[:max]\t Duration of notification registrations in seconds (default and maximal)\n"
    -		"\t-S, --purge-prefix\t purge files full-path prefix\n"
    -		"\t-D, --dump-prefix\t dump files full-path prefix\n"
    -		"\t-J, --jpreg-dir\t JP registration temporary files prefix (implies '-j')\n"
    -		"\t-j, --enable-jpreg-export\t enable JP registration export (disabled by default)\n"
    -		"\t--super-user\t user allowed to bypass authorization and indexing\n"
    -		"\t--super-users-file (deprecated)\t the same but read the subjects from a file\n"
    -		"\t--no-index=1\t don't enforce indices for superusers\n"
    -		"\t          =2\t don't enforce indices at all\n"
    -		"\t--strict-locking=1\t lock jobs also on storing events (may be slow)\n"
    -		"\t--notif-il-sock\t socket to send notifications\n"
    -		"\t--notif-il-fprefix\t file prefix for notifications\n"
    -		"\t--count-statistics=1\t count certain statistics on jobs\n"
    -		"\t                  =2\t ... and allow anonymous access\n"
    -		"\t-t, --request-timeout\t request timeout for one client\n"
    -		"\t--silent\t don't print diagnostic, even if -d is on\n"
    -#ifdef LB_PERF
    -		"\t-K, --perf-sink\t where to sink events\n"
    -#endif
    -		"\t-g,--greyjobs\t allow delayed registration (grey jobs), implies --strict-locking\n"
    -		"\t-P,--proxyonly\t	run only proxy service\n"
    -		"\t-B,--withproxy\t	run both server and proxy service\n"
    -		"\t-o,--sock\t path-name to the local socket for communication with LB proxy\n"
    -		"\t-q,--con-queue\t size of the connection queue (accept)\n"
    -		"\t-W,--proxy-il-sock\t socket to send events to\n"
    -		"\t-Z,--proxy-il-fprefix\t file prefix for events\n"
    -		"\t-G,--proxy-purge\t enable automatic purge on proxy service (disabled by default)\n"
    -		"\t-I,--rss-time\t age (in seconds) of job states published via RSS\n"
    -		"\t-l,--policy\tauthorization policy file\n"
    -		"\t-E,--exclusive-zombies-off\twith 'exclusive' flag, allow reusing IDs of purged jobs\n"
    -
    -	,me);
    -}
    -
    -static int wait_for_open(edg_wll_Context,const char *);
    -static int decrement_timeout(struct timeval *, struct timeval, struct timeval);
    -static int asyn_gethostbyaddr(char **, char **, const struct sockaddr *, int, struct timeval *, int );
    -static int add_root(edg_wll_Context, char *, authz_action);
    -static int parse_limits(char *, int *, int *, int *);
    -static int check_mkdir(const char *);
    -
    -
    -/*
    - *	SERVER BONES structures and handlers
    - */
    -int bk_clnt_data_init(void **);
    -
    -	/*
    -	 *	Serve & Store handlers
    -	 */
    -int bk_clnt_reject(int);
    -int bk_handle_connection(int, struct timeval *, void *);
    -int bk_accept_serve(int, struct timeval *, void *);
    -int bk_accept_store(int, struct timeval *, void *);
    -int bk_clnt_disconnect(int, struct timeval *, void *);
    -
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -	/*
    -	 *	WS handlers
    -	 */
    -int bk_handle_ws_connection(int, struct timeval *, void *);
    -int bk_accept_ws(int, struct timeval *, void *);
    -int bk_ws_clnt_reject(int);
    -int bk_ws_clnt_disconnect(int, struct timeval *, void *);
    -#endif 	/*GLITE_LB_SERVER_WITH_WS */
    -
    -        /*
    -         *      Proxy handlers
    -         */
    -int bk_clnt_reject_proxy(int);
    -int bk_handle_connection_proxy(int, struct timeval *, void *);
    -int bk_clnt_disconnect_proxy(int, struct timeval *, void *);
    -
    -  
    -  #define SERVICE_SERVER_START	0 
    -  #define SRV_SERVE			0
    -  #define SRV_STORE			1
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -  #define SRV_WS			2
    -  #define SERVICE_SERVER_SIZE		3
    -
    -  #define SERVICE_PROXY_START		3
    -  #define SRV_SERVE_PROXY		3
    -  #define SRV_STORE_PROXY		4
    -  #define SERVICE_PROXY_SIZE		2
    -#else
    -  #define SERVICE_SERVER_SIZE		2
    -
    -  #define SERVICE_PROXY_START		2
    -  #define SRV_SERVE_PROXY		2
    -  #define SRV_STORE_PROXY		3
    -  #define SERVICE_PROXY_SIZE		2
    -#endif	/* GLITE_LB_SERVER_WITH_WS */
    -
    -
    -
    -static struct glite_srvbones_service service_table[] = {
    -	{ "serve",	-1, bk_handle_connection, bk_accept_serve, bk_clnt_reject, bk_clnt_disconnect },
    -	{ "store",	-1, bk_handle_connection, bk_accept_store, bk_clnt_reject, bk_clnt_disconnect },
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -	{ "WS",		-1, bk_handle_ws_connection, bk_accept_ws, bk_ws_clnt_reject, bk_ws_clnt_disconnect },
    -#endif	/* GLITE_LB_SERVER_WITH_WS */
    -	{ "serve_proxy",	-1, bk_handle_connection_proxy, bk_accept_serve, bk_clnt_reject_proxy, bk_clnt_disconnect_proxy },
    -	{ "store_proxy",	-1, bk_handle_connection_proxy, bk_accept_store, bk_clnt_reject_proxy, bk_clnt_disconnect_proxy }
    -};
    -
    -struct clnt_data_t {
    -	edg_wll_Context			ctx;
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -	struct soap			   *soap;
    -#endif	/* GLITE_LB_SERVER_WITH_WS */
    -	glite_lbu_DBContext	dbctx;
    -	int			dbcaps;
    -	edg_wll_QueryRec	  **job_index,**notif_index;
    -	edg_wll_IColumnRec	   *job_index_cols,*notif_index_cols;;
    -	int			mode;
    -};
    -
    -
    -
    -int main(int argc, char *argv[])
    -{
    -	int			i;
    -	struct addrinfo *ai;
    -	struct addrinfo hints;
    -	char *portstr = NULL;
    -	int 	gaie;
    -	int					opt, pidfile_forced = 0;
    -	char				pidfile[PATH_MAX] = EDG_BKSERVERD_PIDFILE,
    -					   *name;
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -	char			   *ws_port;
    -#endif	/* GLITE_LB_SERVER_WITH_WS */
    -	FILE			   *fpid;
    -	edg_wll_Context		ctx;
    -	edg_wll_GssStatus	gss_code;
    -	struct timeval		to;
    -	int 			request_timeout = REQUEST_TIMEOUT;
    -	int			silent = 0;
    -	char 			socket_path_prefix[PATH_MAX] = GLITE_LBPROXY_SOCK_PREFIX;
    -
    -
    -	name = strrchr(argv[0],'/');
    -	if (name) name++; else name = argv[0];
    -
    -	memset(host, 0, sizeof host);
    -	edg_wll_gss_gethostname(host,sizeof host);
    -	host[sizeof host - 1] = 0;
    -
    -	asprintf(&port, "%d", GLITE_JOBID_DEFAULT_PORT);
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -	asprintf(&ws_port, "%d", GLITE_JOBID_DEFAULT_PORT+3);
    -#endif 	/* GLITE_LB_SERVER_WITH_WS */
    -	server_cert = server_key = cadir = vomsdir = NULL;
    -
    -/* no magic here: 1 month, 3 and 7 days */
    -	for (i=0; i < EDG_WLL_NUMBER_OF_STATCODES; i++) purge_timeout[i] = 60*60*24*31;	
    -	purge_timeout[EDG_WLL_JOB_CLEARED] = 60*60*24*3;
    -	purge_timeout[EDG_WLL_JOB_ABORTED] = 60*60*24*7;
    -	purge_timeout[EDG_WLL_JOB_CANCELLED] = 60*60*24*7;
    -	edg_wll_InitContext(&ctx);
    -
    -	while ((opt = getopt_long(argc,argv,get_opt_string,opts,NULL)) != EOF) switch (opt) {
    -		case 'A': enable_lcas = 1; break;
    -		case 'a': fake_host = strdup(optarg); break;
    -		case 'b': transactions = atoi(optarg); break;
    -		case 'c': server_cert = optarg; break;
    -		case 'k': server_key = optarg; break;
    -		case 'C': cadir = optarg; break;
    -		case 'V': vomsdir = optarg; break;
    -		case 'p': free(port); port = strdup(optarg); break;
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -		case 'w': free(ws_port); ws_port = strdup(optarg); break;
    -#endif /* GLITE_LB_SERVER_WITH_WS */
    -		case 'd': debug = 1; break;
    -		case 'z': silent = 1; break;
    -		case 'r': rgma_export = 1; break;
    -		case 'm': dbstring = optarg; break;
    -		case 'n': noAuth = 1; break;
    -		case 's': slaves = atoi(optarg); break;
    -		case 'S': purgeStorage = optarg; break;
    -		case 'D': dumpStorage = optarg; break;
    -		case 'J': jpregDir = optarg; jpreg = 1; break;
    -		case 'j': jpreg = 1; break;
    -		case 'L':
    -			if ( !parse_limits(optarg, &hardJobsLimit, &hardEventsLimit, &hardRespSizeLimit) )
    -			{
    -				usage(name);
    -				return 1;
    -			}
    -			break;
    -		case 'N': {
    -				int	std,max;
    -				switch (sscanf(optarg,"%d:%d",&std,&max)) {
    -					case 2: notif_duration_max = max;
    -						/* fallthrough */
    -					case 1: notif_duration = std;
    -						break;
    -					default: 
    -						usage(name);
    -						return 1;
    -				}
    -			}  break;
    -		case 'X': notif_ilog_socket_path = strdup(optarg); break;
    -		case 'Y': notif_ilog_file_prefix = strdup(optarg); break;
    -		case 'i': strcpy(pidfile,optarg); pidfile_forced = 1; break;
    -		case 'R': add_root(ctx, optarg, ADMIN_ACCESS); break;
    -		case 'F': glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL,
    -				"%s: Option --super-users-file is deprecated, specify policy using --policy instead");
    -			  return 1;
    -		case 'x': noIndex = atoi(optarg);
    -			  if (noIndex < 0 || noIndex > 2) { usage(name); return 1; }
    -			  break;
    -		case 'O': strict_locking = 1;
    -			  break;
    -		case 'T': count_statistics = atoi(optarg);
    -			  break;
    -		case 't': request_timeout = atoi(optarg);
    -			  break;
    -#ifdef LB_PERF
    -		case 'K': sink_mode = atoi(optarg);
    -			  break;
    -#endif
    -		case 'g': greyjobs = strict_locking = 1;
    -			  break;
    -		case 'P': mode = SERVICE_PROXY;
    -			  break;
    -		case 'B': mode = SERVICE_PROXY_SERVER;
    -			  break;
    -		case 'o': strcpy(socket_path_prefix, optarg);
    -			  break;
    -		case 'q': con_queue = atoi(optarg); 
    -			  break;
    -		case 'W': lbproxy_ilog_socket_path = strdup(optarg); 
    -			  break;
    -		case 'Z': lbproxy_ilog_file_prefix = strdup(optarg);
    -			  break;
    -		case 'G': proxy_purge = 1;
    -			  break;
    -		case 'I': rss_time = atol(optarg);
    -			  break;
    -		case 'l': policy_file = strdup(optarg);
    -			  break;
    -		case 'E': exclusive_zombies = 0;
    -			  break;
    -		case '?': usage(name); return 1;
    -	}
    -
    -	if ( optind < argc ) { usage(name); return 1; }
    -
    -	setlinebuf(stdout);
    -	setlinebuf(stderr);
    -
    -	if (glite_common_log_init()) {
    -		fprintf(stderr,"glite_common_log_init() failed, exiting.");
    -		exit(1);
    -	}
    -	glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Initializing...");
    -
    -	if (mode & SERVICE_PROXY) glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Starting LB proxy service");
    -	if (mode & SERVICE_SERVER) glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Starting LB server service");
    -
    -	// XXX: workaround for only preudoparallel job registration
    -	//	we need at least 2 slaves to avoid locking misbehaviour
    -	if ((mode == SERVICE_PROXY_SERVER) && (slaves == 1)) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "Running both proxy and server services enforces at least 2 slaves");
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "Starting 2 slaves");
    -		slaves = 2;
    -	}
    -
    -	if (!pidfile_forced && geteuid())
    -		snprintf(pidfile,sizeof pidfile, "%s/glite-lb-bkserverd.pid", getenv("HOME"));
    -
    -	fpid = fopen(pidfile,"r");
    -	if ( fpid )
    -	{
    -		int	opid = -1;
    -
    -		if ( fscanf(fpid,"%d",&opid) == 1 )
    -		{
    -			if ( !kill(opid,0) )
    -			{
    -				glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "%s: another instance running, pid = %d", argv[0], opid);
    -				return 1;
    -			}
    -			else if (errno != ESRCH) { perror("kill()"); return 1; }
    -		}
    -		fclose(fpid);
    -	} else if (errno != ENOENT) { perror(pidfile); return 1; }
    -
    -	fpid = fopen(pidfile, "w");
    -	if (!fpid) { perror(pidfile); return 1; }
    -	if (fprintf(fpid, "%d", getpid()) <= 0) { perror(pidfile); return 1; }
    -	if (fclose(fpid) != 0) { perror(pidfile); return 1; }
    -
    -	if (policy_file && parse_server_policy(ctx, policy_file, &authz_policy)) {
    -		char *et, *ed;
    -
    -		edg_wll_Error(ctx,&et,&ed);
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "Cannot load server policy: %s: %s\n", et, ed);
    -		return 1;
    -	}
    -
    -	if (enable_lcas) {
    -		char s[3];
    -
    -		switch (glite_common_log_get_priority(LOG_CATEGORY_LB_AUTHZ)) {
    -		case LOG_PRIORITY_FATAL:
    -		case LOG_PRIORITY_ERROR:
    -		case LOG_PRIORITY_WARN:
    -			i = 0;
    -			break;
    -		case LOG_PRIORITY_INFO:
    -			i = 1;
    -			break;
    -		case LOG_PRIORITY_DEBUG:
    -			i = 2;
    -			break;
    -		default:
    -			i = 0;
    -		}
    -		snprintf(s, 3, "%d", i);
    -		setenv("LCAS_DEBUG_LEVEL", s, 1);
    -	}
    -
    -	if (mode & SERVICE_SERVER) {
    -		if (check_mkdir(dumpStorage)){
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "Directory for dump files not redy!");
    -			exit(1);
    -		}
    -		if (check_mkdir(purgeStorage)){
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "Directory for purge files not redy!");
    -			exit(1);
    -		}
    -		if ( jpreg ) {
    -			if ( glite_lbu_MaildirInit(jpregDir) ) {
    -				glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "[%d] glite_lbu_MaildirInit failed: %s", getpid(), lbm_errdesc);
    -				exit(1);
    -			}
    -		}
    -	}
    -
    -	if (mode & SERVICE_SERVER) {
    -		if ( fake_host )
    -		{
    -			char	*p = strchr(fake_host,':');
    -
    -			if (p)
    -			{
    -				*p = 0;
    -				fake_port = atoi(p+1);
    -			}
    -			else fake_port = atoi(port);
    -		}
    -		else {
    -			fake_host = strdup(host);
    -			fake_port = atoi(port); 
    -		}
    -
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Server address: %s:%d", fake_host, fake_port);
    -	}
    -
    -	memset (&hints, '\0', sizeof (hints));
    -	hints.ai_flags = AI_NUMERICSERV | AI_PASSIVE | AI_ADDRCONFIG;
    -	hints.ai_socktype = SOCK_STREAM;
    -
    -	if ((mode & SERVICE_SERVER)) {
    -		gaie = getaddrinfo (NULL, port, &hints, &ai);
    -		if (gaie != 0) {
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "getaddrinfo: %s", gai_strerror (gaie));
    -			return 1;
    -		}
    -		if (ai == NULL) {
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "getaddrinfo: no return");
    -			return 1;
    -		}
    -		service_table[SRV_SERVE].conn = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
    -		if ( service_table[SRV_SERVE].conn < 0 ) { 
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "socket()");
    -			freeaddrinfo(ai);
    -			return 1; 
    -		}
    -		setsockopt(service_table[SRV_SERVE].conn, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
    -		if ( bind(service_table[SRV_SERVE].conn, ai->ai_addr, ai->ai_addrlen) )
    -		{ 
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "bind(%s)", port);
    -			freeaddrinfo(ai);
    -			return 1;
    -		}
    -		freeaddrinfo(ai);
    -		if ( listen(service_table[SRV_SERVE].conn, CON_QUEUE) ) { 
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "listen()");
    -			return 1; 
    -		}
    -
    -		asprintf(&portstr, "%d", atoi(port)+1);
    -		gaie = getaddrinfo (NULL, portstr, &hints, &ai);
    -		if (gaie != 0) {
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "getaddrinfo: %s", gai_strerror (gaie));
    -			return 1;
    -		}
    -		if (ai == NULL) {
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "getaddrinfo: no return");
    -			return 1;
    -		}
    -		service_table[SRV_STORE].conn = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
    -		if ( service_table[SRV_STORE].conn < 0 ) { 
    -			freeaddrinfo(ai);
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "socket()");
    -			return 1; 
    -		}
    -		setsockopt(service_table[SRV_STORE].conn, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
    -		if ( bind(service_table[SRV_STORE].conn, ai->ai_addr, ai->ai_addrlen) )
    -		{ 
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "bind(%s)", portstr);
    -			freeaddrinfo(ai);
    -			return 1;
    -		}
    -		freeaddrinfo(ai);
    -		if ( listen(service_table[SRV_STORE].conn, CON_QUEUE) ) { 
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "listen()");
    -			return 1; 
    -		}
    -		free(portstr); portstr = NULL;
    -
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -		gaie = getaddrinfo (NULL, ws_port, &hints, &ai);
    -		if (gaie != 0) {
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "getaddrinfo: %s", gai_strerror (gaie));
    -			return 1;
    -		}
    -		if (ai == NULL) {
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "getaddrinfo: no return");
    -			return 1;
    -		}
    -		service_table[SRV_WS].conn = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
    -		if ( service_table[SRV_WS].conn < 0 ) { 
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "socket()");
    -			freeaddrinfo(ai);
    -			return 1; 
    -		}
    -		setsockopt(service_table[SRV_WS].conn, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
    -		if ( bind(service_table[SRV_WS].conn, ai->ai_addr, ai->ai_addrlen) )
    -		{ 
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "bind(%s)",ws_port);
    -			freeaddrinfo(ai);
    -			return 1;
    -		}
    -		freeaddrinfo(ai);
    -		if ( listen(service_table[SRV_WS].conn, CON_QUEUE) ) { 
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "listen()");
    -			return 1; 
    -		}
    -#endif	/* GLITE_LB_SERVER_WITH_WS */
    -
    -		if (!server_cert || !server_key)
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "%s: key or certificate file not specified  - unable to watch them for changes!", argv[0]);
    -
    -		if ( cadir ) setenv("X509_CERT_DIR", cadir, 1);
    -		edg_wll_gss_watch_creds(server_cert, &cert_mtime);
    -		if ( !edg_wll_gss_acquire_cred_gsi(server_cert, server_key, &mycred, &gss_code) )
    -		{
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Server identity: %s", mycred->name);
    -			server_subject = strdup(mycred->name);
    -			add_root(ctx, server_subject, READ_ALL);
    -			add_root(ctx, server_subject, PURGE);
    -		}
    -		else {
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "Server running unauthenticated");
    -			server_subject = strdup("anonymous LB");
    -		}
    -
    -		if ( noAuth ) 
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Server in promiscuous mode");
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, 
    -			"Server listening at %d,%d (accepting protocols: " COMP_PROTO " and compatible) ...", atoi(port), atoi(port)+1);
    -
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO,
    -		"Server listening at %d (accepting web service protocol) ...", atoi(ws_port));
    -#endif	/* GLITE_LB_SERVER_WITH_WS */
    -
    -	}
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -	free(ws_port);
    -	ws_port = NULL;
    -#endif
    -	if (mode & SERVICE_PROXY) {	/* proxy stuff */
    -		struct sockaddr_un      a;
    -
    -		service_table[SRV_SERVE_PROXY].conn = socket(PF_UNIX, SOCK_STREAM, 0);
    -		if ( service_table[SRV_SERVE_PROXY].conn < 0 ) { 
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "socket()");
    -			return 1; 
    -		}
    -		memset(&a, 0, sizeof(a));
    -		a.sun_family = AF_UNIX;
    -		sprintf(sock_serve, "%s%s", socket_path_prefix, "serve.sock");
    -		strcpy(a.sun_path, sock_serve);
    -
    -		if( connect(service_table[SRV_SERVE_PROXY].conn, (struct sockaddr *)&a, sizeof(a.sun_path)) < 0) {
    -			if( errno == ECONNREFUSED ) {
    -				glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "removing stale input socket %s", sock_serve);
    -				unlink(sock_serve);
    -			}
    -		} else { 
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "another instance of lb-proxy is running");
    -			return 1; 
    -		}
    -
    -		if ( bind(service_table[SRV_SERVE_PROXY].conn, (struct sockaddr *) &a, sizeof(a)) < 0 ) {
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "bind(%s)", sock_serve);
    -			return 1;
    -		}
    -
    -		if ( listen(service_table[SRV_SERVE_PROXY].conn, con_queue) ) { 
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "listen()");
    -			return 1; 
    -		}
    -
    -		service_table[SRV_STORE_PROXY].conn = socket(PF_UNIX, SOCK_STREAM, 0);
    -		if ( service_table[SRV_STORE_PROXY].conn < 0 ) { 
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "socket()");
    -			return 1; 
    -		}
    -		memset(&a, 0, sizeof(a));
    -		a.sun_family = AF_UNIX;
    -		sprintf(sock_store, "%s%s", socket_path_prefix, "store.sock");
    -		strcpy(a.sun_path, sock_store);
    -
    -		if( connect(service_table[SRV_STORE_PROXY].conn, (struct sockaddr *)&a, sizeof(a.sun_path)) < 0) {
    -			if( errno == ECONNREFUSED ) {
    -				glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "removing stale input socket %s", sock_store);
    -				unlink(sock_store);
    -			}
    -		} else { 
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "another instance of lb-proxy is running");
    -			return 1; 
    -		}
    -
    -		if ( bind(service_table[SRV_STORE_PROXY].conn, (struct sockaddr *) &a, sizeof(a))) {
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "bind(%s)", sock_store);
    -			
    -			return 1;
    -		}
    -		if ( listen(service_table[SRV_STORE_PROXY].conn, con_queue) ) { 
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "listen()");
    -			return 1; 
    -		}
    -
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Proxy listening at %s, %s ...", sock_store, sock_serve);
    -	}
    -
    -	if (!dbstring) dbstring = getenv("LBDB");
    -	if (!dbstring) dbstring = strdup(DEFAULTCS);
    -		
    -	/* Just check the database and let it be. The slaves do the job. */
    -	if (wait_for_open(ctx, dbstring)) {
    -		edg_wll_Close(ctx);
    -		edg_wll_FreeContext(ctx);
    -		return 1;
    -	}
    -
    -	if ((ctx->dbcaps = glite_lbu_DBQueryCaps(ctx->dbctx)) == -1)
    -	{
    -		char	*et,*ed;
    -		glite_lbu_DBError(ctx->dbctx,&et,&ed);
    -
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "%s: open database: %s (%s)", argv[0], et, ed);
    -		free(et); free(ed);
    -		return 1;
    -	}
    -	edg_wll_Close(ctx);
    -	ctx->dbctx = NULL;
    -	glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "DB '%s'", dbstring ? : "default");
    -
    -	if ((ctx->dbcaps & GLITE_LBU_DB_CAP_INDEX) == 0) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "%s: missing index support in DB layer", argv[0]);
    -		return 1;
    -	}
    -	if ((ctx->dbcaps & GLITE_LBU_DB_CAP_TRANSACTIONS) == 0)
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "transactions aren't supported!");
    -	if (transactions >= 0) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "transactions forced from %d to %d", ctx->dbcaps & GLITE_LBU_DB_CAP_TRANSACTIONS ? 1 : 0, transactions);
    -		ctx->dbcaps &= ~GLITE_LBU_DB_CAP_TRANSACTIONS;
    -		ctx->dbcaps |= transactions ? GLITE_LBU_DB_CAP_TRANSACTIONS : 0;
    -	}
    -	use_dbcaps = ctx->dbcaps;
    -
    -	if (count_statistics) edg_wll_InitStatistics(ctx);
    -	edg_wll_FreeContext(ctx);
    -
    -	if ( !debug ) {
    -		if (daemon(1,0) == -1) {
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "deamon()");
    -			exit(1);
    -		}
    -#ifdef LB_PERF
    -		monstartup((u_long)&_start, (u_long)&etext);
    -#endif
    -
    -		fpid = fopen(pidfile,"w");
    -		if (!fpid) { perror(pidfile); return 1; }
    -		fprintf(fpid,"%d",getpid());
    -		fclose(fpid);
    -	} else {
    -		setpgid(0, getpid());
    -	}
    -
    -	if (silent) debug = 0;
    -
    -	glite_srvbones_set_param(GLITE_SBPARAM_SLAVES_COUNT, slaves);
    -	glite_srvbones_set_param(GLITE_SBPARAM_SLAVE_OVERLOAD, SLAVE_OVERLOAD);
    -	glite_srvbones_set_param(GLITE_SBPARAM_SLAVE_CONNS_MAX, SLAVE_CONNS_MAX);
    -
    -	to = (struct timeval){CONNECT_TIMEOUT, 0};
    -	if (mode & SERVICE_SERVER) {
    -		glite_srvbones_set_param(GLITE_SBPARAM_CONNECT_TIMEOUT, &to);
    -	}
    -	// proxy using default from srvbones, 5s
    -
    -	to.tv_sec = request_timeout;
    -	glite_srvbones_set_param(GLITE_SBPARAM_REQUEST_TIMEOUT, &to);
    -	to = (struct timeval){IDLE_TIMEOUT, 0};
    -	glite_srvbones_set_param(GLITE_SBPARAM_IDLE_TIMEOUT, &to);
    -	glite_srvbones_set_param(GLITE_SBPARAM_LOG_REQ_CATEGORY, LOG_CATEGORY_LB_SERVER_REQUEST);
    -
    -	switch (mode) {
    -		case SERVICE_PROXY:
    -			glite_srvbones_run(bk_clnt_data_init,service_table+SERVICE_PROXY_START,
    -				SERVICE_PROXY_SIZE, debug);
    -			break;
    -		case SERVICE_SERVER:
    -			glite_srvbones_run(bk_clnt_data_init,service_table+SERVICE_SERVER_START,
    -				SERVICE_SERVER_SIZE, debug);
    -			break;
    -		case SERVICE_PROXY_SERVER:
    -			glite_srvbones_run(bk_clnt_data_init,service_table+SERVICE_SERVER_START,
    -				SERVICE_PROXY_SIZE+SERVICE_SERVER_SIZE, debug);
    -			break;
    -		default:
    -			assert(0);
    -			break;
    -	}
    -
    -
    -	unlink(pidfile);
    -
    -	for ( i = 0; i < sizofa(service_table); i++ )
    -		if ( service_table[i].conn >= 0 ) close(service_table[i].conn);
    -
    -	if (mode & SERVICE_PROXY) {
    -		unlink(sock_serve);
    -		unlink(sock_store);
    -	}
    -
    -        if (port) free(port);
    -	edg_wll_gss_release_cred(&mycred, NULL);
    -
    -
    -	return 0;
    -}
    -
    -static void list_index_cols(edg_wll_QueryRec **index,edg_wll_IColumnRec **index_cols_out)
    -{
    -	int i,j, k, maxncol, ncol;
    -	edg_wll_IColumnRec	*index_cols;
    -
    -	ncol = maxncol = 0;
    -	for ( i = 0; index[i]; i++ )
    -		for ( j = 0; index[i][j].attr; j++ )
    -			maxncol++;
    -
    -	index_cols = calloc(maxncol+1, sizeof(edg_wll_IColumnRec));
    -	for ( i = 0; index[i]; i++ )
    -	{
    -		for ( j = 0; index[i][j].attr; j++)
    -		{
    -			for ( k = 0;
    -				  k < ncol && edg_wll_CmpColumn(&index_cols[k].qrec, &index[i][j]);
    -				  k++);
    -
    -			if ( k == ncol)
    -			{
    -				index_cols[ncol].qrec = index[i][j];
    -				if ( index[i][j].attr == EDG_WLL_QUERY_ATTR_USERTAG )
    -				{
    -					index_cols[ncol].qrec.attr_id.tag =
    -							strdup(index[i][j].attr_id.tag);
    -				}
    -				index_cols[ncol].colname =
    -						edg_wll_QueryRecToColumn(&index_cols[ncol].qrec);
    -				ncol++;
    -			}
    -		}
    -	}
    -	index_cols[ncol].qrec.attr = EDG_WLL_QUERY_ATTR_UNDEF;
    -	index_cols[ncol].colname = NULL;
    -	*index_cols_out = index_cols;
    -}
    -
    -int bk_clnt_data_init(void **data)
    -{
    -	edg_wll_Context			ctx;
    -	struct clnt_data_t	   *cdata;
    -	edg_wll_QueryRec	  **job_index,**notif_index;
    -
    -
    -	if ( !(cdata = calloc(1, sizeof(*cdata))) )
    -		return -1;
    -
    -	cdata->mode = mode;
    -
    -	if ( edg_wll_InitContext(&ctx) ) 
    -	{
    -		free(cdata);
    -		return -1;
    -	}
    -
    -	glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "[%d] opening database ...", getpid());
    -	wait_for_open(ctx, dbstring);
    -	glite_lbu_DBSetCaps(ctx->dbctx, use_dbcaps);
    -	cdata->dbctx = ctx->dbctx;
    -	cdata->dbcaps = use_dbcaps;
    -
    -	if ( edg_wll_QueryJobIndices(ctx, &job_index, NULL) )
    -	{
    -		char	   *et, *ed;
    -
    -		edg_wll_Error(ctx,&et,&ed);
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "[%d]: query_job_indices(): %s: %s, no custom indices available", getpid(), et, ed);
    -		free(et);
    -		free(ed);
    -	}
    -	cdata->job_index = job_index;
    -	if ( job_index ) list_index_cols(job_index,&cdata->job_index_cols);
    -
    -	if (edg_wll_QueryNotifIndices(ctx,¬if_index,NULL)) {
    -		char	*et,*ed;
    -		edg_wll_Error(ctx,&et,&ed);
    -
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "[%d]: query notif indices: %s: %s", getpid(), et, ed);
    -	
    -		free(et); free(ed);
    -	}
    -	cdata->notif_index = notif_index;
    -	if (notif_index) list_index_cols(notif_index,&cdata->notif_index_cols);
    -
    -	edg_wll_FreeContext(ctx);
    -		
    -#ifdef LB_PERF
    -	glite_wll_perftest_init(NULL, NULL, NULL, NULL, 0);
    -#endif
    -
    -	*data = cdata;
    -	return 0;
    -}
    -
    -
    -/*
    - *	Creates context (initializes it from global vatiables and data given
    - *	from server_bones)
    - *	gets the connection info
    - *	and accepts the gss connection
    - */
    -int bk_handle_connection(int conn, struct timeval *timeout, void *data)
    -{
    -	struct clnt_data_t *cdata = (struct clnt_data_t *)data;
    -	edg_wll_Context		ctx;
    -	edg_wll_GssPrincipal	client = NULL;
    -	edg_wll_GssCred		newcred = NULL;
    -	edg_wll_GssStatus	gss_code;
    -	struct timeval		dns_to = {DNS_TIMEOUT, 0},
    -						conn_start, now;
    -	struct sockaddr_storage	a;
    -	socklen_t					alen;
    -	char			*server_name = NULL,
    -				*port =NULL,
    -				*name_num = NULL,
    -				*name = NULL;
    -	int					h_errno, ret;
    -
    -
    -
    -	switch ( edg_wll_gss_watch_creds(server_cert, &cert_mtime) ) {
    -	case 0: break;
    -	case 1:
    -		if ( !edg_wll_gss_acquire_cred_gsi(server_cert, server_key, &newcred, &gss_code) ) {
    -			glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_INFO, "[%d] reloading credentials successful", getpid());
    -			edg_wll_gss_release_cred(&mycred, NULL);
    -			mycred = newcred;
    -		} else { 
    -			glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_WARN, "[%d] reloading credentials failed, using old ones");
    -		}
    -		break;
    -	case -1: 
    -		glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_ERROR, "[%d] edg_wll_gss_watch_creds failed", getpid());
    -		break;
    -	}
    -
    -	if ( edg_wll_InitContext(&ctx) )
    -	{
    -		//fprintf(stderr, "Couldn't create context");
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, "Couldn't create context");
    -		return -1;
    -	}
    -	cdata->ctx = ctx;
    -
    -	/* Shared structures (pointers)
    -	 */
    -	ctx->serverRunning = cdata->mode & SERVICE_SERVER;
    -	ctx->proxyRunning = cdata->mode & SERVICE_PROXY;
    -	ctx->dbctx = cdata->dbctx;
    -	ctx->dbcaps = cdata->dbcaps;
    -	ctx->job_index_cols = cdata->job_index_cols;
    -	ctx->job_index = cdata->job_index; 
    -	ctx->notif_index_cols = cdata->notif_index_cols;
    -	ctx->notif_index = cdata->notif_index; 
    -	
    -	/*	set globals
    -	 */
    -	ctx->notifDuration = notif_duration;
    -	ctx->notifDurationMax = notif_duration_max;
    -	ctx->purgeStorage = strdup(purgeStorage);
    -	ctx->dumpStorage = strdup(dumpStorage);
    -	if ( jpreg ) ctx->jpreg_dir = strdup(jpregDir); else ctx->jpreg_dir = NULL;
    -	ctx->hardJobsLimit = hardJobsLimit;
    -	ctx->hardEventsLimit = hardEventsLimit;
    -	if ( noAuth ) ctx->noAuth = 1;
    -	if ( authz_policy.actions_num ) {
    -		int i,j;
    -		for (i=0; i < authz_policy.actions_num; i++)
    -			for (j = 0; j < authz_policy.actions[i].rules_num; j++)
    -				edg_wll_add_authz_rule(ctx,
    -					&ctx->authz_policy,
    -					authz_policy.actions[i].id,
    -					&authz_policy.actions[i].rules[j]);
    -	}
    -	ctx->rgma_export = rgma_export;
    -	memcpy(ctx->purge_timeout, purge_timeout, sizeof(ctx->purge_timeout));
    -
    -	ctx->p_tmp_timeout.tv_sec = timeout->tv_sec;
    -	ctx->p_tmp_timeout.tv_usec = timeout->tv_usec;
    -	
    -	edg_wll_initConnections();
    -
    -	ctx->count_statistics = count_statistics;
    -
    -	ctx->serverIdentity = strdup(server_subject);
    -
    -	ctx->rssTime = rss_time;
    -
    -	gettimeofday(&conn_start, 0);
    -
    -	alen = sizeof(a);
    -	memset(&a, 0, sizeof a);
    -	if (getpeername(conn, (struct sockaddr *)&a, &alen) != 0) {
    -		glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_ERROR, "getpeername(): %s", strerror(errno));
    -		return -1;
    -	}
    -	if ((h_errno = asyn_gethostbyaddr(&name_num, &port, (struct sockaddr *)&a, alen, &dns_to, 1)) != 0) {
    -		glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_ERROR, "gethostbyaddr(): %s", hstrerror(h_errno));
    -		return -1;
    -	}
    -	ctx->connections->serverConnection->peerPort = atoi(port);
    -	h_errno = asyn_gethostbyaddr(&name, NULL, (struct sockaddr *)&a, alen, &dns_to, 0);
    -	switch ( h_errno )
    -	{
    -	case NETDB_SUCCESS:
    -		if (name) 
    -			glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_INFO, "[%d] connection from %s:%s (%s)", getpid(), name_num, port, name); 
    -		free(ctx->connections->serverConnection->peerName);
    -		ctx->connections->serverConnection->peerName = name;
    -		name = NULL;
    -		break;
    -
    -	default:
    -		glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_DEBUG, "gethostbyaddr(%s): %s", name_num, hstrerror(h_errno));
    -		glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_INFO,"[%d] connection from %s:%s", getpid(), name_num, port);
    -		free(ctx->connections->serverConnection->peerName);
    -		ctx->connections->serverConnection->peerName = strdup(name_num);
    -		break;
    -	}
    -	
    -	free(port);
    -
    -	gettimeofday(&now, 0);
    -	if ( decrement_timeout(timeout, conn_start, now) )
    -	{
    -		glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_WARN, "gethostbyaddr() timeout"); 
    -		free(name);
    -
    -		return -1;
    -	}
    -				
    -	if (fake_host)
    -	{
    -		ctx->srvName = strdup(fake_host);
    -		ctx->srvPort = fake_port;
    -	}
    -	else
    -	{
    -		alen = sizeof(a);
    -		getsockname(conn,(struct sockaddr *) &a,&alen);
    -	
    -		dns_to.tv_sec = DNS_TIMEOUT;
    -		dns_to.tv_usec = 0;
    -		h_errno = asyn_gethostbyaddr(&name, &port,
    -						(struct sockaddr *) &a, alen,
    -						&dns_to, 0);
    -
    -		switch ( h_errno )
    -		{
    -		case NETDB_SUCCESS:
    -			ctx->srvName = name;
    -			if ( server_name != NULL )
    -			{
    -				if ( strcmp(name, server_name))
    -				{
    -					glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, "different server endpoint names (%s,%s), check DNS PTR records", name, server_name);
    -				}
    -			}
    -			else server_name = strdup(name);
    -			break;
    -
    -		default:
    -				glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_ERROR, "gethostbyaddr(%s): %s", name_num, hstrerror(h_errno));
    -			if ( server_name != NULL )
    -				ctx->srvName = strdup(server_name);
    -			break;
    -		}
    -		ctx->srvPort = atoi(port);
    -		free(port); port = NULL;
    -	}
    -
    -/* XXX: ugly workaround, we may detect false expired certificated
    - * probably due to bug in Globus GSS/SSL. Treated as fatal,
    - * restarting the server solves the problem */ 
    - 
    -#define _EXPIRED_CERTIFICATE_MESSAGE "certificate has expired"
    -
    -	if ( (ret = edg_wll_gss_accept(mycred, conn, timeout, &ctx->connections->serverConnection->gss, &gss_code)) )
    -	{
    -		if ( ret == EDG_WLL_GSS_ERROR_TIMEOUT )
    -		{
    -			glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_WARN, "[%d] %s: Client authentication failed - timeout reached, closing.", getpid(),ctx->connections->serverConnection->peerName);
    -		}
    -		else if (ret == EDG_WLL_GSS_ERROR_GSS) {
    -			edg_wll_SetErrorGss(ctx,"Client authentication",&gss_code);
    -			if (strstr(ctx->errDesc,_EXPIRED_CERTIFICATE_MESSAGE)) {
    -				glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_WARN, "[%d] %s: false expired certificate: %s",getpid(),ctx->connections->serverConnection->peerName,ctx->errDesc);
    -				edg_wll_FreeContext(ctx);
    -				return -1;
    -			}
    -			glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_WARN, "[%d] %s: GSS error: %s", getpid(), ctx->connections->serverConnection->peerName, ctx->errDesc);
    -		}
    -		else
    -		{
    -			 glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_WARN, "[%d] %s: Client authentication failed", getpid(), ctx->connections->serverConnection->peerName);
    -		}
    -		edg_wll_FreeContext(ctx);
    -		return 1;
    -	} 
    -
    -	ret = edg_wll_gss_get_client_conn(&ctx->connections->serverConnection->gss, &client, NULL);
    -	if (ret || client->flags & EDG_WLL_GSS_FLAG_ANON) {
    -		glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_INFO, "[%d] anonymous client",getpid());
    -		ctx->peerName = NULL;
    -	} else {
    -		if (ctx->peerName) free(ctx->peerName);
    -		ctx->peerName = strdup(client->name);
    -		edg_wll_gss_free_princ(client);
    -		glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_INFO, "[%d] client DN: %s",getpid(),ctx->peerName);
    -	}
    -
    -	if ( edg_wll_SetVomsGroups(ctx, &ctx->connections->serverConnection->gss, server_cert, server_key, vomsdir, cadir) )
    -	{
    -		char *errt, *errd;
    -
    -		edg_wll_Error(ctx, &errt, &errd);
    -		glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_INFO, "[%d] %s (%s)\n[%d]\tignored, continuing without VOMS", getpid(), errt, errd,getpid());
    -		free(errt); free(errd);
    -		edg_wll_ResetError(ctx); 
    -	}
    -	if (ctx->vomsGroups.len > 0)
    -	{
    -		int i;
    -  
    -		 glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_DEBUG, "[%d] client's VOMS groups:",getpid());
    -		for ( i = 0; i < ctx->vomsGroups.len; i++ )
    -			glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_DEBUG, "\t%s:%s", ctx->vomsGroups.val[i].vo, ctx->vomsGroups.val[i].name);
    -	}
    -	if (ctx->fqans && *(ctx->fqans))
    -	{
    -		char **f;
    -
    -		glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_DEBUG, "[%d] client's FQANs:",getpid());
    -		for (f = ctx->fqans; f && *f; f++)
    -			glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_DEBUG, "\t%s", *f);
    -	}
    -	
    -	/* used also to reset start_time after edg_wll_ssl_accept! */
    -	/* gettimeofday(&start_time,0); */
    -	
    -	ctx->noAuth = noAuth || edg_wll_amIroot(ctx->peerName, ctx->fqans,&ctx->authz_policy);
    -	switch ( noIndex )
    -	{
    -	case 0: ctx->noIndex = 0; break;
    -	case 1: ctx->noIndex = edg_wll_amIroot(ctx->peerName, ctx->fqans,&ctx->authz_policy); break;
    -	case 2: ctx->noIndex = 1; break;
    -	}
    -	ctx->strict_locking = strict_locking;
    -	ctx->greyjobs = greyjobs;
    -	ctx->exclusive_zombies = exclusive_zombies;
    -
    -	return 0;
    -}
    -
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -int bk_init_ws_connection(struct clnt_data_t *cdata)
    -{
    -	struct soap             *soap = NULL;
    -	glite_gsplugin_Context  gsplugin_ctx = NULL;
    -	int err = 0;
    -
    -	if ( glite_gsplugin_init_context(&gsplugin_ctx) ) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, 
    -			"Couldn't create gSOAP plugin context");
    -                return -1;
    -        }
    -
    -        if ( !(soap = soap_new()) ) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR,
    -			"Couldn't create soap environment");
    -                goto err;
    -        }
    -
    -        soap_init2(soap, SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE);
    -	if ( soap_set_namespaces(soap, namespaces) ) { 
    -                soap_done(soap);
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR,
    -			"Couldn't set soap namespaces");
    -                goto err;
    -        }
    -	if ( soap_register_plugin_arg(soap, glite_gsplugin, gsplugin_ctx) ) {
    -                soap_done(soap);
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR,
    -			"Couldn't set soap namespaces");
    -                goto err;
    -        }
    -
    -	glite_gsplugin_use_credential(gsplugin_ctx, mycred);
    -        cdata->soap = soap;
    -
    -	return 0;
    -err:
    -	if ( gsplugin_ctx ) glite_gsplugin_free_context(gsplugin_ctx);
    -        if ( soap ) soap_destroy(soap);
    -
    -	return err;
    -}
    -
    -int bk_handle_ws_connection(int conn, struct timeval *timeout, void *data)
    -{
    -    struct clnt_data_t	   *cdata = (struct clnt_data_t *) data;
    -	glite_gsplugin_Context	gsplugin_ctx = NULL;
    -	int			rv = 0;
    -	int 			err = 0;
    -
    -	if ((err = bk_init_ws_connection(cdata)))
    -		return -1;
    -
    -	if ( (rv = bk_handle_connection(conn, timeout, data)) ){
    -		soap_done(cdata->soap);
    -		goto err;
    -	}
    -
    -	gsplugin_ctx = glite_gsplugin_get_context(cdata->soap);
    -	glite_gsplugin_set_connection(gsplugin_ctx, &cdata->ctx->connections->serverConnection->gss);
    -
    -	return 0;
    -
    -err:
    -	if ( cdata->soap ) soap_destroy(cdata->soap);
    -
    -	return rv ? : -1;
    -}
    -#endif	/* GLITE_LB_SERVER_WITH_WS */
    -
    -int bk_handle_connection_proxy(int conn, struct timeval *timeout, void *data)
    -{
    -	struct clnt_data_t *cdata = (struct clnt_data_t *)data;
    -	edg_wll_Context		ctx;
    -	struct timeval		conn_start, now;
    -
    -        if ( edg_wll_InitContext(&ctx) ) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR,
    -			"Couldn't create context");
    -		return -1;
    -	}
    -	cdata->ctx = ctx;
    -
    -	/* Shared structures (pointers)
    -	 */
    -	ctx->serverRunning = cdata->mode & SERVICE_SERVER;
    -	ctx->proxyRunning = cdata->mode & SERVICE_PROXY;
    -	ctx->dbctx = cdata->dbctx;
    -	ctx->dbcaps = cdata->dbcaps;
    -	
    -	/*	set globals
    -	 */
    -	ctx->notifDuration = notif_duration;
    -	ctx->notifDurationMax = notif_duration_max;
    -	if ( jpreg ) ctx->jpreg_dir = strdup(jpregDir); else ctx->jpreg_dir = NULL;
    -	ctx->allowAnonymous = 1;
    -	ctx->isProxy = 1;
    -	ctx->noAuth = 1;
    -	ctx->noIndex = 1;
    -
    -	if ( authz_policy.actions_num ) {
    -		int i,j;
    -		for (i=0; i < authz_policy.actions_num; i++)
    -			for (j = 0; j < authz_policy.actions[i].rules_num; j++)
    -				edg_wll_add_authz_rule(ctx,
    -					&ctx->authz_policy,
    -					authz_policy.actions[i].id,
    -					&authz_policy.actions[i].rules[j]);
    -	}
    -
    -	/* required to match superuser-authorized notifications */
    -
    -	if (fake_host)
    -	{
    -		ctx->srvName = strdup(fake_host);
    -		ctx->srvPort = fake_port;
    -	}
    -	else {
    -		ctx->srvName = strdup(host);
    -		ctx->srvPort = atoi(port);
    -	}
    -	
    -	ctx->connProxy = (edg_wll_ConnProxy *) calloc(1, sizeof(edg_wll_ConnProxy));
    -	if ( !ctx->connProxy ) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR,
    -			"calloc");
    -		edg_wll_FreeContext(ctx);
    -
    -		return -1;
    -	}
    -
    -	gettimeofday(&conn_start, 0);
    -	if ( edg_wll_plain_accept(conn, &ctx->connProxy->conn) ) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR,
    -			"accept");
    -		edg_wll_FreeContext(ctx);
    -
    -		return -1;
    -	} 
    -
    -	gettimeofday(&now, 0);
    -	if ( decrement_timeout(timeout, conn_start, now) ) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN,
    -			"edg_wll_plain_accept(): timeout");
    -		return -1;
    -	}
    -
    -	ctx->rssTime = rss_time;
    -
    -	return 0;
    -}
    -
    -
    -static int handle_server_error(edg_wll_Context ctx)
    -{ 
    -	char    *errt = NULL, *errd = NULL;
    -	int		err,ret = 0;
    -
    -	
    -	errt = errd = NULL;
    -	switch ( (err = edg_wll_Error(ctx, &errt, &errd)) )
    -	{
    -	case ETIMEDOUT:
    -	case EDG_WLL_ERROR_GSS:
    -	case EPIPE:
    -	case EIO:
    -	case EDG_WLL_IL_PROTO:
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN,
    -			"[%d] %s (%s)", getpid(), errt, errd);
    -		/*	fallthrough
    -		 */
    -	case ENOTCONN:
    -	case ECONNREFUSED:
    -		/*
    -		 *	"recoverable" error - return (>0)
    -		 */
    -		ret = err;
    -		break;
    -
    -	case ENOENT:
    -	case EPERM:
    -	case EEXIST:
    -	case EDG_WLL_ERROR_NOINDEX:
    -	case E2BIG:
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN,
    -			"[%d] %s (%s)", getpid(), errt, errd);
    -		break;
    -	case EINVAL:
    -	case EDG_WLL_ERROR_PARSE_BROKEN_ULM:
    -	case EDG_WLL_ERROR_PARSE_EVENT_UNDEF:
    -	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:
    -	case EDG_WLL_ERROR_JOBID_FORMAT:
    -	case EDG_WLL_ERROR_MD5_CLASH:
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN,
    -			"[%d] %s (%s)", getpid(), errt, errd);
    -		/*
    -		 *	no action for non-fatal errors
    -		 */
    -		break;
    -		
    -	case EDG_WLL_ERROR_DB_INIT:
    -	case EDG_WLL_ERROR_DB_CALL:
    -	case EDG_WLL_ERROR_SERVER_RESPONSE:
    -	default:
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL,
    -		"[%d] %s (%s)", getpid(), errt, errd);
    -		/*
    -		 *	unknown error - do rather return (<0) (slave will be killed)
    -		 */
    -		ret = -EIO; 
    -	} 
    -	free(errt); free(errd);
    -	return ret;
    -}
    -
    -int bk_accept_store(int conn, struct timeval *timeout, void *cdata)
    -{
    -	edg_wll_Context		ctx = ((struct clnt_data_t *) cdata)->ctx;
    -	struct timeval		before, after;
    -	int	err;
    -
    -	/*
    -	 *	serve the request
    -	 */
    -	memcpy(&ctx->p_tmp_timeout, timeout, sizeof(ctx->p_tmp_timeout));
    -	gettimeofday(&before, NULL);
    -	if ( edg_wll_StoreProto(ctx) && (err = handle_server_error(ctx))) return err;
    -
    -	gettimeofday(&after, NULL);
    -	if ( decrement_timeout(timeout, before, after) ) {
    -		glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_WARN,
    -			"Serving store connection timed out");
    -		return ETIMEDOUT;
    -	}
    -
    -	return 0;
    -}
    -
    -static int
    -try_accept_ws(int conn, struct timeval *timeout, void *cdata, char *req, size_t len)
    -{
    -	edg_wll_Context ctx = ((struct clnt_data_t *) cdata)->ctx;
    -	glite_gsplugin_Context  gsplugin_ctx = NULL;
    -	struct soap *soap = NULL;
    -	int err;
    -
    -	err = bk_init_ws_connection(cdata);
    -	if (err)
    -		return err;
    -	soap = ((struct clnt_data_t *) cdata)->soap;
    -	gsplugin_ctx = glite_gsplugin_get_context(soap);
    -	err = edg_wll_gss_unread(&ctx->connections->serverConnection->gss, req, len);
    -	if (err)
    -		goto end;
    -	glite_gsplugin_set_connection(gsplugin_ctx, &ctx->connections->serverConnection->gss);
    -	bk_accept_ws(conn, timeout, cdata);
    -
    -	err = 0;
    -end:
    -	soap_destroy(soap);
    -	glite_gsplugin_free_context(gsplugin_ctx);
    -
    -	return err;
    -}
    -
    -
    -
    -int bk_accept_serve(int conn, struct timeval *timeout, void *cdata)
    -{
    -	edg_wll_Context		ctx = ((struct clnt_data_t *) cdata)->ctx;
    -	struct timeval		before, after;
    -	int	err;
    -	char    *body = NULL, *resp = NULL, **hdrOut = NULL, *bodyOut = NULL;
    -	int 	httpErr;
    -
    -	/*
    -	 *	serve the request
    -	 */
    -	memcpy(&ctx->p_tmp_timeout, timeout, sizeof(ctx->p_tmp_timeout));
    -	gettimeofday(&before, NULL);
    -	err = edg_wll_AcceptHTTP(ctx, &body, &resp, &hdrOut, &bodyOut, &httpErr);
    -	if (err && (err = handle_server_error(ctx))){
    -		edg_wll_DoneHTTP(ctx, resp, hdrOut, bodyOut);
    -	        free(resp);
    -	        free(bodyOut);
    -                if (body)
    -			free(body);
    -	        // hdrOut are static
    -		return err;
    -	}
    -
    -	if (httpErr == HTTP_BADREQ)
    -		err = try_accept_ws(conn, timeout, cdata, body, strlen(body) + 1);
    -	if (httpErr != HTTP_BADREQ || err)
    -		edg_wll_DoneHTTP(ctx, resp, hdrOut, bodyOut);
    -
    -	free(resp);
    -	free(bodyOut);
    -	if (body)
    -		free(body);
    -	// hdrOut are static
    -
    -	gettimeofday(&after, NULL);
    -	if ( decrement_timeout(timeout, before, after) ) {
    -		glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_WARN,
    -			"Serving store connection timed out");
    -		
    -		return ETIMEDOUT;
    -	}
    -
    -	return 0;
    -}
    -
    -
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -int bk_accept_ws(int conn, struct timeval *timeout, void *cdata)
    -{
    -	struct soap			   *soap = ((struct clnt_data_t *) cdata)->soap;
    -	edg_wll_Context			ctx = ((struct clnt_data_t *) cdata)->ctx;
    -	glite_gsplugin_Context	gsplugin_ctx;
    -	int						err;
    -
    -
    -	gsplugin_ctx = glite_gsplugin_get_context(soap);
    -	glite_gsplugin_set_timeout(gsplugin_ctx, timeout);
    -	glite_gsplugin_set_udata(soap, ctx);
    -	/*	soap->max_keep_alive must be higher tha 0,
    -	 *	because on 0 value soap closes the connection
    -	 */
    -	soap->max_keep_alive = 10;
    -	soap->keep_alive = 1;
    -	soap_begin(soap);
    -	err = 0;
    -	if ( soap_begin_recv(soap) ) {
    -		if ( soap->error == SOAP_EOF ) {
    -			soap_send_fault(soap);
    -			return ENOTCONN;
    -		}
    -		if ( soap->error < SOAP_STOP ) err = soap_send_fault(soap);
    -		else soap_closesock(soap);	/*	XXX: Do close the socket here? */
    -	} else {
    -		/* XXX: An ugly hack!
    -		 * soap->keep_alive is reset to 0 by soap->fparse (http_parse)
    -		 * handler
    -		 * Disabling http_parse function would be nice :)
    -		 */
    -		soap->keep_alive = 1;
    -		if (   soap_envelope_begin_in(soap)
    -			   || soap_recv_header(soap)
    -			   || soap_body_begin_in(soap)
    -			   || soap_serve_request(soap)
    -#if GSOAP_VERSION >= 20700
    -			   /* XXX: Is it really neccesary ? */
    -			   || (soap->fserveloop && soap->fserveloop(soap))
    -#endif
    -			   )
    -		err = soap_send_fault(soap);
    -	}
    -
    -	if ( err ) {
    -		// soap_print_fault(struct soap *soap, FILE *fd) maybe useful here
    -		glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_WARN,
    -			"[%d] SOAP error (bk_accept_ws)", getpid());
    -		return ECANCELED;
    -	}
    -
    -	return ENOTCONN;
    -}
    -#endif	/* GLITE_LB_SERVER_WITH_WS */
    -
    -
    -int bk_clnt_disconnect(int conn, struct timeval *timeout, void *cdata)
    -{
    -	edg_wll_Context		ctx = ((struct clnt_data_t *) cdata)->ctx;
    -
    -
    -	if ( ctx->connections->serverConnection->gss.context != NULL)
    -		edg_wll_gss_close(&ctx->connections->serverConnection->gss, timeout);
    -	edg_wll_FreeContext(ctx);
    -	ctx = NULL;
    -
    -	return 0;
    -}
    -
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -int bk_ws_clnt_disconnect(int conn, struct timeval *timeout, void *cdata)
    -{
    -	struct soap			   *soap = ((struct clnt_data_t *) cdata)->soap;
    -	glite_gsplugin_Context	gsplugin_ctx;
    -	int						rv;
    -
    -
    -	gsplugin_ctx = glite_gsplugin_get_context(soap);
    -	glite_gsplugin_set_connection(gsplugin_ctx, NULL);
    -	glite_gsplugin_use_credential(gsplugin_ctx, NULL);
    -	if ( (rv = bk_clnt_disconnect(conn, timeout, cdata)) )
    -		return rv;
    -
    -	soap_destroy(((struct clnt_data_t *)cdata)->soap);
    -	glite_gsplugin_free_context(gsplugin_ctx);
    -
    -	return 0;
    -}
    -#endif	/* GLITE_LB_SERVER_WITH_WS */
    -
    -
    -int bk_clnt_disconnect_proxy(int conn, struct timeval *timeout, void *cdata)
    -{
    -	edg_wll_Context		ctx = ((struct clnt_data_t *) cdata)->ctx;
    -
    -	/* XXX: handle the timeout
    -	 */
    -    if ( ctx->connProxy && ctx->connProxy->conn.sock >= 0 )
    -		edg_wll_plain_close(&ctx->connProxy->conn);
    -
    -	edg_wll_FreeContext(ctx);
    -	ctx = NULL;
    -
    -	return 0;
    -}
    -
    -int bk_clnt_reject(int conn)
    -{
    -	int		flags = fcntl(conn, F_GETFL, 0);
    -
    -	if ( fcntl(conn, F_SETFL, flags | O_NONBLOCK) < 0 ) 
    -		return 1;
    -
    -	edg_wll_gss_reject(conn);
    -
    -	return 0;
    -}
    -
    -#ifdef GLITE_LB_SERVER_WITH_WS
    -int bk_ws_clnt_reject(int conn)
    -{
    -	return bk_clnt_reject(conn);
    -}
    -#endif	/* GLITE_LB_SERVER_WITH_WS */
    -
    -int bk_clnt_reject_proxy(int conn)
    -{
    -	return 0;
    -}
    -
    -
    -static int wait_for_open(edg_wll_Context ctx, const char *dbstring)
    -{
    -	char	*dbfail_string1, *dbfail_string2;
    -	char	*errt,*errd;
    -	int err;
    -
    -	dbfail_string1 = dbfail_string2 = NULL;
    -
    -	while (((err = edg_wll_Open(ctx, (char *) dbstring)) != EDG_WLL_ERROR_DB_INIT) && err) {
    -		if (dbfail_string1) free(dbfail_string1);
    -		edg_wll_Error(ctx,&errt,&errd);
    -		asprintf(&dbfail_string1,"%s (%s)",errt,errd);
    -		free(errt);
    -		free(errd);
    -		if (dbfail_string1 != NULL) {
    -			if (dbfail_string2 == NULL || strcmp(dbfail_string1,dbfail_string2)) {
    -				if (dbfail_string2) free(dbfail_string2);
    -				dbfail_string2 = dbfail_string1;
    -				dbfail_string1 = NULL;
    -				glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "[%d]: %s\nStill trying ...",getpid(),dbfail_string2);
    -				
    -			}
    -		}
    -		sleep(5);
    -	}
    -
    -	if (dbfail_string1) free(dbfail_string1);
    -	if (dbfail_string2 != NULL) {
    -		free(dbfail_string2);
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO,
    -			"[%d]: DB connection established",getpid());
    -	}
    -
    -	if (err) {
    -		edg_wll_Error(ctx,&errt,&errd);
    -		asprintf(&dbfail_string1,"%s (%s)",errt,errd);
    -		free(errt);
    -		free(errd);
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN,
    -			"[%d]: %s", getpid(), dbfail_string1);
    -		free(dbfail_string1);
    -	}
    -
    -	return err;
    -}
    -
    -struct asyn_result {
    -	char		*host;
    -	char		*service;
    -	int		err;
    -};
    -
    -/* ares callback handler for ares_getnameinfo() */
    -#if ARES_VERSION >= 0x010500
    -void callback_ares_getnameinfo(void *arg, int status, int timeouts, char *node, char *service)
    -#else
    -void callback_ares_getnameinfo(void *arg, int status, char *node, char *service)
    -#endif
    -{
    -	struct asyn_result *arp = (struct asyn_result *) arg;
    -
    -	switch (status) {
    -	   case ARES_SUCCESS:
    -		if (node||service) {
    -			if (node) arp->host = strdup(node);		
    -			if (service) arp->service = strdup(service);		
    -			if (arp->host == NULL && arp->service == NULL) {
    -				arp->err = NETDB_INTERNAL;
    -			} else {
    -				arp->err = NETDB_SUCCESS;
    -			}
    -		} else {
    -			arp->err = NO_DATA;
    -		}
    -		break;
    -	    case ARES_EBADNAME:
    -	    case ARES_ENOTFOUND:
    -		arp->err = HOST_NOT_FOUND;
    -		break;
    -	    case ARES_ENOTIMP:
    -		arp->err = NO_RECOVERY;
    -		break;
    -	    case ARES_ENOMEM:
    -	    case ARES_EDESTRUCTION:
    -	    default:
    -		arp->err = NETDB_INTERNAL;
    -		break;
    -	}
    -}
    -
    -static int asyn_gethostbyaddr(char **name, char **service, const struct sockaddr *addr, int len, struct timeval *timeout, int numeric)
    -{
    -	struct asyn_result ar;
    -	ares_channel channel;
    -	int nfds;
    -	fd_set readers, writers;
    -	struct timeval tv, *tvp;
    -	struct timeval start_time,check_time;
    -	int 	flags = 0;
    -	int	err = NETDB_INTERNAL;
    -	struct sockaddr_in	v4;
    -
    -/* start timer */
    -        gettimeofday(&start_time,0);
    -
    -/* ares init */
    -        if ( ares_init(&channel) != ARES_SUCCESS ) return(NETDB_INTERNAL);
    -	memset((void *) &ar, 0, sizeof(ar));
    -
    -	if (addr->sa_family == AF_INET6 && IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)addr)->sin6_addr)) {
    -		v4.sin_family = AF_INET;
    -		v4.sin_port = ((struct sockaddr_in6 *)addr)->sin6_port;
    -		v4.sin_addr.s_addr = *(in_addr_t *) &((struct sockaddr_in6 *)addr)->sin6_addr.s6_addr[12];
    -		addr = (struct sockaddr *) &v4;
    -		len = sizeof(v4);
    -	} 
    -
    -/* query DNS server asynchronously */
    -	if (name) flags |= ARES_NI_LOOKUPHOST | ( numeric? ARES_NI_NUMERICHOST : 0);
    -	if (service) flags |= ARES_NI_LOOKUPSERVICE | ( numeric? ARES_NI_NUMERICSERV : 0);
    -	ares_getnameinfo(channel, addr, len, flags, (ares_nameinfo_callback)callback_ares_getnameinfo, (void *) &ar);
    -
    -/* wait for result */
    -        while (1) {
    -                FD_ZERO(&readers);
    -                FD_ZERO(&writers);
    -                nfds = ares_fds(channel, &readers, &writers);
    -                if (nfds == 0)
    -                        break;
    -
    -                gettimeofday(&check_time,0);
    -		if (decrement_timeout(timeout, start_time, check_time)) {
    -			ares_destroy(channel);
    -			return(TRY_AGAIN);
    -		}
    -		start_time = check_time;
    -
    -                tvp = ares_timeout(channel, timeout, &tv);
    -
    -                switch ( select(nfds, &readers, &writers, NULL, tvp) ) {
    -			case -1: if (errno != EINTR) {
    -					ares_destroy(channel);
    -				  	return NETDB_INTERNAL;
    -				 } else
    -					continue;
    -			case 0: 
    -				FD_ZERO(&readers);
    -				FD_ZERO(&writers);
    -				/* fallthrough */
    -                        default : ares_process(channel, &readers, &writers);
    -                }
    -
    -        }
    -
    -	if (ar.err == NETDB_SUCCESS) {
    -		if (name) *name = ar.host;
    -		if (service) *service = ar.service;
    -	}
    -	err = ar.err;
    -
    -	ares_destroy(channel);
    -	return err;
    -}
    -
    -static int add_root(edg_wll_Context ctx, char *root, authz_action action)
    -{
    -	struct _edg_wll_authz_attr attr;
    -	struct _edg_wll_authz_rule rule;
    -
    -	attr.id = ATTR_SUBJECT;
    -	if (strncmp(root, "FQAN:", 5) == 0){
    -		root += 5;
    -		attr.id = ATTR_FQAN;
    -	}
    -	attr.value = root;
    -	rule.attrs = &attr;
    -	rule.attrs_num = 1;
    -	edg_wll_add_authz_rule(ctx, &authz_policy, action, &rule);
    -
    -	return 0;
    -}
    -
    -static int parse_limits(char *opt, int *j_limit, int *e_limit, int *size_limit)
    -{
    -	return (sscanf(opt, "%d:%d:%d", j_limit, e_limit, size_limit) == 3);
    -}
    -
    -
    -static int check_mkdir(const char *dir)
    -{
    -	struct stat	sbuf;
    -
    -	if ( stat(dir, &sbuf) )
    -	{
    -		if ( errno == ENOENT )
    -		{
    -			if ( mkdir(dir, S_IRWXU) )
    -			{
    -				glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, "[%d] %s: %s", getpid(), dir, strerror(errno));
    -				return 1;
    -			}
    -		}
    -		else
    -		{
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, "[%d] %s: %s", getpid(), dir, strerror(errno));
    -			return 1;
    -		}
    -	}
    -
    -	if (!S_ISDIR(sbuf.st_mode))
    -	{
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN,
    -			"[%d] %s: not a directory", getpid(),dir);
    -		return 1;
    -	}
    -
    -	if (access(dir, R_OK | W_OK))
    -	{
    -		 glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN,
    -			"[%d] %s: directory is not readable/writable", getpid(),dir);
    -		return 1;
    -	}
    -		
    -
    -	return 0;
    -}
    -
    -static int decrement_timeout(struct timeval *timeout, struct timeval before, struct timeval after)
    -{
    -        (*timeout).tv_sec = (*timeout).tv_sec - (after.tv_sec - before.tv_sec);
    -        (*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);
    -}
    -
    diff --git a/org.glite.lb.server/src/cond_dump.c b/org.glite.lb.server/src/cond_dump.c
    deleted file mode 100644
    index 0a40349..0000000
    --- a/org.glite.lb.server/src/cond_dump.c
    +++ /dev/null
    @@ -1,234 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include "glite/lb/context-int.h"
    -#include "lb_proto.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#define TR(name,type,field)             \
    -        if (field) {            \
    -                asprintf(&pomA,"%s" name ":"        \
    -                        "" type "",pomB,(field)); \
    -                free(pomB);                                     \
    -                pomB = pomA;                                    \
    -        }
    -
    -#define GS(string){	\
    -	asprintf(&pomA, "%s %s", pomB, (string)); \
    -	free(pomB); \
    -	pomB = pomA; \
    -}
    -
    -int edg_wll_Condition_Dump(notifInfo *ni, char **output, int oneline){
    -	if (! ni->conditions){
    -		*output = strdup("");
    -		return -1;
    -	}
    -
    -	char *pomA = NULL, *pomB;
    -	pomB = strdup("");
    -
    -	edg_wll_QueryRec **l1;
    -	edg_wll_QueryRec *l2;
    -	for (l1 = ni->conditions; *l1; l1++){
    -		if (l1 != ni->conditions)
    -			GS ("and");
    -		if (oneline)
    -			GS("(");
    -		l2 = *l1;
    -		switch (l2->attr){
    -			case EDG_WLL_QUERY_ATTR_JOBID: GS("jobId");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_OWNER: GS("owner");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_STATUS: GS("status");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_LOCATION: GS("location");
    -				break;
    -                        case EDG_WLL_QUERY_ATTR_DESTINATION: GS("destination");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_DONECODE: GS("donecode");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_USERTAG:
    -				GS(l2->attr_id.tag);
    -				break;
    -			case EDG_WLL_QUERY_ATTR_TIME: GS("time");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_LEVEL: GS("level");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_HOST: GS("host");
    -				break;
    -                        case EDG_WLL_QUERY_ATTR_SOURCE: GS("source");
    -				break;
    -                        case EDG_WLL_QUERY_ATTR_INSTANCE: GS("instance");
    -				break;
    -                        case EDG_WLL_QUERY_ATTR_EVENT_TYPE: GS("eventtype");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_CHKPT_TAG: GS("chkpttag");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_RESUBMITTED: GS("resubmitted");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_PARENT: GS("parent_job");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_EXITCODE: GS("exitcode");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_JDL_ATTR: 
    -				GS(l2->attr_id.tag);  //get JDL attribute name
    -				break;
    -			case EDG_WLL_QUERY_ATTR_STATEENTERTIME: GS("stateentertime");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: GS("lastupdatetime");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_NETWORK_SERVER: GS("networkserver");
    -				break;
    -			default:
    -				assert(! "Unknown attribute!");
    -				break;
    -		}
    -		for (l2 = *l1; l2->attr; l2++){
    -			if (l2 != *l1 && !oneline) GS ("	or");
    -			if (l2 != *l1 && oneline) GS("or");
    -			switch(l2->op){
    -				case EDG_WLL_QUERY_OP_EQUAL: GS("=");
    -					break;
    -				case EDG_WLL_QUERY_OP_LESS: GS ("<");
    -					break;
    -				case EDG_WLL_QUERY_OP_GREATER: GS ("<");
    -					break;
    -				case EDG_WLL_QUERY_OP_WITHIN: GS ("within");
    -					break;
    -				case EDG_WLL_QUERY_OP_UNEQUAL: GS ("!=");
    -					break;
    -				case EDG_WLL_QUERY_OP_CHANGED: GS ("->");
    -					break;
    -			}
    -			char *buf;
    -			switch (l2->attr){
    -		                case EDG_WLL_QUERY_ATTR_JOBID:
    -				case EDG_WLL_QUERY_ATTR_PARENT:
    -					GS(edg_wlc_JobIdUnparse(l2->value.j));
    -        	                        break;
    -				case EDG_WLL_QUERY_ATTR_DESTINATION:
    -				case EDG_WLL_QUERY_ATTR_LOCATION:
    -                	        case EDG_WLL_QUERY_ATTR_OWNER:
    -				case EDG_WLL_QUERY_ATTR_HOST:
    -				case EDG_WLL_QUERY_ATTR_INSTANCE:
    -				case EDG_WLL_QUERY_ATTR_JDL_ATTR:
    -				case EDG_WLL_QUERY_ATTR_NETWORK_SERVER:
    -					GS(l2->value.c);
    -                        	        break;
    -	                        case EDG_WLL_QUERY_ATTR_STATUS:
    -					if (l2->op == EDG_WLL_QUERY_OP_WITHIN)
    -                                                asprintf(&buf, "%s and %s",
    -                                                        edg_wll_StatToString((edg_wll_JobStatCode)l2->value.i), 
    -							edg_wll_StatToString((edg_wll_JobStatCode)l2->value2.i));
    -					else
    -						asprintf(&buf, "%s", edg_wll_StatToString((edg_wll_JobStatCode)l2->value.i));
    -					GS(buf);
    -					free(buf);
    -        	                        break;
    -                	        case EDG_WLL_QUERY_ATTR_DONECODE:
    -				case EDG_WLL_QUERY_ATTR_EXITCODE:
    -					if (l2->op == EDG_WLL_QUERY_OP_WITHIN)
    -						asprintf(&buf, "%i and %i",
    -                                                        l2->value.i, l2->value2.i);
    -					else
    -	                                        asprintf(&buf, "%i", l2->value.i);
    -                                        GS(buf);
    -                                        free(buf);
    -                        	        break;
    -				case EDG_WLL_QUERY_ATTR_EVENT_TYPE:
    -					if (l2->op == EDG_WLL_QUERY_OP_WITHIN)
    -						asprintf(&buf, "%s and %s", 
    -							edg_wll_EventToString((edg_wll_EventCode)l2->value.i),
    -							edg_wll_EventToString((edg_wll_EventCode)l2->value2.i));
    -					else
    -						asprintf(&buf, "%s", 
    -							edg_wll_EventToString((edg_wll_EventCode)l2->value.i));
    -					GS(buf);
    -					free(buf);
    -                                        break;
    -	                        case EDG_WLL_QUERY_ATTR_USERTAG:
    -					GS(l2->attr_id.tag);
    -        	                        break;
    -                	        case EDG_WLL_QUERY_ATTR_TIME:
    -				case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
    -                                case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
    -					buf = strdup(ctime(&(l2->value.t.tv_sec)));
    -					buf[strlen(buf)-1] = 0; // cut out '\n'
    -					if (l2->op == EDG_WLL_QUERY_OP_WITHIN){
    -						char *buf_ptr = buf;
    -						asprintf(&buf, "%s and %s", buf_ptr, ctime(&(l2->value2.t.tv_sec)));
    -						free(buf_ptr);
    -						buf[strlen(buf)-1] = 0;
    -						GS(buf);
    -					}
    -					else
    -						GS(buf);
    -					free(buf);
    -                        	        break;
    -	                        case EDG_WLL_QUERY_ATTR_LEVEL:
    -					if (l2->op == EDG_WLL_QUERY_OP_WITHIN)
    -						asprintf(&buf, "%i and %i",
    -							l2->value.i, l2->value2.i);
    -					else
    -						asprintf(&buf, "%i", l2->value.i);
    -					GS(buf);	
    -					free(buf);
    -        	                        break;
    -	                        case EDG_WLL_QUERY_ATTR_SOURCE:
    -					buf = edg_wll_SourceToString(l2->value.i);
    -					GS(buf);
    -					free(buf);
    -					if (l2->op == EDG_WLL_QUERY_OP_WITHIN){
    -						GS("and");
    -						buf = edg_wll_SourceToString(l2->value2.i);
    -	                                        GS(buf);
    -        	                                free(buf);
    -					}
    -        	                        break;
    -                	        case EDG_WLL_QUERY_ATTR_CHKPT_TAG:
    -					//XXX: what kind of data is it?
    -                        	        break;
    -	                        case EDG_WLL_QUERY_ATTR_RESUBMITTED:
    -					asprintf(&buf, "%i", l2->value.i);
    -					GS(buf);
    -                                        free(buf);
    -        	                        break;
    -				default:
    -					assert(! "Unknown condition attribute!");
    -					break;
    -	                }
    -			if (! oneline)
    -				GS("\n");
    -		}
    -		if (oneline)
    -			GS(")");
    -	}
    -
    -	*output = pomA;
    -
    -	return 0;
    -}
    -
    diff --git a/org.glite.lb.server/src/cond_dump.h b/org.glite.lb.server/src/cond_dump.h
    deleted file mode 100644
    index 8a17c09..0000000
    --- a/org.glite.lb.server/src/cond_dump.h
    +++ /dev/null
    @@ -1,26 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef GLITE_NOPTIF_DUMP_H
    -#define GLITE_NOTIF_DUMP_H
    -
    -#include "lb_proto.h"
    -
    -int edg_wll_Condition_Dump(notifInfo *ni, char **output, int oneline);
    -
    -#endif /* GLITE_NOTIF_DUMP */
    -
    diff --git a/org.glite.lb.server/src/db_calls.c b/org.glite.lb.server/src/db_calls.c
    deleted file mode 100644
    index 0f47539..0000000
    --- a/org.glite.lb.server/src/db_calls.c
    +++ /dev/null
    @@ -1,113 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ident "$Header: "
    -
    -#include 
    -#include 
    -
    -#include "glite/jobid/cjobid.h"
    -#include "glite/lbu/trio.h"
    -#include "glite/lbu/log.h"
    -
    -#include "glite/lb/context-int.h"
    -
    -#include "db_calls.h"
    -#include "db_supp.h"
    -
    -/** Returns bitmask of job membership in common server/proxy database 
    - */
    -int edg_wll_jobMembership(edg_wll_Context ctx, glite_jobid_const_t job)
    -{
    -        char            *dbjob;
    -        char            *stmt = NULL;
    -        glite_lbu_Statement q;
    -        int             ret, result = -1;
    -        char            *res[2] = { NULL, NULL};
    -
    -        edg_wll_ResetError(ctx);
    -
    -        dbjob = edg_wlc_JobIdGetUnique(job);
    -
    -        trio_asprintf(&stmt,"select proxy,server from jobs where jobid = '%|Ss' for update",dbjob);
    -	glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt);
    -        ret = edg_wll_ExecSQL(ctx,stmt,&q);
    -        if (ret <= 0) {
    -                if (ret == 0) {
    -			glite_common_log(LOG_CATEGORY_CONTROL, 
    -				LOG_PRIORITY_WARN, "%s: no such job",dbjob);
    -                        edg_wll_SetError(ctx,ENOENT,dbjob);
    -                }
    -                goto clean;
    -        }
    -        free(stmt); stmt = NULL;
    -
    -        if ((ret = edg_wll_FetchRow(ctx,q,sizeof(res)/sizeof(res[0]),NULL,res)) > 0) {
    -		result = 0;
    -                if (strcmp(res[0],"0")) result += DB_PROXY_JOB;
    -                if (strcmp(res[1],"0")) result += DB_SERVER_JOB;
    -        }
    -        else {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, "Error retrieving proxy&server fields of jobs table. Missing column?");
    -                edg_wll_SetError(ctx,ENOENT,dbjob);
    -        }
    -
    -clean:
    -        glite_lbu_FreeStmt(&q);
    -
    -	free(res[0]); free(res[1]);
    -        free(dbjob);
    -        free(stmt);
    -        return(result);
    -}
    -
    -
    -/* just lock one row corresponding to job in table jobs
    - * lock_mode: 0 = lock in share mode / 1 = for update
    - */
    -int edg_wll_LockJobRow(edg_wll_Context ctx, const char *job, int lock_mode) 
    -{
    -	char			*stmt = NULL;
    -	glite_lbu_Statement 	sh;
    -	int			nr;
    -
    -
    -	edg_wll_ResetError(ctx);
    -
    -	if (lock_mode) 
    -		trio_asprintf(&stmt, "select * from jobs where jobid='%|Ss' for update", job);
    -	else
    -		trio_asprintf(&stmt, "select * from jobs where jobid='%|Ss' lock in share mode", job);
    -
    -	glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt);
    -	if ((nr = edg_wll_ExecSQL(ctx,stmt,&sh)) < 0) goto cleanup;
    -	if (nr == 0) {
    -		char *err;
    -
    -		asprintf(&err,"jobid='%s' not registered in DB", job);
    -                edg_wll_SetError(ctx,ENOENT, err);
    -		free(err);
    -                goto cleanup;
    -	}
    -	
    -cleanup:
    -	if (sh) glite_lbu_FreeStmt(&sh);
    -	free(stmt); stmt = NULL;
    -
    -	return edg_wll_Error(ctx, NULL, NULL);
    -}
    -
    diff --git a/org.glite.lb.server/src/db_calls.h b/org.glite.lb.server/src/db_calls.h
    deleted file mode 100644
    index c7d0a5d..0000000
    --- a/org.glite.lb.server/src/db_calls.h
    +++ /dev/null
    @@ -1,33 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef GLITE_LB_LB_CALLS_H
    -#define GLITE_LB_LB_CALLS_H
    -
    -#ident "$Header:"
    -
    -#define DB_PROXY_JOB    1
    -#define DB_SERVER_JOB   2
    -
    -int edg_wll_jobMembership(edg_wll_Context ctx, glite_jobid_const_t job);
    -
    -#define edg_wll_LockJobRowInShareMode(X,Y) edg_wll_LockJobRow(X,Y,0)
    -#define edg_wll_LockJobRowForUpdate(X,Y) edg_wll_LockJobRow(X,Y,1)
    -int edg_wll_LockJobRow(edg_wll_Context ctx, const char *job, int lock_mode);
    -
    -
    -#endif /* GLITE_LB_LB_CALLS_H */
    diff --git a/org.glite.lb.server/src/db_store.c b/org.glite.lb.server/src/db_store.c
    deleted file mode 100644
    index cbbff6a..0000000
    --- a/org.glite.lb.server/src/db_store.c
    +++ /dev/null
    @@ -1,329 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/lbu/maildir.h"
    -#include "glite/lb/context-int.h"
    -#include "glite/lb/events.h"
    -#include "glite/lb/events_parse.h"
    -#include "purge.h"
    -#include "store.h"
    -#include "il_lbproxy.h"
    -#include "jobstat.h"
    -#include "db_supp.h"
    -#include "il_notification.h"
    -
    -#ifdef LB_PERF
    -#include "glite/lb/lb_perftest.h"
    -#include "srv_perf.h"
    -#endif
    -
    -
    -extern int unset_proxy_flag(edg_wll_Context, edg_wlc_JobId);
    -extern int proxy_purge;
    -
    -
    -static int db_store_finalize(edg_wll_Context ctx, char *event, edg_wll_Event *ev, edg_wll_JobStat *oldstat, edg_wll_JobStat *newstat, int reg_to_JP);
    -
    -
    -int
    -db_store(edg_wll_Context ctx, char *event)
    -{
    -  edg_wll_Event 	*ev = NULL;
    -  int			seq, reg_to_JP = 0, local_job;
    -  edg_wll_JobStat	newstat;
    -  edg_wll_JobStat	oldstat;
    -  int			ret;
    -
    -
    -  edg_wll_ResetError(ctx);
    -  memset(&newstat,0,sizeof newstat);
    -  memset(&oldstat,0,sizeof oldstat);
    -
    -  if(edg_wll_ParseEvent(ctx, event, &ev)) goto err;
    -
    -  local_job = is_job_local(ctx, ev->any.jobId);
    -
    -  if (!ctx->isProxy && check_store_authz(ctx, ev) != 0)
    -    goto err;
    -
    -#ifdef LB_PERF
    -  if (sink_mode == GLITE_LB_SINK_STORE) {
    -	  glite_wll_perftest_consumeEvent(ev);
    -	  edg_wll_FreeEvent(ev);
    -	  free(ev);
    -	  return 0;
    -  }
    -#endif
    -
    -  do {
    -	if (edg_wll_Transaction(ctx)) goto err;
    -
    -	if (store_job_server_proxy(ctx, ev, ®_to_JP)) goto rollback;
    -
    -	/* events logged to proxy and server (DIRECT flag) may be ignored on proxy
    -	* if jobid prefix hostname matches server hostname -> they will
    -   	* sooner or later arrive to server too and are stored in common DB 
    -   	*/
    -  	if (ctx->isProxy && local_job && (ev->any.priority & EDG_WLL_LOGFLAG_DIRECT)) {
    -		goto commit;
    -  	}
    -
    -	ret = edg_wll_StoreEvent(ctx, ev, event, &seq);
    -	if (ret ) {
    -		if (ret == EEXIST) edg_wll_ResetError(ctx);
    -		goto rollback;
    -	}
    -	
    -	if ( ev->any.type == EDG_WLL_EVENT_CHANGEACL ) {
    -		if (edg_wll_UpdateACL(ctx, ev->any.jobId,
    -			ev->changeACL.user_id, ev->changeACL.user_id_type,
    -			ev->changeACL.permission, ev->changeACL.permission_type,
    -			ev->changeACL.operation)) goto rollback;		
    -			
    -	}
    -	else {
    -#ifdef LB_PERF
    -		if(sink_mode == GLITE_LB_SINK_STATE) {
    -			glite_wll_perftest_consumeEvent(ev);
    -			goto commit;
    -    		}
    -#endif
    -
    -  		if ( newstat.state )  {	/* prevent memleaks in case of transaction retry */
    -			edg_wll_FreeStatus(&newstat);
    -			newstat.state = EDG_WLL_JOB_UNDEF;
    -		}
    -		if (edg_wll_StepIntState(ctx,ev->any.jobId, ev, seq, &oldstat, &newstat)) goto rollback;
    -		
    -		if (proxy_purge && newstat.remove_from_proxy) 
    -			if (edg_wll_PurgeServerProxy(ctx, ev->any.jobId)) goto rollback;
    -	}
    -
    -
    -	if (ev->any.type == EDG_WLL_EVENT_REGJOB &&
    -		(ev->regJob.jobtype == EDG_WLL_REGJOB_DAG ||
    -		 ev->regJob.jobtype == EDG_WLL_REGJOB_PARTITIONED ||
    -		 ev->regJob.jobtype == EDG_WLL_REGJOB_COLLECTION) &&
    -		ev->regJob.nsubjobs > 0) { 
    -
    -			if (register_subjobs_embryonic(ctx,&ev->regJob)) goto rollback;
    -			reg_to_JP |= REG_SUBJOBS_TO_JP;
    -	}
    -
    -commit:
    -rollback:;
    -  } while (edg_wll_TransNeedRetry(ctx));
    -
    -  if (edg_wll_Error(ctx, NULL, NULL)) goto err;
    -
    -
    -  db_store_finalize(ctx, event, ev, &oldstat, &newstat, reg_to_JP);
    -
    -
    -err:
    -  if(ev) { edg_wll_FreeEvent(ev); free(ev); }
    -  if ( newstat.state ) edg_wll_FreeStatus(&newstat);
    -  if ( oldstat.state ) edg_wll_FreeStatus(&oldstat);
    -
    -  return edg_wll_Error(ctx,NULL,NULL);
    -}
    -
    -
    -
    -/* Called only when CollectionStateEvent generated */
    -int
    -db_parent_store(edg_wll_Context ctx, edg_wll_Event *ev, intJobStat *is)
    -{
    -  char  *event = NULL;
    -  int	seq;
    -  int   err;
    -  edg_wll_JobStat	newstat;
    -  edg_wll_JobStat	oldstat;
    -
    -
    -  edg_wll_ResetError(ctx);
    -  memset(&newstat,0,sizeof newstat);
    -  memset(&oldstat,0,sizeof oldstat);
    -
    -  /* Transaction opened from db_store */
    -
    -#ifdef LB_PERF
    -  if (sink_mode == GLITE_LB_SINK_STORE) {
    -	  glite_wll_perftest_consumeEvent(ev);
    -	  edg_wll_FreeEvent(ev);
    -	  free(ev);
    -	  return 0;
    -  }
    -#endif
    -
    -
    -  assert(ev->any.user);
    -
    -    // locked from edg_wll_LoadIntState() <- load_parent_intJobStat() <- update_parent_status()
    -    // XXX: maybe it can be locked InShareMode there and re-locked ForUpdate here?
    -
    -    if(edg_wll_StoreEvent(ctx, ev, NULL, &seq))
    -      goto err;
    -
    -#ifdef LB_PERF
    -  if(sink_mode == GLITE_LB_SINK_STATE) {
    -	     glite_wll_perftest_consumeEvent(ev);
    -	     goto err;
    -  }
    -#endif
    -
    -  err = edg_wll_StepIntStateParent(ctx,ev->any.jobId, ev, seq, is, &oldstat, ctx->isProxy? NULL: &newstat);
    -
    -  if (err) goto err;
    -
    -  if ( ctx->isProxy ) {
    -    event = edg_wll_UnparseEvent(ctx, ev);
    -    assert(event);
    -  }
    -
    -  db_store_finalize(ctx, event, ev, &oldstat, &newstat, 0);
    -
    -err:
    -
    -  free(event);
    -  if ( newstat.state ) edg_wll_FreeStatus(&newstat);
    -  if ( oldstat.state ) edg_wll_FreeStatus(&oldstat);
    -  
    -  return edg_wll_Error(ctx,NULL,NULL);
    -}
    -
    -
    -/* Send regitration to JP 
    - */
    -static int register_to_JP(edg_wll_Context ctx, edg_wlc_JobId jobid, char *user)
    -{
    -	char *jids, *msg;
    -	
    -	
    -	if ( !(jids = edg_wlc_JobIdUnparse(jobid)) ) {
    -		return edg_wll_SetError(ctx, errno, "Can't unparse jobid when registering to JP");
    -	}
    -	if ( !(msg = calloc(strlen(jids)+strlen(user)+2, sizeof(char) )) ) {
    -		free(jids);
    -		return edg_wll_SetError(ctx, errno, "Can't allocate buffer when registering to JP");
    -	}
    -	strcat(msg, jids);
    -	free(jids);
    -	strcat(msg, "\n");
    -	strcat(msg, user);
    -	if ( glite_lbu_MaildirStoreMsg(ctx->jpreg_dir, ctx->srvName, msg) ) {
    -		free(msg);
    -		return edg_wll_SetError(ctx, errno, lbm_errdesc);
    -	}
    -	free(msg);
    -
    -	return edg_wll_Error(ctx,NULL,NULL);
    -}
    -
    -
    -static int register_subjobs_to_JP(edg_wll_Context ctx, edg_wll_Event *ev)
    -{
    -	edg_wlc_JobId	*subjobs = NULL;
    -	int		i = 0, j;
    -
    -
    -	if (edg_wll_GenerateSubjobIds(ctx, ev->regJob.jobId, 
    -			ev->regJob.nsubjobs, ev->regJob.seed, &subjobs)) 
    -		goto err;
    -
    -	for (i=0; iregJob.nsubjobs; i++) {
    -		if (register_to_JP(ctx, subjobs[i], ev->any.user))
    -			goto err;
    -	}
    -
    -err:
    -	for (j=i; jregJob.nsubjobs; j++) edg_wlc_JobIdFree(subjobs[j]);
    -	free(subjobs);
    -
    -	return edg_wll_Error(ctx,NULL,NULL);
    -}
    -
    -
    -static int forward_event_to_server(edg_wll_Context ctx, char *event, edg_wll_Event *ev, int local_job)
    -{
    -	if ( ctx->isProxy ) {
    -		/*
    -		 *	send event to the proper BK server
    -		 *	event with priority flag EDG_WLL_LOGFLAG_DIRECT (typically RegJob) is not sent
    -		 */
    -
    -		/* XXX: ending here may break the backward compatibility */
    -		if (!(ev->any.priority & EDG_WLL_LOGFLAG_PROXY)) {
    -			edg_wll_UpdateError(ctx, 0, "db_actual_store() WARNING: the event is not PROXY");
    -			//return edg_wll_SetError(ctx, EDG_WLL_IL_PROTO, "db_actual_store() ERROR: the event is not PROXY");
    -		}
    -
    -		if (!(ev->any.priority & (EDG_WLL_LOGFLAG_DIRECT | EDG_WLL_LOGFLAG_INTERNAL)) && !local_job) {
    -			if (edg_wll_EventSendProxy(ctx, ev->any.jobId, event) )  {
    -				return edg_wll_SetError(ctx, EDG_WLL_IL_PROTO, "edg_wll_EventSendProxy() error.");
    -			}
    -		}
    -	}
    -
    -	return edg_wll_Error(ctx,NULL,NULL);
    -}
    -
    -
    -static int db_store_finalize(edg_wll_Context ctx, char *event, edg_wll_Event *ev, edg_wll_JobStat *oldstat, edg_wll_JobStat *newstat, int reg_to_JP) 
    -{
    -	int 	local_job = is_job_local(ctx, ev->any.jobId);
    -
    -
    -#ifdef LB_PERF
    -	if( sink_mode == GLITE_LB_SINK_SEND ) {
    -		glite_wll_perftest_consumeEvent(ev);
    -		return edg_wll_Error(ctx,NULL,NULL);
    -	}
    -#endif
    -	
    -	if (ctx->jpreg_dir) {
    -		if (reg_to_JP & REG_JOB_TO_JP) 
    -			if (register_to_JP(ctx,ev->any.jobId,ev->any.user)) goto err;
    -		if (reg_to_JP & REG_SUBJOBS_TO_JP)
    -			if (register_subjobs_to_JP(ctx,ev)) goto err;
    -	}
    -
    -	if (forward_event_to_server(ctx, event, ev, local_job)) goto err;
    -	
    -	if (newstat->state) {
    -		if ( ctx->isProxy ) {
    -			if ((ev->any.priority & EDG_WLL_LOGFLAG_DIRECT) || local_job) 
    -				/* event will not arrive to server, only flag was set		*/
    -				/* check whether some pending notifications are not triggered	*/
    -				edg_wll_NotifMatch(ctx, oldstat, newstat);
    -			}
    -		else {
    -				edg_wll_NotifMatch(ctx, oldstat, newstat);
    -		}
    -	}
    -
    -err:
    -	return edg_wll_Error(ctx,NULL,NULL);
    -}
    diff --git a/org.glite.lb.server/src/db_supp.c b/org.glite.lb.server/src/db_supp.c
    deleted file mode 100644
    index cf49b8c..0000000
    --- a/org.glite.lb.server/src/db_supp.c
    +++ /dev/null
    @@ -1,144 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/lbu/db.h"
    -#include "glite/lb/context-int.h"
    -#include "glite/lbu/log.h"
    -
    -extern int 	debug;	// declared and set in bkserver.c
    -
    -
    -int edg_wll_SetErrorDB(edg_wll_Context ctx) {
    -	int code;
    -	char *ed;
    -
    -	if (ctx->dbctx) {
    -		code = glite_lbu_DBError(ctx->dbctx, NULL, &ed);
    -		if (code == EDEADLK) code = EDG_WLL_ERROR_DB_TRANS_DEADLOCK;
    -		if (code == ENOTCONN) code = EDG_WLL_ERROR_DB_LOST_CONNECTION;
    -		edg_wll_SetError(ctx, code, ed);
    -		free(ed);
    -	} else {
    -		code = EINVAL;
    -		edg_wll_SetError(ctx, EINVAL, "DB context isn't created");
    -	}
    -
    -	return code;
    -}
    -
    -
    -int edg_wll_ExecSQL(edg_wll_Context ctx, const char *cmd, glite_lbu_Statement *stmt) {
    -	int retval;
    -
    -	if ((retval = glite_lbu_ExecSQL(ctx->dbctx, cmd, stmt)) < 0) edg_wll_SetErrorDB(ctx);
    -	return retval;
    -}
    -
    -
    -int edg_wll_FetchRow(edg_wll_Context ctx, glite_lbu_Statement stmt, unsigned int n, unsigned long *lengths, char **results) {
    -	int retval;
    -
    -	if ((retval = glite_lbu_FetchRow(stmt, n, lengths, results)) < 0) edg_wll_SetErrorDB(ctx);
    -	return retval;
    -}
    -
    -int edg_wll_bufferedInsertInit(edg_wll_Context ctx, glite_lbu_bufInsert *bi, const char *table_name, long size_limit, long record_limit, const char *columns) {
    -	int retval;
    -
    -	if ((retval = glite_lbu_bufferedInsertInit(ctx->dbctx, bi, table_name, size_limit, record_limit, columns)) != 0) edg_wll_SetErrorDB(ctx);
    -	return retval;
    -}
    -
    -int edg_wll_bufferedInsert(edg_wll_Context ctx, glite_lbu_bufInsert bi, const char *row) {
    -	int retval;
    -
    -	if ((retval = glite_lbu_bufferedInsert(bi, row)) != 0) edg_wll_SetErrorDB(ctx);
    -	return retval;
    -}
    -
    -int edg_wll_bufferedInsertClose(edg_wll_Context ctx, glite_lbu_bufInsert bi) {
    -	int retval;
    -
    -	if ((retval = glite_lbu_bufferedInsertClose(bi)) != 0) edg_wll_SetErrorDB(ctx);
    -	return retval;
    -}
    -
    -int edg_wll_Transaction(edg_wll_Context ctx) {
    -	int retval;
    -
    -	if ((retval = glite_lbu_Transaction(ctx->dbctx)) != 0) edg_wll_SetErrorDB(ctx);
    -
    -// printf("edg_wll_Transaction(%d)\n", retval);
    -	return retval;
    -}
    -
    -int edg_wll_Commit(edg_wll_Context ctx) {
    -	int retval;
    -
    -	if ((retval = glite_lbu_Commit(ctx->dbctx)) != 0) edg_wll_SetErrorDB(ctx);
    -// printf("edg_wll_Commit(%d)\n", retval);
    -	return retval;
    -}
    -
    -int edg_wll_Rollback(edg_wll_Context ctx) {
    -	int retval;
    -
    -	if ((retval = glite_lbu_Rollback(ctx->dbctx)) != 0) edg_wll_SetErrorDB(ctx);
    -// printf("edg_wll_Rollback(%d)\n", retval);
    -	return retval;
    -}
    -
    -int edg_wll_TransNeedRetry(edg_wll_Context ctx) {
    -	int ret;
    -	char *errd;
    -
    -	ret = edg_wll_Error(ctx,NULL,NULL);
    -
    -	if (ret == EDG_WLL_ERROR_DB_TRANS_DEADLOCK) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, 
    -			"[%d]: DB deadlock detected. Rolling back transaction "
    -			"and retrying...", getpid());
    -
    -		edg_wll_ResetError(ctx);
    -		return !edg_wll_Rollback(ctx);
    -	}
    -	if (ret == EDG_WLL_ERROR_DB_LOST_CONNECTION) {
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, 
    -			"[%d]: Lost connection to DB. "
    -			"Rolling back transaction and retrying...",
    -			getpid());
    -
    -		edg_wll_ResetError(ctx);
    -		return !edg_wll_Rollback(ctx);
    -	} else if (ret==0) {
    -		edg_wll_Commit(ctx); /* errors propagated further */
    -		return 0;
    -	} else {
    -		edg_wll_Error(ctx, NULL, &errd);
    -		edg_wll_Rollback(ctx);
    -		edg_wll_SetError(ctx, ret, errd);
    -		free(errd);
    -		return 0;
    -	}
    -}
    -
    -
    diff --git a/org.glite.lb.server/src/db_supp.h b/org.glite.lb.server/src/db_supp.h
    deleted file mode 100644
    index 863c898..0000000
    --- a/org.glite.lb.server/src/db_supp.h
    +++ /dev/null
    @@ -1,44 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef EDG_WLL_DB_SUPP_H
    -#define EDG_WLL_DB_SUPP_H
    -
    -#ident "$Header:"
    -
    -#include "glite/lbu/db.h"
    -
    -#define DEFAULTCS "lbserver/@localhost:lbserver20"
    -
    -/**
    - * Set the current database error.
    - */
    -int edg_wll_SetErrorDB(edg_wll_Context ctx);
    -
    -int edg_wll_ExecSQL(edg_wll_Context ctx, const char *cmd, glite_lbu_Statement *stmt);
    -int edg_wll_FetchRow(edg_wll_Context ctx, glite_lbu_Statement stmt, unsigned int n, unsigned long *lengths, char **results);
    -
    -int edg_wll_bufferedInsertInit(edg_wll_Context ctx, glite_lbu_bufInsert *bi, const char *table_name, long size_limit, long record_limit, const char *columns);
    -int edg_wll_bufferedInsert(edg_wll_Context ctx, glite_lbu_bufInsert bi, const char *row);
    -int edg_wll_bufferedInsertClose(edg_wll_Context ctx, glite_lbu_bufInsert bi);
    -
    -int edg_wll_Transaction(edg_wll_Context ctx);
    -int edg_wll_Commit(edg_wll_Context ctx);
    -int edg_wll_Rollback(edg_wll_Context ctx);
    -int edg_wll_TransNeedRetry(edg_wll_Context ctx);
    -
    -#endif
    diff --git a/org.glite.lb.server/src/dump.c b/org.glite.lb.server/src/dump.c
    deleted file mode 100644
    index 34ae9e4..0000000
    --- a/org.glite.lb.server/src/dump.c
    +++ /dev/null
    @@ -1,215 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/lbu/trio.h"
    -#include "glite/jobid/cjobid.h"
    -#include  "glite/lbu/log.h"
    -
    -#include "glite/lb/context-int.h"
    -#include "glite/lb/events_parse.h"
    -#include "glite/lb/ulm_parse.h"
    -
    -#include "query.h"
    -#include "get_events.h"
    -#include "server_state.h"
    -#include "purge.h"
    -#include "db_supp.h"
    -#include "lb_proto.h"
    -
    -static char *time_to_string(time_t t, char **ptr);
    -static int handle_specials(edg_wll_Context,time_t *);
    -
    -#define sizofa(a) (sizeof(a)/sizeof((a)[0]))
    -
    -int edg_wll_DumpEventsServer(edg_wll_Context ctx,const edg_wll_DumpRequest *req,edg_wll_DumpResult *result)
    -{
    -	char	*from_s, *to_s, *stmt, *time_s, *ptr;
    -	char	*tmpfname;
    -	time_t	start,end;
    -	glite_lbu_Statement	q = NULL;
    -	char		*res[10];
    -	int	event;
    -	edg_wll_Event	e;
    -	int	ret,dump = 2;	/* TODO: manage dump file */
    -	time_t	from = req->from,to = req->to;
    -
    -	from_s = to_s = stmt = NULL;
    -	memset(res,0,sizeof res);
    -	memset(&e,0,sizeof e);
    -
    -	time(&start);
    -	edg_wll_ResetError(ctx);
    -
    -	if ( (dump = edg_wll_CreateTmpDumpFile(ctx, &tmpfname)) == -1 )
    -		return edg_wll_Error(ctx, NULL, NULL);
    -
    -	if (handle_specials(ctx,&from) || handle_specials(ctx,&to))
    -	{
    -		unlink(tmpfname);
    -		return edg_wll_Error(ctx,NULL,NULL);
    -	}
    -
    -	glite_lbu_TimeToStr(from, &from_s);
    -	glite_lbu_TimeToStr(to, &to_s);
    -
    -	trio_asprintf(&stmt,
    -			"select event,dg_jobid,code,prog,host,u.cert_subj,time_stamp,usec,level,arrived "
    -			"from events e,users u,jobs j "
    -			"where u.userid=e.userid "
    -			"and j.jobid = e.jobid "
    -			"and j.dg_jobid like 'https://%|Ss:%d%%' "
    -			"and arrived > %s and arrived <= %s "
    -			"order by arrived",
    -			ctx->srvName,ctx->srvPort,
    -			from_s,to_s);
    -	glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt);
    -	
    -	if (edg_wll_ExecSQL(ctx,stmt,&q) < 0) goto clean;
    -
    -	while ((ret = edg_wll_FetchRow(ctx,q,sizeof(res)/sizeof(res[0]),NULL,res)) > 0) {
    -		assert(ret == sizofa(res));
    -		event = atoi(res[0]); free(res[0]); res[0] = NULL;
    -
    -		if (convert_event_head(ctx,res+1,&e)
    -			|| edg_wll_get_event_flesh(ctx,event,&e))
    -		{
    -			char	*et,*ed;
    -			int	i;
    -
    -		/* Most likely sort of internal inconsistency. 
    -		 * Must not be fatal -- just complain
    -		 */
    -			edg_wll_Error(ctx,&et,&ed);
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "%s event %d: %s (%s)", res[1], event, et, ed);
    -			free(et); free(ed);
    -			for (i=0; ifrom = from;
    -	result->to = to;
    -
    -	edg_wll_CreateDumpFileFromTmp(ctx, tmpfname, &(result->server_file));
    -	unlink(tmpfname);
    -
    -clean:
    -	edg_wll_FreeEvent(&e);
    -	glite_lbu_FreeStmt(&q);
    -
    -	free(stmt);
    -	free(from_s);
    -	free(to_s);
    -	return edg_wll_Error(ctx,NULL,NULL);
    -}
    -
    -static int handle_specials(edg_wll_Context ctx,time_t *t)
    -{
    -	char	*time_s;
    -	int	ret;
    -
    -	edg_wll_ResetError(ctx);
    -	switch (*t) {
    -		case EDG_WLL_DUMP_NOW:
    -			time(t);
    -			return 0;
    -		case EDG_WLL_DUMP_LAST_START:
    -		case EDG_WLL_DUMP_LAST_END:
    -			switch (ret = edg_wll_GetServerState(ctx,
    -					*t == EDG_WLL_DUMP_LAST_START ? 
    -						EDG_WLL_STATE_DUMP_START:
    -						EDG_WLL_STATE_DUMP_END,
    -					&time_s))
    -			{
    -				case ENOENT: *t = 0; 
    -					     edg_wll_ResetError(ctx);
    -					     break;
    -				case 0: *t = glite_lbu_StrToTime(time_s); 
    -					assert(*t >= 0);
    -					break;
    -				default: break;
    -			}
    -			break;
    -		default: if (*t < 0) return edg_wll_SetError(ctx,EINVAL,"special time limit unrecognized");
    -	}
    -	return edg_wll_Error(ctx,NULL,NULL);
    -}
    -
    -
    -static char *time_to_string(time_t t, char **ptr) {
    -	char *s;
    -
    -	glite_lbu_TimeToStr(t, &s);
    -	s[strlen(s) - 1] = '\0';
    -	*ptr = s;
    -
    -	return s + 1;
    -}
    diff --git a/org.glite.lb.server/src/get_events.c.T b/org.glite.lb.server/src/get_events.c.T
    deleted file mode 100644
    index 3f51578..0000000
    --- a/org.glite.lb.server/src/get_events.c.T
    +++ /dev/null
    @@ -1,206 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -/*
    -@@@AUTO
    -*/
    -@@@LANG: C
    -
    -/* Helper functions for getting events from the LB database *
    - * XXX: lots of stuff still hadcoded:
    - * 		there's mapping db.columns <-> union event fields
    - */
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/lbu/trio.h"
    -#include "glite/lbu/log.h"
    -#include "get_events.h"
    -#include "glite/lb/context-int.h"
    -#include "glite/lb/events_parse.h"
    -#include "glite/lb/ulm_parse.h"
    -#include "db_supp.h"
    -
    -static void edg_wll_set_event_field(edg_wll_Event *,char *,char *);
    -static void edg_wll_set_event_field_warn(edg_wll_Event *,char *,char *);
    -
    -int edg_wll_get_event_flesh(edg_wll_Context ctx,int n,edg_wll_Event *e)
    -{
    -	char	*jobid = edg_wlc_JobIdGetUnique(e->any.jobId),
    -		*q = NULL,*nameval[2];
    -	glite_lbu_Statement	sh;
    -	int	ret,t;
    -	const char	*tables[] = { "short_fields","long_fields" };
    -	edg_wll_Event *f;
    -
    -	edg_wll_ResetError(ctx);
    -
    -	trio_asprintf(&q, "select ulm from events_flesh where jobid = '%|Ss' and event = %d", jobid, n);
    -	glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, q);
    -
    -	if ((ret=edg_wll_ExecSQL(ctx,q,&sh)) < 0) goto cleanup;
    -	if (edg_wll_FetchRow(ctx,sh,1,NULL,&nameval[0]) == 1) {
    -		//fprintf(stderr, "got ulm: '%s'\n", nameval[0]);
    -		// nasty ;-)
    -		edg_wll_ParseEvent(ctx,nameval[0],&f);
    -		free(nameval[0]);
    -
    -		f->any.arrived = e->any.arrived;
    -		edg_wll_FreeEvent(e);
    -
    -		memcpy(e, f, sizeof *e);
    -		free(f);
    -		ret=edg_wll_CheckEvent(ctx,e);
    -	} else ret = ENOENT;
    -	free(q); q = NULL;
    -	glite_lbu_FreeStmt(&sh);
    -
    -	// old way keeped for compatibility/slow migration
    -	if (ret != 0) {
    -	for (t=0; t<=1; t++) {
    -		trio_asprintf(&q,"select name,value from %s "
    -				"where jobid = '%|Ss' and event = %d ",
    -				tables[t],jobid,n);
    -		glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG,
    -			q);
    -
    -		if ((ret=edg_wll_ExecSQL(ctx,q,&sh)) < 0) goto cleanup;
    -
    -		while ((ret=edg_wll_FetchRow(ctx,sh,sizeof(nameval)/sizeof(nameval[0]),NULL,nameval)) > 0) {
    -			assert(ret == 2);
    -			edg_wll_set_event_field(e,nameval[0],nameval[1]);
    -			free(nameval[0]);
    -			/* XXX: nameval[1] freed in edg_wll_set_event_field
    -			 * if necessary
    -			 */
    -		}
    -
    -		if (ret<0) goto cleanup;
    -		glite_lbu_FreeStmt(&sh);
    -		free(q); q=NULL;
    -	}
    -	ret=edg_wll_CheckEvent(ctx,e);
    -	}
    -
    -cleanup:
    -	if (sh) glite_lbu_FreeStmt(&sh);
    -	free(jobid);
    -	free(q);
    -
    -	if (ret) { edg_wll_FreeEvent(e); memset(e,0,sizeof *e); }
    -	return ret;
    -}
    -
    -
    -/* print/log  warning for database inconsistency */
    -
    -static void edg_wll_set_event_field_warn(
    -		edg_wll_Event	*event,
    -		char		*name,
    -		char		*value)
    -{
    -	char *e = edg_wll_EventToString(event->any.type);
    -
    -	glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, 
    -		"edg_wll_set_event_field: bad field:"
    -		"code=\"%s\" name=\"%s\" value=\"%s\"",
    -		e, name, value);
    -	free(e);
    -	/* XXX edg_wll_Log */
    -}
    -
    -/* set event structure field */
    -
    -static void edg_wll_set_event_field(
    -		edg_wll_Event	*event,
    -		char		*name,
    -		char		*value)
    -{
    -/* XXX: where's the best place to hande it? */
    -	if (!strcasecmp(name,"SRC_INSTANCE")) {
    -		event->any.src_instance = value;
    -		return;
    -	}
    -
    -/* XXX: handled separately, should go to event_head one day */
    -	if (!strcasecmp(name,"SEQCODE")) {
    -		event->any.seqcode = value;
    -		return;
    -	}
    -
    -@@@{
    -	for my $n (getAllFieldsOrdered $event) {
    -		my @occ = getFieldOccurence $event $n;
    -		next if $#occ == 0 && $occ[0] eq '_common_';
    -		selectType $event $occ[0];
    -		my $f = selectField $event $n;
    -		my $name = getName $f;
    -		my $lcname = lc $name;
    -		gen qq{
    -!	if (!strcasecmp(name,"$lcname")) \{
    -!		switch (event->any.type) \{
    -};
    -		for (@occ) {
    -			next if $_ eq '_common_';
    -			selectType $event $_;
    -			$f = selectField $event $n;
    -			my $fucname = ucfirst $n;
    -			my $uctype = uc $_;
    -			my $flctype = lcfirst $_;
    -			if ($flctype =~ m/^pBS/) { $flctype = ucfirst $flctype; }
    -			if ($flctype =~ m/^cREAM/) { $flctype = ucfirst $flctype; }
    -			if ($flctype =~ m/^condor/) { $flctype = ucfirst $flctype; }
    -			my $frs = $f->{codes} ?
    -				"event->$flctype.$name = edg_wll_StringTo$_${fucname}(value);" :
    -				fromString $f 'value',"event->$flctype.$name";
    -			gen qq{
    -!			case EDG_WLL_EVENT_$uctype: $frs break;
    -};
    -		}
    -		gen qq{
    -!			default: edg_wll_set_event_field_warn(event,name,value); break;
    -!		\} /* switch */
    -!		free(value);
    -!		return;
    -!	\}
    -};
    -	}
    -@@@}
    -
    -	edg_wll_set_event_field_warn(event,name,value);
    -	free(value);
    -	return;
    -}
    -		
    -
    -int compare_events_by_tv(const void *a, const void *b)
    -{
    -	const edg_wll_Event *e = (edg_wll_Event *)a;
    -	const edg_wll_Event *f = (edg_wll_Event *)b;
    -
    -	if (e->any.timestamp.tv_sec < f->any.timestamp.tv_sec) return -1;
    -	if (e->any.timestamp.tv_sec > f->any.timestamp.tv_sec) return 1;
    -	if (e->any.timestamp.tv_usec < f->any.timestamp.tv_usec) return -1;
    -	if (e->any.timestamp.tv_usec > f->any.timestamp.tv_usec) return 1;
    -	return 0;
    -}
    diff --git a/org.glite.lb.server/src/get_events.h b/org.glite.lb.server/src/get_events.h
    deleted file mode 100644
    index 024b3da..0000000
    --- a/org.glite.lb.server/src/get_events.h
    +++ /dev/null
    @@ -1,55 +0,0 @@
    -#ifndef GLITE_LB_GET_EVENTS_H
    -#define GLITE_LB_GET_EVENTS_H
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include "glite/lb/context.h"
    -#include "glite/lb/events.h"
    -#include "glite/lb/query_rec.h"
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -#if 0	/* rel 1 */
    -char *edg_wll_jobid_to_user( edg_wll_Context, char *);
    -void edg_wll_set_event_field_warn( edg_wll_Event *, char *, char *);
    -void edg_wll_set_event_field( edg_wll_Event *, char *, char *);
    -int edg_wll_get_events_restricted( edg_wll_Context, edg_wlc_JobId, char *, int, int, char *, edg_wll_Event **);
    -#define edg_wll_get_events(ctx,job,md5,emin,emax,ret) \
    -	edg_wll_get_events_restricted((ctx),(job),(md5),(emin),(emax),NULL,(ret))
    -int edg_wll_last_event( edg_wll_Context, char *);
    -int compare_events_by_tv(const void *, const void *);
    -#endif
    -
    -int edg_wll_get_event_flesh(edg_wll_Context,int,edg_wll_Event *);
    -
    -int edg_wll_QueryEventsServer(edg_wll_Context,int,const edg_wll_QueryRec **,const edg_wll_QueryRec **,edg_wll_Event **);
    -
    -int edg_wll_QueryJobsServer(edg_wll_Context, const edg_wll_QueryRec **, int, edg_wlc_JobId **, edg_wll_JobStat **);
    -
    -void edg_wll_SortEvents(edg_wll_Event *);
    -
    -void edg_wll_SortPEvents(edg_wll_Event **);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* GLITE_LB_GET_EVENTS_H */
    diff --git a/org.glite.lb.server/src/il_lbproxy.c b/org.glite.lb.server/src/il_lbproxy.c
    deleted file mode 100644
    index debe75d..0000000
    --- a/org.glite.lb.server/src/il_lbproxy.c
    +++ /dev/null
    @@ -1,101 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/lb/context-int.h"
    -#include "glite/lb/log_proto.h"
    -#include "glite/lbu/log.h"
    -
    -#include "il_lbproxy.h"
    -
    -#define FCNTL_ATTEMPTS		5
    -#define FCNTL_TIMEOUT		1
    -#define FILE_PREFIX		EDG_WLL_LOG_PREFIX_DEFAULT
    -#define DEFAULT_SOCKET		"/tmp/interlogger.sock"
    -
    -char *lbproxy_ilog_socket_path = DEFAULT_SOCKET;
    -char *lbproxy_ilog_file_prefix = FILE_PREFIX;
    -
    -
    -int
    -edg_wll_EventSendProxy(
    -	edg_wll_Context			ctx,
    -	glite_jobid_const_t		jobid,
    -	const char			   *event)
    -{
    -	long			filepos;
    -	char		   *jobid_s,
    -				   *event_file = NULL;
    -	int				err = 0;
    -
    -#define _err(n)		{ err = n; goto out; }
    -
    -	edg_wll_ResetError(ctx);
    -
    -	jobid_s = edg_wlc_JobIdGetUnique(jobid);
    -	if ( !jobid_s ) {
    -		edg_wll_SetError(ctx, ENOMEM, "edg_wlc_JobIdGetUnique()");
    -		_err(1);
    -	}
    -
    -	asprintf(&event_file, "%s.%s", lbproxy_ilog_file_prefix, jobid_s);
    -	if ( !event_file ) {
    -		edg_wll_SetError(ctx, ENOMEM, "asprintf()");
    -		_err(1);
    -	}
    -
    -	if ( edg_wll_log_event_write(ctx, event_file, event,
    -					(ctx->p_tmp_timeout.tv_sec > FCNTL_ATTEMPTS ?
    -						ctx->p_tmp_timeout.tv_sec : FCNTL_ATTEMPTS),
    -					FCNTL_TIMEOUT, &filepos) ) {
    -
    -		edg_wll_UpdateError(ctx, 0, "edg_wll_log_event_write()");
    -		_err(1);
    -	}
    -
    -	if ( edg_wll_log_event_send(ctx, lbproxy_ilog_socket_path, filepos,
    -						event, strlen(event), 1, &ctx->p_tmp_timeout) ) {
    -		char *errt, *errd;
    -		errt = errd = NULL;
    -	
    -		edg_wll_UpdateError(ctx, EDG_WLL_IL_PROTO, "edg_wll_log_event_send()");
    -		edg_wll_Error(ctx, &errt, &errd);
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, 
    -			"%s (%s)", errt, errd);
    -		free(errt); free(errd);
    -		_err(-1);
    -	}
    -
    -out:
    -	if ( jobid_s ) free(jobid_s);
    -	if ( event_file ) free(event_file);
    -
    -	if ( !err ) return 0;
    -	if ( err < 0 ) {
    -		/* do not propagate IL errors */
    -		edg_wll_ResetError(ctx);
    -		return 0;
    -	} else {
    -		edg_wll_UpdateError(ctx, 0, "edg_wll_EventSendProxy()");
    -		return edg_wll_Error(ctx, NULL, NULL);
    -	}
    -}
    diff --git a/org.glite.lb.server/src/il_lbproxy.h b/org.glite.lb.server/src/il_lbproxy.h
    deleted file mode 100644
    index 23e228f..0000000
    --- a/org.glite.lb.server/src/il_lbproxy.h
    +++ /dev/null
    @@ -1,36 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#ifndef GLITE_LB_IL_LBPROXY_H
    -#define GLITE_LB_IL_LBPROXY_H
    -
    -#include "glite/lb/context.h"
    -
    -#ifdef __cplusplus
    -#extern "C" {
    -#endif
    -
    -extern char *lbproxy_ilog_socket_path;
    -extern char *lbproxy_ilog_file_prefix;
    -
    -int edg_wll_EventSendProxy(edg_wll_Context ctx, glite_jobid_const_t jobid, const char *event);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* GLITE_LB_IL_LBPROXY_H */
    diff --git a/org.glite.lb.server/src/il_notification.c b/org.glite.lb.server/src/il_notification.c
    deleted file mode 100644
    index ff44b33..0000000
    --- a/org.glite.lb.server/src/il_notification.c
    +++ /dev/null
    @@ -1,238 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -/**
    - * il_notification.c
    - *   - implementation of IL API calls for notifications
    - *
    - */
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/lbu/escape.h"
    -#include "glite/lb/context-int.h"
    -#include "glite/lb/notifid.h"
    -#include "glite/lb/events_parse.h"
    -#include "glite/lb/log_proto.h"
    -#include "glite/lbu/log.h"
    -
    -#include "il_notification.h"
    -#include "lb_xml_parse.h"
    -#include "authz_policy.h"
    -
    -
    -#define FCNTL_ATTEMPTS		5
    -#define FCNTL_TIMEOUT		1
    -#define FILE_PREFIX             "/tmp/notif_events"
    -#define DEFAULT_SOCKET          "/tmp/notif_interlogger.sock"
    -#define NOTIF_TIMEOUT		1
    -
    -char *notif_ilog_socket_path = DEFAULT_SOCKET;
    -char *notif_ilog_file_prefix = FILE_PREFIX;
    -
    -
    -static
    -int
    -notif_create_ulm(
    -	edg_wll_Context	context,
    -	edg_wll_NotifId	reg_id,
    -	const char	*host,
    -	const uint16_t	port,
    -	const char	*owner,
    -	int		expires,
    -	const char	*notif_data,
    -	char		**ulm_data,
    -	char		**reg_id_s)
    -{
    -	int		ret;
    -	edg_wll_Event	*event=NULL;
    -
    -	*ulm_data = NULL;
    -	*reg_id_s = NULL;
    -
    -	event = edg_wll_InitEvent(EDG_WLL_EVENT_NOTIFICATION);
    -
    -	gettimeofday(&event->any.timestamp,0);
    -	if (context->p_host) event->any.host = strdup(context->p_host);
    -	event->any.level = context->p_level;
    -	event->any.source = context->p_source;
    -	if (context->p_instance) event->notification.src_instance = strdup(context->p_instance);
    -	event->notification.notifId = edg_wll_NotifIdDup(reg_id);
    -	if (owner) event->notification.owner = strdup(owner);
    -	if (host) event->notification.dest_host = strdup(host);
    -	event->notification.dest_port = port;
    -	if (notif_data) event->notification.jobstat = strdup(notif_data);
    -
    -	event->notification.expires = expires;
    -
    -	if ((*ulm_data = edg_wll_UnparseNotifEvent(context,event)) == NULL) {
    -		edg_wll_SetError(context, ret = ENOMEM, "edg_wll_UnparseNotifEvent()"); 
    -		goto out;
    -	}
    -
    -	if((*reg_id_s = edg_wll_NotifIdGetUnique(reg_id)) == NULL) {
    -		edg_wll_SetError(context, ret = ENOMEM, "edg_wll_NotifIdGetUnique()");
    -		goto out;
    -	}
    -
    -	ret = 0;
    -
    -out:
    -	if(event) { 
    -		edg_wll_FreeEvent(event);
    -		free(event);
    -	}
    -	if(ret) edg_wll_UpdateError(context, ret, "notif_create_ulm()");
    -	return(ret);
    -}
    -
    -
    -int
    -edg_wll_NotifSend(edg_wll_Context       context,
    -	          edg_wll_NotifId       reg_id,
    -		  const char           *host,
    -                  int                   port,
    -		  const char           *owner,
    -		  int			expires,
    -                  const char           *notif_data)
    -{
    -	struct timeval	timeout = {NOTIF_TIMEOUT, 0};
    -	int				ret;
    -	long			filepos;
    -	char		   *ulm_data,
    -				   *reg_id_s,
    -				   *event_file;
    -
    -	if((ret=notif_create_ulm(context, 
    -				 reg_id, 
    -				 host, 
    -				 port, 
    -				 owner, 
    -				 expires,
    -				 notif_data,
    -				 &ulm_data,
    -				 ®_id_s))) {
    -		goto out;
    -	}
    -
    -	asprintf(&event_file, "%s.%s", notif_ilog_file_prefix, reg_id_s);
    -	if(event_file == NULL) {
    -		edg_wll_SetError(context, ret=ENOMEM, "asprintf()");
    -		goto out;
    -	}
    -
    -	if ( (ret = edg_wll_log_event_write(context, event_file, ulm_data,
    -					FCNTL_ATTEMPTS, FCNTL_TIMEOUT, &filepos)) ) {
    -		edg_wll_UpdateError(context, 0, "edg_wll_log_event_write()");
    -		goto out;
    -	}
    -
    -	if ( (ret = edg_wll_log_event_send(context, notif_ilog_socket_path,
    -					filepos, ulm_data, strlen(ulm_data), 1, &timeout)) ) {
    -		edg_wll_UpdateError(context, 0, "edg_wll_log_event_send()");
    -		goto out;
    -	}
    -
    -	ret = 0;
    -
    -out:
    -	if(ulm_data) free(ulm_data);
    -	if(reg_id_s) free(reg_id_s);
    -	if(ret) edg_wll_UpdateError(context, ret, "edg_wll_NotifSend()");
    -	return(ret);
    -}
    -
    -
    -int
    -edg_wll_NotifJobStatus(edg_wll_Context	context,
    -		       edg_wll_NotifId	reg_id,
    -		       const char      *host,
    -                       int              port,
    -		       const char      *owner,
    -                       int		flags,
    -		       int		authz_flags,
    -		       int		expires,
    -		       const edg_wll_JobStat notif_job_stat)
    -{
    -	int 		ret=0;
    -	char   		*xml_data, *xml_esc_data=NULL;
    -	edg_wll_JobStat	stat = notif_job_stat;
    -
    -	
    -	if (flags == 0) {
    -		stat.jdl = NULL;
    -		stat.matched_jdl = NULL;
    -		stat.condor_jdl = NULL;
    -		stat.rsl = NULL;
    -	}
    -	if (authz_flags)
    -		blacken_fields(&stat, authz_flags);
    -
    -	if(edg_wll_JobStatusToXML(context, stat, &xml_data)) 
    -		goto out;
    -	
    -	if((xml_esc_data = glite_lbu_EscapeXML(xml_data)) == NULL) {
    -		edg_wll_SetError(context, ret=ENOMEM, "glite_lbu_EscapeXML()");
    -		goto out;
    -	}
    -
    -	if ((ret=edg_wll_NotifSend(context, reg_id, host, port, owner, expires, xml_esc_data))) {
    -		char *ed = NULL, *et = NULL;
    -
    -		if(ret) edg_wll_UpdateError(context, ret, "edg_wll_NotifJobStatus()");
    -		edg_wll_Error(context,&et,&ed);
    -		glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, 
    -			"%s - %s\n", ed, et);
    -		edg_wll_ResetError(context);
    -		free(et); 
    -		free(ed);
    -	}
    -
    -out:
    -	if(xml_data) free(xml_data);
    -	if(xml_esc_data) free(xml_esc_data);
    -	return(edg_wll_Error(context,NULL,NULL));
    -}
    -
    -
    -int 
    -edg_wll_NotifChangeIL(edg_wll_Context context,
    -                               edg_wll_NotifId reg_id,
    -                               const char      *host,
    -                               int             port,
    -			       int	       expires)
    -{
    -	return(edg_wll_NotifSend(context, reg_id, host, port, "", expires, ""));
    -}
    -
    -
    -int
    -edg_wll_NotifCancelRegId(edg_wll_Context context,
    -			 edg_wll_NotifId reg_id)
    -{
    -/* XXX: Jan 1 1970 00:00:01 -- quite sure to make it expire immediately */
    -	return(edg_wll_NotifSend(context, reg_id, NULL, 0, "", 1, ""));
    -}
    -
    diff --git a/org.glite.lb.server/src/il_notification.h b/org.glite.lb.server/src/il_notification.h
    deleted file mode 100644
    index cf1facc..0000000
    --- a/org.glite.lb.server/src/il_notification.h
    +++ /dev/null
    @@ -1,127 +0,0 @@
    -#ifndef GLITE_LB_IL_NOTIFICATION_H
    -#define GLITE_LB_IL_NOTIFICATION_H
    -
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -/* needed for the edg_wll_NotifId */
    -#include "glite/lb/notifid.h"
    -
    -/* import the edg_wll_JobStat structure */
    -#include "glite/lb/jobstat.h"
    -
    -#ifdef __cplusplus
    -#extern "C" {
    -#endif
    -
    -extern char *notif_ilog_socket_path;
    -extern char *notif_ilog_file_prefix;
    -
    -/** Send ULM notification string to interlogger.
    - * Stores notification to file according to registration id and send it
    - * to interlogger using local socket.
    - * \param reg_id  registration id
    - * \param host,port address to deliver the notification to.
    - *                  If NULL, it means no further notifications will
    - *                  follow (the client has unregistered). It always
    - *                  overrides previous values (ie. changes the
    - *                  reg_id->client address mapping in interlogger).
    - * \param owner DN of the registration owner, this will be verified
    - *              against client's certificate
    - * \param notif_data ULM formatted notification string, may be NULL,
    - *                   if there is nothing to be sent to client.
    - * \retval 0 OK
    - * \retval EINVAL	bad jobId, unknown event code, or the format
    - *                      string together with the remaining arguments
    - *                      does not form a valid event 
    - * \retval ENOSPC	unable to accept the event due to lack of disk
    - *                      space etc. 
    - * \retval ENOMEM	failed to allocate memory
    - * \retval EAGAIN	non blocking return from the call, the event
    - *                      did not come through socket, but is backed up
    - *                      in file
    - */
    -int
    -edg_wll_NotifSend(edg_wll_Context       context,
    -	          edg_wll_NotifId       reg_id,
    -		  const char           *host,
    -                  int                   port,
    -		  const char           *owner,
    -		  int			expires,
    -                  const char           *notif_data);
    -
    -
    -/** Send job status notification.
    - * Creates ULM notification string and sends it using
    - * edg_wll_NotifSend(). The job status is encoded into XML and escaped
    - * before inclusion into ULM.
    - * \param reg_id registration id
    - * \param host,port address to deliver the notification to.
    - * \param owner DN of the registration owner, this will be verified
    - *              against client's certificate
    - * \param flags verbosity of returned status 
    - * \param notif_job_stat structure describing job status
    - * \see edg_wll_NotifSend()
    - */
    -int
    -edg_wll_NotifJobStatus(edg_wll_Context	context,
    -		       edg_wll_NotifId	reg_id,
    -		       const char      *host,
    -                       int              port,
    -		       const char      *owner,
    -                       int              flags,
    -		       int		authz_flags,
    -		       int		expires,
    -		       const edg_wll_JobStat notif_job_stat);
    -
    -
    -/** Change address for notification delivery.
    - * Creates ULM string and uses edg_wll_NotifSend() to pass it
    - * to interlogger.
    - * \param reg_id registration id
    - * \param host,port new delivery address
    - * \see edg_wll_NotifSend()
    - */
    -int 
    -edg_wll_NotifChangeIL(edg_wll_Context context,
    -                               edg_wll_NotifId reg_id,
    -                               const char      *host,
    -                               int             port,
    -			       int		expires);
    -
    -/** Cancel registration.
    - * Creates ULM string and uses edg_wll_NotifSend() to pass it to
    - * interlogger.
    - * \param reg_id registration id
    - */
    -int
    -edg_wll_NotifCancelRegId(edg_wll_Context context,
    -			 edg_wll_NotifId reg_id);
    -
    -
    -/**
    - * Check and perform notifications.
    - */
    -int edg_wll_NotifMatch(edg_wll_Context context, const edg_wll_JobStat *oldstat, const edg_wll_JobStat *stat);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* GLITE_LB_IL_NOTIFICATION_H */
    diff --git a/org.glite.lb.server/src/index.c.T b/org.glite.lb.server/src/index.c.T
    deleted file mode 100644
    index 46057b9..0000000
    --- a/org.glite.lb.server/src/index.c.T
    +++ /dev/null
    @@ -1,452 +0,0 @@
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/lb/context-int.h"
    -#include "glite/lbu/trio.h"
    -#include "db_supp.h"
    -#include "index.h"
    -
    -extern int debug;
    -
    -#define const_len(c)	(sizeof((c))-1)
    -
    -static int parse_indices(edg_wll_Context ctx,char **keys,char ***column_names,const char **built_in_indices,edg_wll_QueryRec *** index_out,char ***keys_out);
    -
    -int edg_wll_QueryJobIndices(edg_wll_Context ctx,edg_wll_QueryRec *** index_out,char ***keys_out)
    -{
    -	static const char *built_in_indices[] = {
    -		"PRIMARY",
    -		"parent_job",
    -		NULL
    -	};
    -	char	**keys = NULL;
    -	char	***column_names = NULL;
    -
    -	if (glite_lbu_QueryIndices(ctx->dbctx, "states", &keys, &column_names) != 0) {
    -		edg_wll_SetErrorDB(ctx);
    -		return EIO;
    -	}
    -
    -	if (!keys) {
    -		*index_out = NULL;
    -		if (keys_out) *keys_out = NULL;
    -		return edg_wll_ResetError(ctx);
    -	}
    -
    -/* XXX: keys are passed up or freed, column_names are freed there */
    -	if (parse_indices(ctx,keys,column_names,built_in_indices,index_out,keys_out)) 
    -		return edg_wll_Error(ctx,NULL,NULL);
    -	else return edg_wll_ResetError(ctx);
    -
    -}
    -
    -int edg_wll_QueryNotifIndices(edg_wll_Context ctx,edg_wll_QueryRec *** index_out,char ***keys_out)
    -{
    -	static const char *built_in_indices[] = {
    -		"PRIMARY",
    -		NULL
    -	};
    -	char	**keys = NULL;
    -	char	***column_names = NULL;
    -
    -	if (glite_lbu_QueryIndices(ctx->dbctx, "notif_registrations", &keys, &column_names) != 0) {
    -		edg_wll_SetErrorDB(ctx);
    -		return EIO;
    -	}
    -
    -	if (!keys) {
    -		*index_out = NULL;
    -		if (keys_out) *keys_out = NULL;
    -		return edg_wll_ResetError(ctx);
    -	}
    -
    -/* XXX: keys are passed up or freed, column_names are freed there */
    -	if (parse_indices(ctx,keys,column_names,built_in_indices,index_out,keys_out)) 
    -		return edg_wll_Error(ctx,NULL,NULL);
    -	else return edg_wll_ResetError(ctx);
    -
    -}
    -
    -/* TODO: 
    -   - better error recovery (skip unrecognised indices etc.)
    -   - leaks memory on errors
    -*/
    -
    -static int parse_indices(edg_wll_Context ctx,char **keys,char ***column_names,const char **built_in_indices,edg_wll_QueryRec *** index_out,char ***keys_out)
    -{
    -
    -	edg_wll_QueryRec	**idx = NULL;
    -
    -	int	*cols = NULL;
    -
    -	int	i, j;
    -	int	nkeys = 0;
    -
    -
    -
    -	for (i = 0; keys[i]; i++) {
    -		// skip builtin indices
    -		for (j = 0; built_in_indices[j]; j++) {
    -			if (strcasecmp(keys[i], built_in_indices[j]) == 0)
    -				goto next_index;
    -		}
    -
    -		cols = realloc(cols,(nkeys+1) * sizeof cols[0]); 
    -		cols[nkeys] = 0;
    -		idx = realloc(idx,(nkeys+2) * sizeof idx[0]);
    -		idx[nkeys] = idx[nkeys+1] = NULL;
    -		if (keys_out) {
    -			*keys_out = realloc(*keys_out, (nkeys + 2) * sizeof(char *));
    -			(*keys_out)[nkeys] = strdup(keys[i]);
    -			(*keys_out)[nkeys + 1] = NULL;
    -		}
    -
    -		for (j = 0; column_names[i][j]; j++) {
    -			if (cols[nkeys] <= j) {
    -				cols[nkeys] = j+1;
    -				idx[nkeys] = realloc(idx[nkeys],(j+2)*sizeof idx[nkeys][0]);
    -				memset(&idx[nkeys][j+1],0,sizeof idx[nkeys][0]);
    -			}
    -
    -			if (edg_wll_ColumnToQueryRec(column_names[i][j],&idx[nkeys][j])) {
    -				int   code;
    -				char *ed;
    -
    -				asprintf(&ed, "%s(%s): unsupported column", keys[i], column_names[i][j]);
    -				code = edg_wll_SetError(ctx, EINVAL, ed);
    -				free(ed);
    -				return code;
    -			}
    -// XXX: needed Sub_part in value???
    -//      	               else idx[nkeys][j].value.i = atoi(showcol[Sub_part]);
    -		}
    -		nkeys++;
    -next_index:
    -		for (j = 0; column_names[i][j]; j++) free(column_names[i][j]);
    -		free(column_names[i]);
    -		column_names[i] = NULL;
    -		free(keys[i]);
    -		keys[i] = NULL;
    -
    -		// just for escaping from nested cycles
    -		;	/* prevent compiler to complain */
    -	}
    -	free(column_names);
    -	free(keys);
    -	free(cols);
    -	*index_out = idx;
    -
    -	return edg_wll_ResetError(ctx);
    -}
    -
    -int edg_wll_CmpColumn(const edg_wll_QueryRec *r1,const edg_wll_QueryRec *r2)
    -{
    -	if (r1->attr != r2->attr) return 1;
    -	switch (r1->attr) {
    -		case EDG_WLL_QUERY_ATTR_USERTAG:
    -			return strcasecmp(r1->attr_id.tag,r2->attr_id.tag);
    -		case EDG_WLL_QUERY_ATTR_JDL_ATTR:
    -			return strcasecmp(r1->attr_id.tag,r2->attr_id.tag);
    -		case EDG_WLL_QUERY_ATTR_TIME:
    -			return r1->attr_id.state != r2->attr_id.state;
    -		default:
    -			return 0;
    -	}
    -}
    -
    -static char *to_sql_string(edg_wll_JobStat const *stat,int offset)
    -{
    -	char	*out = NULL,
    -	    	*in = *((char **) (((char *) stat) + offset));
    -
    -       	if (in) trio_asprintf(&out,"'%|Ss'",in);
    -	return out;
    -}
    -
    -static char *to_sql_timeval(edg_wll_JobStat const *stat,int offset)
    -{
    -	char	*out;
    -	glite_lbu_TimeToStr( ((struct timeval *) (((char *) stat) + offset))->tv_sec, &out );
    -	return out;
    -}
    -
    -static edg_wll_JobStat	fakestat;
    -
    -static struct {
    -	const char	*name;
    -	edg_wll_QueryAttr	attr;
    -	int		offset;
    -	char	* (*to_sql)(edg_wll_JobStat const *,int);
    -} std_attrs[] =
    -{
    -@@@{
    -	for my $n ($status->getAllFieldsOrdered) {
    -		my $f = selectField $status $n;
    -		next unless $f->{index};
    -		my $u = uc $n;
    -		gen "\t{ \"$n\", EDG_WLL_QUERY_ATTR_$u, ((char *) \&fakestat.$n) - ((char *) \&fakestat),\&to_sql_$f->{type} },\n";
    -	}
    -@@@}
    -	{ NULL, },
    -};
    -
    -/* TODO: use in queries */
    -char *edg_wll_StatToSQL(edg_wll_JobStat const *stat,edg_wll_QueryAttr attr)
    -{
    -	int	i;
    -
    -	for (i=0; std_attrs[i].attr && std_attrs[i].attr != attr; i++);
    -
    -	return std_attrs[i].attr ? std_attrs[i].to_sql(stat,std_attrs[i].offset) : (char *) -1;
    -}
    -
    -char *edg_wll_JDLStatToSQL(edg_wll_JobStat const *stat,edg_wll_QueryRec col_rec)
    -{
    -        struct cclassad *ad = NULL;
    -        char *extr_val = NULL;
    -	char *extr_val_apostrophed = NULL;
    -
    -        ad = cclassad_create(stat->jdl);
    -        if (ad) {
    -                if (!cclassad_evaluate_to_string(ad, col_rec.attr_id.tag, &extr_val)) { // Extract attribute value
    -                        extr_val = NULL;
    -                        cclassad_delete(ad);
    -                }
    -        }
    -
    -	if (extr_val) {
    -		trio_asprintf(&extr_val_apostrophed,"'%|Ss'", extr_val);
    -		free(extr_val);
    -	}
    -
    -        return extr_val_apostrophed;
    -}
    -
    -int edg_wll_ColumnToQueryRec(const char *col_name,edg_wll_QueryRec *rec)
    -{
    -	int	i;
    -
    -	memset(rec,0,sizeof *rec);
    -	if (strncasecmp(col_name,STD_PREFIX,const_len(STD_PREFIX)) == 0) {
    -		for (i=0; std_attrs[i].name
    -			&& strcasecmp(std_attrs[i].name,col_name+const_len(STD_PREFIX)); i++);
    -
    -		if (std_attrs[i].name) rec->attr = std_attrs[i].attr;
    -	}
    -	else if (strncasecmp(col_name,TIME_PREFIX,const_len(TIME_PREFIX)) == 0) {
    -		rec->attr_id.state = edg_wll_StringToStat(col_name+const_len(TIME_PREFIX));
    -		if (rec->attr_id.state != (edg_wll_JobStatCode) -1) rec->attr = EDG_WLL_QUERY_ATTR_TIME;
    -	}
    -	else if (strncasecmp(col_name,USR_PREFIX,const_len(USR_PREFIX)) == 0) {
    -		rec->attr = EDG_WLL_QUERY_ATTR_USERTAG;
    -		rec->attr_id.tag = strdup(col_name+const_len(USR_PREFIX));
    -		rec->value.c = NULL;
    -	}
    -	else if (strncasecmp(col_name,JDL_PREFIX,const_len(JDL_PREFIX)) == 0) {
    -		rec->attr = EDG_WLL_QUERY_ATTR_JDL_ATTR;
    -		rec->attr_id.tag = strdup(col_name+const_len(JDL_PREFIX));
    -		rec->value.c = NULL;
    -	}
    -
    -	return !rec->attr;
    -}
    -
    -char * edg_wll_QueryRecToColumn(const edg_wll_QueryRec *rec)
    -{
    -	char	col[100] = "";
    -
    -	if (rec->attr == EDG_WLL_QUERY_ATTR_USERTAG) {
    -		strcpy(col,USR_PREFIX);
    -		strcat(col,rec->attr_id.tag);
    -	}
    -	else if (rec->attr == EDG_WLL_QUERY_ATTR_TIME) {
    -		char	*s = edg_wll_StatToString(rec->attr_id.state);
    -
    -		if (s) {
    -			strcpy(col,TIME_PREFIX);
    -			strcat(col,s);
    -			free(s);
    -		}
    -	}
    -	else if (rec->attr == EDG_WLL_QUERY_ATTR_JDL_ATTR) {
    -		strcpy(col,JDL_PREFIX);
    -		strcat(col,rec->attr_id.tag);
    -	}
    -	else {
    -		int	i;
    -		for (i=0; std_attrs[i].name && std_attrs[i].attr != rec->attr; i++);
    -		if (std_attrs[i].name) {
    -			strcpy(col,STD_PREFIX);
    -			strcat(col,std_attrs[i].name);
    -		}
    -	}
    -
    -	return col[0] ? strdup(col) : NULL;
    -}
    -
    -char * edg_wll_QueryRecToColumnExt(const edg_wll_QueryRec *rec)
    -{
    -	char	*intern = edg_wll_QueryRecToColumn(rec),
    -		*out;
    -
    -	if (!intern) return NULL;
    -
    -	switch (rec->attr) {
    -		case EDG_WLL_QUERY_ATTR_USERTAG:
    -			out = strdup(intern+const_len(USR_PREFIX));
    -			break;
    -		case EDG_WLL_QUERY_ATTR_TIME:
    -			out = strdup(intern+const_len(TIME_PREFIX));
    -			break;
    -		default:
    -			out = strdup(intern+const_len(STD_PREFIX));
    -			break;
    -	}
    -	free(intern);
    -	return out;
    -}
    -
    -void edg_wll_FreeIColumnRec(edg_wll_IColumnRec *icrp)
    -{
    -	if (icrp->qrec.attr == EDG_WLL_QUERY_ATTR_USERTAG)
    -		free(icrp->qrec.attr_id.tag);
    -	free(icrp->colname);
    -}
    -
    -
    -/*
    - * Compute part of SQL command used for indexed state table columns
    - */
    -
    -edg_wll_ErrorCode edg_wll_IColumnsSQLPart(edg_wll_Context ctx,
    -					void *job_index_cols_v,
    -					edg_wll_JobStat *stat,
    -					int is_insert,
    -					char **names_out,
    -					char **values_out)
    -{
    -	int i;
    -	char *names, *values;
    -	char *data;
    -	char *tmp;
    -	char *tmpval;
    -	edg_wll_IColumnRec *job_index_cols = (edg_wll_IColumnRec *)job_index_cols_v;
    -
    -	edg_wll_ResetError(ctx);
    -
    -	if (is_insert) names = strdup(""); else names = NULL;
    -	values = strdup("");
    -
    -	if (job_index_cols != NULL)
    -	for (i=0; job_index_cols[i].colname; i++) {
    -		data = NULL;
    -		switch (job_index_cols[i].qrec.attr) {
    -			case EDG_WLL_QUERY_ATTR_OWNER:
    -				if (stat->owner) {
    -					tmpval = edg_wll_gss_normalize_subj(stat->owner, 0);
    -					trio_asprintf(&data, "'%|Ss'", tmpval);
    -					free(tmpval);
    -				} else data = strdup("''");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_LOCATION:
    -				if (stat->location)
    -					trio_asprintf(&data, "'%|Ss'", stat->location);
    -				else data = strdup("''");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_DESTINATION:
    -				if (stat->destination)
    -					trio_asprintf(&data, "'%|Ss'", stat->destination);
    -				else data = strdup("''");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_DONECODE:
    -				asprintf(&data, "%d", stat->done_code);
    -				break;
    -			case EDG_WLL_QUERY_ATTR_USERTAG:
    -				if (stat->user_tags) {
    -					int k;
    -					for (k=0; stat->user_tags[k].tag &&
    -							strcmp(stat->user_tags[k].tag,job_index_cols[i].qrec.attr_id.tag);
    -						k++);
    -					if (stat->user_tags[k].tag != NULL) {
    -						trio_asprintf(&data, "'%|Ss'", stat->user_tags[k].value);
    -					} else data = strdup("''");
    -				} else data = strdup("''");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_TIME:
    -				if (stat->stateEnterTimes)
    -					glite_lbu_TimeToStr(stat->stateEnterTimes[job_index_cols[i].qrec.attr_id.state+1], &data);
    -				else data = strdup("0");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_RESUBMITTED:
    -				asprintf(&data, "%d", stat->resubmitted);
    -				break;
    -			case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
    -				glite_lbu_TimeToStr(stat->stateEnterTime.tv_sec, &data);
    -				break;
    -			case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
    -				glite_lbu_TimeToStr(stat->lastUpdateTime.tv_sec, &data);
    -				break;
    -			case EDG_WLL_QUERY_ATTR_JDL_ATTR: // This is not the correct way to handle jdl searches.
    -                                /* There's no way to index individual JDL attributes */
    -				if (stat->jdl)
    -					trio_asprintf(&data, "'%|Ss'", stat->jdl);
    -				else data = strdup("''");
    -				break;
    -/*			case EDG_WLL_QUERY_ATTR_STATEENTERTIME: /// XXX: Which way of handling this is correct?
    -				if (stat->stateEnterTime)
    -					glite_lbu_TimeToStr(stat->stateEnterTime, &data);
    -				else data = strdup("0");
    -				break;
    -			case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
    -				if (stat->lastUpdateTime)
    -					glite_lbu_TimeToStr(stat->lastUpdateTime, &data);
    -				else data = strdup("0");
    -				break;*/
    -
    -				/* XXX add more attributes when defined */
    -			default:
    -				/* do not use */
    -				break;
    -		}
    -
    -		if (!data) continue;
    -
    -		if (is_insert) {
    -			asprintf(&tmp, "%s,`%s`", names, job_index_cols[i].colname);
    -			free(names); names = tmp;
    -			asprintf(&tmp, "%s,%s", values, data);
    -			free(values); values = tmp;
    -		} else {
    -			/* update */
    -			asprintf(&tmp, "%s,`%s`=%s", values, job_index_cols[i].colname, data);
    -			free(values); values = tmp;
    -		}
    -		free(data);
    -	}
    -
    -	if (is_insert) *names_out = names;
    -	*values_out = values;
    -
    -	return edg_wll_Error(ctx, NULL, NULL);
    -}
    diff --git a/org.glite.lb.server/src/index_lex.l b/org.glite.lb.server/src/index_lex.l
    deleted file mode 100644
    index d70f10b..0000000
    --- a/org.glite.lb.server/src/index_lex.l
    +++ /dev/null
    @@ -1,63 +0,0 @@
    -%{
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -#include 
    -
    -#include "glite/lb/context-int.h"
    -#include "index_parse.h"
    -#include "index.h"
    -
    -char	*lex_out;
    -int	lex_int;
    -int	lex_line;
    -
    -int yywrap(void) { return 1; }
    -
    -#define YY_NO_UNPUT
    -
    -%}
    -
    -
    -delim	[ \t]
    -ws	{delim}+
    -string	\"[^\"\n]*\"
    -digit	[0-9]
    -int	{digit}+
    -
    -%%
    -{ws}	{}
    -
    -JobIndices	return JOB_INDICES;
    -type		return TYPE;
    -name		return NAME;
    -prefixlen	return PREFIX;
    -{int}		{
    -			lex_int = atoi(yytext);
    -			return INT;
    -		}
    -{string}	{
    -			int	len;
    -			lex_out = malloc(len = strlen(yytext)-1);
    -			strncpy(lex_out,yytext+1,len-1);
    -			lex_out[len-1] = 0;
    -			return STRING;
    -		}
    -\n	lex_line++;
    -.		return *yytext;
    -
    diff --git a/org.glite.lb.server/src/index_parse.y b/org.glite.lb.server/src/index_parse.y
    deleted file mode 100644
    index 036aeb3..0000000
    --- a/org.glite.lb.server/src/index_parse.y
    +++ /dev/null
    @@ -1,259 +0,0 @@
    -%{
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/lb/context-int.h"
    -
    -#include "index.h"
    -
    -#define yyerror(x) {}
    -
    -#define YYDEBUG	1
    -
    -#define ATTR_TYPE_SYSTEM	"system"
    -#define ATTR_TYPE_USER		"user"
    -#define ATTR_TYPE_TIME		"time"
    -
    -static edg_wll_Context parse_ctx;
    -static const char	*parse_fname;
    -
    -#define bailout(msg) \
    -{ \
    -	char	*buf; \
    - \
    -	asprintf(&buf,"%s:%d: %s",parse_fname,lex_line,(msg)); \
    -	edg_wll_SetError(parse_ctx,EINVAL,buf); \
    -	free(buf); \
    -	YYABORT; \
    -}
    -
    -extern FILE *yyin;
    -
    -edg_wll_QueryRec	**indices_out;
    -
    -%}
    -
    -%term JOB_INDICES
    -%term STRING
    -%term INT
    -%term TYPE
    -%term NAME
    -%term PREFIX
    -
    -%union
    -{
    -	char	*s;
    -	int	i;
    -	edg_wll_QueryRec	qr;
    -	edg_wll_QueryRec	*qrl;
    -	edg_wll_QueryRec	**qrll;
    -	struct elem_attr {
    -		int	attr;
    -		char	*val;
    -		int	intval;
    -	}			attr;
    -}
    -
    -%type  string
    -%type  int
    -%type  job_index_elem
    -%type  job_index job_index_elem_list
    -%type  job_index_list job_indices;
    -%type  elem_attr opt_elem_attr
    -
    -%%
    -
    -config	: '[' job_indices soft_semicolon ']'	{ indices_out = $2; }
    -	;
    -
    -job_indices	: JOB_INDICES '=' '{' job_index_list soft_comma '}' { $$ = $4; }
    -		;
    -
    -job_index_list	: job_index	{ $$ = calloc(2,sizeof (*$$)); *$$ = $1; }
    -		| job_index_list ',' job_index
    -{
    -	int	i;
    -	for (i=0; $1[i]; i++);
    -	$$ = realloc($1,(i+2) * sizeof *$1);
    -	$$[i] = $3;
    -	$$[i+1] = NULL;
    -}
    -		;
    -
    -job_index	: job_index_elem		{ $$ = calloc(2,sizeof (*$$)); memcpy($$,&$1,sizeof $1); }
    -		| '{' job_index_elem_list '}'	{ $$ = $2; }
    -		;
    -
    -job_index_elem_list	: job_index_elem	{ $$ = calloc(2,sizeof (*$$)); memcpy($$,&$1,sizeof $1); }
    -		| job_index_elem_list ',' job_index_elem
    -{
    -	int	i;
    -	for (i=0; $1[i].attr; i++);
    -	$$ = realloc($1,(i+2) * sizeof *$1);
    -	memcpy($$+i,&$3,sizeof $3);
    -	memset($$+i+1,0,sizeof *$$);
    -}
    -		;
    -
    -job_index_elem	: '[' elem_attr ';' elem_attr opt_elem_attr ']'
    -{
    -	char	*name = $2.attr == NAME ? $2.val :
    -				$4.attr == NAME ? $4.val : 
    -				$5.attr == NAME ? $5.val : NULL,
    -		*type = $2.attr == TYPE ? $2.val :
    -				$4.attr == TYPE ? $4.val :
    -				$5.attr == TYPE ? $5.val : NULL;
    -	int	prefix = $2.attr == PREFIX ? $2.intval :
    -				$4.attr == PREFIX ? $4.intval :
    -				$5.attr == PREFIX ? $5.intval : 0;
    -
    -
    -	if (!name) bailout("`name' required");
    -	if (!type) bailout("`type' required");
    -
    -	if (strcasecmp(type,ATTR_TYPE_SYSTEM) == 0) {
    -		char	*name2;
    -		asprintf(&name2,STD_PREFIX "%s",name);
    -		if (edg_wll_ColumnToQueryRec(name2,&$$)) bailout("unknown attribute");
    -		free(name2);
    -		free(name);
    -	}
    -	else if (strcasecmp(type,ATTR_TYPE_USER) == 0) {
    -		$$.attr = EDG_WLL_QUERY_ATTR_USERTAG;
    -		$$.attr_id.tag = name;
    -	}
    -	else if (strcasecmp(type,ATTR_TYPE_TIME) == 0) {
    -		char	*name2;
    -		if (prefix) bailout("PREFIXLEN is not valid with time attributes");
    -		asprintf(&name2,TIME_PREFIX "%s",name);
    -		if (edg_wll_ColumnToQueryRec(name2,&$$)) bailout("unknown attribute");
    -		free(name2);
    -		free(name);
    -	}
    -	else bailout("unknown attr type");
    -
    -	$$.value.i = prefix;
    -}
    -		;
    -
    -elem_attr	: TYPE '=' string	{ $$.attr = TYPE; $$.val = $3; }
    -		| NAME '=' string	{ $$.attr = NAME; $$.val = $3; }
    -		| PREFIX '=' int	{ $$.attr = PREFIX; $$.intval = $3; }
    -		;
    -
    -opt_elem_attr	: 	{ $$.attr = 0; $$.val = NULL; }
    -		|	';' elem_attr	{ $$ = $2; }
    -		;
    -
    -string		: STRING	{ $$ = lex_out; lex_out = NULL; }
    -		;
    -
    -int		: INT		{ $$ = lex_int; }
    -		;
    -
    -soft_semicolon	:
    -		| ';'
    -		;
    -
    -soft_comma	:
    -		| ','
    -		;
    -
    -
    -%%
    -
    -
    -/* XXX: uses static variables -- non thread-safe */
    -
    -int edg_wll_ParseIndexConfig(edg_wll_Context ctx,const char *fname,edg_wll_QueryRec ***out)
    -{
    -	yyin = strcmp(fname,"-") ? fopen(fname,"r") : stdin;
    -	lex_line = 1;
    -
    -	if (!yyin) return edg_wll_SetError(ctx,errno,fname);
    -
    -	parse_ctx = ctx;
    -	parse_fname = fname;
    -	edg_wll_ResetError(ctx);
    -
    -	/* yydebug = 1; */
    -	if (yyparse() && !edg_wll_Error(ctx,NULL,NULL)) {
    -		char	buf[100];
    -		if (yyin != stdin) fclose(yyin);
    -		sprintf(buf,"%s:%d: parse error",fname,lex_line);
    -		return edg_wll_SetError(ctx,EINVAL,buf);
    -	}
    -	if (yyin != stdin) fclose(yyin);
    -
    -	if (!edg_wll_Error(ctx,NULL,NULL)) *out = indices_out;
    -	indices_out = NULL;	/* XXX: memory leak on error but who cares? */
    -	return edg_wll_Error(ctx,NULL,NULL);
    -}
    -
    -int edg_wll_DumpIndexConfig(edg_wll_Context ctx,const char *fname,edg_wll_QueryRec * const *idx)
    -{
    -	int	haveit = 0;
    -
    -	FILE	*f = strcmp(fname,"-") ? fopen(fname,"w") : stdout;
    -
    -	if (!f) return edg_wll_SetError(ctx,errno,fname);
    -	if (idx && *idx) { haveit = 1; fputs("[\n\tJobIndices = {\n",f); }
    -
    -	while (idx && *idx) {
    -		const edg_wll_QueryRec *i;
    -		int	multi = (*idx)[1].attr;
    -
    -		fputs(multi ? "\t\t{\n" : "\t\t",f);
    -
    -		for (i=*idx; i->attr; i++) {
    -			char	*cn = edg_wll_QueryRecToColumnExt(i);
    -			char	prefix[100] = "";
    -			char	*type;
    -
    -			switch (i->attr) {
    -				case EDG_WLL_QUERY_ATTR_USERTAG: type = ATTR_TYPE_USER; break;
    -				case EDG_WLL_QUERY_ATTR_TIME: type = ATTR_TYPE_TIME; break;
    -				default: type = ATTR_TYPE_SYSTEM; break;
    -			}
    -				
    -			if (i->value.i) sprintf(prefix,"; prefixlen = %d ",i->value.i);
    -			if (multi) fputs("\t\t\t",f);
    -			fprintf(f,"[ type = \"%s\"; name = \"%s\" %s]",type,cn,prefix);
    -			if (multi) fputs(i[1].attr ? ",\n" : "\n",f);
    -			free(cn);
    -		}
    -
    -		if (multi) fputs("\t\t}",f);
    -		fputs(idx[1] ? ",\n" : "\n",f);
    -
    -		idx++;
    -	}
    -
    -	if (haveit) {
    -		fputs("\t}\n]\n",f);
    -		return edg_wll_ResetError(ctx);
    -	}
    -	else return edg_wll_SetError(ctx,ENOENT,"no indices");
    -}
    -
    -
    diff --git a/org.glite.lb.server/src/jobstat.c b/org.glite.lb.server/src/jobstat.c
    deleted file mode 100644
    index fa75a56..0000000
    --- a/org.glite.lb.server/src/jobstat.c
    +++ /dev/null
    @@ -1,1406 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -#ident "$Header$"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/lbu/trio.h"
    -#include "glite/lb/events.h"
    -#include "glite/lb/context-int.h"
    -#include "glite/lb/intjobstat.h"
    -#include "glite/lb/process_event.h"
    -#include "glite/lbu/log.h"
    -
    -#include "get_events.h"
    -#include "store.h"
    -#include "index.h"
    -#include "jobstat.h"
    -#include "lb_authz.h"
    -#include "stats.h"
    -#include "db_supp.h"
    -#include "db_calls.h"
    -#include "authz_policy.h"
    -
    -#define DAG_ENABLE	1
    -
    -#define	DONT_LOCK	0
    -#define	LOCK		1
    -
    -/* TBD: share in whole logging or workload */
    -#ifdef __GNUC__
    -#define UNUSED_VAR __attribute__((unused))
    -#else
    -#define UNUSED_VAR
    -#endif
    -  
    -
    -#define mov(a,b) { free(a); a = b; b = NULL; }
    -
    -static void warn (const char* format, ...) UNUSED_VAR ;
    -static char *job_owner(edg_wll_Context,char *);
    -static edg_wll_ErrorCode get_job_parent(edg_wll_Context ctx, glite_jobid_const_t job, glite_jobid_t *parent);
    -
    -
    -int js_enable_store = 1;
    -
    -/*
    - * Basic manipulations with the internal representation of job state
    - */
    -
    -#if 0
    -static int eval_expect_update(intJobStat *, int *, char **);
    -#endif
    -
    -static char* matched_substr(char *, regmatch_t) UNUSED_VAR;
    -
    -static char* matched_substr(char *in, regmatch_t match)
    -{
    -	int len;
    -	char *s;
    -
    -	len = match.rm_eo - match.rm_so;
    -	s = calloc(1, len + 1);
    -	if (s != NULL) {
    -		strncpy(s, in + (int)match.rm_so, len);
    -	}
    -
    -	return s;
    -}
    -
    -static int
    -check_jobstat_authz(edg_wll_Context ctx,
    -	char *owner,
    -	edg_wll_Acl acl,
    -	int *flags)
    -{
    -	struct _edg_wll_GssPrincipal_data princ;
    -
    -	*flags = 0;
    -	if (ctx->noAuth)
    -		return 1;
    -	if (ctx->peerName && edg_wll_gss_equal_subj(ctx->peerName, owner))
    -		return 1;
    -	if (acl && edg_wll_CheckACL(ctx, acl, EDG_WLL_CHANGEACL_READ) == 0)
    -		return 1;
    -	edg_wll_ResetError(ctx);
    -	princ.name = ctx->peerName;
    -	princ.fqans = ctx->fqans;
    -	if (check_authz_policy(&ctx->authz_policy, &princ, READ_ALL))
    -		return 1;
    -	if (check_authz_policy(&ctx->authz_policy, &princ, STATUS_FOR_MONITORING)) {
    -		*flags |= STATUS_FOR_MONITORING;
    -		return 1;
    -	}
    -	return 0;
    -}
    -
    -int edg_wll_JobStatusServer(
    -	edg_wll_Context	ctx,
    -	glite_jobid_const_t		job,
    -	int		flags,
    -	edg_wll_JobStat	*stat)
    -{
    -
    -/* Local variables */
    -	char		*string_jobid = NULL;
    -	char		*md5_jobid = NULL;
    -
    -	intJobStat	jobstat;
    -	intJobStat	*ijsp;
    -	int		whole_cycle;
    -	edg_wll_Acl	acl = NULL;
    -#if DAG_ENABLE	
    -	char		*stmt = NULL;
    -#endif
    -	char *s_out;
    -	intJobStat *js;
    -	char *out[1], *out_stat[3];
    -	glite_lbu_Statement sh = NULL;
    -	int num_sub, num_f, i, ii;
    -	int authz_flags = 0;
    -
    -
    -	edg_wll_ResetError(ctx);
    -
    -	memset(&jobstat, 0, sizeof(jobstat));
    -	string_jobid = edg_wlc_JobIdUnparse(job);
    -	if (string_jobid == NULL || stat == NULL)
    -		return edg_wll_SetError(ctx,EINVAL, NULL);
    -	md5_jobid = edg_wlc_JobIdGetUnique(job);
    -
    -	do {
    -		whole_cycle = 0;
    -
    -		if (edg_wll_Transaction(ctx)) goto rollback;
    -		if (edg_wll_LockJobRowInShareMode(ctx, md5_jobid)) goto rollback;
    -
    -
    -		if (!edg_wll_LoadIntState(ctx, job, DONT_LOCK, -1 /*all events*/, &ijsp)) {
    -			memcpy(stat, &(ijsp->pub), sizeof(ijsp->pub));
    -			destroy_intJobStat_extension(ijsp);
    -			free(ijsp);
    -		} else {
    -			if (edg_wll_intJobStatus(ctx, job, flags,&jobstat, js_enable_store, 0)) {
    -				goto rollback;
    -			}
    -			memcpy(stat, &(jobstat.pub), sizeof(jobstat.pub));
    -		}
    -		
    -		if (edg_wll_GetACL(ctx, job, &acl)) goto rollback;
    -
    -		if (check_jobstat_authz(ctx, stat->owner, acl, &authz_flags) == 0) {
    -			edg_wll_SetError(ctx, EPERM, "not owner");
    -			goto rollback;
    -		}
    -			
    -		if (acl) {
    -			stat->acl = strdup(acl->string);
    -			edg_wll_FreeAcl(acl);
    -			acl = NULL;
    -		}
    -
    -		if ((flags & EDG_WLL_STAT_CLASSADS) == 0) {
    -			char *null = NULL;
    -
    -			mov(stat->jdl, null);
    -			mov(stat->matched_jdl, null);
    -			mov(stat->condor_jdl, null);
    -			mov(stat->rsl, null);
    -			// !! if adding something here, add it also to edg_wll_NotifJobStatus() !!
    -		}
    -
    -	#if DAG_ENABLE
    -		if (stat->jobtype == EDG_WLL_STAT_DAG || stat->jobtype == EDG_WLL_STAT_COLLECTION) {
    -
    -	//	XXX: The users does not want any histogram. What do we do about it? 
    -	//		if ((!(flags & EDG_WLL_STAT_CHILDHIST_FAST))&&(!(flags & EDG_WLL_STAT_CHILDHIST_THOROUGH))) { /* No Histogram */
    -	//                        if (stat->children_hist != NULL) {	/* No histogram will be sent even if there was one */
    -	//
    -	//				printf("\nNo Histogram required\n\n");
    -	//
    -	//                              free(stat->children_hist);
    -	//			}
    -	//			
    -	//		}
    -
    -
    -			if (flags & EDG_WLL_STAT_CHILDSTAT) {
    -
    -				trio_asprintf(&stmt, "SELECT version,int_status,jobid FROM states WHERE parent_job='%|Ss'", md5_jobid);
    -				if (stmt != NULL) {
    -					glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt);
    -					num_sub = edg_wll_ExecSQL(ctx, stmt, &sh);
    -					if (num_sub >=0 ) {
    -						i = 0;
    -						stat->children_states = calloc(num_sub+1, sizeof(edg_wll_JobStat));
    -						if (stat->children_states == NULL) {
    -							edg_wll_SetError(ctx, ENOMEM, "edg_wll_JobStatusServer() calloc children_states failed!");
    -							goto rollback;
    -						}
    -						while ((num_f = edg_wll_FetchRow(ctx, sh, sizeof(out_stat), NULL, out_stat)) == 3
    -							&& i < num_sub) {
    -							if (!strcmp(INTSTAT_VERSION,out_stat[0])) {
    -								js = dec_intJobStat(out_stat[1], &s_out);
    -								if (s_out != NULL && js != NULL) {
    -									stat->children_states[i] = js->pub;
    -									destroy_intJobStat_extension(js);
    -									free(js);
    -									i++; // Careful, this value will also be used further
    -								}
    -							}
    -							else { // recount state
    -								glite_jobid_t	subjob;
    -								intJobStat	js_real;
    -								char		*name;
    -								unsigned int		port;
    -
    -
    -								js = &js_real;
    -								glite_jobid_getServerParts(job, &name, &port);
    -								if (glite_jobid_recreate(name, port, out_stat[2], &subjob)) {
    -									goto rollback;
    -								}
    -								free(name);
    -
    -								if (edg_wll_intJobStatus(ctx, subjob, flags, js, js_enable_store, 0)) {
    -									goto rollback;
    -								}
    -								glite_jobid_free(subjob);
    -								stat->children_states[i] = js->pub;
    -								destroy_intJobStat_extension(js);
    -								i++; // Careful, this value will also be used further
    -							}
    -							free(out_stat[0]); out_stat[0] = NULL;
    -							free(out_stat[1]); out_stat[1] = NULL;  
    -							free(out_stat[2]); out_stat[2] = NULL;
    -						}
    -						if (num_f < 0) goto rollback;
    -
    -						glite_lbu_FreeStmt(&sh); sh = NULL;
    -					}
    -					else goto rollback;
    -
    -					free(stmt); stmt = NULL;
    -				} else {
    -					edg_wll_SetError(ctx, ENOMEM, "edg_wll_JobStatusServer() trio_asprintf failed!");
    -					goto rollback;
    -				}
    -			}
    -
    -
    -			if (flags & EDG_WLL_STAT_CHILDHIST_THOROUGH) { /* Full (thorough) Histogram */
    -
    -
    -				if (stat->children_hist == NULL) {
    -					stat->children_hist = (int*) calloc(1+EDG_WLL_NUMBER_OF_STATCODES, sizeof(int));
    -					if (stat->children_hist == NULL) {
    -						edg_wll_SetError(ctx, ENOMEM, "edg_wll_JobStatusServer() calloc children_hist failed!");
    -						goto rollback;
    -					}
    -
    -					stat->children_hist[0] = EDG_WLL_NUMBER_OF_STATCODES;
    -				}
    -				else {
    -					/* If hist is loaded, it probably contain only incomplete histogram
    -					 * built in update_parent_status. Count it from scratch...*/
    -					for (ii=1; ii<=EDG_WLL_NUMBER_OF_STATCODES; ii++)
    -						stat->children_hist[ii] = 0;
    -				}
    -
    -				if (flags & EDG_WLL_STAT_CHILDSTAT) { // Job states have already been loaded
    -					for ( ii = 0 ; ii < i ; ii++ ) {
    -						stat->children_hist[(stat->children_states[ii].state)+1]++;
    -					}
    -				}
    -				else {
    -					// Get child states from the database
    -					trio_asprintf(&stmt, "SELECT version,status,jobid FROM states WHERE parent_job='%|Ss'", md5_jobid);
    -					if (stmt != NULL) {
    -						glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt);
    -						num_sub = edg_wll_ExecSQL(ctx, stmt, &sh);
    -						if (num_sub >=0 ) {
    -							while ((num_f = edg_wll_FetchRow(ctx, sh, sizeof(out_stat)/sizeof(out_stat[0]), NULL, out_stat)) == 3 ) {
    -								if (!strcmp(INTSTAT_VERSION,out_stat[0])) {
    -									num_f = atoi(out_stat[1]);
    -									if (num_f > EDG_WLL_JOB_UNDEF && num_f < EDG_WLL_NUMBER_OF_STATCODES)
    -										stat->children_hist[num_f+1]++;
    -								}
    -								else { // recount state
    -									glite_jobid_t	subjob;
    -									intJobStat	js_real;
    -									char		*name;
    -									unsigned int		port;
    -
    -
    -									js = &js_real;
    -									glite_jobid_getServerParts(job, &name, &port);
    -									if (glite_jobid_recreate(name, port, out_stat[2], &subjob)) {
    -										goto rollback;
    -									}
    -									free(name);
    -
    -									if (edg_wll_intJobStatus(ctx, subjob, flags, js, js_enable_store, 0)) {
    -										goto rollback;
    -									}
    -									glite_jobid_free(subjob);
    -									num_f = js->pub.state;
    -									if (num_f > EDG_WLL_JOB_UNDEF && num_f < EDG_WLL_NUMBER_OF_STATCODES)
    -										stat->children_hist[num_f+1]++;
    -
    -									destroy_intJobStat(js);
    -								}
    -								free(out_stat[0]); out_stat[0] = NULL;
    -								free(out_stat[1]); out_stat[1] = NULL;  
    -								free(out_stat[2]); out_stat[2] = NULL;
    -							}
    -							if (num_f < 0) goto rollback;
    -
    -							glite_lbu_FreeStmt(&sh); sh = NULL;
    -						}
    -						else goto rollback;
    -
    -						free(stmt); stmt = NULL;
    -					} else {
    -						edg_wll_SetError(ctx, ENOMEM, "edg_wll_JobStatusServer() trio_asprintf failed!");
    -						goto rollback;
    -					}
    -				}
    -			}
    -			else {
    -				if (flags & EDG_WLL_STAT_CHILDHIST_FAST) { /* Fast Histogram */
    -					
    -					if (stat->children_hist == NULL) {
    -						// If the histogram exists, assume that it was already filled during job state retrieval
    -						stat->children_hist = (int*) calloc(1+EDG_WLL_NUMBER_OF_STATCODES, sizeof(int));
    -						if (stat->children_hist == NULL) {
    -							edg_wll_SetError(ctx, ENOMEM, "edg_wll_JobStatusServer() calloc children_hist failed!");
    -							goto rollback;
    -						}
    -
    -						if (edg_wll_GetSubjobHistogram(ctx, job, stat->children_hist))
    -							goto rollback;
    -					}
    -				}
    -				else {
    -					if (stat->children_hist) {
    -						free (stat->children_hist);
    -						stat->children_hist = NULL;
    -					}
    -				}
    -
    -			}
    -
    -
    -			if (flags & EDG_WLL_STAT_CHILDREN) {
    -
    -				trio_asprintf(&stmt, "SELECT j.dg_jobid FROM states s,jobs j "
    -						"WHERE s.parent_job='%|Ss' AND s.jobid=j.jobid",
    -					md5_jobid);
    -				if (stmt != NULL) {
    -					glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt);
    -					num_sub = edg_wll_ExecSQL(ctx, stmt, &sh);
    -					if (num_sub >=0 ) {
    -						while ((num_f = edg_wll_FetchRow(ctx, sh, sizeof(out)/sizeof(out[0]), NULL, out)) == 1 ) {
    -							add_stringlist(&stat->children, out[0]);
    -							free(out[0]); 
    -						}
    -						if (num_f < 0) goto rollback;
    -
    -						glite_lbu_FreeStmt(&sh); sh = NULL;
    -					}
    -					else goto rollback;
    -
    -					free(stmt); stmt = NULL;
    -				} else {
    -					edg_wll_SetError(ctx, ENOMEM, "edg_wll_JobStatusServer() trio_asprintf failed!");
    -					goto rollback;
    -				}
    -			}
    -		}
    -#endif
    -
    -		whole_cycle = 1;
    -rollback:
    -		if (!whole_cycle) { 
    -			edg_wll_FreeStatus(&jobstat.pub);
    -			memset(stat, 0, sizeof(*stat));
    -		}
    -		destroy_intJobStat_extension(&jobstat);
    -		if (acl) { edg_wll_FreeAcl(acl); acl = NULL; }
    -		if (stmt) { free(stmt); stmt = NULL; }
    -		if (sh) { glite_lbu_FreeStmt(&sh); sh = NULL; }
    -
    -        } while (edg_wll_TransNeedRetry(ctx));
    -
    -	free(string_jobid);
    -	free(md5_jobid);
    -
    -	if (authz_flags)
    -		blacken_fields(stat, authz_flags);
    -
    -	return edg_wll_Error(ctx, NULL, NULL);
    -}
    -
    -int edg_wll_intJobStatus(
    -	edg_wll_Context	ctx,
    -	glite_jobid_const_t	job,
    -	int			flags,
    -	intJobStat	*intstat,
    -	int		update_db,
    -	int		add_fqans)
    -{
    -
    -/* Local variables */
    -	char		*string_jobid;
    -	char		*md5_jobid;
    -
    -	int		num_events;
    -	edg_wll_Event	*events = NULL;
    -
    -	int		i, intErr = 0;
    -	int		res;
    -	int		be_strict = 0;
    -		char		*errstring = NULL;
    -
    -	edg_wll_QueryRec	jqr[2];
    -	edg_wll_QueryRec        **jqra;
    -	glite_lbu_Statement	sh;
    -	char			*stmt, *out;
    -	struct timeval		ts, maxts = {tv_sec:0, tv_usec:0};
    -
    -/* Processing */
    -	edg_wll_ResetError(ctx);
    -	init_intJobStat(intstat);
    -
    -	string_jobid = edg_wlc_JobIdUnparse(job);
    -	if (string_jobid == NULL || intstat == NULL) {
    -		free(string_jobid);
    -		return edg_wll_SetError(ctx,EINVAL, NULL);
    -	}
    -	free(string_jobid);
    -
    -	/* can be already filled by public edg_wll_JobStat() */
    -	if (intstat->pub.owner == NULL) {
    -		md5_jobid = edg_wlc_JobIdGetUnique(job);
    -		if ( !(intstat->pub.owner = job_owner(ctx,md5_jobid)) ) {
    -			free(md5_jobid);
    -			return edg_wll_Error(ctx,NULL,NULL);
    -		}
    -	}
    -	
    -	/* re-lock job from InShareMode to ForUpdate
    -	 * needed by edg_wll_RestoreSubjobState and edg_wll_StoreIntState
    -	 */
    -	res = edg_wll_LockJobRowForUpdate(ctx, md5_jobid);
    -	free(md5_jobid);
    -	if (res) return edg_wll_Error(ctx, NULL, NULL);
    -
    -        jqr[0].attr = EDG_WLL_QUERY_ATTR_JOBID;
    -        jqr[0].op = EDG_WLL_QUERY_OP_EQUAL;
    -        jqr[0].value.j = (glite_jobid_t)job;
    -        jqr[1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
    -
    -	jqra = (edg_wll_QueryRec **) malloc (2 * sizeof(edg_wll_QueryRec **));
    -	jqra[0] = jqr;
    -	jqra[1] = NULL;
    -
    -	if (edg_wll_QueryEventsServer(ctx,1, (const edg_wll_QueryRec **)jqra, NULL, &events)) {
    -		if (edg_wll_Error(ctx, NULL, NULL) == ENOENT) {
    -			if (edg_wll_RestoreSubjobState(ctx, job, intstat)) {
    -				if (edg_wll_Error(ctx, NULL, NULL) != ENOENT) {
    -					destroy_intJobStat(intstat);
    -					free(jqra);
    -					free(intstat->pub.owner); intstat->pub.owner = NULL;
    -					return edg_wll_Error(ctx, NULL, NULL);
    -				}
    -			}
    -		}
    -		else {
    -			free(jqra);
    -			free(intstat->pub.owner); intstat->pub.owner = NULL;
    -                	return edg_wll_Error(ctx, NULL, NULL);
    -		}
    -	}
    -	edg_wll_ResetError(ctx);
    -
    -	{
    -		free(jqra);
    -
    -		for (num_events = 0; events && events[num_events].type != EDG_WLL_EVENT_UNDEF;
    -			num_events++);
    -
    -		for (i = 0; i < num_events; i++) {
    -			res = processEvent(intstat, &events[i], i, be_strict, &errstring);
    -			if (res == RET_FATAL || res == RET_INTERNAL) { /* !strict */
    -				intErr = 1; break;
    -			}
    -			ts = events[i].any.timestamp;
    -			if ((!maxts.tv_sec && !maxts.tv_usec)
    -			    || (ts.tv_sec > maxts.tv_sec)
    -			    || (ts.tv_sec == maxts.tv_sec && ts.tv_usec > maxts.tv_usec)) maxts = ts;
    -		}
    -		/* no events or status computation error */
    -		if (intstat->pub.state == EDG_WLL_JOB_UNDEF) {
    -			intstat->pub.state = EDG_WLL_JOB_UNKNOWN;
    -			if (num_events) intstat->pub.lastUpdateTime = maxts;
    -			else intstat->pub.lastUpdateTime.tv_sec = 1;
    -		}
    -
    -
    -		for (i=0; i < num_events ; i++) edg_wll_FreeEvent(&events[i]);
    -		free(events);
    -	}
    -
    -	if (intErr) {
    -		destroy_intJobStat(intstat);
    -		return edg_wll_SetError(ctx, EDG_WLL_ERROR_SERVER_RESPONSE, errstring);
    -	} else {
    -		/* XXX intstat->pub.expectUpdate = eval_expect_update(intstat, &intstat->pub.expectFrom); */
    -		intErr = edg_wlc_JobIdDup(job, &intstat->pub.jobId);
    -		if (intErr) return edg_wll_SetError(ctx, intErr, NULL);
    -
    -		/* don't update status of grey jobs */
    -		md5_jobid = glite_jobid_getUnique(job);
    -		trio_asprintf(&stmt, "select grey from jobs where jobid='%|Ss'", md5_jobid);
    -		free(md5_jobid);
    -		if (edg_wll_ExecSQL(ctx, stmt, &sh) < 0 ||
    -		    (res = edg_wll_FetchRow(ctx, sh, 1, NULL, &out)) < 0) {
    -			free(stmt);
    -			return edg_wll_Error(ctx, NULL, NULL);
    -		}
    -		if (!out || strcmp(out, "0") != 0) update_db = 0;
    -		glite_lbu_FreeStmt(&sh);
    -		free(stmt);
    -		free(out);
    -
    -		if (update_db) {
    -			int tsq = num_events - 1;
    -			if (add_fqans && tsq == 0 && ctx->fqans != NULL) {
    -				for (i=0; ctx->fqans[i]; i++);
    -				intstat->pub.user_fqans = malloc(sizeof(*ctx->fqans)*(i+1));
    -				for (i=0; ctx->fqans[i]; i++) {
    -					intstat->pub.user_fqans[i] = strdup(ctx->fqans[i]);
    -				}
    -				intstat->pub.user_fqans[i] = NULL;
    -			}
    -
    -			edg_wll_StoreIntState(ctx, intstat, tsq);
    -			/* recheck
    -			 * intJobStat *reread;
    -			 * edg_wll_LoadIntState(ctx, job, tsq, &reread);
    -			 * destroy_intJobStat(reread);
    -			*/
    -		}
    -	}
    -
    -	return edg_wll_Error(ctx, NULL, NULL);
    -}
    -
    -
    -/* 
    - * Regenarate state of subjob without any event from its parent JobReg Event 
    - */
    -edg_wll_ErrorCode edg_wll_RestoreSubjobState(
    -	edg_wll_Context		ctx,
    -	glite_jobid_const_t	job,
    -	intJobStat		*intstat)
    -{
    -	glite_jobid_t		parent_job = NULL;
    -	edg_wll_QueryRec        jqr_p1[2], jqr_p2[2];
    -	edg_wll_QueryRec        **ec, **jc;
    -	edg_wll_Event		*events_p;
    -	int			err, i;
    -
    -	
    -	/* find job parent */
    -	if (get_job_parent(ctx, job, &parent_job)) goto err;
    -
    -	/* get registration event(s) of parent*/
    -	jqr_p1[0].attr = EDG_WLL_QUERY_ATTR_JOBID;
    -	jqr_p1[0].op = EDG_WLL_QUERY_OP_EQUAL;
    -	jqr_p1[0].value.j = parent_job;
    -	jqr_p1[1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
    -
    -	jqr_p2[0].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE;
    -	jqr_p2[0].op = EDG_WLL_QUERY_OP_EQUAL;
    -	jqr_p2[0].value.i = EDG_WLL_EVENT_REGJOB;
    -	jqr_p2[1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
    -
    -	jc = (edg_wll_QueryRec **) malloc (2 * sizeof(edg_wll_QueryRec **));
    -	jc[0] = jqr_p1;
    -	jc[1] = NULL;
    -
    -	ec = (edg_wll_QueryRec **) malloc (2 * sizeof(edg_wll_QueryRec **));
    -	ec[0] = jqr_p2;
    -	ec[1] = NULL;
    -
    -	if (edg_wll_QueryEventsServer(ctx,1, (const edg_wll_QueryRec **)jc, 
    -				(const edg_wll_QueryRec **)ec, &events_p)) {
    -		glite_jobid_free(parent_job);
    -		free(jc);
    -		free(ec);
    -		return edg_wll_Error(ctx, NULL, NULL);
    -	}
    -	glite_jobid_free(parent_job);
    -	free(jc);
    -	free(ec);
    -
    -	/* recreate job status of subjob */
    -	err = intJobStat_embryonic(ctx, job, (const edg_wll_RegJobEvent *) &(events_p[0]), intstat);
    -
    -	for (i=0; events_p[i].type != EDG_WLL_EVENT_UNDEF ; i++) 
    -		edg_wll_FreeEvent(&events_p[i]);
    -	free(events_p);
    -
    -	if (err) goto err;
    -
    -err:
    -	return edg_wll_Error(ctx, NULL, NULL);
    -}
    -
    -
    -/*
    - * Helper for warning printouts
    - */
    -
    -static void warn(const char* format, ...)
    -{
    -	va_list l;
    -	va_start(l, format);
    -
    -	/*
    -	fprintf(stderr, "Warning: ");
    -	vfprintf(stderr, format, l);
    -	fputc('\n', stderr);
    -	*/
    -
    -	va_end(l);
    -}
    -
    -static char *job_owner(edg_wll_Context ctx,char *md5_jobid)
    -{
    -	char	*stmt = NULL,*out = NULL;
    -	glite_lbu_Statement	sh;
    -	int	f = -1;
    -	
    -	edg_wll_ResetError(ctx);
    -	trio_asprintf(&stmt,"select cert_subj from users,jobs "
    -		"where users.userid = jobs.userid "
    -		"and jobs.jobid = '%|Ss'",md5_jobid);
    -
    -	if (stmt==NULL) {
    -		edg_wll_SetError(ctx,ENOMEM, NULL);
    -		return NULL;
    -	}
    -	glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt);
    -	if (edg_wll_ExecSQL(ctx,stmt,&sh) >= 0) {
    -		f=edg_wll_FetchRow(ctx,sh,1,NULL,&out);
    -		if (f == 0) {
    -			if (out) free(out);
    -			out = NULL;
    -			edg_wll_SetError(ctx,ENOENT,md5_jobid);
    -		}
    -	}
    -	glite_lbu_FreeStmt(&sh);
    -	free(stmt);
    -
    -	return out;
    -}
    -
    -
    -static edg_wll_ErrorCode get_job_parent(edg_wll_Context ctx, glite_jobid_const_t job, glite_jobid_t *parent)
    -{
    -	glite_lbu_Statement	sh = NULL;
    -	char	*stmt = NULL, *out = NULL;
    -	char 	*md5_jobid = edg_wlc_JobIdGetUnique(job);
    -	int	ret;
    -
    -	
    -	edg_wll_ResetError(ctx);
    -	trio_asprintf(&stmt,"select parent_job from states "
    -		"where jobid = '%|Ss'" ,md5_jobid);
    -
    -	if (stmt==NULL) {
    -		edg_wll_SetError(ctx,ENOMEM, NULL);
    -		goto err;
    -	}
    -	glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt);
    -
    -	if (edg_wll_ExecSQL(ctx,stmt,&sh) < 0) goto err;
    -
    -	if (!edg_wll_FetchRow(ctx,sh,1,NULL,&out)) {
    -		edg_wll_SetError(ctx,ENOENT,md5_jobid);
    -		goto err;
    -	}
    -
    -	if (strcmp(out, "*no parent job*") == 0) {
    -		edg_wll_SetError(ctx,ENOENT,"No parent job found.");
    -		goto err;
    -	}
    -
    -	ret = glite_jobid_recreate((const char*) ctx->srvName,
    -			ctx->srvPort, (const char *) out, parent);
    -
    -	if (ret) {
    -		edg_wll_SetError(ctx,ret,"Error creating jobid");
    -		goto err;
    -	}
    -
    -err:
    -	if (sh) glite_lbu_FreeStmt(&sh);
    -	free(md5_jobid);
    -	free(stmt);
    -	free(out);
    -
    -	return edg_wll_Error(ctx,NULL,NULL);
    -}
    -
    -
    -#if 0
    -/* XXX went_through went out */
    -static int eval_expect_update(intJobStat *js, int* went_through, char **expect_from)
    -{
    -	int em = 0;
    -	int ft = 0; /* fall through following tests */
    -
    -	if (ft || (went_through[ EDG_WLL_JOB_OUTPUTREADY ] && !js->done_failed)) ft = 1;
    -	if (ft || (went_through[ EDG_WLL_JOB_DONE ] && !js->done_failed)) ft = 1;
    -	if (ft || went_through[ EDG_WLL_JOB_CHECKPOINTED ]) ft = 1;
    -	if (ft || went_through[ EDG_WLL_JOB_RUNNING ]) {
    -		if (js->pub.node == NULL) em |= EXPECT_MASK_JOBMGR;
    -		ft = 1;
    -	}
    -	if (ft || went_through[ EDG_WLL_JOB_SCHEDULED ]) {
    -			if (js->pub.jssId == NULL) em |= EXPECT_MASK_JSS;
    -			if (js->pub.rsl == NULL) em |= EXPECT_MASK_JSS;
    -			if (js->pub.globusId == NULL) em |= EXPECT_MASK_JOBMGR;
    -			if (js->pub.localId == NULL) em |= EXPECT_MASK_JOBMGR;
    -			if (js->pub.jss_jdl == NULL) em |= EXPECT_MASK_RB;
    -			ft = 1;
    -	}
    -	if (ft || went_through[ EDG_WLL_JOB_READY ]) {
    -		if (js->pub.destination == NULL) em |= EXPECT_MASK_RB;
    -		ft = 1;
    -	}
    -	if (ft || went_through[ EDG_WLL_JOB_SUBMITTED ]) {
    -		if (js->pub.jdl == NULL) em |= EXPECT_MASK_UI;
    -		ft = 1;
    -	}
    -	
    -	if (em == 0) 
    -		*expect_from = NULL;
    -	else {
    -		asprintf(expect_from, "%s%s%s%s%s%s%s",
    -			(em & EXPECT_MASK_UI ) ? EDG_WLL_SOURCE_UI : "",
    -			(em & EXPECT_MASK_UI ) ? " " : "",
    -			(em & EXPECT_MASK_RB ) ? EDG_WLL_SOURCE_RB : "",
    -			(em & EXPECT_MASK_RB ) ? " " : "",
    -			(em & EXPECT_MASK_JSS ) ? EDG_WLL_SOURCE_JSS : "",
    -			(em & EXPECT_MASK_JSS ) ? " " : "",
    -			(em & EXPECT_MASK_JOBMGR ) ? EDG_WLL_SOURCE_JOBMGR : ""
    -			);
    -	}
    -
    -	return (em == 0) ? 0 : 1;
    -}
    -#endif
    -
    -/* XXX more thorough malloc, calloc, and asprintf failure handling */
    -/* XXX indexes in {short,long}_fields */
    -/* XXX strict mode */
    -/* XXX caching */
    -
    -/*
    - * Store current job state to states and status_tags DB tables.
    - * Should be called with the job locked.
    - */
    -
    -edg_wll_ErrorCode edg_wll_StoreIntState(edg_wll_Context ctx,
    -				     intJobStat *stat,
    -				     int seq)
    -{
    -	char *jobid_md5, *stat_enc, *parent_md5 = NULL;
    -	char *stmt;
    -	edg_wll_TagValue *tagp;
    -	int update;
    -	int dbret;
    -	char *icnames, *icvalues;
    -
    -
    -	/* check size of intstat version, its only varchar(32) */
    -	assert(strlen(INTSTAT_VERSION) <= 32);
    -	
    -	update = (seq > 0);
    -	jobid_md5 = edg_wlc_JobIdGetUnique(stat->pub.jobId);
    -	stat_enc = enc_intJobStat(strdup(""), stat);
    -
    -	tagp = stat->pub.user_tags;
    -	if (tagp) {
    -		while ((*tagp).tag != NULL) {
    -			trio_asprintf(&stmt, "insert into status_tags"
    -					"(jobid,seq,name,value) values "
    -					"('%|Ss',%d,'%|Ss','%|Ss')",
    -					jobid_md5, seq, (*tagp).tag, (*tagp).value);
    -			glite_common_log(LOG_CATEGORY_LB_SERVER_DB, 
    -				LOG_PRIORITY_DEBUG, stmt);
    -
    -			if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) {
    -				if (EEXIST == edg_wll_Error(ctx, NULL, NULL)) {
    -				/* XXX: this should not happen */
    -					edg_wll_ResetError(ctx);
    -					free(stmt); stmt = NULL;
    -					tagp++;
    -					continue;
    -				}
    -				else
    -					goto cleanup;
    -			}
    -			free(stmt); stmt = NULL;
    -			tagp++;
    -		}
    -	}
    -
    -	parent_md5 = edg_wlc_JobIdGetUnique(stat->pub.parent_job);
    -	if (parent_md5 == NULL) parent_md5 = strdup("*no parent job*");
    -
    -
    -	edg_wll_IColumnsSQLPart(ctx, ctx->job_index_cols, &stat->pub, 0, NULL, &icvalues);
    -
    -	trio_asprintf(&stmt,
    -		"update states set "
    -		"status=%d,seq=%d,int_status='%|Ss',version='%|Ss'"
    -			",parent_job='%|Ss'%s "
    -		"where jobid='%|Ss'",
    -		stat->pub.state, seq, stat_enc, INTSTAT_VERSION,
    -		parent_md5, icvalues,
    -		jobid_md5);
    -	free(icvalues);
    -	glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt);
    -
    -	if ((dbret = edg_wll_ExecSQL(ctx,stmt,NULL)) < 0) goto cleanup;
    -	free(stmt); stmt = NULL;
    -
    -	if (dbret == 0) {
    -		edg_wll_IColumnsSQLPart(ctx, ctx->job_index_cols, &stat->pub, 1, &icnames, &icvalues);
    -		trio_asprintf(&stmt,
    -			"insert into states"
    -			"(jobid,status,seq,int_status,version"
    -				",parent_job%s) "
    -			"values ('%|Ss',%d,%d,'%|Ss','%|Ss','%|Ss'%s)",
    -			icnames,
    -			jobid_md5, stat->pub.state, seq, stat_enc,
    -			INTSTAT_VERSION, parent_md5, icvalues);
    -		free(icnames); free(icvalues);
    -
    -		glite_common_log(LOG_CATEGORY_LB_SERVER_DB, 
    -			LOG_PRIORITY_DEBUG, stmt);
    -		if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto cleanup;
    -		free(stmt); stmt = NULL;
    -	}
    -
    -	if (update) {
    -		trio_asprintf(&stmt, "delete from states "
    -			"where jobid ='%|Ss' and ( seq<%d or version !='%|Ss')",
    -			jobid_md5, seq, INTSTAT_VERSION);
    -		if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto cleanup;
    -		free(stmt); stmt = NULL;
    -	}
    -	if (update) {
    -		trio_asprintf(&stmt, "delete from status_tags "
    -			"where jobid ='%|Ss' and seq<%d", jobid_md5, seq);
    -		glite_common_log(LOG_CATEGORY_LB_SERVER_DB, 
    -			LOG_PRIORITY_DEBUG, stmt);
    -		if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto cleanup;
    -		free(stmt); stmt = NULL;
    -	}
    -
    -cleanup:
    -	free(stmt); 
    -	free(jobid_md5); free(stat_enc);
    -	free(parent_md5);
    -	return edg_wll_Error(ctx,NULL,NULL);
    -}
    -
    -
    -edg_wll_ErrorCode edg_wll_StoreIntStateEmbryonic(edg_wll_Context ctx,
    -        char *icnames, 
    -	char *values)
    -{
    -	char *stmt = NULL;
    -
    -/* TODO
    -		edg_wll_UpdateStatistics(ctx, NULL, e, &jobstat.pub);
    -		if (ctx->rgma_export) write2rgma_status(&jobstat);
    -*/
    -
    -	trio_asprintf(&stmt,
    -		"insert into states"
    -		"(jobid,status,seq,int_status,version"
    -			",parent_job%s) "
    -		"values (%s)",
    -		icnames, values);
    -	glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt);
    -	
    -	if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto cleanup;
    -
    -cleanup:
    -	free(stmt); 
    -
    -	return edg_wll_Error(ctx,NULL,NULL);
    -}
    -
    -/*
    - * Retrieve stored job state from states and status_tags DB tables.
    - * Should be called with the job locked.
    - */
    -
    -edg_wll_ErrorCode edg_wll_LoadIntState(edg_wll_Context ctx,
    -				    glite_jobid_const_t jobid,
    -				    int lock,
    -				    int seq,
    -				    intJobStat **stat)
    -{
    -	char *jobid_md5;
    -	char *stmt;
    -	glite_lbu_Statement sh;
    -	char *res, *res_rest;
    -	int nstates;
    -
    -	edg_wll_ResetError(ctx);
    -	jobid_md5 = edg_wlc_JobIdGetUnique(jobid);
    -
    -	if (lock) {
    -		edg_wll_LockJobRowForUpdate(ctx,jobid_md5);
    -	}
    -
    -	if (seq == -1) {
    -		/* any sequence number */
    -		trio_asprintf(&stmt,
    -			"select int_status from states "
    -			"where jobid='%|Ss' and version='%|Ss'",
    -			jobid_md5, INTSTAT_VERSION);
    -	} else {
    -		trio_asprintf(&stmt,
    -			"select int_status from states "
    -			"where jobid='%|Ss' and seq='%d' and version='%|Ss'",
    -			jobid_md5, seq, INTSTAT_VERSION);
    -	}
    -
    -	if (stmt == NULL) {
    -		return edg_wll_SetError(ctx, ENOMEM, NULL);
    -	}
    -	glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt);
    -	
    -	if ((nstates = edg_wll_ExecSQL(ctx,stmt,&sh)) < 0) goto cleanup;
    -	if (nstates == 0) {
    -		edg_wll_SetError(ctx,ENOENT,"no state in DB");
    -		goto cleanup;
    -	}
    -	if (edg_wll_FetchRow(ctx,sh,1,NULL,&res) < 0) goto cleanup;
    -
    -	*stat = dec_intJobStat(res, &res_rest);
    -	if (res_rest == NULL) {
    -		edg_wll_SetError(ctx, EDG_WLL_ERROR_DB_CALL,
    -				"error decoding DB intJobStatus");
    -	}
    -
    -	free(res);
    -cleanup:
    -	free(jobid_md5);
    -	free(stmt); 
    -	if (sh) glite_lbu_FreeStmt(&sh);
    -	return edg_wll_Error(ctx,NULL,NULL);
    -}
    -
    -
    -static char* hist_to_string(int * hist)
    -{
    -	int i;
    -	char *s, *s1;
    -
    -
    -	assert(hist[0] == EDG_WLL_NUMBER_OF_STATCODES);
    -	asprintf(&s, "%s=%d", edg_wll_StatToString(1), hist[2]);
    -
    -	for (i=2; ipub.parent_job, LOCK, - 1, pis))
    -		goto err;
    -
    -	assert(*pis);	// deadlock would happen with next call of this function
    -
    -err:
    -	return edg_wll_Error(ctx, NULL, NULL);
    -
    -}
    -
    -
    -static int log_collectionState_event(edg_wll_Context ctx, edg_wll_JobStatCode state, enum edg_wll_StatDone_code done_code, intJobStat *cis, intJobStat *pis, edg_wll_Event *ce) 
    -{
    -	int	ret = 0;
    -
    -	edg_wll_Event  *event = 
    -		edg_wll_InitEvent(EDG_WLL_EVENT_COLLECTIONSTATE);
    -
    -	event->any.priority = EDG_WLL_LOGFLAG_INTERNAL;
    -
    -	if (ctx->serverIdentity) 
    -		event->any.user = strdup(ctx->serverIdentity);	
    -	else
    -		event->any.user = strdup("LBProxy");
    -
    -	if (!edg_wll_SetSequenceCode(ctx,pis->last_seqcode,EDG_WLL_SEQ_NORMAL)) {
    -		ctx->p_source = EDG_WLL_SOURCE_LB_SERVER;
    -                edg_wll_IncSequenceCode(ctx);
    -        }
    -	event->any.seqcode = edg_wll_GetSequenceCode(ctx);
    -	edg_wlc_JobIdDup(pis->pub.jobId, &(event->any.jobId));
    -	gettimeofday(&event->any.timestamp,0);
    -	if (ctx->p_host) event->any.host = strdup(ctx->p_host);
    -	event->any.level = ctx->p_level;
    -	event->any.source = EDG_WLL_SOURCE_LB_SERVER; 
    -		
    -					
    -	event->collectionState.state = edg_wll_StatToString(state);
    -	event->collectionState.done_code = done_code;
    -	event->collectionState.histogram = hist_to_string(pis->pub.children_hist);
    -	edg_wlc_JobIdDup(cis->pub.jobId, &(event->collectionState.child));
    -	event->collectionState.child_event = edg_wll_EventToString(ce->any.type);
    -
    -	ret = db_parent_store(ctx, event, pis);
    -
    -	edg_wll_FreeEvent(event);
    -	free(event);
    -
    -	return ret;	
    -}
    -
    -
    -/* returns state class of subjob of job collection	*/
    -static subjobClassCodes class(edg_wll_JobStat *stat)
    -{
    -	switch (stat->state) {
    -		case EDG_WLL_JOB_RUNNING:
    -			return(SUBJOB_CLASS_RUNNING);
    -			break;
    -		case EDG_WLL_JOB_DONE:
    -			if (stat->done_code == EDG_WLL_STAT_OK)
    -				return(SUBJOB_CLASS_DONE);
    -			else
    -				// failed & cancelled
    -				return(SUBJOB_CLASS_REST);
    -			break;
    -		case EDG_WLL_JOB_CANCELLED:
    -			return(SUBJOB_CLASS_CLEARED);
    -			break;
    -		case EDG_WLL_JOB_ABORTED:
    -			return(SUBJOB_CLASS_ABORTED);
    -			break;
    -		case EDG_WLL_JOB_CLEARED:
    -			return(SUBJOB_CLASS_CLEARED);
    -			break;
    -		default:
    -			return(SUBJOB_CLASS_REST);
    -			break;
    -	}
    -}
    -
    -/* Mapping of subjob class to some field in childen_hist */
    -static edg_wll_JobStatCode class_to_statCode(subjobClassCodes code)
    -{
    -	switch (code) {
    -		case SUBJOB_CLASS_RUNNING:	return(EDG_WLL_JOB_RUNNING); break;
    -		case SUBJOB_CLASS_DONE:		return(EDG_WLL_JOB_DONE); break;
    -		case SUBJOB_CLASS_ABORTED:	return(EDG_WLL_JOB_ABORTED); break;
    -		case SUBJOB_CLASS_CLEARED:	return(EDG_WLL_JOB_CLEARED); break;
    -		case SUBJOB_CLASS_REST:		return(EDG_WLL_JOB_UNKNOWN); break;
    -		default:			assert(0); break;
    -	}
    -}
    -
    -/* count parent state from subjob histogram */
    -static edg_wll_JobStatCode process_Histogram(intJobStat *pis)
    -{
    -	if (pis->pub.children_hist[class_to_statCode(SUBJOB_CLASS_RUNNING)+1] > 0) {
    -		return EDG_WLL_JOB_RUNNING;
    -	}
    -	else if (pis->pub.children_hist[class_to_statCode(SUBJOB_CLASS_CLEARED)+1] == pis->pub.children_num) {
    -		return EDG_WLL_JOB_CLEARED;
    -	}
    -	else if (pis->pub.children_hist[class_to_statCode(SUBJOB_CLASS_DONE)+1] 
    -			+ pis->pub.children_hist[class_to_statCode(SUBJOB_CLASS_CLEARED)+1] == pis->pub.children_num) {
    -		return EDG_WLL_JOB_DONE;
    -	}
    -	else if (pis->pub.children_hist[class_to_statCode(SUBJOB_CLASS_ABORTED)+1]
    -			+ pis->pub.children_hist[class_to_statCode(SUBJOB_CLASS_DONE)+1]
    -			+ pis->pub.children_hist[class_to_statCode(SUBJOB_CLASS_CLEARED)+1] == pis->pub.children_num) {
    -		return EDG_WLL_JOB_ABORTED;
    -	}
    -	else
    -		return EDG_WLL_JOB_WAITING;
    -}
    -
    -static edg_wll_ErrorCode update_parent_status(edg_wll_Context ctx, edg_wll_JobStat *subjob_stat_old, intJobStat *cis, edg_wll_Event *ce)
    -{
    -	intJobStat		*pis = NULL;
    -	subjobClassCodes	subjob_class, subjob_class_old;
    -	edg_wll_JobStatCode	parent_new_state;
    -
    -
    -	subjob_class = class(&cis->pub);
    -	subjob_class_old = class(subjob_stat_old);
    -
    -
    -	if (subjob_class_old != subjob_class) {
    -		if (load_parent_intJobStat(ctx, cis, &pis)) goto err;
    -
    -		pis->pub.children_hist[class_to_statCode(subjob_class)+1]++;
    -		pis->pub.children_hist[class_to_statCode(subjob_class_old)+1]--;
    -
    -		edg_wll_StoreSubjobHistogram(ctx, cis->pub.parent_job, pis);
    -
    -
    -		if (pis->pub.jobtype == EDG_WLL_STAT_COLLECTION) {
    -			parent_new_state = process_Histogram(pis);
    -			if (pis->pub.state != parent_new_state) {
    -				// XXX: we do not need  EDG_WLL_STAT_code any more
    -				//	doneFailed subjob is stored in REST class and
    -				//	inducting collection Waiting state
    -				//	-> in future may be removed from collectionState event
    -				//	   supposing collection Done state to be always DoneOK
    -				if (log_collectionState_event(ctx, parent_new_state, EDG_WLL_STAT_OK, cis, pis, ce))
    -					goto err;
    -			}
    -		}
    -	}
    -
    -err:
    -	if (pis)
    -		destroy_intJobStat(pis);
    -
    -
    -	return edg_wll_Error(ctx,NULL,NULL);
    -}
    -
    -
    -
    -/*
    - * update stored state according to the new event
    - * (must be called with the job locked)
    - */
    -
    -edg_wll_ErrorCode edg_wll_StepIntStateParent(edg_wll_Context ctx,
    -					glite_jobid_const_t job,
    -					edg_wll_Event *e,
    -					int seq,
    -					intJobStat *ijsp,
    -					edg_wll_JobStat *oldstat,
    -					edg_wll_JobStat	*stat_out)
    -{
    -	int		res;
    -	int		be_strict = 0;
    -	char		*errstring = NULL;
    -	char 		*oldstat_rgmaline = NULL;
    -
    -
    -	edg_wll_CpyStatus(&ijsp->pub,oldstat);
    -
    -	if (ctx->rgma_export) oldstat_rgmaline = write2rgma_statline(ijsp);
    -
    -	res = processEvent(ijsp, e, seq, be_strict, &errstring);
    -	if (res == RET_FATAL || res == RET_INTERNAL) { /* !strict */
    -		edg_wll_FreeStatus(oldstat);
    -		memset(oldstat,0,sizeof *oldstat);
    -		return edg_wll_SetError(ctx, EINVAL, errstring);
    -	}
    -	// XXX: store it in update_parent status ?? 
    -	edg_wll_StoreIntState(ctx, ijsp, seq);
    -
    -	edg_wll_UpdateStatistics(ctx,oldstat,e,&ijsp->pub);
    -
    -	if (ctx->rgma_export) write2rgma_chgstatus(ijsp, oldstat_rgmaline);
    -
    -	if (stat_out) {
    -		edg_wll_CpyStatus(&ijsp->pub, stat_out);
    -	}
    -
    -	return edg_wll_Error(ctx, NULL, NULL);
    -}
    -
    -
    -
    -/*
    - * update stored state according to the new event
    - * (must be called with the job locked)
    -
    - * XXX: job is locked on entry, unlocked in this function
    - */
    -
    -edg_wll_ErrorCode edg_wll_StepIntState(edg_wll_Context ctx,
    -					glite_jobid_const_t job,
    -					edg_wll_Event *e,
    -					int seq,
    -					edg_wll_JobStat	*oldstat,
    -					edg_wll_JobStat	*stat_out)
    -{
    -	intJobStat 	*ijsp;
    -	int		flags = 0;
    -	int		res;
    -	int		be_strict = 0;
    -	char		*errstring = NULL;
    -	intJobStat	jobstat;
    -	char 		*oldstat_rgmaline = NULL;
    -
    -
    -	if (!edg_wll_LoadIntState(ctx, job, DONT_LOCK, seq - 1, &ijsp)) {
    -		edg_wll_CpyStatus(&ijsp->pub,oldstat);
    -
    -		if (ctx->rgma_export) oldstat_rgmaline = write2rgma_statline(ijsp);
    -
    -		res = processEvent(ijsp, e, seq, be_strict, &errstring);
    -		if (res == RET_FATAL || res == RET_INTERNAL) { /* !strict */
    -			edg_wll_FreeStatus(oldstat);
    -			memset(oldstat,0,sizeof *oldstat);
    -			return edg_wll_SetError(ctx, EINVAL, errstring);
    -		}
    -		edg_wll_StoreIntState(ctx, ijsp, seq);
    -
    -		edg_wll_UpdateStatistics(ctx,oldstat,e,&ijsp->pub);
    -
    -		/* check whether subjob state change does not change parent state */
    -		if ((ijsp->pub.parent_job) && (oldstat->state != ijsp->pub.state)) { 
    -			if (update_parent_status(ctx, oldstat, ijsp, e)) {
    -				edg_wll_FreeStatus(oldstat);
    -				memset(oldstat,0,sizeof *oldstat);
    -				return edg_wll_SetError(ctx, EINVAL, "update_parent_status()");
    -			}
    -		}
    -
    -		if (ctx->rgma_export) write2rgma_chgstatus(ijsp, oldstat_rgmaline);
    -
    -		if (stat_out) {
    -			memcpy(stat_out,&ijsp->pub,sizeof *stat_out);
    -			destroy_intJobStat_extension(ijsp);
    -		}
    -		else destroy_intJobStat(ijsp);
    -		free(ijsp);
    -	}
    -	else if (!edg_wll_intJobStatus(ctx, job, flags,&jobstat, js_enable_store, 1)) 
    -	{
    -		/* FIXME: we miss state change in the case of seq != 0 
    -		 * Does anybody care? */
    -
    -		/* FIXME: collection parent status is wrong in this case.
    -		   However, it should not happen (frequently).
    -		   Right approach is computing parent status from scratch.
    -		*/
    -
    -		edg_wll_UpdateStatistics(ctx,NULL,e,&jobstat.pub);
    -
    -		if (ctx->rgma_export) write2rgma_status(&jobstat);
    -
    -		if (stat_out) {
    -			memcpy(stat_out,&jobstat.pub,sizeof *stat_out);
    -			destroy_intJobStat_extension(&jobstat);
    -		}
    -		else destroy_intJobStat(&jobstat);
    -	}
    -
    -	return edg_wll_Error(ctx, NULL, NULL);
    -}
    -
    -
    -edg_wll_ErrorCode edg_wll_GetSubjobHistogram(edg_wll_Context ctx, glite_jobid_const_t parent_jobid, int *hist)
    -{
    -
    -        char    *stmt = NULL,*out = NULL, *rest = NULL;
    -        glite_lbu_Statement    sh;
    -        int     f = -1, i;
    -	char *jobid_md5;
    -	intJobStat *ijs = NULL;
    -
    -	jobid_md5 = edg_wlc_JobIdGetUnique(parent_jobid);
    -
    -        edg_wll_ResetError(ctx);
    -        trio_asprintf(&stmt,"select int_status from states where (jobid='%|Ss') AND (version='%|Ss')", jobid_md5, INTSTAT_VERSION);
    -
    -	free(jobid_md5);
    -
    -        if (stmt==NULL) {
    -                return edg_wll_SetError(ctx,ENOMEM, NULL);
    -        }
    -	glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt);
    -
    -        if (edg_wll_ExecSQL(ctx,stmt,&sh) >= 0) {
    -                f=edg_wll_FetchRow(ctx,sh,1,NULL,&out);
    -                if (f == 0) {
    -                        if (out) free(out);
    -                        out = NULL;
    -                        edg_wll_SetError(ctx, ENOENT, NULL);
    -                }
    -		else {
    -			// Ready to read the histogram from the record returned
    -			rest = (char *)calloc(1,strlen(out));	
    -			ijs = dec_intJobStat(out, &rest);
    -			for (i=0;i<=EDG_WLL_NUMBER_OF_STATCODES;i++) hist[i] = ijs->pub.children_hist[i];
    -		}
    -        }
    -        glite_lbu_FreeStmt(&sh);
    -        free(stmt);
    -	if (rest==NULL) free(rest);
    -	if (ijs==NULL) free(rest);
    -
    -
    -
    -	return edg_wll_Error(ctx, NULL, NULL);
    -}
    -
    -/* Make a histogram of all subjobs belonging to the parent job */
    -
    -edg_wll_ErrorCode edg_wll_StoreSubjobHistogram(edg_wll_Context ctx, glite_jobid_const_t parent_jobid, intJobStat *ijs)
    -{
    -        char *stat_enc = NULL;
    -        char *stmt;
    -        int dbret;
    -	char *jobid_md5;
    -
    -        stat_enc = enc_intJobStat(strdup(""), ijs);
    -
    -	jobid_md5 = edg_wlc_JobIdGetUnique(parent_jobid);
    -
    -        trio_asprintf(&stmt,
    -                "update states set "
    -                "status=%d,int_status='%|Ss',version='%|Ss'"
    -                "where jobid='%|Ss'",
    -                ijs->pub.state, stat_enc, INTSTAT_VERSION, jobid_md5);
    -
    -	free(jobid_md5);
    -
    -	if (stmt==NULL) {
    -		return edg_wll_SetError(ctx,ENOMEM, NULL);
    -	}
    -
    -//printf ("\n\n\n Would like to run SQL statament: %s\n\n\n\n", stmt);
    -	glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt);
    -
    -        if ((dbret = edg_wll_ExecSQL(ctx,stmt,NULL)) < 0) goto cleanup;
    -
    -	assert(dbret);	/* update should come through OK as the record exists */
    -
    -cleanup:
    -        free(stmt);
    -        free(stat_enc);
    -
    -	return edg_wll_Error(ctx, NULL, NULL);
    -
    -}
    -
    diff --git a/org.glite.lb.server/src/jobstat.h b/org.glite.lb.server/src/jobstat.h
    deleted file mode 100644
    index 5ceec21..0000000
    --- a/org.glite.lb.server/src/jobstat.h
    +++ /dev/null
    @@ -1,63 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#ifndef GLITE_LB_LBS_JOBSTAT_H
    -#define GLITE_LB_LBS_JOBSTAT_H
    -
    -#include "glite/lb/jobstat.h"
    -#include "glite/lb/intjobstat.h"
    -#include "glite/lbu/db.h"
    -
    -int edg_wll_JobStatusServer(edg_wll_Context, glite_jobid_const_t, int, edg_wll_JobStat *);
    -
    -
    -int edg_wll_intJobStatus( edg_wll_Context, glite_jobid_const_t, int, intJobStat *, int, int);
    -edg_wll_ErrorCode edg_wll_StoreIntState(edg_wll_Context, intJobStat *, int);
    -edg_wll_ErrorCode edg_wll_StoreIntStateEmbryonic(edg_wll_Context, char *icnames, char *values);
    -edg_wll_ErrorCode edg_wll_LoadIntState(edg_wll_Context , glite_jobid_const_t , int, int, intJobStat **);
    -edg_wll_ErrorCode edg_wll_RestoreSubjobState(edg_wll_Context , glite_jobid_const_t , intJobStat *);
    -
    -
    -/* update stored job state according to new event */
    -edg_wll_ErrorCode edg_wll_StepIntState(edg_wll_Context ctx, glite_jobid_const_t job, edg_wll_Event *e, int seq, edg_wll_JobStat *old_stat, edg_wll_JobStat *stat_out);
    -
    -edg_wll_ErrorCode edg_wll_StepIntStateParent(edg_wll_Context,glite_jobid_const_t,edg_wll_Event *,int,intJobStat *, edg_wll_JobStat *old_stat, edg_wll_JobStat *);
    -
    -/* create embriotic job state for DAGs' subjob */
    -
    -edg_wll_ErrorCode edg_wll_StepIntStateEmbriotic(
    -	edg_wll_Context ctx,	/* INOUT */
    -        edg_wll_Event *e	/* IN */
    -);
    -
    -
    -
    -intJobStat* dec_intJobStat(char *, char **);
    -char *enc_intJobStat(char *, intJobStat* );
    -
    -void write2rgma_status(intJobStat *);
    -void write2rgma_chgstatus(intJobStat *, char *);
    -char* write2rgma_statline(intJobStat *);
    -
    -int add_stringlist(char ***, const char *);
    -
    -edg_wll_ErrorCode edg_wll_GetSubjobHistogram(edg_wll_Context, glite_jobid_const_t parent_jobid, int *hist);
    -edg_wll_ErrorCode edg_wll_StoreSubjobHistogram(edg_wll_Context, glite_jobid_const_t parent_jobid, intJobStat *ijs);
    -
    -#endif /* GLITE_LB_LBS_JOBSTAT_H*/
    diff --git a/org.glite.lb.server/src/jobstat_supp.c b/org.glite.lb.server/src/jobstat_supp.c
    deleted file mode 100644
    index 548d741..0000000
    --- a/org.glite.lb.server/src/jobstat_supp.c
    +++ /dev/null
    @@ -1,785 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "glite/jobid/cjobid.h"
    -#include "glite/lbu/trio.h"
    -#include "glite/lbu/db.h"
    -#include "glite/lb/context-int.h"
    -#include "glite/lb/intjobstat.h"
    -#include "glite/lb/seqcode_aux.h"
    -
    -#include "store.h"
    -#include "index.h"
    -#include "jobstat.h"
    -#include "get_events.h"
    -
    -
    -/* TBD: share in whole logging or workload */
    -#ifdef __GNUC__
    -#define UNUSED_VAR __attribute__((unused))
    -#else
    -#define UNUSED_VAR
    -#endif
    -
    -static char* enc_strlist(char *, char **) UNUSED_VAR;
    -static char **dec_strlist(char *, char **) UNUSED_VAR;
    -
    -/*
    - * string encoding routines for safe DB store
    - */
    -
    -static char *enc_string(char *old, char *item)
    -{
    -	char *out;
    -	if (item == NULL) {
    -		asprintf(&out,"%s-1 ", old);
    -	} else {
    -		asprintf(&out,"%s%ld %s",old, (long)strlen(item), item);
    -	}
    -	free(old);
    -	return out;
    -}
    -
    -static char *dec_string(char *in, char **rest)
    -{
    -	int scret;
    -	long len = -1;
    -	char *out;
    -	
    -	scret = sscanf(in, "%ld", &len);
    -	if (scret < 1) {
    -		*rest = NULL;
    -		return NULL;
    -	}
    -	if (len == -1) {
    -		out = NULL;
    -		*rest = strchr(in, ' ') ? strchr(in, ' ') + 1 : NULL;
    -	} else {
    -		in = strchr(in, ' ') ? strchr(in, ' ') + 1 : NULL;
    -		out = (char *)malloc(len+1);
    -		if (out) {
    -			memcpy(out, in, len);
    -			*(out+len) = '\0';
    -		}
    -		*rest = in+len;
    -	}
    -	return out;
    -}
    -
    -static char *enc_int(char *old, int item)
    -{
    -        char *out;
    -        asprintf(&out,"%s%d ", old, item);
    -	free(old);
    -        return out;
    -}
    -
    -static char *enc_int_array(char *old, int *item, int itemsNo)
    -{
    -        char *out;
    -	int index;
    -	char *strpom;
    -
    -	strpom=(char*)calloc(strlen(old)+1,sizeof(char));
    -
    -	for (index=0; index <= itemsNo; index++) sprintf(strpom+strlen(strpom),"%d%s", item[index],index==itemsNo?"":";");
    -
    -        asprintf(&out,"%s%s ", old, strpom);
    -	free(strpom);
    -        free(old);
    -
    -        return out;
    -}
    -
    -static int dec_int(char* in, char **rest)
    -{
    -	int scret;
    -	int out;
    -
    -	scret = sscanf(in, "%d", &out);
    -	if (scret == 1) {
    -		*rest = strchr(in, ' ') ? strchr(in, ' ') + 1 : NULL;
    -	} else {
    -		out = 0;
    -		*rest = in;
    -	}
    -	return out;
    -}
    -
    -static int dec_int_array(char* in, char **rest, int *out)	// Returns the number of items found in the array
    -{
    -	int charNo, itemsNo = 0, cindex, iindex = 0, lenindex;
    -	char *tempstr;
    -
    -        /* Find out the number of items in the field first */
    -
    -	for (charNo = 0;charNo 0 ; len--, item++) {
    -		ret = enc_int(ret, *item);
    -	}
    -
    -	return ret;
    -}
    -
    -static int *dec_intlist(char *in, char **rest)
    -{
    -	int len = -1;
    -	int *out, *ptr;
    -	char *tmp_in;
    -	int scret;
    -
    -	scret = sscanf(in, "%d", &len);
    -	if (scret < 1) {
    -		*rest = NULL;
    -		return NULL;
    -	}
    -	tmp_in = strchr(in, ' ') ? strchr(in, ' ') + 1 : NULL;
    -	if (len == -1 || tmp_in == NULL) {
    -		*rest = tmp_in;
    -		return NULL;
    -	}
    -
    -	len = dec_int(tmp_in, &tmp_in);
    -	out = (int *)malloc( (len+1) *sizeof(int));
    -	if (out) {
    -		*out = len; 
    -		ptr = out+1;
    -		while (len) {
    -			*ptr = dec_int(tmp_in, &tmp_in);
    -			len--; ptr++;
    -		}
    -	}
    -	*rest = tmp_in;
    -	return out;
    -}
    -
    -static char* enc_timeval(char *old, struct timeval item)
    -{
    -	char *ret;
    -	
    -	ret = enc_int(old, (int)item.tv_sec);
    -	if (ret) {
    -		ret = enc_int(ret, (int)item.tv_usec);
    -	}
    -	return ret;
    -}
    -
    -static struct timeval dec_timeval(char *in, char **rest)
    -{
    -	struct timeval t;
    -	char *tmp_in;
    -	
    -	t.tv_sec = dec_int(in, &tmp_in);
    -	if (tmp_in != NULL) t.tv_usec = dec_int(tmp_in, &tmp_in);
    -	*rest = tmp_in;
    -	return t;
    -}
    -
    -static char *enc_JobStat(char *old, edg_wll_JobStat* stat)
    -{
    -	char *ret;
    -
    -	ret = enc_int(old, stat->state);
    -	if (ret) ret = enc_jobid(ret, stat->jobId);
    -	if (ret) ret = enc_string(ret, stat->owner);
    -	if (ret) ret = enc_int(ret, stat->jobtype);
    -	if (ret) ret = enc_jobid(ret, stat->parent_job);
    -	if (ret) ret = enc_string(ret, stat->seed);
    -	if (ret) ret = enc_int(ret, stat->children_num);
    -	if (ret) ret = enc_int_array(ret, stat->children_hist, EDG_WLL_NUMBER_OF_STATCODES);
    -		/* children histogram stored in the DB, other children data not stored. */
    -	if (ret) ret = enc_string(ret, stat->condorId);
    -	if (ret) ret = enc_string(ret, stat->globusId);
    -	if (ret) ret = enc_string(ret, stat->localId);
    -	if (ret) ret = enc_string(ret, stat->jdl);
    -	if (ret) ret = enc_string(ret, stat->matched_jdl);
    -	if (ret) ret = enc_string(ret, stat->destination);
    -	if (ret) ret = enc_string(ret, stat->condor_jdl);
    -	if (ret) ret = enc_string(ret, stat->rsl);
    -	if (ret) ret = enc_string(ret, stat->reason);
    -	if (ret) ret = enc_string(ret, stat->location);
    -	if (ret) ret = enc_string(ret, stat->ce_node);
    -	if (ret) ret = enc_string(ret, stat->network_server);
    -	if (ret) ret = enc_int(ret, stat->subjob_failed);
    -	if (ret) ret = enc_int(ret, stat->done_code);
    -	if (ret) ret = enc_int(ret, stat->exit_code);
    -	if (ret) ret = enc_int(ret, stat->resubmitted);
    -	if (ret) ret = enc_int(ret, stat->cancelling);
    -	if (ret) ret = enc_string(ret, stat->cancelReason);
    -	if (ret) ret = enc_int(ret, stat->cpuTime);
    -	if (ret) ret = enc_taglist(ret, stat->user_tags);
    -	if (ret) ret = enc_timeval(ret, stat->stateEnterTime);
    -	if (ret) ret = enc_timeval(ret, stat->lastUpdateTime);
    -	if (ret) ret = enc_intlist(ret, stat->stateEnterTimes);
    -	if (ret) ret = enc_int(ret, stat->expectUpdate);
    -	if (ret) ret = enc_string(ret, stat->expectFrom);
    -	if (ret) ret = enc_string(ret, stat->acl);
    -	if (ret) ret = enc_int(ret, stat->payload_running);
    -	if (ret) ret = enc_strlist(ret, stat->possible_destinations);
    -	if (ret) ret = enc_strlist(ret, stat->possible_ce_nodes);
    -	if (ret) ret = enc_int(ret, stat->suspended);
    -	if (ret) ret = enc_string(ret, stat->suspend_reason);
    -	if (ret) ret = enc_string(ret, stat->failure_reasons);
    -	if (ret) ret = enc_int(ret, stat->remove_from_proxy);
    -	if (ret) ret = enc_string(ret, stat->ui_host);
    -	if (ret) ret = enc_strlist(ret, stat->user_fqans);
    -	if (ret) ret = enc_int(ret, stat->sandbox_retrieved);
    -	if (ret) ret = enc_int(ret, stat->jw_status);
    -	if (ret) ret = enc_jobid(ret, stat->isb_transfer);
    -	if (ret) ret = enc_jobid(ret, stat->osb_transfer);
    -	if (ret) ret = enc_string(ret, stat->pbs_state);
    -	if (ret) ret = enc_string(ret, stat->pbs_queue);
    -	if (ret) ret = enc_string(ret, stat->pbs_owner);
    -	if (ret) ret = enc_string(ret, stat->pbs_name);
    -	if (ret) ret = enc_string(ret, stat->pbs_reason);
    -	if (ret) ret = enc_string(ret, stat->pbs_scheduler);
    -	if (ret) ret = enc_string(ret, stat->pbs_dest_host);
    -	if (ret) ret = enc_int(ret, stat->pbs_pid);
    -	if (ret) ret = enc_string(ret, stat->pbs_resource_usage);
    -	if (ret) ret = enc_int(ret, stat->pbs_exit_status);
    -	if (ret) ret = enc_string(ret, stat->pbs_error_desc);
    -	if (ret) ret = enc_string(ret, stat->condor_status);
    -	if (ret) ret = enc_string(ret, stat->condor_universe);
    -	if (ret) ret = enc_string(ret, stat->condor_owner);
    -	if (ret) ret = enc_string(ret, stat->condor_preempting);
    -	if (ret) ret = enc_int(ret, stat->condor_shadow_pid);
    -	if (ret) ret = enc_int(ret, stat->condor_shadow_exit_status);
    -	if (ret) ret = enc_int(ret, stat->condor_starter_pid);
    -	if (ret) ret = enc_int(ret, stat->condor_starter_exit_status);
    -	if (ret) ret = enc_int(ret, stat->condor_job_pid);
    -	if (ret) ret = enc_int(ret, stat->condor_job_exit_status);
    -	if (ret) ret = enc_string(ret, stat->condor_dest_host);
    -	if (ret) ret = enc_string(ret, stat->condor_reason);
    -	if (ret) ret = enc_string(ret, stat->condor_error_desc);
    -	if (ret) ret = enc_int(ret, stat->cream_state);
    -	if (ret) ret = enc_string(ret, stat->cream_id);
    -	if (ret) ret = enc_string(ret, stat->cream_owner);
    -	if (ret) ret = enc_string(ret, stat->cream_endpoint);
    -	if (ret) ret = enc_string(ret, stat->cream_jdl);
    -	if (ret) ret = enc_string(ret, stat->cream_reason);
    -	if (ret) ret = enc_string(ret, stat->cream_failure_reason);
    -	if (ret) ret = enc_string(ret, stat->cream_lrms_id);
    -	if (ret) ret = enc_string(ret, stat->cream_node);
    -	if (ret) ret = enc_int(ret, stat->cream_done_code);
    -	if (ret) ret = enc_int(ret, stat->cream_exit_code);
    -	if (ret) ret = enc_int(ret, stat->cream_cancelling);
    -	if (ret) ret = enc_int(ret, stat->cream_cpu_time);
    -	if (ret) ret = enc_int(ret, stat->cream_jw_status);
    -	if (ret) ret = enc_jobid(ret, stat->ft_compute_job);
    -	if (ret) ret = enc_int(ret, stat->ft_sandbox_type);
    -	if (ret) ret = enc_string(ret, stat->ft_src);
    -	if (ret) ret = enc_string(ret, stat->ft_dest);
    -
    -	return ret;
    -}
    -static edg_wll_JobStat* dec_JobStat(char *in, char **rest)
    -{
    -	char *tmp_in;
    -	edg_wll_JobStat *stat;
    -
    -	stat = (edg_wll_JobStat *) calloc(1,sizeof(edg_wll_JobStat));
    -	if (!stat) return stat;
    -	tmp_in = in;
    -
    -        stat->state = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->jobId = dec_jobid(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->owner = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->jobtype = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->parent_job = dec_jobid(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->seed = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->children_num = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) {
    -			    stat->children_hist = (int*)calloc(EDG_WLL_NUMBER_OF_STATCODES+1, sizeof(int));
    -			    dec_int_array(tmp_in, &tmp_in, stat->children_hist);
    -	}
    -                /* children histogram stored in the DB, other children data not stored. */
    -        if (tmp_in != NULL) stat->condorId = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->globusId = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->localId = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->jdl = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->matched_jdl = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->destination = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->condor_jdl = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->rsl = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->reason = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->location = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->ce_node = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->network_server = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->subjob_failed = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->done_code = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->exit_code = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->resubmitted = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->cancelling = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->cancelReason = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->cpuTime = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->user_tags = dec_taglist(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->stateEnterTime = dec_timeval(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->lastUpdateTime = dec_timeval(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->stateEnterTimes = dec_intlist(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->expectUpdate = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->expectFrom = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->acl = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->payload_running = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->possible_destinations = dec_strlist(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->possible_ce_nodes = dec_strlist(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->suspended = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->suspend_reason = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->failure_reasons = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->remove_from_proxy = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->ui_host = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->user_fqans = dec_strlist(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->sandbox_retrieved = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->jw_status = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->isb_transfer = dec_jobid(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->osb_transfer = dec_jobid(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->pbs_state = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->pbs_queue = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->pbs_owner = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->pbs_name = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->pbs_reason = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->pbs_scheduler = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->pbs_dest_host = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->pbs_pid = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->pbs_resource_usage = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->pbs_exit_status = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->pbs_error_desc = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->condor_status = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->condor_universe = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->condor_owner = dec_string(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->condor_preempting = dec_string(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->condor_shadow_pid = dec_int(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->condor_shadow_exit_status = dec_int(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->condor_starter_pid = dec_int(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->condor_starter_exit_status = dec_int(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->condor_job_pid = dec_int(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->condor_job_exit_status = dec_int(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->condor_dest_host = dec_string(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->condor_reason = dec_string(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->condor_error_desc = dec_string(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->cream_state = dec_int(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->cream_id = dec_string(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->cream_owner = dec_string(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->cream_endpoint = dec_string(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->cream_jdl = dec_string(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->cream_reason = dec_string(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->cream_failure_reason = dec_string(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->cream_lrms_id = dec_string(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->cream_node = dec_string(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->cream_done_code = dec_int(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->cream_exit_code = dec_int(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->cream_cancelling = dec_int(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->cream_cpu_time = dec_int(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->cream_jw_status = dec_int(tmp_in, &tmp_in);
    -        if (tmp_in != NULL) stat->ft_compute_job = dec_jobid(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->ft_sandbox_type = dec_int(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->ft_src = dec_string(tmp_in, &tmp_in);
    -	if (tmp_in != NULL) stat->ft_dest = dec_string(tmp_in, &tmp_in);
    -	
    -
    -	*rest = tmp_in;
    -
    -	return stat;
    -}
    -
    -char *enc_intJobStat(char *old, intJobStat* stat)
    -{
    -	char *ret;
    -
    -	ret = enc_JobStat(old, &stat->pub);
    -	if (ret) ret = enc_int(ret, stat->resubmit_type);
    -	if (ret) ret = enc_string(ret, stat->last_seqcode);
    -	if (ret) ret = enc_string(ret, stat->last_cancel_seqcode);
    -	if (ret) ret = enc_string(ret, stat->branch_tag_seqcode);
    -	if (ret) ret = enc_string(ret, stat->last_branch_seqcode);
    -	if (ret) ret = enc_string(ret, stat->deep_resubmit_seqcode);
    -	if (ret) ret = enc_branch_states(ret, stat->branch_states);
    -	if (ret) ret = enc_timeval(ret, stat->last_pbs_event_timestamp);
    -	if (ret) ret = enc_int(ret, stat->pbs_reruning);
    -	if (ret) ret = enc_strlist(ret, stat->tag_seq_codes);
    -	return ret;
    -}
    -
    -intJobStat* dec_intJobStat(char *in, char **rest)
    -{
    -	edg_wll_JobStat *pubstat;
    -	intJobStat *stat = 0;
    -	char *tmp_in;
    -
    -	pubstat = dec_JobStat(in, &tmp_in);
    -
    -	if (tmp_in != NULL) {
    -		stat = (intJobStat *)calloc(1,sizeof(intJobStat));
    -	} 
    -	if (stat != NULL) {
    -		stat->pub = *pubstat;
    -		free(pubstat);
    -		stat->resubmit_type = dec_int(tmp_in, &tmp_in);
    -		if (tmp_in != NULL) {
    -			stat->last_seqcode = dec_string(tmp_in, &tmp_in);
    -		}
    -		if (tmp_in != NULL) {
    -			stat->last_cancel_seqcode = dec_string(tmp_in, &tmp_in);
    -		}
    -		if (tmp_in != NULL) {
    -			stat->branch_tag_seqcode = dec_string(tmp_in, &tmp_in);
    -		}
    -		if (tmp_in != NULL) {
    -			stat->last_branch_seqcode = dec_string(tmp_in, &tmp_in);
    -		}
    -		if (tmp_in != NULL) {
    -			stat->deep_resubmit_seqcode = dec_string(tmp_in, &tmp_in);
    -		}
    -		if (tmp_in != NULL) {
    -			stat->branch_states = dec_branch_states(tmp_in, &tmp_in);
    -		}
    -		if (tmp_in != NULL) {
    -			stat->last_pbs_event_timestamp = dec_timeval(tmp_in, &tmp_in);
    -		}
    -		if (tmp_in != NULL) {
    -			stat->pbs_reruning = dec_int(tmp_in, &tmp_in);
    -		}
    -		if (tmp_in != NULL) {
    -			stat->tag_seq_codes = dec_strlist(tmp_in, &tmp_in);
    -		}
    -	} else if (tmp_in != NULL) {
    -		edg_wll_FreeStatus(pubstat);
    -		free(pubstat);
    -	}
    -
    -	*rest = tmp_in;
    -	return stat;
    -}
    -
    -
    -static int compare_pevents_by_seq(const void *a, const void *b)
    -{
    -        const edg_wll_Event **e = (const edg_wll_Event **) a;
    -        const edg_wll_Event **f = (const edg_wll_Event **) b;
    -	return compare_events_by_seq(*e,*f);
    -}
    -
    -void edg_wll_SortEvents(edg_wll_Event *e)
    -{
    -	int	n;
    -
    -	if (!e) return;
    -	for (n=0; e[n].type; n++);
    -	qsort(e,n,sizeof(*e),compare_events_by_seq);
    -}
    -
    -void edg_wll_SortPEvents(edg_wll_Event **e)
    -{
    -	edg_wll_Event **p;
    -	int	n;
    -
    -	if (!e) return;
    -	p = e;
    -	for (n=0; *p; n++) {
    -		p++;
    -	}
    -	qsort(e,n,sizeof(*e),compare_pevents_by_seq);
    -}
    -
    -
    diff --git a/org.glite.lb.server/src/lb_authz.c b/org.glite.lb.server/src/lb_authz.c
    deleted file mode 100644
    index 88e1605..0000000
    --- a/org.glite.lb.server/src/lb_authz.c
    +++ /dev/null
    @@ -1,966 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include 
    -#include 
    -#include 
    -
    -#include 
    -#include "glite/security/voms/voms_apic.h"
    -#include "glite/lb/context-int.h"
    -#include "lb_authz.h"
    -#include "glite/lbu/log.h"
    -
    -#include  
    -#undef WITHOUT_TRIO
    -
    -#include "glite/jobid/strmd5.h"
    -#include "glite/jobid/cjobid.h"
    -#include "glite/lbu/trio.h"
    -#include "db_supp.h"
    -#include "authz_policy.h"
    -
    -
    -/* XXX should be defined in gridsite-gacl.h */
    -GRSTgaclEntry *GACLparseEntry(xmlNodePtr cur);
    -
    -extern char *server_key;
    -extern char *server_cert;
    -extern struct _edg_wll_authz_policy authz_policy;
    -extern int enable_lcas;
    -extern char *policy_file;
    -
    -int 
    -edg_wll_get_fqans(edg_wll_Context ctx, struct vomsdata *voms_info,
    -      	  char ***fqans)
    -{
    -   struct voms **voms_cert = NULL;
    -   char **f, **attrs, **tmp;
    -   int num;
    -
    -   attrs = NULL;
    -   num = 0;
    -
    -   for (voms_cert = voms_info->data; voms_cert && *voms_cert; voms_cert++) {
    -      for (f = (*voms_cert)->fqan; f && *f; f++) {
    -         tmp = realloc(attrs, (num + 1) * sizeof(*attrs));
    -         if (tmp == NULL) {
    -            free(attrs);
    -            return ENOMEM;
    -         }
    -         attrs = tmp;
    -         attrs[num++] = strdup(*f);
    -      }
    -   }
    -   if (attrs) {
    -      tmp = realloc(attrs, (num + 1) * sizeof(*attrs));
    -      if (tmp == NULL) {
    -         free(attrs);
    -         return ENOMEM;
    -      }
    -      attrs = tmp;
    -      attrs[num++] = NULL;
    -   }
    -   
    -   *fqans = attrs;
    -   return 0;
    -}
    -
    -static int
    -add_groups(edg_wll_Context ctx, struct voms *voms_cert, char *vo_name,
    -      	   edg_wll_VomsGroups *groups)
    -{
    -   struct data **voms_data;
    -   edg_wll_VomsGroup *tmp = NULL;
    -
    -   if (voms_cert->type != TYPE_STD) {
    -      edg_wll_SetError(ctx, EINVAL, "not supported VOMS certificate type");
    -      return EINVAL;
    -   }
    -
    -   for (voms_data = voms_cert->std; voms_data && *voms_data; voms_data++) {
    -      if ((*voms_data)->group && *(*voms_data)->group) {
    -	 tmp = realloc(groups->val, (groups->len + 1) * sizeof(*groups->val));
    -	 if (tmp == NULL)
    -	    return edg_wll_SetError(ctx, ENOMEM, "not enough memory");
    -	 groups->val = tmp;
    -	 groups->val[groups->len].vo = strdup(vo_name);
    -	 groups->val[groups->len].name = strdup((*voms_data)->group);
    -	 groups->len++;
    -      }
    -   }
    -   return 0;
    -}
    -
    -static int 
    -get_groups(edg_wll_Context ctx, struct vomsdata *voms_info,
    -      	   edg_wll_VomsGroups *res_groups)
    -{
    -   struct voms **voms_cert = NULL;
    -   edg_wll_VomsGroups groups;
    -   int ret;
    -
    -   memset(&groups, 0, sizeof(groups));
    -
    -   for (voms_cert = voms_info->data; voms_cert && *voms_cert; voms_cert++) {
    -      if ((*voms_cert)->voname) {
    -	 ret = add_groups(ctx, *voms_cert, (*voms_cert)->voname, &groups);
    -	 if (ret) {
    -	    edg_wll_FreeVomsGroups(&groups);
    -	    return ret;
    -	 }
    -      }
    -   }
    -
    -   res_groups->len = groups.len;
    -   res_groups->val = groups.val;
    -   return 0;
    -}
    -
    -int
    -edg_wll_SetVomsGroups(edg_wll_Context ctx, edg_wll_GssConnection *gss, char *server_cert, char *server_key, char *voms_dir, char *ca_dir)
    -{
    -   int ret;
    -   int err = 0;
    -   struct vomsdata *voms_info = NULL;
    -   edg_wll_GssPrincipal principal;
    -   edg_wll_GssStatus gss_code;
    -
    -
    -   /* XXX DK: correct cleanup ?? */
    -   memset (&ctx->vomsGroups, 0, sizeof(ctx->vomsGroups));
    -   edg_wll_ResetError(ctx);
    -
    -   if (ctx->fqans) {
    -      char **f;
    -      for (f = ctx->fqans; f && *f; f++)
    -         free(*f);
    -      free(ctx->fqans);
    -      ctx->fqans = NULL;
    -   }
    -
    -   ret = edg_wll_gss_get_client_conn(gss, &principal, &gss_code);
    -   if (ret) {
    -	if (ret == EDG_WLL_GSS_ERROR_GSS) {
    -		edg_wll_SetErrorGss(ctx,"edg_wll_SetVomsGroups()",&gss_code);
    -	}
    -	edg_wll_SetError(ctx, ret, "edg_wll_SetVomsGroups() - failed to get peer credentials");
    -	goto end;	
    -   }
    -
    -   /* uses X509_CERT_DIR and X509_VOMS_DIR vars */
    -   voms_info = VOMS_Init(voms_dir, ca_dir);
    -   if (voms_info == NULL) {
    -      edg_wll_SetError(ctx, errno, "failed to initialize VOMS structures");
    -      ret = -1; /* XXX VOMS Error */
    -      goto end;
    -   }
    -
    -   ret = VOMS_RetrieveFromCtx(gss->context, RECURSE_CHAIN, voms_info, &err);
    -   if (ret == 0) {
    -      if (err == VERR_NOEXT)
    -	 /* XXX DK:
    -	 edg_wll_SetError(ctx, EINVAL, "no client VOMS certificates found");
    -	 */
    -	 ret = 0;
    -      else {
    -	 edg_wll_SetError(ctx, -1, "failed to retrieve VOMS info");
    -	 ret = -1; /* XXX VOMS Error */
    -      }
    -      goto end;
    -   }
    -
    -   ret = get_groups(ctx, voms_info, &ctx->vomsGroups);
    -   if (ret)
    -      goto end;
    -
    -   ret = edg_wll_get_fqans(ctx, voms_info, &ctx->fqans);
    -
    -end:
    -   edg_wll_gss_free_princ(principal);
    -
    -   if (voms_info)
    -      VOMS_Destroy(voms_info);
    -
    -   return ret;
    -}
    -
    -void
    -edg_wll_FreeVomsGroups(edg_wll_VomsGroups *groups)
    -{
    -   size_t len;
    -
    -   if (groups == NULL)
    -      return;
    -
    -   for (len = 0; len < groups->len; len++) {
    -      if (groups->val[len].vo)
    -	 free(groups->val[len].vo);
    -      if (groups->val[len].name)
    -	 free(groups->val[len].name);
    -   }
    -}
    -
    -static int
    -parse_creds(edg_wll_Context ctx, edg_wll_VomsGroups *groups, char **fqans,
    -            char *subject, GRSTgaclUser **gacl_user)
    -{
    -   GRSTgaclCred *cred = NULL;
    -   GRSTgaclUser *user = NULL;
    -   int i;
    -   char **f;
    -
    -   edg_wll_ResetError(ctx);
    -
    -   GRSTgaclInit();
    -
    -   cred = GRSTgaclCredNew("person");
    -   if (cred == NULL)
    -      return edg_wll_SetError(ctx, ENOMEM, "Failed to create GACL person");
    -   
    -   if (!GRSTgaclCredAddValue(cred, "dn", subject)) {
    -      edg_wll_SetError(ctx, EINVAL, "Failed to create GACL DN credential");
    -      goto fail;
    -   }
    -
    -   user = GRSTgaclUserNew(cred);
    -   if (user == NULL) {
    -      edg_wll_SetError(ctx, ENOMEM, "Failed to create GACL user");
    -      goto fail;
    -   }
    -   cred = NULL; /* GACLnewUser() doesn't copy content, just store the pointer */
    -
    -   for (i = 0; i < groups->len; i++) {
    -      cred = GRSTgaclCredNew("voms");
    -      if (cred == NULL) {
    -	 edg_wll_SetError(ctx, ENOMEM, "Failed to create GACL voms-cred credential");
    -	 goto fail;
    -      }
    -      if (!GRSTgaclCredAddValue(cred, "fqan", groups->val[i].name)) {
    -         edg_wll_SetError(ctx, EINVAL, "Failed to populate GACL voms-cred credential");
    -	 goto fail;
    -      }
    -      if (!GRSTgaclUserAddCred(user, cred)) {
    -         edg_wll_SetError(ctx, EINVAL, "Failed to add GACL voms-cred credential");
    -	 goto fail;
    -      }
    -      cred = NULL;
    -      /* GACLuserAddCred() doesn't copy content, just store the pointer. Cred
    -       * mustn't be free()ed */
    -   }
    -
    -   for (f = fqans; f && *f; f++) {
    -      cred = GRSTgaclCredNew("voms");
    -      if (cred == NULL) {
    -         edg_wll_SetError(ctx, ENOMEM, "Failed to create GACL voms credential");
    -         goto fail;
    -      }
    -      if (!GRSTgaclCredAddValue(cred, "fqan", *f)) {
    -         edg_wll_SetError(ctx, EINVAL, "Failed to populate GACL voms credential");
    -         goto fail;
    -      }
    -      if (!GRSTgaclUserAddCred(user, cred)) {
    -         edg_wll_SetError(ctx, EINVAL, "Failed to add GACL voms credential");
    -         goto fail;
    -      }
    -      cred = NULL;
    -   }
    -
    -   *gacl_user = user;
    -
    -   return 0;
    -
    -fail:
    -   if (cred)
    -      GRSTgaclCredFree(cred);
    -   if (user)
    -      GRSTgaclUserFree(user);
    -
    -   return edg_wll_Error(ctx,NULL,NULL);
    -}
    -
    -static int
    -cmp_gacl_names(GRSTgaclNamevalue *n1, GRSTgaclNamevalue *n2)
    -{
    -   if (n1 == NULL && n2 == NULL)
    -      return 1;
    -
    -   for ( ; n1; n1 = (GRSTgaclNamevalue *)n1->next, n2 = (GRSTgaclNamevalue *) n2->next) {
    -      if (n2 == NULL)
    -	 return 0;
    -      if (strcmp(n1->name, n2->name) != 0 ||
    -	  strcmp(n1->value, n2->value) != 0)
    -	 return 0;
    -   }
    -
    -   return (n2 == NULL);
    -}
    -
    -static int
    -cmp_gacl_creds(GRSTgaclCred *c1, GRSTgaclCred *c2)
    -{
    -   /* XXX the GRSTgaclCred contains a bit more information to handle */
    -   return (strcmp(c1->auri, c2->auri) == 0);
    -}
    -
    -static int
    -addEntry(edg_wll_Context ctx, GRSTgaclAcl *acl, GRSTgaclEntry *entry)
    -{
    -	GRSTgaclEntry   *cur = NULL;
    -   
    -
    -	if ( acl == NULL )
    -		return EINVAL;
    -
    -	if ( acl->firstentry == NULL )
    -		return (GRSTgaclAclAddEntry(acl, entry) == 0) ? -1 /* GACL_ERR */ : 0;
    -
    -	for ( cur = acl->firstentry; cur; cur = cur->next )
    -		if (   cmp_gacl_creds(cur->firstcred, entry->firstcred)
    -			&& cur->allowed == entry->allowed
    -			&& cur->denied == entry->denied ) 
    -	 		return edg_wll_SetError(ctx,EEXIST,"ACL entry already exists");;
    -
    -	return (GRSTgaclAclAddEntry(acl, entry) == 0) ? -1 /* GACL_ERR */ : 0;
    -}
    -
    -static int
    -delEntry(edg_wll_Context ctx, GRSTgaclAcl *acl, GRSTgaclEntry *entry)
    -{
    -   GRSTgaclEntry *cur = NULL, *prev = NULL;
    -   int found = 0;
    -   
    -   if (acl == NULL || acl->firstentry == NULL)
    -      return EINVAL;
    -
    -   cur = acl->firstentry;
    -   while (cur) {
    -      if (cmp_gacl_creds(cur->firstcred, entry->firstcred) &&
    -	  cur->allowed == entry->allowed &&
    -	  cur->denied == entry->denied) {
    -	 if (prev)
    -	    prev->next = cur->next;
    -	 else
    -	    acl->firstentry = cur->next;
    -	 /* XXX GRSTgaclEntryFree(cur); */
    -	 found = 1;
    -	 break;
    -      }
    -      prev = cur;
    -      cur = cur->next; 
    -   }
    -
    -   return (found) ? 0 : edg_wll_SetError(ctx,EINVAL,"ACL entry doesn't exist");
    -}
    -
    -static int
    -create_cred(edg_wll_Context ctx, char *userid, int user_type, GRSTgaclCred **cred)
    -{
    -   GRSTgaclCred *c = NULL;
    -   char *group = NULL;
    -
    -   if (user_type == EDG_WLL_CHANGEACL_DN) {
    -      c = GRSTgaclCredNew("person");
    -      if (c == NULL)
    -	 return ENOMEM;
    -      if (!GRSTgaclCredAddValue(c, "dn", userid)) {
    -	 GRSTgaclCredFree(c);
    -	 return -1; /* GACL_ERR */
    -      }
    -   } else if(user_type == EDG_WLL_CHANGEACL_GROUP) {
    -      c = GRSTgaclCredNew("voms-cred");
    -      if (c == NULL)
    -	 return ENOMEM;
    -      group = strchr(userid, ':');
    -      if ( !group )
    -	 return EINVAL;
    -      *group++ = '\0';
    -      if (!GRSTgaclCredAddValue(c, "vo", userid) ||
    -	  !GRSTgaclCredAddValue(c, "group", group)) {
    -	  GRSTgaclCredFree(c);
    -	 return -1; /* GACL_ERR */
    -      }
    -   } else if (user_type == EDG_WLL_CHANGEACL_FQAN) {
    -      c = GRSTgaclCredNew("voms");
    -      if (c == NULL)
    -         return ENOMEM;
    -      if (!GRSTgaclCredAddValue(c, "fqan", userid)) {
    -         GRSTgaclCredFree(c);
    -         return -1; /* GACL_ERR */
    -      }
    -   } else
    -      return edg_wll_SetError(ctx,EINVAL,"Unknown user type for ACL");
    -
    -   *cred = c;
    -
    -   return 0;
    -}
    -
    -static int
    -change_acl(edg_wll_Context ctx, GRSTgaclAcl *acl, GRSTgaclEntry *entry, int operation)
    -      /* creds, permission, permission_type */
    -{
    -   if (operation == EDG_WLL_CHANGEACL_ADD)
    -      return addEntry(ctx, acl, entry);
    -   
    -   if (operation == EDG_WLL_CHANGEACL_REMOVE)
    -      return delEntry(ctx, acl, entry);
    -
    -   return edg_wll_SetError(ctx,EINVAL,"Unknown ACL operation requested");
    -}
    -
    -static int
    -edg_wll_change_acl(edg_wll_Context ctx, edg_wll_Acl acl, char *user_id,
    -		   int user_id_type, int permission, int perm_type,
    -		   int operation)
    -{
    -   GRSTgaclCred *cred = NULL;
    -   GRSTgaclEntry *entry = NULL;
    -   int ret,p;
    -
    -   GRSTgaclInit();
    -
    -   if (acl == NULL || acl->value == NULL)
    -      return edg_wll_SetError(ctx,EINVAL,"Change ACL");
    -
    -   ret = create_cred(ctx, user_id, user_id_type, &cred);
    -   if (ret)
    -      return ret;
    -
    -   entry = GRSTgaclEntryNew();
    -   if (entry == NULL) {
    -      ret = edg_wll_SetError(ctx,ENOMEM,"Change ACL");
    -      goto end;
    -   }
    -
    -   if (!GRSTgaclEntryAddCred(entry, cred)) {
    -      ret = edg_wll_SetError(ctx,EINVAL,"Can't create ACL");
    -      goto end;
    -   }
    -
    -   switch (permission) {
    -      case EDG_WLL_CHANGEACL_READ:
    -          p = EDG_WLL_CHANGEACL_READ;
    -	  break;
    -      default:
    -          ret = edg_wll_SetError(ctx,EINVAL,"Unknown permission for ACL");
    -	  goto end;
    -   }
    -
    -   if (perm_type == EDG_WLL_CHANGEACL_ALLOW)
    -      GRSTgaclEntryAllowPerm(entry, p);
    -   else if (perm_type == EDG_WLL_CHANGEACL_DENY)
    -      GRSTgaclEntryDenyPerm(entry, p);
    -   else {
    -      ret = edg_wll_SetError(ctx,EINVAL,"Unknown permission type");
    -      goto end;
    -   }
    -
    -   ret = change_acl(ctx, acl->value, entry, operation);
    -   if (ret)
    -   {
    -/*    XXX: mem leak?
    -      GRSTgaclEntryFree(entry);
    -*/
    -      goto end;
    -   }
    -
    -   if (acl->string) free(acl->string);
    -   ret = edg_wll_EncodeACL(acl->value, &acl->string);
    -
    -end:
    -
    -   return ret;
    -}
    -
    -int
    -edg_wll_CheckACL(edg_wll_Context ctx, edg_wll_Acl acl, int requested_perm)
    -{
    -   int ret;
    -   GRSTgaclUser *user = NULL;
    -   unsigned int perm;
    -
    -   if (acl == NULL || acl->value == NULL)
    -      return edg_wll_SetError(ctx,EINVAL,"CheckACL");
    -
    -   if (!ctx->peerName) return edg_wll_SetError(ctx,EPERM,"CheckACL");
    -
    -   ret = parse_creds(ctx, &ctx->vomsGroups, ctx->fqans, ctx->peerName, &user);
    -   if (ret)
    -      return edg_wll_Error(ctx,NULL,NULL);
    -
    -   perm = GRSTgaclAclTestUser(acl->value, user);
    -
    -   GRSTgaclUserFree(user);
    -   
    -   if (perm & requested_perm) return edg_wll_ResetError(ctx);
    -   else return edg_wll_SetError(ctx,EPERM,"CheckACL");
    -}
    -
    -int
    -edg_wll_EncodeACL(GRSTgaclAcl *acl, char **str)
    -{
    -   int tmp_fd, ret;
    -   FILE *fd = NULL;
    -   char filename[16];
    -   char line[4096];
    -   char *buf = NULL;
    -   size_t buf_len = 0;
    -   char *p;
    -
    -   snprintf(filename, sizeof(filename), "/tmp/XXXXXX");
    -   tmp_fd = mkstemp(filename);
    -   if (tmp_fd == -1)
    -      return errno;
    -
    -   fd = fdopen(tmp_fd, "r");
    -
    -   ret = GRSTgaclAclSave(acl, filename);
    -   unlink(filename);
    -   if (ret == 0) {
    -      ret = -1; /* GACL_ERR */
    -      goto end;
    -   }
    -
    -   buf_len = 1024;
    -   buf = calloc(buf_len, 1);
    -   if (buf == NULL) {
    -      ret = ENOMEM;
    -      goto end;
    -   }
    -
    -   while (fgets(line, sizeof(line), fd) != NULL) {
    -      p = strchr(line, '\n');
    -      if (p)
    -	 *p = '\0';
    -
    -      if (strlen(buf) + strlen(line) > buf_len) {
    -	 char *tmp;
    -
    -	 tmp =  realloc(buf, buf_len + 1024);
    -	 if (tmp == NULL) {
    -	    ret = ENOMEM;
    -	    goto end;
    -	 }
    -	 buf = tmp;
    -	 buf_len += 1024;
    -      }
    -
    -      strcat(buf, line);
    -   }
    -
    -   *str = buf;
    -   ret = 0;
    -
    -end:
    -   fclose(fd);
    -   return ret;
    -}
    -
    -int
    -edg_wll_DecodeACL(char *buf, GRSTgaclAcl **result_acl)
    -{
    -   /* Got from GACLloadAcl() available from GACL API */
    -   xmlDocPtr   doc;
    -   xmlNodePtr  cur;
    -   GRSTgaclAcl    *acl;
    -   GRSTgaclEntry  *entry;
    -        
    -   doc = xmlParseMemory(buf, strlen(buf));
    -   if (doc == NULL) return EINVAL;
    -    
    -   cur = xmlDocGetRootElement(doc);
    -  
    -   if (xmlStrcmp(cur->name, (const xmlChar *) "gacl"))
    -    {
    -       free(doc);
    -       free(cur);
    -       return EINVAL;
    -    }
    -
    -   cur = cur->xmlChildrenNode;
    -
    -   acl = GRSTgaclAclNew();
    -  
    -   while (cur != NULL)
    -       {
    -	 /*
    -	 if (cur->type == XML_TEXT_NODE && cur->content == '\n') {
    -	    cur=cur->next;
    -	    continue;
    -	 }
    -	 */
    -         entry = GACLparseEntry(cur);
    -         if (entry == NULL)
    -           {
    -             /* XXX GRSTgaclAclFree(acl); */
    -             xmlFreeDoc(doc);
    -             return EINVAL;
    -           }
    -
    -         GRSTgaclAclAddEntry(acl, entry);
    -         
    -         cur=cur->next;
    -       }
    -
    -   xmlFreeDoc(doc);
    -   *result_acl = acl;
    -   return 0;
    -}
    -
    -int
    -edg_wll_InitAcl(edg_wll_Acl *acl)
    -{
    -   edg_wll_Acl tmp;
    -
    -   tmp = malloc(sizeof(*tmp));
    -   if ( !tmp )
    -      return ENOMEM;
    -
    -   tmp->value = GRSTgaclAclNew();
    -   tmp->string = NULL;
    -   *acl = tmp;
    -   return 0;
    -}
    -
    -void
    -edg_wll_FreeAcl(edg_wll_Acl acl)
    -{
    -   if ( acl->value ) GRSTgaclAclFree(acl->value);
    -   if ( acl->string ) free(acl->string);
    -   free(acl);
    -}
    -
    -int
    -edg_wll_HandleCounterACL(edg_wll_Context ctx, edg_wll_Acl acl,
    -      			 char *aclid, int incr)
    -{
    -	char	   *q1 = NULL,
    -			   *q2 = NULL;
    -
    -	edg_wll_ResetError(ctx);
    -
    -	if ( incr > 0 )
    -	{
    -		trio_asprintf(&q1,
    -				"insert into acls(aclid,value,refcnt) "
    -				"values ('%|Ss','%|Ss',%d)",
    -				aclid, acl->string, incr);
    -
    -		for ( ; ; )
    -		{
    -			 glite_common_log(LOG_CATEGORY_LB_SERVER_DB, 
    -				LOG_PRIORITY_DEBUG, q1);
    -			if ( edg_wll_ExecSQL(ctx, q1, NULL) > 0 )
    -				goto end;
    -
    -			if ( edg_wll_Error(ctx,NULL,NULL) != EEXIST )
    -				goto end;
    -
    -			/*
    -			 *	row allready in DB
    -			 */
    -			edg_wll_ResetError(ctx);
    -			if ( !q2 ) trio_asprintf(&q2,
    -						"update acls set refcnt = refcnt+%d "
    -						"where aclid = '%|Ss'",
    -						incr, aclid);
    -			glite_common_log(LOG_CATEGORY_LB_SERVER_DB,  
    -                                LOG_PRIORITY_DEBUG, q2);
    -			if ( edg_wll_ExecSQL(ctx, q2, NULL) < 0 )
    -				continue;
    -
    -			goto end; 
    -		}
    -	}
    -	else if (incr < 0)
    -	{
    -		trio_asprintf(&q1,
    -				"update acls set refcnt = refcnt-%d "
    -				"where aclid='%|Ss' and refcnt>=%d",
    -				-incr, aclid, -incr);
    -
    -		glite_common_log(LOG_CATEGORY_LB_SERVER_DB,  
    -                                LOG_PRIORITY_DEBUG, q1);
    -		if ( edg_wll_ExecSQL(ctx, q1, NULL) > 0 )
    -		{
    -			trio_asprintf(&q2,
    -						"delete from acls "
    -						"where aclid='%|Ss' and refcnt=0",
    -						aclid);
    -			glite_common_log(LOG_CATEGORY_LB_SERVER_DB,  
    -                                LOG_PRIORITY_DEBUG, q2);
    -			edg_wll_ExecSQL(ctx, q2, NULL);
    -		}
    -		else
    -		{
    -			glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "ACL with ID: %s has invalid reference count", aclid);
    -		}
    -	}
    -
    -
    -end:
    -	if ( q1 ) free(q1);
    -	if ( q2 ) free(q2);
    -
    -	return edg_wll_Error(ctx, NULL, NULL);
    -}
    -
    -int
    -edg_wll_UpdateACL(edg_wll_Context ctx, glite_jobid_const_t job, 
    -      		  char *user_id, int user_id_type,
    -		  int permission, int perm_type, int operation)
    -{
    -   char *md5_jobid;
    -   edg_wll_Acl acl = NULL;
    -   int ret;
    -   char *stmt = NULL;
    -   char *new_aclid = NULL, *old_aclid = NULL;
    -   int updated;
    -
    -   edg_wll_ResetError(ctx);
    -
    -   md5_jobid = edg_wlc_JobIdGetUnique(job);
    -
    -   do {
    -      if (acl)
    -      {
    -	 edg_wll_FreeAcl(acl);
    -	 acl = NULL;
    -      }
    -      if (old_aclid)
    -      {
    -	 free(old_aclid);
    -      	 old_aclid = NULL;
    -      }
    -      if (new_aclid)
    -      {
    -	 free(new_aclid);
    -         new_aclid = NULL;
    -      }
    -	 
    -      if ( (ret = edg_wll_GetACL(ctx, job, &acl)) )
    -	 goto end;
    -      if ( !acl && (ret = edg_wll_InitAcl(&acl)) )
    -	 goto end;
    -	 
    -      old_aclid = acl->string? strdup(strmd5(acl->string, NULL)): NULL;
    -
    -      ret = edg_wll_change_acl(ctx, acl, user_id, user_id_type, 
    -	    		       permission, perm_type, operation);
    -      if (ret)
    -      {
    -	 if ( ret == EEXIST )
    -            ret = edg_wll_ResetError(ctx);
    -	 goto end;
    -      }
    -
    -      new_aclid = strdup(strmd5(acl->string, NULL));
    -
    -      /* store new ACL or increment its counter if already present in db */
    -      ret = edg_wll_HandleCounterACL(ctx, acl, new_aclid, 1);
    -      if  (ret)
    -	 goto end;
    -
    -      if ( old_aclid )
    -	 trio_asprintf(&stmt,
    -	    "update jobs set aclid='%|Ss' where jobid='%|Ss' and aclid='%|Ss'",
    -	    new_aclid, md5_jobid, old_aclid);
    -      else
    -	 trio_asprintf(&stmt,
    -	    "update jobs set aclid='%|Ss' where jobid='%|Ss' and ISNULL(aclid)",
    -	    new_aclid, md5_jobid);
    -      glite_common_log(LOG_CATEGORY_LB_SERVER_DB,
    -         LOG_PRIORITY_DEBUG, stmt);
    -      updated = edg_wll_ExecSQL(ctx, stmt, NULL);
    -      free(stmt); stmt = NULL;
    -
    -      if (updated > 0)
    -	 /* decrement reference counter of the old ACL, and possibly remove
    -	  * whole ACL if the counter becames zero */
    -	 ret = edg_wll_HandleCounterACL(ctx, NULL, old_aclid, -1);
    -      else
    -         /* We failed to store new ACL to db, most likely because the ACL has
    -	  * been changed. Decrement counter of new ACL set before trying
    -	  * updating */
    -	 ret = edg_wll_HandleCounterACL(ctx, NULL, new_aclid, -1);
    -   } while (updated <= 0);
    -
    -end:
    -   free(md5_jobid);
    -   if (acl)
    -      edg_wll_FreeAcl(acl);
    -   if (new_aclid)
    -      free(new_aclid);
    -   if (old_aclid)
    -      free(old_aclid);
    -
    -   return ret;
    -}
    -
    -int edg_wll_GetACL(edg_wll_Context ctx, glite_jobid_const_t jobid, edg_wll_Acl *acl)
    -{
    -	char	*q = NULL;
    -	char	*acl_id = NULL;
    -	char	*acl_str = NULL;
    -	glite_lbu_Statement    stmt = NULL;
    -	int	ret;
    -	GRSTgaclAcl	*gacl = NULL;
    -	char	*jobstr = edg_wlc_JobIdGetUnique(jobid);
    -
    -	if (jobid == NULL || jobstr == NULL)
    -	   return edg_wll_SetError(ctx,EINVAL,"edg_wll_GetACL()");
    -
    -	edg_wll_ResetError(ctx);
    -
    -	trio_asprintf(&q,
    -		"select aclid from jobs where jobid = '%|Ss'", jobstr);
    -
    -	glite_common_log(LOG_CATEGORY_LB_SERVER_DB,
    -        	LOG_PRIORITY_DEBUG, q);
    -	if (edg_wll_ExecSQL(ctx, q, &stmt) < 0 ||
    -		edg_wll_FetchRow(ctx, stmt, 1, NULL, &acl_id) < 0) {
    -		goto end;
    -	}
    -	glite_lbu_FreeStmt(&stmt); stmt = NULL;
    -	free(q); q = NULL;
    -
    -	if (acl_id == NULL || *acl_id == '\0') {
    -		free(acl_id);
    -		free(jobstr);
    -		*acl = NULL;
    -		return 0;
    -	}
    -
    -	trio_asprintf(&q,
    -		"select value from acls where aclid = '%|Ss'", acl_id);
    -	glite_common_log(LOG_CATEGORY_LB_SERVER_DB,
    -        	LOG_PRIORITY_DEBUG, q);
    -	if (edg_wll_ExecSQL(ctx, q, &stmt) < 0 ||
    -		edg_wll_FetchRow(ctx, stmt, 1, NULL, &acl_str) < 0) {
    -		goto end;
    -	}
    -
    -	ret = edg_wll_DecodeACL(acl_str, &gacl);
    -	if (ret) {
    -		edg_wll_SetError(ctx, EINVAL, "encoding ACL");
    -		goto end;
    -	}
    -
    -	*acl = calloc(1, sizeof(**acl));
    -	if (*acl == NULL) {
    -		ret = ENOMEM;
    -		edg_wll_SetError(ctx, ENOMEM, "not enough memory");
    -		goto end;
    -	}
    -
    -	(*acl)->value = gacl;
    -	(*acl)->string = acl_str;
    -	gacl = NULL; acl_str = NULL;
    -	ret = 0;
    -
    -end:
    -	if (q) free(q);
    -	if (stmt) glite_lbu_FreeStmt(&stmt);
    -	if (acl_id) free(acl_id);
    -	if (acl_str) free(acl_str);
    -	if (gacl) GRSTgaclAclFree(gacl);
    -	if (jobstr) free(jobstr);
    -
    -	return edg_wll_Error(ctx, NULL, NULL);
    -}
    -
    -int
    -check_store_authz(edg_wll_Context ctx, edg_wll_Event *ev)
    -{
    -   char *pem_string = NULL;
    -   const char *request = NULL;
    -   int ret;
    -   authz_action action;
    -   struct _edg_wll_GssPrincipal_data princ;
    -
    -   /* by default the server is open to any authenticated client */
    -   if (policy_file == NULL)
    -        return 0;
    -
    -   switch (ev->any.type) {
    -	case EDG_WLL_EVENT_REGJOB:
    -	     action = REGISTER_JOBS;
    -	     break;
    -
    -	case EDG_WLL_EVENT_CURDESCR:
    -	case EDG_WLL_EVENT_USERTAG:
    -	case EDG_WLL_EVENT_CHANGEACL:
    -	     action = LOG_GENERAL_EVENTS;
    -	     break;
    -
    -	case EDG_WLL_EVENT_RUNNING:
    -	case EDG_WLL_EVENT_REALLYRUNNING:
    -	case EDG_WLL_EVENT_DONE:
    -	     action = LOG_CE_EVENTS;
    -	     break;
    -
    -	default:
    -	     action = LOG_WMS_EVENTS;
    -	     break;
    -   }
    -
    -   princ.name = ctx->peerName;
    -   princ.fqans = ctx->fqans;
    -   ret = check_authz_policy(&ctx->authz_policy, &princ, action);
    -   if (ret == 1)
    -      return 0;
    -
    -   ret = EPERM;
    -   if (enable_lcas) {
    -      /* XXX make a real RSL ? */
    -      request = (char *) action2name(action);
    -
    -      ret = edg_wll_gss_get_client_pem(&ctx->connections->serverConnection->gss,
    -				       server_cert, server_key,
    -                                       &pem_string);
    -      if (ret)
    -         return edg_wll_SetError(ctx, ret, "Failed to extract client's PEM string");
    -
    -      ret = lcas_pem(pem_string, request);
    -      free(pem_string);
    -   }
    -
    -   if (ret)
    -      ret = edg_wll_SetError(ctx, EPERM, "Not allowed to log events here");
    -
    -   return ret;
    -}
    -
    -int edg_wll_amIroot(const char *subj, char **fqans,edg_wll_authz_policy policy)
    -{
    -	struct _edg_wll_GssPrincipal_data princ;
    -
    -	memset(&princ, 0, sizeof(princ));
    -	princ.name = (char *) subj;
    -	princ.fqans = fqans;
    -
    -	return check_authz_policy(policy, &princ, ADMIN_ACCESS);
    -}
    -
    -edg_wll_authz_policy
    -edg_wll_get_server_policy()
    -{
    -    return &authz_policy;
    -}
    diff --git a/org.glite.lb.server/src/lb_html.c b/org.glite.lb.server/src/lb_html.c
    deleted file mode 100644
    index 3562938..0000000
    --- a/org.glite.lb.server/src/lb_html.c
    +++ /dev/null
    @@ -1,392 +0,0 @@
    -#ident "$Header$"
    -/*
    -Copyright (c) Members of the EGEE Collaboration. 2004-2010.
    -See http://www.eu-egee.org/partners for details on the copyright holders.
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -*/
    -
    -
    -#include "lb_html.h"
    -#include "lb_proto.h"
    -#include "cond_dump.h"
    -#include "pretty_print_wrapper.h"
    -
    -#include "glite/lb/context-int.h"
    -#include "glite/lb/xml_conversions.h"
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#ifdef __GNUC__
    -#define UNUSED_VAR __attribute__((unused))
    -#else
    -#define UNUSED_VAR
    -#endif
    -
    -int edg_wll_QueryToHTML(edg_wll_Context ctx UNUSED_VAR, edg_wll_Event *eventsOut UNUSED_VAR, char **message UNUSED_VAR)
    -{
    -/* not implemented yet */
    -	return -1;
    -}
    -
    -/* construct Message-Body of Response-Line for edg_wll_UserJobs */
    -int edg_wll_UserInfoToHTML(edg_wll_Context ctx UNUSED_VAR, edg_wlc_JobId *jobsOut, char **message)
    -{
    -        char *pomA = NULL, *pomB;
    -        int i = 0;
    -
    -        /* head */
    -        pomB = strdup("");
    -
    -        while (jobsOut && jobsOut[i]) {
    -                char    *chid = edg_wlc_JobIdUnparse(jobsOut[i]);
    -
    -                asprintf(&pomA,"%s\t\t 
  • %s\r\n", - pomB, - notifids[i], - notifids[i] - ); - free(pomB); - pomB = pomA; - i++; - } - - char *ret; - asprintf(&ret, "\r\n\t\r\n"); - asprintf(&ret, "\r\n\t\r\n" - "

    User notifications

    \r\n" - "
      %s
    " - "\t\r\n", - pomA - ); - free(pomA); - - *message = ret; - - return 0; -} - -#define TR(name,type,field,null) \ -{ \ - int l; \ - if ((field) != (null)){ \ - l = asprintf(&pomA,"" name ":" \ - "" type "", (field)); \ - } \ - else{ \ - l = asprintf(&pomA,"" name \ - ""); \ - } \ - pomB = realloc(pomB, sizeof(*pomB)*(pomL+l+1)); \ - strcpy(pomB+pomL, pomA); \ - pomL += l; \ - free(pomA); \ - pomA=NULL; \ -} - -#define TRL(name,type,field,null) \ -{ \ - int l; \ - if ((field) != (null)){ \ - l = asprintf(&pomA,"" name ":" \ - "" type "", (field), (field)); \ - } \ - else{ \ - l = asprintf(&pomA,"" name \ - ""); \ - } \ - pomB = realloc(pomB, sizeof(*pomB)*(pomL+l+1)); \ - strcpy(pomB+pomL, pomA); \ - pomL += l; \ - free(pomA); \ - pomA=NULL; \ -} - -int edg_wll_NotificationToHTML(edg_wll_Context ctx UNUSED_VAR, notifInfo *ni, char **message){ - char *pomA = NULL, *pomB = NULL, *flags = NULL, *cond; - int pomL = 0; - - flags = edg_wll_stat_flags_to_string(ni->flags); - printf("flags %d - %s", ni->flags, flags); - - TR("Destination", "%s", ni->destination, NULL); - TR("Valid until", "%s", ni->valid, NULL); - TR("Flags", "%s", flags, NULL); - free(flags); - - if (! edg_wll_Condition_Dump(ni, &cond, 0)){ - asprintf(&pomA, "%s

    Conditions

    \r\n
    %s
    \r\n", - pomB, cond); - free(pomB); - pomB = pomA; - pomL = strlen(pomB); - - } - free(cond); - - asprintf(&pomA, "\r\n\t\r\n" - "

    Notification %s

    \r\n" - "%s
    " - "\t\r\n", - ni->notifid, pomB); - - *message = pomA; - - return 0; -} - -/* construct Message-Body of Response-Line for edg_wll_JobStatus */ -int edg_wll_GeneralJobStatusToHTML(edg_wll_Context ctx UNUSED_VAR, edg_wll_JobStat stat, char **message) -{ - char *pomA = NULL, *pomB = NULL; - int pomL = 0; - char *chid,*chstat,*chis = NULL, *chos = NULL; - char *jdl,*rsl; - - jdl = strdup(""); - rsl = strdup(""); - - chid = edg_wlc_JobIdUnparse(stat.jobId); - if (stat.isb_transfer) chis = edg_wlc_JobIdUnparse(stat.isb_transfer); - if (stat.osb_transfer) chos = edg_wlc_JobIdUnparse(stat.osb_transfer); - - TR("Status","%s",(chstat = edg_wll_StatToString(stat.state)), NULL); - free(chstat); - TR("Owner","%s",stat.owner, NULL); - TR("Condor Id","%s",stat.condorId, NULL); - TR("Globus Id","%s",stat.globusId, NULL); - TR("Local Id","%s",stat.localId, NULL); - TR("Reason","%s",stat.reason, NULL); - if ( (stat.stateEnterTime.tv_sec) || (stat.stateEnterTime.tv_usec) ) { - time_t time = stat.stateEnterTime.tv_sec; - TR("State entered","%s",ctime(&time), NULL); - } - else - TR("State entered", "%s", (char*)NULL, NULL); - if ( (stat.lastUpdateTime.tv_sec) || (stat.lastUpdateTime.tv_usec) ) { - time_t time = stat.lastUpdateTime.tv_sec; - TR("Last update","%s",ctime(&time), NULL); - } - else - TR("Last update", "%s", (char*)NULL, NULL); - TR("Expect update","%s",stat.expectUpdate ? "YES" : "NO", NULL); - TR("Expect update from","%s",stat.expectFrom, NULL); - TR("Location","%s",stat.location, NULL); - TR("Destination","%s",stat.destination, NULL); - TR("Cancelling","%s",stat.cancelling>0 ? "YES" : "NO", NULL); - TR("Cancel reason","%s",stat.cancelReason, NULL); - TR("CPU time","%d",stat.cpuTime, 0); - - - TR("Done code","%d",stat.done_code, -1); - TR("Exit code","%d",stat.exit_code, -1); - - TRL("Input sandbox", "%s", chis, NULL); - TRL("Output sandbox", "%s", chos, NULL); - - if (stat.jdl){ - char *jdl_unp; - if (pretty_print(stat.jdl, &jdl_unp) == 0) - asprintf(&jdl,"

    Job description

    \r\n" - "
    %s
    \r\n",jdl_unp); - else - asprintf(&jdl,"

    Job description (not a ClassAd)" - "

    \r\n
    %s
    \r\n",stat.jdl); - } - - if (stat.rsl) asprintf(&rsl,"

    RSL

    \r\n" - "
    %s
    \r\n",stat.rsl); - - - asprintf(&pomA, "\r\n\t\r\n" - "

    %s

    \r\n" - "%s
    " - "%s%s" - "\t\r\n", - chid,pomB,jdl,rsl); - free(pomB); - - *message = pomA; - - free(chid); - if (chis) free(chis); - if (chos) free(chos); - free(jdl); - free(rsl); - return 0; -} - -int edg_wll_CreamJobStatusToHTML(edg_wll_Context ctx UNUSED_VAR, edg_wll_JobStat stat, char **message) -{ - char *chid, *pomA = NULL, *pomB = NULL, *jdl; - char *lbstat, *creamstat; - int pomL = 0; - - jdl = strdup(""); - - chid = edg_wlc_JobIdUnparse(stat.jobId); - - TR("CREAM ID", "%s", stat.cream_id, NULL); - TR("Status", "%s", (lbstat = edg_wll_StatToString(stat.state)), NULL); - free(lbstat); - TR("CREAM Status", "%s", (creamstat = edg_wll_CreamStatToString(stat.cream_state)), NULL); - free(creamstat); - TR("Owner", "%s", stat.cream_owner, NULL); - TR("Endpoint", "%s", stat.cream_endpoint, NULL); - TR("Worker node", "%s", stat.cream_node, NULL); - TR("Reason", "%s", stat.cream_reason, NULL); - TR("Failure reason", "%s", stat.cream_failure_reason, NULL); - - if ( (stat.stateEnterTime.tv_sec) || (stat.stateEnterTime.tv_usec) ) { - time_t time = stat.stateEnterTime.tv_sec; - TR("State entered","%s",ctime(&time), NULL); - } - else - TR("State entered", "%s", (char*)NULL, NULL); - if ( (stat.lastUpdateTime.tv_sec) || (stat.lastUpdateTime.tv_usec) ) { - time_t time = stat.lastUpdateTime.tv_sec; - TR("Last update","%s",ctime(&time), NULL); - } - else - TR("Last update", "%s", (char*)NULL, NULL); - - - TR("LRMS id", "%s", stat.cream_lrms_id, NULL); - TR("Node", "%s", stat.cream_node, NULL); - TR("Cancelling", "%s", stat.cream_cancelling > 0 ? "YES" : "NO", NULL); - TR("CPU time", "%d", stat.cream_cpu_time, 0); - TR("Done code", "%d", stat.cream_done_code, -1); - TR("Exit code", "%d", stat.cream_exit_code, -1); - - /* - cream_jw_status - */ - - if (stat.cream_jdl){ - char *jdl_unp; - if (pretty_print(stat.cream_jdl, &jdl_unp) == 0) - asprintf(&jdl,"

    Job description

    \r\n" - "
    %s
    \r\n",jdl_unp); - else - asprintf(&jdl,"

    Job description (not a ClassAd)" - "

    \r\n
    %s
    \r\n",stat.cream_jdl); - } - asprintf(&pomA, "\r\n\t\r\n" - "

    %s

    \r\n" - "%s
    " - "%s" - "\t\r\n", - chid,pomB,jdl); - free(pomB); free(jdl); - - *message = pomA; - - return 0; -} - -int edg_wll_FileTransferStatusToHTML(edg_wll_Context ctx UNUSED_VAR, edg_wll_JobStat stat, char **message) -{ - char *pomA = NULL, *pomB = NULL; - int pomL = 0; - char *chid,*chcj,*chsbt; - - chid = edg_wlc_JobIdUnparse(stat.jobId); - - TR("Owner","%s",stat.owner, NULL); - chcj = edg_wlc_JobIdUnparse(stat.ft_compute_job); - TRL("Compute job", "%s", chcj, NULL); - free(chcj); - - switch(stat.ft_sandbox_type){ - case EDG_WLL_STAT_INPUT: chsbt = strdup("INPUT"); - break; - case EDG_WLL_STAT_OUTPUT: chsbt = strdup("OUTPUT"); - break; - default: chsbt = NULL; - break; - } - TR("Sandbox type", "%s", chsbt, NULL); - TR("File transfer source", "%s", stat.ft_src, NULL); - TR("File transfer destination", "%s", stat.ft_dest, NULL); - - asprintf(&pomA, "\r\n\t\r\n" - "

    %s

    \r\n" - "%s
    " - "\t\r\n", - chid,pomB); - free(pomB); - - *message = pomA; - - if (chsbt) free(chsbt); - free(chid); - return 0; -} - -char *edg_wll_ErrorToHTML(edg_wll_Context ctx,int code) -{ - char *out,*et,*ed; - char *msg = edg_wll_HTTPErrorMessage(code); - edg_wll_ErrorCode e; - - e = edg_wll_Error(ctx,&et,&ed); - asprintf(&out,"Error\n" - "

    %s

    \n" - "%d: %s (%s)",msg,e,et,ed); - - free(et); free(ed); - return out; -} - diff --git a/org.glite.lb.server/src/lb_html.h b/org.glite.lb.server/src/lb_html.h deleted file mode 100644 index e5c4eeb..0000000 --- a/org.glite.lb.server/src/lb_html.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef GLITE_LB_HTML_H -#define GLITE_LB_HTML_H - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include "glite/lb/context.h" -#include "glite/lb/events.h" -#include "glite/lb/jobstat.h" -#include "lb_proto.h" - -int edg_wll_QueryToHTML(edg_wll_Context,edg_wll_Event *,char **); -int edg_wll_GeneralJobStatusToHTML(edg_wll_Context, edg_wll_JobStat, char **); -int edg_wll_CreamJobStatusToHTML(edg_wll_Context, edg_wll_JobStat, char **); -int edg_wll_UserInfoToHTML(edg_wll_Context, edg_wlc_JobId *, char **); -int edg_wll_UserNotifsToHTML(edg_wll_Context ctx, char **notifids, char **message); -int edg_wll_NotificationToHTML(edg_wll_Context ctx, notifInfo *ni, char **message); -char *edg_wll_ErrorToHTML(edg_wll_Context,int); -int edg_wll_FileTransferStatusToHTML(edg_wll_Context ctx, edg_wll_JobStat stat, char **message); - -#endif /* GLITE_LB_HTML_H */ diff --git a/org.glite.lb.server/src/lb_http.c b/org.glite.lb.server/src/lb_http.c deleted file mode 100644 index b60f81a..0000000 --- a/org.glite.lb.server/src/lb_http.c +++ /dev/null @@ -1,86 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include - -#include "glite/lb/mini_http.h" -#include "glite/lb/context-int.h" - -#include "glite/lbu/log.h" - -#include "lb_http.h" -#include "lb_proto.h" - -extern int debug; -#define dprintf(x) if (debug) printf x - - -int edg_wll_AcceptHTTP(edg_wll_Context ctx, char **body, char **resp, char ***hdrOut, char **bodyOut, int *httpErr) -{ - char **hdr = NULL,*req = NULL, *err_desc = NULL; - edg_wll_ErrorCode err = 0; - *httpErr = HTTP_OK; - - - if ( ctx->isProxy ) err = edg_wll_http_recv_proxy(ctx,&req,&hdr,body); - else err = edg_wll_http_recv(ctx,&req,&hdr,body,ctx->connections->serverConnection); - - if (req) - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, - LOG_PRIORITY_DEBUG, "[%d] request: %s", - getpid(), req); - else - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, - LOG_PRIORITY_DEBUG, "no request"); - if (body && *body) - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, - LOG_PRIORITY_DEBUG, "request body:\n%s",*body); - - if (!err) { - if ((err = edg_wll_Proto(ctx,req,hdr,*body,resp,hdrOut,bodyOut,httpErr))) - edg_wll_Error(ctx,NULL,&err_desc); - } - - free(req); - if (hdr) { - char **h; - for (h = hdr; *h; h++) free(*h); - free(hdr); - } - - if (err != edg_wll_Error(ctx,NULL,NULL)) edg_wll_SetError(ctx,err,err_desc); - free(err_desc); - return err; -} - -int edg_wll_DoneHTTP(edg_wll_Context ctx, char *resp, char **hdrOut, char *bodyOut) -{ - if (resp) { - if ( ctx->isProxy ) - edg_wll_http_send_proxy(ctx,resp,(char const * const *)hdrOut,bodyOut); - else - edg_wll_http_send(ctx,resp,(char const * const *)hdrOut,bodyOut,ctx->connections->serverConnection); - } - - return 0; -} diff --git a/org.glite.lb.server/src/lb_http.h b/org.glite.lb.server/src/lb_http.h deleted file mode 100644 index 8fa69a9..0000000 --- a/org.glite.lb.server/src/lb_http.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef GLITE_LB_HTTP_H -#define GLITE_LB_HTTP_H - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include "glite/lb/context.h" - -int edg_wll_AcceptHTTP(edg_wll_Context ctx, char **body, char **resp, char ***hdrOut, char **bodyOut, int *httpErr); -int edg_wll_DoneHTTP(edg_wll_Context ctx, char *resp, char **hdrOut, char *bodyOut); - -#endif /* GLITE_LB_HTTP_H */ diff --git a/org.glite.lb.server/src/lb_proto.c b/org.glite.lb.server/src/lb_proto.c deleted file mode 100644 index cfba7a2..0000000 --- a/org.glite.lb.server/src/lb_proto.c +++ /dev/null @@ -1,1272 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "glite/lb/context-int.h" -#include "glite/lb/mini_http.h" -#include "glite/lb/xml_conversions.h" -#include "glite/jobid/strmd5.h" -#include "glite/lbu/trio.h" -#include "glite/lbu/log.h" - -#include "lb_proto.h" -#include "lb_text.h" -#include "lb_html.h" -#include "lb_rss.h" -#include "stats.h" -#include "jobstat.h" -#include "get_events.h" -#include "purge.h" -#include "lb_xml_parse.h" -#include "lb_xml_parse_V21.h" -#include "db_supp.h" -#include "server_notification.h" - - -#define METHOD_GET "GET " -#define METHOD_POST "POST " - -#define KEY_QUERY_JOBS "/queryJobs " -#define KEY_QUERY_EVENTS "/queryEvents " -#define KEY_PURGE_REQUEST "/purgeRequest " -#define KEY_DUMP_REQUEST "/dumpRequest " -#define KEY_LOAD_REQUEST "/loadRequest " -#define KEY_INDEXED_ATTRS "/indexedAttrs " -#define KEY_NOTIF_REQUEST "/notifRequest " -#define KEY_QUERY_SEQUENCE_CODE "/querySequenceCode " -#define KEY_STATS_REQUEST "/statsRequest " -#define KEY_HTTP "HTTP/1.1" - - -#define KEY_ACCEPT "Accept:" -#define KEY_APP "application/x-dglb" -#define KEY_AGENT "User-Agent" - - -static const char* const response_headers_dglb[] = { - "Cache-Control: no-cache", - "Server: edg_wll_Server/" PROTO_VERSION "/" COMP_PROTO, - "Content-Type: application/x-dglb", - NULL -}; - -static const char* const response_headers_html[] = { - "Cache-Control: no-cache", - "Server: edg_wll_Server/" PROTO_VERSION "/" COMP_PROTO, - "Content-Type: text/html", - NULL -}; - -volatile sig_atomic_t purge_quit = 0; - - -char *edg_wll_HTTPErrorMessage(int errCode) -{ - char *msg; - - switch (errCode) { - case HTTP_OK: msg = "OK"; break; - case HTTP_ACCEPTED: msg = "Accepted"; break; - case HTTP_BADREQ: msg = "Bad Request"; break; - case HTTP_UNAUTH: msg = "Unauthorized"; break; - case HTTP_NOTFOUND: msg = "Not Found"; break; - case HTTP_NOTALLOWED: msg = "Method Not Allowed"; break; - case HTTP_UNSUPPORTED: msg = "Unsupported Media Type"; break; - case HTTP_NOTIMPL: msg = "Not Implemented"; break; - case HTTP_INTERNAL: msg = "Internal Server Error"; break; - case HTTP_UNAVAIL: msg = "Service Unavailable"; break; - case HTTP_INVALID: msg = "Invalid Data"; break; - default: msg = "Unknown error"; break; - } - - return msg; -} - - -/* returns non-zero if old style (V21) protocols incompatible */ -static int is_protocol_incompatibleV21(char *user_agent) -{ - char *version, *comp_proto, *needle; - double v, c, my_v = strtod(PROTO_VERSION_V21, (char **) NULL), my_c; - - - /* get version od the other side */ - if ((version = strstr(user_agent,"/")) == NULL) return(-1); - else v = strtod(++version, &needle); - - /* sent the other side list of compatible protocols? */ - if ( needle[0] == '\0' ) return(-2); - - /* test compatibility if server newer*/ - if (my_v > v) { - comp_proto=COMP_PROTO_V21; - do { - my_c = strtod(comp_proto, &needle); - if (my_c == v) return(0); - comp_proto = needle + 1; - } while (needle[0] != '\0'); - return(1); - } - - /* test compatibility if server is older */ - else if (my_v < v) { - do { - comp_proto = needle + 1; - c = strtod(comp_proto, &needle); - if (my_v == c) return(0); - } while (needle[0] != '\0'); - return(1); - } - - /* version match */ - return(0); -} - - -/* returns non-zero if protocols incompatible */ -static int is_protocol_incompatible(char *user_agent) -{ - char *version, *comp_proto, *needle; - double v, c, my_v = strtod(PROTO_VERSION, (char **) NULL), my_c; - - - /* get version od the other side */ - if ((version = strstr(user_agent,"/")) == NULL) return(-1); - else v = strtod(++version, &needle); - - /* sent the other side list of compatible protocols? */ - if ( needle[0] == '\0' ) return(-2); - - /* test compatibility if server newer*/ - if (my_v > v) { - comp_proto=COMP_PROTO; - do { - my_c = strtod(comp_proto, &needle); - if (my_c == v) return(0); - comp_proto = needle + 1; - } while (needle[0] != '\0'); - return(1); - } - - /* test compatibility if server is older */ - else if (my_v < v) { - do { - comp_proto = needle + 1; - c = strtod(comp_proto, &needle); - if (my_v == c) return(0); - } while (needle[0] != '\0'); - return(1); - } - - /* version match */ - return(0); -} - - -static int outputHTML(char **headers) -{ - int i; - - if (!headers) return 0; - - for (i=0; headers[i]; i++) - if (!strncmp(headers[i], KEY_ACCEPT, sizeof(KEY_ACCEPT) - 1)) { - if (strstr(headers[i],KEY_APP)) - return 0; /* message sent by edg_wll_Api */ - else - return 1; /* message sent by other application */ - } - return 1; - -} - - -static int drain_text_request(char *request){ - int i = 0; - while (!isspace(request[i])) i++; - if (i < 5) - return 0; - if (! strncmp(request+i-5, "?text", 5)){ - if (i == 5) - strcpy(request+i-4, request+i); // keep '/' - else - strcpy(request+i-5, request+i); - return 1; - } - else - return 0; -} - -static int getUserNotifications(edg_wll_Context ctx, char *user, char ***notifids){ - char *q = NULL; - glite_lbu_Statement notifs = NULL; - char *notifc[1] = {NULL}; - - trio_asprintf(&q, "select notifid " - "from notif_registrations " - "where userid='%s'", - user); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, q); - if (edg_wll_ExecSQL(ctx, q, ¬ifs) < 0) goto err; - free(q); q = NULL; - - int n = 0; - *notifids = NULL; - while(edg_wll_FetchRow(ctx, notifs, 1, NULL, notifc)){ - n++; - *notifids = realloc(*notifids, n*sizeof(**notifids)); - (*notifids)[n-1] = strdup(notifc[0]); - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, - "Notif %s found", notifc[0]); - } - if (n){ - *notifids = realloc(*notifids, (n+1)*sizeof(**notifids)); - (*notifids)[n] = NULL; - } - return n; - -err: - return 0; -} - -static int getNotifInfo(edg_wll_Context ctx, char *notifId, notifInfo *ni){ - char *q = NULL; - glite_lbu_Statement notif = NULL; - char *notifc[4] = {NULL, NULL, NULL, NULL}; - - trio_asprintf(&q, "select destination, valid, conditions, flags " - "from notif_registrations " - "where notifid='%s'", - notifId); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, q); - if (edg_wll_ExecSQL(ctx, q, ¬if) < 0) goto err; - free(q); q = NULL; - - ni->notifid = strdup(notifId); - if (edg_wll_FetchRow(ctx, notif, sizeof(notifc)/sizeof(notifc[0]), NULL, notifc)){ - ni->destination = notifc[0]; - ni->valid = notifc[1]; - ni->conditions_text = notifc[2]; - parseJobQueryRec(ctx, notifc[2], strlen(notifc[2]), &(ni->conditions)); - ni->flags = atoi(notifc[3]); - } - else - goto err; - - return 0; - -err: - return -1; -} - -static void freeNotifInfo(notifInfo *ni){ - if (ni->notifid) free(ni->notifid); - if (ni->destination) free(ni->destination); - if (ni->valid) free(ni->valid); - if (ni->conditions){ - edg_wll_QueryRec **p; - int i; - for (p = ni->conditions; *p; p++){ - for (i = 0; (*p)[i].attr; i++) - edg_wll_QueryRecFree((*p)+i); - free(*p); - } - free(ni->conditions); - } - if (ni->conditions_text) free(ni->conditions_text); -} - -static int getJobsRSS(edg_wll_Context ctx, char *feedType, edg_wll_JobStat **statesOut){ - edg_wlc_JobId *jobsOut; - //edg_wll_JobStat *statesOut; - edg_wll_QueryRec **conds; - int i; - - char *can_peername = edg_wll_gss_normalize_subj(ctx->peerName, 0); - - if (strncmp(feedType, "finished", strlen("finished")) == 0){ - conds = malloc(4*sizeof(*conds)); - conds[0] = malloc(2*sizeof(**conds)); - conds[0][0].attr = EDG_WLL_QUERY_ATTR_OWNER; - conds[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - conds[0][0].value.c = can_peername; - conds[0][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - conds[1] = malloc(4*sizeof(**conds)); - conds[1][0].attr = EDG_WLL_QUERY_ATTR_STATUS; - conds[1][0].op = EDG_WLL_QUERY_OP_EQUAL; - conds[1][0].value.i = EDG_WLL_JOB_DONE; - conds[1][1].attr = EDG_WLL_QUERY_ATTR_STATUS; - conds[1][1].op = EDG_WLL_QUERY_OP_EQUAL; - conds[1][1].value.i = EDG_WLL_JOB_ABORTED; - conds[1][2].attr = EDG_WLL_QUERY_ATTR_STATUS; - conds[1][2].op = EDG_WLL_QUERY_OP_EQUAL; - conds[1][2].value.i = EDG_WLL_JOB_CANCELLED; - conds[1][3].attr = EDG_WLL_QUERY_ATTR_UNDEF; - conds[2] = malloc(2*sizeof(**conds)); - conds[2][0].attr = EDG_WLL_QUERY_ATTR_LASTUPDATETIME; - conds[2][0].op = EDG_WLL_QUERY_OP_GREATER; - conds[2][0].value.t.tv_sec = time(NULL) - ctx->rssTime; - conds[2][0].value.t.tv_usec = 0; - conds[2][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - conds[3] = NULL; - } - else if (strncmp(feedType, "running", strlen("running")) == 0){ - conds = malloc(4*sizeof(*conds)); - conds[0] = malloc(2*sizeof(**conds)); - conds[0][0].attr = EDG_WLL_QUERY_ATTR_OWNER; - conds[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - conds[0][0].value.c = can_peername; - conds[0][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - conds[1] = malloc(2*sizeof(**conds)); - conds[1][0].attr = EDG_WLL_QUERY_ATTR_STATUS; - conds[1][0].op = EDG_WLL_QUERY_OP_EQUAL; - conds[1][0].value.i = EDG_WLL_JOB_RUNNING; - conds[1][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - conds[2] = malloc(2*sizeof(**conds)); - conds[2][0].attr = EDG_WLL_QUERY_ATTR_LASTUPDATETIME; - conds[2][0].op = EDG_WLL_QUERY_OP_GREATER; - conds[2][0].value.t.tv_sec = time(NULL) - ctx->rssTime; - conds[2][0].value.t.tv_usec = 0; - conds[2][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - conds[3] = NULL; - } - else if (strncmp(feedType, "aborted", strlen("aborted")) == 0){ - conds = malloc(4*sizeof(*conds)); - conds[0] = malloc(2*sizeof(**conds)); - conds[0][0].attr = EDG_WLL_QUERY_ATTR_OWNER; - conds[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - conds[0][0].value.c = can_peername; - conds[0][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - conds[1] = malloc(2*sizeof(**conds)); - conds[1][0].attr = EDG_WLL_QUERY_ATTR_STATUS; - conds[1][0].op = EDG_WLL_QUERY_OP_EQUAL; - conds[1][0].value.i = EDG_WLL_JOB_ABORTED; - conds[1][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - conds[2] = malloc(2*sizeof(**conds)); - conds[2][0].attr = EDG_WLL_QUERY_ATTR_LASTUPDATETIME; - conds[2][0].op = EDG_WLL_QUERY_OP_GREATER; - conds[2][0].value.t.tv_sec = time(NULL) - ctx->rssTime; - conds[2][0].value.t.tv_usec = 0; - conds[2][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - conds[3] = NULL; - } - else{ - *statesOut = NULL; - return -1; - } - - edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conds, 0, &jobsOut, statesOut); - - for (i = 0; conds[i]; i++) - free(conds[i]); - free(conds); - free(can_peername); - - return 0; -} - -static void hup_handler(int sig) { - purge_quit = 1; -} - -edg_wll_ErrorCode edg_wll_ProtoV21(edg_wll_Context ctx, - char *request,char **headers,char *messageBody, - char **response,char ***headersOut,char **bodyOut) -{ - char *requestPTR, *message = NULL; - int ret = HTTP_OK; - int html = outputHTML(headers); - int i; - - edg_wll_ResetError(ctx); - - for (i=0; headers[i]; i++) /* find line with version number in headers */ - if ( strstr(headers[i], KEY_AGENT) ) break; - - if (headers[i] == NULL) { ret = HTTP_BADREQ; goto errV21; } /* if not present */ - switch (is_protocol_incompatibleV21(headers[i])) { - case 0 : /* protocols compatible */ - ctx->is_V21 = 1; - break; - case -1 : /* malformed 'User Agent:' line */ - ret = HTTP_BADREQ; - goto errV21; - break; - case -2 : /* version of one protocol unknown */ - /* fallthrough */ - case 1 : /* protocols incompatible */ - /* fallthrough */ - default : ret = HTTP_UNSUPPORTED; - edg_wll_SetError(ctx,ENOTSUP,"Protocol versions are incompatible."); - goto errV21; - break; - } - - -/* GET */ - if (!strncmp(request, METHOD_GET, sizeof(METHOD_GET)-1)) { - // Not supported - ret = HTTP_BADREQ; -/* POST */ - } else if (!strncmp(request,METHOD_POST,sizeof(METHOD_POST)-1)) { - - requestPTR = request + sizeof(METHOD_POST)-1; - - if (!strncmp(requestPTR,KEY_QUERY_EVENTS,sizeof(KEY_QUERY_EVENTS)-1)) { - edg_wll_Event *eventsOut = NULL; - edg_wll_QueryRec **job_conditions = NULL, **event_conditions = NULL; - int i,j; - - if (parseQueryEventsRequestV21(ctx, messageBody, &job_conditions, &event_conditions)) - ret = HTTP_BADREQ; - - else { - int fatal = 0; - - switch (edg_wll_QueryEventsServer(ctx,ctx->noAuth, - (const edg_wll_QueryRec **)job_conditions, - (const edg_wll_QueryRec **)event_conditions, &eventsOut)) { - - case 0: if (html) ret = HTTP_NOTIMPL; - else ret = HTTP_OK; - break; - case ENOENT: ret = HTTP_NOTFOUND; break; - case EPERM : ret = HTTP_UNAUTH; break; - case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break; - case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break; - default: ret = HTTP_INTERNAL; break; - } - /* glue errors (if eny) to XML responce */ - if (!html && !fatal) - if (edg_wll_QueryEventsToXMLV21(ctx, eventsOut, &message)) - ret = HTTP_INTERNAL; - } - - if (job_conditions) { - for (j = 0; job_conditions[j]; j++) { - for (i = 0 ; (job_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&job_conditions[j][i]); - free(job_conditions[j]); - } - free(job_conditions); - } - - if (event_conditions) { - for (j = 0; event_conditions[j]; j++) { - for (i = 0 ; (event_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&event_conditions[j][i]); - free(event_conditions[j]); - } - free(event_conditions); - } - - if (eventsOut != NULL) { - for (i=0; eventsOut[i].type != EDG_WLL_EVENT_UNDEF; i++) - edg_wll_FreeEvent(&(eventsOut[i])); - edg_wll_FreeEvent(&(eventsOut[i])); /* free last line */ - free(eventsOut); - } - } - else if (!strncmp(requestPTR,KEY_QUERY_JOBS,sizeof(KEY_QUERY_JOBS)-1)) { - edg_wlc_JobId *jobsOut = NULL; - edg_wll_JobStat *statesOut = NULL; - edg_wll_QueryRec **conditions = NULL; - int i,j, flags = 0; - - if (parseQueryJobsRequestV21(ctx, messageBody, &conditions, &flags)) - ret = HTTP_BADREQ; - - else { - int fatal = 0, - retCode; - - if (flags & EDG_WLL_STAT_NO_JOBS) { - flags -= EDG_WLL_STAT_NO_JOBS; - jobsOut = NULL; - if (flags & EDG_WLL_STAT_NO_STATES) { - flags -= EDG_WLL_STAT_NO_STATES; - statesOut = NULL; - retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, NULL, NULL); - } - else - retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, NULL, &statesOut); - } - else { - if (flags & EDG_WLL_STAT_NO_STATES) { - flags -= EDG_WLL_STAT_NO_STATES; - statesOut = NULL; - retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, &jobsOut, NULL); - } - else - retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, &jobsOut, &statesOut); - } - - switch ( retCode ) { - // case EPERM : ret = HTTP_UNAUTH; - // /* soft-error fall through */ - case 0: if (html) ret = HTTP_NOTIMPL; - else ret = HTTP_OK; - - break; - case ENOENT: ret = HTTP_NOTFOUND; break; - case EPERM: ret = HTTP_UNAUTH; break; - case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break; - case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break; - default: ret = HTTP_INTERNAL; break; - } - if (!html && !fatal) - if (edg_wll_QueryJobsToXMLV21(ctx, jobsOut, statesOut, &message)) - ret = HTTP_INTERNAL; - } - - if (conditions) { - for (j = 0; conditions[j]; j++) { - for (i = 0; (conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&conditions[j][i]); - free(conditions[j]); - } - free(conditions); - } - - if (jobsOut) { - for (i=0; jobsOut[i]; i++) edg_wlc_JobIdFree(jobsOut[i]); - free(jobsOut); - } - if (statesOut) { - for (i=0; statesOut[i].state != EDG_WLL_JOB_UNDEF; i++) - edg_wll_FreeStatus(&(statesOut[i])); - edg_wll_FreeStatus(&(statesOut[i])); /* free last line */ - free(statesOut); - } - } - /* POST [something else]: not understood */ - else ret = HTTP_BADREQ; - -/* other HTTP methods */ - } else ret = HTTP_NOTALLOWED; - -errV21: asprintf(response,"HTTP/1.1 %d %s",ret,edg_wll_HTTPErrorMessage(ret)); - *headersOut = (char **) (html? response_headers_html : response_headers_dglb); - if ((ret != HTTP_OK) && html) - *bodyOut = edg_wll_ErrorToHTML(ctx,ret); - else - *bodyOut = message; - - return edg_wll_Error(ctx,NULL,NULL); -} - - - -edg_wll_ErrorCode edg_wll_Proto(edg_wll_Context ctx, - char *request,char **headers,char *messageBody, - char **response,char ***headersOut,char **bodyOut, - int *httpErr) -{ - char *requestPTR = NULL, *message = NULL; - int ret = HTTP_OK; - int html = outputHTML(headers); - int text = 0; //XXX: Plain text communication is special case of html here, hence when text=1, html=1 too - int i; - - edg_wll_ResetError(ctx); - - for (i=0; headers[i]; i++) /* find line with version number in headers */ - if ( strstr(headers[i], KEY_AGENT) ) break; - - if (headers[i] == NULL) { ret = HTTP_BADREQ; goto err; } /* if not present */ - if (!html) { - switch (is_protocol_incompatible(headers[i])) { - case 0 : /* protocols compatible */ - ctx->is_V21 = 0; - break; - case -1 : /* malformed 'User Agent:' line */ - ret = HTTP_BADREQ; - goto err; - break; - case 1 : /* protocols incompatible */ - /* try old (V21) version compatibility */ - edg_wll_ProtoV21(ctx, request, headers, messageBody, - response, headersOut, bodyOut); - - /* and propagate errors or results */ - return edg_wll_Error(ctx,NULL,NULL); - break; - case -2 : /* version of one protocol unknown */ - /* fallthrough */ - default : ret = HTTP_UNSUPPORTED; - edg_wll_SetError(ctx,ENOTSUP,"Protocol versions are incompatible."); - goto err; - break; - } - } - - -/* GET */ - if (!strncmp(request, METHOD_GET, sizeof(METHOD_GET)-1)) { - - requestPTR = strdup(request + sizeof(METHOD_GET)-1); - if (html) text = drain_text_request(requestPTR); - - - /* Is user authorised? */ - if (!ctx->peerName){ - ret = HTTP_UNAUTH; - edg_wll_SetError(ctx, EPERM, "user not authenticated"); - } - - /* GET /: Current User Jobs */ - else if (requestPTR[0]=='/' && (requestPTR[1]==' ' || requestPTR[1]=='?')) { - edg_wlc_JobId *jobsOut = NULL; - int i, flags; - - flags = (requestPTR[1]=='?') ? edg_wll_string_to_stat_flags(requestPTR + 2) : 0; - -// FIXME: edg_wll_UserJobs should take flags as parameter - switch (edg_wll_UserJobsServer(ctx,&jobsOut,NULL)) { - case 0: if (text) - edg_wll_UserInfoToText(ctx, jobsOut, &message); - else if (html) - edg_wll_UserInfoToHTML(ctx, jobsOut, &message); - else ret = HTTP_OK; - break; - case ENOENT: ret = HTTP_NOTFOUND; break; - case EPERM: ret = HTTP_UNAUTH; break; - case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAVAIL; break; - default: ret = HTTP_INTERNAL; break; - } - if (!html && (ret != HTTP_INTERNAL)) - if (edg_wll_UserJobsToXML(ctx, jobsOut, &message)) - ret = HTTP_INTERNAL; - - if (jobsOut) { - for (i=0; jobsOut[i]; i++) edg_wlc_JobIdFree(jobsOut[i]); - free(jobsOut); - } - } - - /* GET /[jobId]: Job Status */ - else if (*requestPTR=='/' - && strncmp(requestPTR, "/RSS", strlen("/RSS")) - && strncmp(requestPTR, "/NOTIF", strlen("/NOTIF")) - && *(requestPTR+strlen("/NOTIF")-1) != ':' - && !isspace(*(requestPTR+strlen("/NOTIF")-1))) { - edg_wlc_JobId jobId = NULL; - char *pom1,*fullid = NULL; - edg_wll_JobStat stat; - char *pomCopy; - - if (ctx->srvName == NULL) { - edg_wll_SetError(ctx, EDG_WLL_ERROR_SERVER_RESPONSE, - "no server name on GET /jobid"); - ret = HTTP_INTERNAL; - goto err; - } - memset(&stat,0,sizeof(stat)); - pomCopy = strdup(requestPTR + 1); - for (pom1=pomCopy; *pom1 && !isspace(*pom1); pom1++); - *pom1 = 0; - - asprintf(&fullid,GLITE_JOBID_PROTO_PREFIX"%s:%u/%s",ctx->srvName,ctx->srvPort,pomCopy); - free(pomCopy); - - if (edg_wlc_JobIdParse(fullid, &jobId)) { - edg_wll_SetError(ctx,EDG_WLL_ERROR_JOBID_FORMAT,fullid); - ret = HTTP_BADREQ; - } - else switch (edg_wll_JobStatusServer(ctx,jobId,EDG_WLL_STAT_CLASSADS,&stat)) { - case 0: if (text) - edg_wll_JobStatusToText(ctx,stat,&message); - else if (html) - switch(stat.jobtype){ - case EDG_WLL_STAT_CREAM: - edg_wll_CreamJobStatusToHTML(ctx,stat,&message); - break; - case EDG_WLL_STAT_FILE_TRANSFER: - edg_wll_FileTransferStatusToHTML(ctx,stat,&message); - break; - default: - //XXX need some more implementations - edg_wll_GeneralJobStatusToHTML(ctx,stat,&message); - break; - } - - else ret = HTTP_OK; - break; - case ENOENT: ret = HTTP_NOTFOUND; break; - case EINVAL: ret = HTTP_INVALID; break; - case EPERM : ret = HTTP_UNAUTH; break; - default: ret = HTTP_INTERNAL; break; - } - if (!html && (ret != HTTP_INTERNAL)) - if (edg_wll_JobStatusToXML(ctx,stat,&message)) - ret = HTTP_INTERNAL; - - free(fullid); - edg_wlc_JobIdFree(jobId); - edg_wll_FreeStatus(&stat); - /*GET /NOTIF: All user's notifications*/ - } else if (strncmp(requestPTR, "/NOTIF", strlen("/NOTIF")) == 0 && (isspace(*(requestPTR+strlen("/NOTIF"))) - || isspace(*(requestPTR+strlen("/NOTIF:"))))){ - char **notifids = NULL; - char *can_peername = edg_wll_gss_normalize_subj(ctx->peerName, 0); - char *userid = strmd5(can_peername, NULL); - getUserNotifications(ctx, userid, ¬ifids); - free(can_peername); - if (text) - edg_wll_UserNotifsToText(ctx, notifids, &message); - else if (html) - edg_wll_UserNotifsToHTML(ctx, notifids, &message); - else ret = HTTP_OK; - - /*GET /NOTIF:[notifId]: Notification info*/ - } else if (strncmp(requestPTR, "/NOTIF:", strlen("/NOTIF:")) == 0){ - notifInfo ni; - char *pomCopy, *pom; - pomCopy = strdup(requestPTR + 1); - for (pom=pomCopy; *pom && !isspace(*pom); pom++); - *pom = 0; - if (getNotifInfo(ctx, strrchr(pomCopy, ':')+1, &ni)){ - ret = HTTP_NOTFOUND; - goto err; - } - free(pomCopy); - - if (text) - edg_wll_NotificationToText(ctx, &ni, &message); - else - edg_wll_NotificationToHTML(ctx, &ni, &message); - - freeNotifInfo(&ni); - - /*GET /RSS:[feed type] RSS feed */ - } else if (strncmp(requestPTR, "/RSS:", strlen("/RSS:")) == 0){ - edg_wll_JobStat *states; - char *feedType; - int i; - int idx; - - feedType = requestPTR + strlen("/RSS:"); - if (getJobsRSS(ctx, feedType, &states) < 0){ - ret = HTTP_INTERNAL; - goto err; - } - - // check if owner and lastupdatetime is indexed - idx = 0; - for (i = 0; ctx->job_index[i]; i++) - if (ctx->job_index[i]->attr == EDG_WLL_QUERY_ATTR_OWNER) - idx++; - else if (ctx->job_index[i]->attr == EDG_WLL_QUERY_ATTR_LASTUPDATETIME) - idx++; - if (idx < 2){ - ret = HTTP_NOTFOUND; - edg_wll_SetError(ctx, ENOENT, "current index configuration does not support RSS feeds"); - } - edg_wll_RSSFeed(ctx, states, requestPTR, &message); - - /* GET [something else]: not understood */ - } else ret = HTTP_BADREQ; - free(requestPTR); requestPTR = NULL; - -/* POST */ - } else if (!strncmp(request,METHOD_POST,sizeof(METHOD_POST)-1)) { - - requestPTR = strdup(request + sizeof(METHOD_POST)-1); - if (html) text = drain_text_request(requestPTR); - - if (!strncmp(requestPTR,KEY_QUERY_EVENTS,sizeof(KEY_QUERY_EVENTS)-1)) { - edg_wll_Event *eventsOut = NULL; - edg_wll_QueryRec **job_conditions = NULL, **event_conditions = NULL; - int i,j; - - if (parseQueryEventsRequest(ctx, messageBody, &job_conditions, &event_conditions)) - ret = HTTP_BADREQ; - - else { - int fatal = 0; - - switch (edg_wll_QueryEventsServer(ctx,ctx->noAuth, - (const edg_wll_QueryRec **)job_conditions, - (const edg_wll_QueryRec **)event_conditions, &eventsOut)) { - - case 0: if (html) ret = HTTP_NOTIMPL; - else ret = HTTP_OK; - break; - case ENOENT: ret = HTTP_NOTFOUND; break; - case EPERM : ret = HTTP_UNAUTH; break; - case E2BIG: ret = HTTP_UNAUTH; break; - case EINVAL: ret = HTTP_UNAUTH; break; - case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break; - case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break; - default: ret = HTTP_INTERNAL; break; - } - /* glue errors (if eny) to XML responce */ - if (!html && !fatal) - if (edg_wll_QueryEventsToXML(ctx, eventsOut, &message)) - ret = HTTP_INTERNAL; - } - - if (job_conditions) { - for (j = 0; job_conditions[j]; j++) { - for (i = 0 ; (job_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&job_conditions[j][i]); - free(job_conditions[j]); - } - free(job_conditions); - } - - if (event_conditions) { - for (j = 0; event_conditions[j]; j++) { - for (i = 0 ; (event_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&event_conditions[j][i]); - free(event_conditions[j]); - } - free(event_conditions); - } - - if (eventsOut != NULL) { - for (i=0; eventsOut[i].type != EDG_WLL_EVENT_UNDEF; i++) - edg_wll_FreeEvent(&(eventsOut[i])); - edg_wll_FreeEvent(&(eventsOut[i])); /* free last line */ - free(eventsOut); - } - } - else if (!strncmp(requestPTR,KEY_QUERY_JOBS,sizeof(KEY_QUERY_JOBS)-1)) { - edg_wlc_JobId *jobsOut = NULL; - edg_wll_JobStat *statesOut = NULL; - edg_wll_QueryRec **conditions = NULL; - int i,j, flags = 0; - - if (parseQueryJobsRequest(ctx, messageBody, &conditions, &flags)) - ret = HTTP_BADREQ; - - else { - int fatal = 0, - retCode; - - if (flags & EDG_WLL_STAT_NO_JOBS) { - flags -= EDG_WLL_STAT_NO_JOBS; - jobsOut = NULL; - if (flags & EDG_WLL_STAT_NO_STATES) { - flags -= EDG_WLL_STAT_NO_STATES; - statesOut = NULL; - retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, NULL, NULL); - } - else - retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, NULL, &statesOut); - } - else { - if (flags & EDG_WLL_STAT_NO_STATES) { - flags -= EDG_WLL_STAT_NO_STATES; - statesOut = NULL; - retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, &jobsOut, NULL); - } - else - retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, &jobsOut, &statesOut); - } - - switch ( retCode ) { - case 0: if (html) ret = HTTP_NOTIMPL; - else ret = HTTP_OK; - - break; - case ENOENT: ret = HTTP_NOTFOUND; break; - case EPERM: ret = HTTP_UNAUTH; break; - case E2BIG: ret = HTTP_UNAUTH; break; - case EINVAL: ret = HTTP_UNAUTH; break; - case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break; - case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break; - default: ret = HTTP_INTERNAL; break; - } - if (!html && !fatal) - if (edg_wll_QueryJobsToXML(ctx, jobsOut, statesOut, &message)) - ret = HTTP_INTERNAL; - } - - if (conditions) { - for (j = 0; conditions[j]; j++) { - for (i = 0; (conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&conditions[j][i]); - free(conditions[j]); - } - free(conditions); - } - - if (jobsOut) { - for (i=0; jobsOut[i]; i++) edg_wlc_JobIdFree(jobsOut[i]); - free(jobsOut); - } - if (statesOut) { - for (i=0; statesOut[i].state != EDG_WLL_JOB_UNDEF; i++) - edg_wll_FreeStatus(&(statesOut[i])); - edg_wll_FreeStatus(&(statesOut[i])); /* free last line */ - free(statesOut); - } - } - else if (!strncmp(requestPTR,KEY_PURGE_REQUEST,sizeof(KEY_PURGE_REQUEST)-1)) { - edg_wll_PurgeRequest request; - edg_wll_PurgeResult result; - struct sigaction sa; - sigset_t sset; - int fatal = 0, retval; - - ctx->p_tmp_timeout.tv_sec = 86400; - - memset(&request,0,sizeof(request)); - memset(&result,0,sizeof(result)); - - if ( !parsePurgeRequest(ctx,messageBody,(int (*)()) edg_wll_StringToStat,&request) ) { - /* do throttled purge on background if requested */ - if ((request.flags & EDG_WLL_PURGE_BACKGROUND)) { - retval = fork(); - - switch (retval) { - case 0: /* forked cleaner */ - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = hup_handler; - sigaction(SIGTERM, &sa, NULL); - sigaction(SIGINT, &sa, NULL); - - sigemptyset(&sset); - sigaddset(&sset, SIGTERM); - sigaddset(&sset, SIGINT); - sigprocmask(SIG_UNBLOCK, &sset, NULL); - sigemptyset(&sset); - sigaddset(&sset, SIGCHLD); - sigprocmask(SIG_BLOCK, &sset, NULL); - break; - case -1: /* err */ - ret = HTTP_INTERNAL; - edg_wll_SetError(ctx, errno, "can't fork purge process"); - goto err; - default: /* client request handler */ - ret = HTTP_ACCEPTED; - /* to end this parent */ - edg_wll_SetError(ctx, EDG_WLL_ERROR_SERVER_RESPONSE, edg_wll_HTTPErrorMessage(ret)); - goto err; - } - } - - switch ( edg_wll_PurgeServer(ctx, (const edg_wll_PurgeRequest *)&request, &result)) { - case 0: if (html) ret = HTTP_NOTIMPL; - else ret = HTTP_OK; - - break; - case ENOENT: ret = HTTP_NOTFOUND; break; - case EPERM: ret = HTTP_UNAUTH; break; - case EINVAL: ret = HTTP_INVALID; break; - case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break; - default: ret = HTTP_INTERNAL; break; - } - if (!html && !fatal) { - if (edg_wll_PurgeResultToXML(ctx, &result, &message)) - ret = HTTP_INTERNAL; - else - printf("%s", message); - } - - /* result is now packed in message, free it */ - if ( result.server_file ) - free(result.server_file); - if ( result.jobs ) - { - for ( i = 0; result.jobs[i]; i++ ) - free(result.jobs[i]); - free(result.jobs); - } - - /* forked cleaner sends no results */ - if ((request.flags & EDG_WLL_PURGE_BACKGROUND)) { - *response = NULL; - free(message); - message = NULL; - if (requestPTR) free(requestPTR); - exit(0); - } - - } - - if ( request.jobs ) - { - int i; - for ( i = 0; request.jobs[i]; i++ ) - free(request.jobs[i]); - free(request.jobs); - } - - } - else if (!strncmp(requestPTR,KEY_DUMP_REQUEST,sizeof(KEY_DUMP_REQUEST)-1)) { - edg_wll_DumpRequest request; - edg_wll_DumpResult result; - - ctx->p_tmp_timeout.tv_sec = 86400; - - memset(&request,0,sizeof(request)); - memset(&result,0,sizeof(result)); - - if (parseDumpRequest(ctx, messageBody, &request)) - ret = HTTP_BADREQ; - else { - int fatal = 0; - - switch (edg_wll_DumpEventsServer(ctx,(const edg_wll_DumpRequest *) &request, &result)) { - case 0: if (html) ret = HTTP_NOTIMPL; - else ret = HTTP_OK; - break; - case ENOENT: ret = HTTP_NOTFOUND; break; - case EPERM : ret = HTTP_UNAUTH; break; - case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break; - case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break; - default: ret = HTTP_INTERNAL; break; - } - /* glue errors (if eny) to XML responce */ - if (!html && !fatal) - if (edg_wll_DumpResultToXML(ctx, &result, &message)) - ret = HTTP_INTERNAL; - } - - free(result.server_file); - } - else if (!strncmp(requestPTR,KEY_LOAD_REQUEST,sizeof(KEY_LOAD_REQUEST)-1)) { - edg_wll_LoadRequest request; - edg_wll_LoadResult result; - - ctx->p_tmp_timeout.tv_sec = 86400; - - memset(&request,0,sizeof(request)); - memset(&result,0,sizeof(result)); - - if (parseLoadRequest(ctx, messageBody, &request)) - ret = HTTP_BADREQ; - else { - int fatal = 0; - - switch (edg_wll_LoadEventsServer(ctx,(const edg_wll_LoadRequest *) &request, &result)) { - case 0: if (html) ret = HTTP_NOTIMPL; - else ret = HTTP_OK; - break; - case EEXIST: ret = HTTP_OK; break; - case EINVAL: ret = HTTP_INVALID; break; - case ENOENT: ret = HTTP_NOTFOUND; break; - case EPERM : ret = HTTP_UNAUTH; break; - case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break; - case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break; - default: ret = HTTP_INTERNAL; break; - } - /* glue errors (if eny) to XML responce */ - if (!html && !fatal) - if (edg_wll_LoadResultToXML(ctx, &result, &message)) - ret = HTTP_INTERNAL; - } - - free(result.server_file); - } - else if (!strncmp(requestPTR,KEY_INDEXED_ATTRS,sizeof(KEY_INDEXED_ATTRS)-1)) { - if (!html) - if (edg_wll_IndexedAttrsToXML(ctx, &message)) - ret = HTTP_INTERNAL; - } - else if (!strncmp(requestPTR,KEY_NOTIF_REQUEST,sizeof(KEY_NOTIF_REQUEST)-1)) { - char *function, *address; - edg_wll_NotifId notifId; - edg_wll_NotifChangeOp op; - edg_wll_QueryRec **conditions; - int flags; - time_t validity = -1; - int i,j; - - - if (parseNotifRequest(ctx, messageBody, &function, ¬ifId, - &address, &op, &validity, &conditions, &flags)) - ret = HTTP_BADREQ; - else { - int fatal = 0, err = 0; - - // XXX presne poradi parametru zatim neni znamo - // navratove chyby nejsou zname, nutno predelat dle aktualni situace - if (!strcmp(function,"New")) - err = edg_wll_NotifNewServer(ctx, - (edg_wll_QueryRec const * const *)conditions, flags, - address, notifId, &validity); - else if (!strcmp(function,"Bind")) - err = edg_wll_NotifBindServer(ctx, notifId, address, &validity); - else if (!strcmp(function,"Change")) - err = edg_wll_NotifChangeServer(ctx, notifId, - (edg_wll_QueryRec const * const *)conditions, op); - else if (!strcmp(function,"Refresh")) - err = edg_wll_NotifRefreshServer(ctx, notifId, &validity); - else if (!strcmp(function,"Drop")) - err = edg_wll_NotifDropServer(ctx, notifId); - - switch (err) { - case 0: if (html) ret = HTTP_NOTIMPL; - else ret = HTTP_OK; - break; - case EEXIST: ret = HTTP_OK; break; - case EINVAL: ret = HTTP_INVALID; break; - case ENOENT: ret = HTTP_NOTFOUND; break; - case EPERM : ret = HTTP_UNAUTH; break; - case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break; - case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break; - default: ret = HTTP_UNAVAIL; break; - } - /* glue errors (if eny) to XML responce */ - if (!html && !fatal) - if (edg_wll_NotifResultToXML(ctx, validity, &message)) - ret = HTTP_INTERNAL; - } - - free(function); - free(address); - edg_wll_NotifIdFree(notifId); - if (conditions) { - for (j = 0; conditions[j]; j++) { - for (i = 0; (conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&conditions[j][i]); - free(conditions[j]); - } - free(conditions); - } - } - else if (!strncmp(requestPTR,KEY_QUERY_SEQUENCE_CODE,sizeof(KEY_QUERY_SEQUENCE_CODE)-1)) { - char *source = NULL; - char *seqCode = NULL; - edg_wlc_JobId jobId = NULL; - - - if (parseQuerySequenceCodeRequest(ctx, messageBody, &jobId, &source)) - ret = HTTP_BADREQ; - else { - int fatal = 0; - - switch (edg_wll_QuerySequenceCodeServer(ctx, jobId, source, &seqCode)) { - case 0: if (html) ret = HTTP_NOTIMPL; - else ret = HTTP_OK; - break; - case EEXIST: ret = HTTP_OK; break; - case EINVAL: ret = HTTP_INVALID; break; - case ENOENT: ret = HTTP_NOTFOUND; break; - case EPERM : ret = HTTP_UNAUTH; break; - case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break; - case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break; - default: ret = HTTP_INTERNAL; break; - } - - /* glue errors (if eny) to XML responce */ - if (!html && !fatal) - if (edg_wll_QuerySequenceCodeResultToXML(ctx, seqCode, &message)) - ret = HTTP_INTERNAL; - } - - if ( source ) free(source); - if ( seqCode ) free(seqCode); - edg_wlc_JobIdFree(jobId); - } - else if (!strncmp(requestPTR,KEY_STATS_REQUEST,sizeof(KEY_STATS_REQUEST)-1)) { - char *function; - edg_wll_QueryRec **conditions; - edg_wll_JobStatCode major = EDG_WLL_JOB_UNDEF; - time_t from, to; - int i, j, minor, res_from, res_to; - float rate = 0, duration = 0; - - - - if (parseStatsRequest(ctx, messageBody, &function, &conditions, - &major, &minor, &from, &to)) - ret = HTTP_BADREQ; - else { - int fatal = 0, err = 0; - - // XXX presne poradi parametru zatim neni znamo - // navratove chyby nejsou zname, nutno predelat dle aktualni situace - if (!strcmp(function,"Rate")) - err = edg_wll_StateRateServer(ctx, - conditions[0], major, minor, - &from, &to, &rate, &res_from, &res_to); - else if (!strcmp(function,"Duration")) - err = edg_wll_StateDurationServer(ctx, - conditions[0], major, minor, - &from, &to, &duration, &res_from, &res_to); - - switch (err) { - case 0: if (html) ret = HTTP_NOTIMPL; - else ret = HTTP_OK; - break; - case ENOSYS: ret = HTTP_NOTIMPL; break; - case EEXIST: ret = HTTP_OK; break; - case EINVAL: ret = HTTP_INVALID; break; - case ENOENT: ret = HTTP_NOTFOUND; break; - case EPERM : ret = HTTP_UNAUTH; break; - case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break; - case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break; - default: ret = HTTP_INTERNAL; break; - } - /* glue errors (if eny) to XML responce */ - if (!html && !fatal) - if (edg_wll_StatsResultToXML(ctx, from, to, rate, - duration, res_from, res_to, &message)) - ret = HTTP_INTERNAL; - } - - free(function); - if (conditions) { - for (j = 0; conditions[j]; j++) { - for (i = 0; (conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&conditions[j][i]); - free(conditions[j]); - } - free(conditions); - } - } - - - /* POST [something else]: not understood */ - else ret = HTTP_BADREQ; - - free(requestPTR); requestPTR = NULL; - -/* other HTTP methods */ - } else ret = HTTP_NOTALLOWED; - -err: asprintf(response,"HTTP/1.1 %d %s",ret,edg_wll_HTTPErrorMessage(ret)); - *headersOut = (char **) (html ? response_headers_html : response_headers_dglb); - if ((ret != HTTP_OK && ret != HTTP_ACCEPTED) && text) - *bodyOut = edg_wll_ErrorToText(ctx,ret); - else if ((ret != HTTP_OK && ret != HTTP_ACCEPTED) && html) - *bodyOut = edg_wll_ErrorToHTML(ctx,ret); - else - *bodyOut = message; - - if (requestPTR) free(requestPTR); - - *httpErr = ret; - - return edg_wll_Error(ctx,NULL,NULL); -} - diff --git a/org.glite.lb.server/src/lb_proto.h b/org.glite.lb.server/src/lb_proto.h deleted file mode 100644 index a89417f..0000000 --- a/org.glite.lb.server/src/lb_proto.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef GLITE_LB_PROTO_H -#define GLITE_LB_PROTO_H - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include "glite/lb/context.h" -#include "glite/lb/query_rec.h" - -/* Handle a single request of the LB server protocol - * returns a complete response string (may contain a formatted error - * message) - * or NULL on fatal error*/ - -extern edg_wll_ErrorCode edg_wll_Proto( - edg_wll_Context, /* INOUT: context */ - char *, /* IN: HTTP request line */ - char **, /* IN: HTTP message headers */ - char *, /* IN: HTTP message body */ - char **, /* OUT: HTTP response line */ - char ***, /* OUT: HTTP response headers */ - char **, /* OUT: HTTP response body */ - int * /* OUT: HTTP error code */ -); - -typedef struct _notifInfo{ - char *notifid; - char *destination; - char *valid; - edg_wll_QueryRec **conditions; - char *conditions_text; - int flags; -} notifInfo; - -extern char *edg_wll_HTTPErrorMessage(int); - -extern int edg_wll_UserJobsServer(edg_wll_Context ctx, edg_wlc_JobId **jobs, edg_wll_JobStat **states); - -extern int edg_wll_QuerySequenceCodeServer(edg_wll_Context ctx, edg_wlc_JobId jobid, const char *source, char **seqcode); - -#endif /* GLITE_LB_PROTO_H */ diff --git a/org.glite.lb.server/src/lb_rss.c b/org.glite.lb.server/src/lb_rss.c deleted file mode 100644 index 8b488e1..0000000 --- a/org.glite.lb.server/src/lb_rss.c +++ /dev/null @@ -1,95 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#ident "$Header:" - -#include "lb_rss.h" -#include "lb_proto.h" - -#include "glite/lb/context-int.h" - -#include -#include -#include -#include -#include -#include - -#ifdef __GNUC__ -#define UNUSED_VAR __attribute__((unused)) -#else -#define UNUSED_VAR -#endif - -#define TR(type, field) \ - if (field){ \ - int l = asprintf(&pomA, type, (field)); \ - pomB = realloc(pomB, sizeof(*pomB)*(pomL+l+1)); \ - strcpy(pomB+pomL, pomA); \ - pomL += l; \ - free(pomA); pomA = NULL; \ - } - -#define TRC(str) \ - { \ - int l = asprintf(&pomA, str); \ - pomB = realloc(pomB, sizeof(*pomB)*(pomL+l+1)); \ - strcpy(pomB+pomL, pomA); \ - pomL += l; \ - free(pomA); pomA = NULL; \ - } - - -int edg_wll_RSSFeed(edg_wll_Context ctx UNUSED_VAR, edg_wll_JobStat *states, char *request, char **message){ - char *pomA = NULL, *pomB = NULL; - int pomL = 0; - int i; - char *chid, *chstat, *rss_link, *tmp; - time_t time; - - TRC("\n\n\n"); - TRC("LB feed\n"); - asprintf(&rss_link, "https://%s:%i%s", ctx->srvName, ctx->srvPort, request); - for (tmp = rss_link; *tmp && !isspace(*tmp); tmp++); - *tmp = 0; - TR("%s\n", rss_link); - TRC("List of jobs."); - if (states) for (i = 0; states[i].state != EDG_WLL_JOB_UNDEF; i++){ - TRC("\n"); - TR("%s\n", (chid = edg_wlc_JobIdUnparse(states[i].jobId))); - TR("%s\n", chid); - TR("%s\n", chid); - // strip description to allow new lines - TR("Status: %s\n", (chstat = edg_wll_StatToString(states[i].state))); - TRC("]]>\n"); - time = states[i].stateEnterTime.tv_sec; - TR("State entered: %s\n", ctime(&time)); - TRC("]]>\n"); - TR("Destination: %s\n", states[i].destination); - TRC("\n"); - - - free(chid); - free(chstat); - } - TRC("\n"); - - *message = pomB; - - return 0; -} - diff --git a/org.glite.lb.server/src/lb_rss.h b/org.glite.lb.server/src/lb_rss.h deleted file mode 100644 index 581da33..0000000 --- a/org.glite.lb.server/src/lb_rss.h +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#ifndef GLITE_LB_RSS_H -#define GLITE_LB_RSS_H - -#include "glite/lb/context-int.h" -#include "glite/lb/jobstat.h" - -int edg_wll_RSSFeed(edg_wll_Context ctx, edg_wll_JobStat *states, char *request, char **message); - -#endif /* GLITE_LB_RSS_H */ diff --git a/org.glite.lb.server/src/lb_text.c b/org.glite.lb.server/src/lb_text.c deleted file mode 100644 index 3072179..0000000 --- a/org.glite.lb.server/src/lb_text.c +++ /dev/null @@ -1,260 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include "lb_text.h" -#include "lb_proto.h" -#include "cond_dump.h" - -#include "glite/lb/context-int.h" -#include "glite/lb/xml_conversions.h" -#include "glite/lbu/trio.h" -#include "glite/lbu/db.h" - -#include -#include -#include -#include - -#ifdef __GNUC__ -#define UNUSED_VAR __attribute__((unused)) -#else -#define UNUSED_VAR -#endif - -static char *escape_text(char *text){ - int len = strlen(text); - char *ret = malloc((len+1)*sizeof(char)); - int reti = 0; - int retlen = len; - int i; - for (i = 0; i < len; i++){ - // escape '\' - if (text[i] == '\\'){ - ret[reti] = '\\'; - reti++; - retlen++; - ret = realloc(ret, (retlen+1)*sizeof(char)); - } - // replace newline by '\\n' - if (text[i] == '\n'){ - ret[reti] = '\\'; - reti++; - ret[reti] = 'n'; - retlen++; - ret = realloc(ret, (retlen+1)*sizeof(char)); - } - else - ret[reti] = text[i]; - reti++; - } - ret[reti] = 0; - return ret; -} - -int edg_wll_QueryToText(edg_wll_Context ctx UNUSED_VAR, edg_wll_Event *eventsOut UNUSED_VAR, char **message UNUSED_VAR) -{ -/* not implemented yet */ - return -1; -} - -#define TR(name,type,field) \ -{ \ - int l; \ - if (field) \ - l = asprintf(&a,"%s=" type "\n", \ - name, field); \ - else \ - l = asprintf(&a,"%s=\n", name); \ - b = realloc(b, sizeof(*b)*(pomL+l+1)); \ - strcpy(b+pomL, a); \ - pomL += l; \ - free(a); a=NULL; \ -} - -int edg_wll_UserInfoToText(edg_wll_Context ctx, edg_wlc_JobId *jobsOut, char **message) -{ - char *a = NULL, *b; - int i = 0; - b = strdup(""); - - while (jobsOut[i]){ - char *chid = edg_wlc_JobIdUnparse(jobsOut[i]); - - if (i == 0) - asprintf(&a, "%s%s", b, chid); - else - asprintf(&a, "%s,%s", b, chid); - - free(chid); - free(b); - b = a; - i++; - } - - if (a){ - asprintf(&a, "User_jobs=%s\n", b); - free(b); - b = a; - } - b = a; - - asprintf(&a, "%sUser_subject=%s\n", b, ctx->peerName ? ctx->peerName: ""); - - *message = a; - - return 0; -} - -int edg_wll_UserNotifsToText(edg_wll_Context ctx, char **notifids, char **message){ - char *a = NULL, *b; - int i = 0; - b = strdup(""); - - while(notifids[i]){ - if (i == 0) - asprintf(&a, "%s", notifids[i]); - else - asprintf(&a, "%s,%s", b, notifids[i]); - free(b); - b = a; - i++; - } - if (b) - asprintf(&a, "User_notifications=%s\n", b); - - *message = a; - - return 0; -} - -int edg_wll_NotificationToText(edg_wll_Context ctx UNUSED_VAR, notifInfo *ni, char **message){ - char *a = NULL, *b = NULL, *cond, *flags; - int pomL = 0; - - TR("Notif_id", "%s", ni->notifid); - TR("Destination", "%s", ni->destination); - TR("Valid_until", "%s", ni->valid); - flags = edg_wll_stat_flags_to_string(ni->flags); - TR("Flags", "%s", flags); - free(flags); - if (! edg_wll_Condition_Dump(ni, &cond, 1)){ - TR("Conditions", "%s", cond); - } - free(cond); - - *message = b; - - return 0; -} - -/* construct Message-Body of Response-Line for edg_wll_JobStatus */ -int edg_wll_JobStatusToText(edg_wll_Context ctx UNUSED_VAR, edg_wll_JobStat stat, char **message) -{ - char *a = NULL, *b = NULL; - char *chid,*chstat; - char *jdl,*rsl; - - jdl = strdup(""); - rsl = strdup(""); - - int pomL = 0; - - chid = edg_wlc_JobIdUnparse(stat.jobId); - - TR("Status","%s",(chstat = edg_wll_StatToString(stat.state))); - free(chstat); - TR("owner","%s",stat.owner); - TR("condorId","%s",stat.condorId); - TR("globusId","%s",stat.globusId); - TR("localId","%s",stat.localId); - TR("reason","%s",stat.reason); - if ( (stat.stateEnterTime.tv_sec) || (stat.stateEnterTime.tv_usec) ) { - time_t time = stat.stateEnterTime.tv_sec; - //TR("State_entered","%s",ctime(&time)); - asprintf(&a, "%sstateEnterTime=%s", b, ctime(&time)); - free(b); b = a; - } - else{ - asprintf(&a, "%sstateEnterTime=", b); - free(b); b = a; - } - if ( (stat.lastUpdateTime.tv_sec) || (stat.lastUpdateTime.tv_usec) ) { - time_t time = stat.lastUpdateTime.tv_sec; - //TR("Last_update","%s",ctime(&time)); - asprintf(&a, "%slastUpdateTime=%s", b, ctime(&time)); - free(b); b = a; - } - else{ - asprintf(&a, "%slastUpdateTime=", b); - free(b); b = a; - } - TR("expectUpdate","%s",stat.expectUpdate ? "YES" : "NO"); - TR("expectFrom","%s",stat.expectFrom); - TR("location","%s",stat.location); - TR("destination","%s",stat.destination); - TR("cancelling","%s",stat.cancelling>0 ? "YES" : "NO"); - TR("cancelReason","%s",stat.cancelReason); - TR("cpuTime","%d",stat.cpuTime); - - TR("done_code","%d",stat.done_code); - TR("exit_code","%d",stat.exit_code); - - if (stat.jdl){ - char* my_jdl = escape_text(stat.jdl); - asprintf(&jdl,"jdl=%s\n", my_jdl); - free(my_jdl); - } - else - asprintf(&jdl,"jdl=\n"); - if (stat.rsl) - asprintf(&rsl,"rsl=%s\n", stat.rsl); - else - asprintf(&rsl,"rsl=\n"); - - asprintf(&a, "Job=%s\n" - "%s" - "%s" - "%s", - chid,b,jdl,rsl); - free(b); - - *message = a; - - free(chid); - free(jdl); - free(rsl); - return 0; -} - -char *edg_wll_ErrorToText(edg_wll_Context ctx,int code) -{ - char *out,*et,*ed; - char *msg = edg_wll_HTTPErrorMessage(code); - edg_wll_ErrorCode e; - - e = edg_wll_Error(ctx,&et,&ed); - asprintf(&out,"Error=%s\n" - "Code=%d\n" - "Description=%s (%s)\n" - ,msg,e,et,ed); - - free(et); free(ed); - return out; -} - diff --git a/org.glite.lb.server/src/lb_text.h b/org.glite.lb.server/src/lb_text.h deleted file mode 100644 index 008e7e9..0000000 --- a/org.glite.lb.server/src/lb_text.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#ifndef GLITE_LB_TEXT_H -#define GLITE_LB_TEXT_H - -#include "glite/lb/context.h" -#include "glite/lb/events.h" -#include "glite/lb/jobstat.h" -#include "lb_proto.h" - -int edg_wll_QueryToText(edg_wll_Context,edg_wll_Event *,char **); -int edg_wll_JobStatusToText(edg_wll_Context, edg_wll_JobStat, char **); -int edg_wll_UserInfoToText(edg_wll_Context, edg_wlc_JobId *, char **); -int edg_wll_UserNotifsToText(edg_wll_Context ctx, char **notifids, char **message); -int edg_wll_NotificationToText(edg_wll_Context ctx, notifInfo *ni, char **message); -char *edg_wll_ErrorToText(edg_wll_Context,int); - -#endif /* GLITE_LB_TEXT */ diff --git a/org.glite.lb.server/src/lb_xml_parse.c.T b/org.glite.lb.server/src/lb_xml_parse.c.T deleted file mode 100644 index 73f274d..0000000 --- a/org.glite.lb.server/src/lb_xml_parse.c.T +++ /dev/null @@ -1,2097 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#include "glite/lbu/trio.h" -#include "glite/lbu/escape.h" - -#include "glite/lb/context-int.h" -#include "glite/lb/xml_conversions.h" - -#include "lb_xml_parse.h" - -#ifdef __GNUC__ -#define UNUSED_VAR __attribute__((unused)) -#else -#define UNUSED_VAR -#endif - -#define QUERY_EVENTS_BEGIN "\r\n" -#define QUERY_JOBS_BEGIN "\r\n" -#define PURGE_RESULT_BEGIN "\r\n" -#define DUMP_RESULT_BEGIN "\r\n" -#define LOAD_RESULT_BEGIN "\r\n" -#define INDEXED_ATTRS_BEGIN "\r\n" -#define NOTIF_RESULT_BEGIN "\r\n" -#define QUERY_SEQUENCE_CODE_RESULT_BEGIN "\r\n" - -#define STATS_RESULT_BEGIN "\r\n" - - -// XXX will be redundant soon -#define USERJOBS_BEGIN "\r\n" - - -static char *ops[] = { "equal","less","greater","within","unequal","changed" }, - *attrs[] = { "jobid","owner","status","location","destination", - "donecode","usertag","time","level","host","source", - "instance","type","chkpt_tag", "resubmitted", "parent_job", - "exitcode", "jdl", "stateentertime", "lastupdatetime", - "networkserver" }; - -static const struct timeval null_timeval = {0,0}; - -#define unexp() {\ - char *e;\ -\ - if (XMLCtx->errtxt) {\ - asprintf(&e,"%s\nunexpected <%s> at line %d",XMLCtx->errtxt,\ - el,XML_GetCurrentLineNumber(XMLCtx->p));\ - free(XMLCtx->errtxt);\ - } else asprintf(&e,"unexpected <%s> at line %d",\ - el,XML_GetCurrentLineNumber(XMLCtx->p));\ - XMLCtx->errtxt = e;\ -} - - - -static void startJobQueryRec(void *data, const char *el, const char **attr) -{ - unsigned int i; - edg_wll_XML_ctx *XMLCtx = data; - - - strcpy(XMLCtx->element, el); - - switch (XMLCtx->level) { - case 0: if (strcasecmp(el,"and")) unexp() - break; - case 1: if (strcasecmp(el,"orJobConditions")) unexp() - else { - XMLCtx->position = -1; - XMLCtx->job_conditions = realloc(XMLCtx->job_conditions, - (++XMLCtx->row+2)*sizeof(*XMLCtx->job_conditions)); - XMLCtx->job_conditions[XMLCtx->row] = NULL; - XMLCtx->job_conditions[XMLCtx->row+1] = NULL; - } - break; - case 2: - for (i=0; ijob_conditions) break; - - /* malloc also terminator and set it to 0 (= EDG_WLL_QUERY_ATTR_UNDEF) */ - XMLCtx->job_conditions[XMLCtx->row] = realloc(XMLCtx->job_conditions[XMLCtx->row], - (++XMLCtx->position+2)*sizeof(**XMLCtx->job_conditions)); - memset(&XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position],0,2*sizeof(**XMLCtx->job_conditions)); - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].op = i; - XMLCtx->bound = 0; - } - break; - case 3: for (i=0; ijob_conditions) break; - if (!XMLCtx->job_conditions[XMLCtx->row]) break; - - if ( (i+1) == EDG_WLL_QUERY_ATTR_USERTAG) { - if (!attr[0] || !attr[1]) { unexp() break;} - if (strcmp(attr[0],"name")) { unexp() break;} - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.tag = strdup(attr[1]); - } - else if ( (i+1) == EDG_WLL_QUERY_ATTR_TIME ) { - if (!attr[0] || !attr[1]) { unexp() break;} - if (attr[0] && strcmp(attr[0],"state")) { unexp() break;} - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.state = edg_wll_StringToStat(attr[1]); - } - if ( (i+1) == EDG_WLL_QUERY_ATTR_JDL_ATTR) { - if (!attr[0] || !attr[1]) - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.tag = NULL; - else if (strcmp(attr[0],"name")) { unexp() break;} - else XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.tag = strdup(attr[1]); - } - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr = i+1; - } - break; - default: unexp(); break; - } - XMLCtx->level++; -} - - - -static void startQueryJobsRequest(void *data, const char *el, const char **attr) -{ - unsigned int i; - edg_wll_XML_ctx *XMLCtx = data; - - - strcpy(XMLCtx->element, el); - - switch (XMLCtx->level) { - case 0: if (strcasecmp(el,"edg_wll_QueryJobsRequest")) { unexp() break; } - for ( i = 0; attr[i] && attr[i+1]; i += 2 ) - { - if ( !strcmp(attr[i],"softLimit") ) - XMLCtx->ctx->softLimit = atoi(attr[i+1]); - else if ( !strcmp(attr[i],"queryRes") ) - XMLCtx->ctx->p_query_results = atoi(attr[i+1]); - else { unexp() break; } - } - break; - case 1: if (!strcasecmp(el,"and")) { - XMLCtx->jobQueryRec_begin = XML_GetCurrentByteIndex(XMLCtx->p); - break; - } - else if (!strcasecmp(el,"flags")) break; - else unexp() - break; - case 2: /* fall through */ - case 3: /* do not check xml tags, processed in startJobQueryRec */ - case 4: break; - default: unexp(); break; - } - XMLCtx->level++; -} - - -static void startQueryEventsRequest(void *data, const char *el, const char **attr UNUSED_VAR) -{ - unsigned int i; - edg_wll_XML_ctx *XMLCtx = data; - - - strcpy(XMLCtx->element, el); - - switch (XMLCtx->level) { - case 0: if (strcasecmp(el,"edg_wll_QueryEventsRequest")) { unexp() break; } - for ( i = 0; attr[i] && attr[i+1]; i += 2 ) - { - if ( !strcmp(attr[i],"softLimit") ) - XMLCtx->ctx->softLimit = atoi(attr[i+1]); - else if ( !strcmp(attr[i],"queryRes") ) - XMLCtx->ctx->p_query_results = atoi(attr[i+1]); - else { unexp() break; } - } - break; - case 1: if (strcasecmp(el,"and")) unexp() - break; - case 2: if (!strcasecmp(el,"orJobConditions")) { - XMLCtx->type = EDG_WLL_QUERY_TYPE_JOB_CONDITION; - XMLCtx->position = -1; - XMLCtx->job_conditions = realloc(XMLCtx->job_conditions, - (++XMLCtx->row+2)*sizeof(*XMLCtx->job_conditions)); - XMLCtx->job_conditions[XMLCtx->row] = NULL; - XMLCtx->job_conditions[XMLCtx->row+1] = NULL; - - } - else if (!strcasecmp(el,"orEventConditions")) { - XMLCtx->type = EDG_WLL_QUERY_TYPE_EVENT_CONDITION; - XMLCtx->position2 = -1; - XMLCtx->event_conditions = realloc(XMLCtx->event_conditions, - (++XMLCtx->row2+2)*sizeof(*XMLCtx->event_conditions)); - XMLCtx->event_conditions[XMLCtx->row2] = NULL; - XMLCtx->event_conditions[XMLCtx->row2+1] = NULL; - } - else unexp() - break; - case 3: - for (i=0; itype == EDG_WLL_QUERY_TYPE_JOB_CONDITION) { - if (!XMLCtx->job_conditions) break; - - /* malloc also terminator and set it to 0 (= EDG_WLL_QUERY_ATTR_UNDEF) */ - XMLCtx->job_conditions[XMLCtx->row] = realloc(XMLCtx->job_conditions[XMLCtx->row], - (++XMLCtx->position+2)*sizeof(**XMLCtx->job_conditions)); - memset(&XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position],0,2*sizeof(**XMLCtx->job_conditions)); - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].op = i; - XMLCtx->bound = 0; - } - else if (XMLCtx->type == EDG_WLL_QUERY_TYPE_EVENT_CONDITION) { - if (!XMLCtx->event_conditions) break; - /* malloc also terminator and set it to 0 (= EDG_WLL_QUERY_ATTR_UNDEF) */ - XMLCtx->event_conditions[XMLCtx->row2] = realloc(XMLCtx->event_conditions[XMLCtx->row2], - (++XMLCtx->position2+2)*sizeof(**XMLCtx->event_conditions)); - memset(&XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2],0,2*sizeof(**XMLCtx->event_conditions)); - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].op = i; - XMLCtx->bound = 0; - } - - break; - case 4: for (i=0; itype == EDG_WLL_QUERY_TYPE_JOB_CONDITION) { - if (!XMLCtx->job_conditions[XMLCtx->row]) break; - if ( (i+1) == EDG_WLL_QUERY_ATTR_USERTAG) { - if (!attr[0] || !attr[1]) { unexp() break;} - if (attr[0] && strcmp(attr[0],"name")) { unexp() break;} - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.tag = strdup(attr[1]); - } - else if ( (i+1) == EDG_WLL_QUERY_ATTR_TIME ) { - if (!attr[0] || !attr[1]) { unexp() break;} - if (attr[0] && strcmp(attr[0],"state")) { unexp() break;} - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.state = edg_wll_StringToStat(attr[1]); - //printf("\nchecking time attr\n%s = %s (%d)\n\n", attr[0], attr[1], edg_wll_StringToStat(attr[1])); - } - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr = i+1; - } - else if (XMLCtx->type == EDG_WLL_QUERY_TYPE_EVENT_CONDITION) { - if (!XMLCtx->event_conditions[XMLCtx->row2]) break; - if ( (i+1) == EDG_WLL_QUERY_ATTR_USERTAG) { - if (!attr[0] || !attr[1]) { unexp() break;} - if (attr[0] && strcmp(attr[0],"name")) { unexp() break;} - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position].attr_id.tag = strdup(attr[1]); - } - else if ( (i+1) == EDG_WLL_QUERY_ATTR_TIME ) { - if (!attr[0] || !attr[1]) { unexp() break;} - if (attr[0] && strcmp(attr[0],"state")) { unexp() break;} - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position].attr_id.state = edg_wll_StringToStat(attr[1]); - } - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].attr = i+1; - } - break; - default: unexp(); break; - } - XMLCtx->level++; -} - - - -static void startPurgeRequest(void *data, const char *el, const char **attr) -{ - edg_wll_XML_ctx *XMLCtx = data; - - - strcpy(XMLCtx->element, el); - - switch (XMLCtx->level) { - case 0: if (strcasecmp(el,"edg_wll_PurgeRequest")) unexp() - break; - case 1: if (strcasecmp(el,"jobs") && strcasecmp(el,"timeout") - && strcasecmp(el,"flags") && strcasecmp(el,"target_runtime")) unexp() - else - XMLCtx->position = 0; - break; - case 2: if (!strcasecmp(el,"jobId")) { - XMLCtx->purgeRequestGlobal.jobs = realloc(XMLCtx->purgeRequestGlobal.jobs, - (XMLCtx->position+2) * sizeof(XMLCtx->purgeRequestGlobal.jobs)); - - if (!XMLCtx->purgeRequestGlobal.jobs) { - edg_wll_SetError(XMLCtx->ctx, ENOMEM, NULL); - unexp() return; - } - XMLCtx->purgeRequestGlobal.jobs[XMLCtx->position+1] = NULL; - } - else if (XMLCtx->tagToIndex(el) >= 0 ) { - /* static array, no need to initialize & allocate anything */ - } - else - unexp() - break; - default: unexp() - break; - } - XMLCtx->level++; -} - - -static void startDumpRequest(void *data, const char *el, const char **attr) -{ - edg_wll_XML_ctx *XMLCtx = data; - - - strcpy(XMLCtx->element, el); - - switch (XMLCtx->level) { - case 0: if (strcasecmp(el,"edg_wll_DumpRequest")) unexp() - break; - case 1: if (strcasecmp(el,"from") && strcasecmp(el,"to")) unexp() - break; - default: unexp() - break; - } - XMLCtx->level++; -} - - - -static void startLoadRequest(void *data, const char *el, const char **attr) -{ - edg_wll_XML_ctx *XMLCtx = data; - - - strcpy(XMLCtx->element, el); - - switch (XMLCtx->level) { - case 0: if (strcasecmp(el,"edg_wll_LoadRequest")) unexp() - break; - case 1: if (strcasecmp(el,"server_file")) unexp() - break; - default: unexp() - break; - } - XMLCtx->level++; -} - - - -static void startNotifRequest(void *data, const char *el, const char **attr) -{ - edg_wll_XML_ctx *XMLCtx = data; - - - strcpy(XMLCtx->element, el); - - switch (XMLCtx->level) { - case 0: if (!strcasecmp(el,"edg_wll_NotifRequest") && attr[0] && attr[1]) { - if (strcmp(attr[0],"function")) { unexp() break;} - else XMLCtx->notifFunction = strdup(attr[1]); - } - else unexp() - break; - case 1: if (!strcasecmp(el,"and")) { - XMLCtx->jobQueryRec_begin = XML_GetCurrentByteIndex(XMLCtx->p); - } - else if ( (strcasecmp(el,"notifId")) && (strcasecmp(el,"clientAddress")) && - (strcasecmp(el,"notifChangeOp")) && (strcasecmp(el,"requestedValidity")) && - (strcasecmp(el,"flags")) ) unexp() - break; - case 2: /* fall through */ - case 3: /* do not check xml tags, processed in startJobQueryRec */ - case 4: break; - default: unexp() - break; - } - XMLCtx->level++; -} - - - -static void startQuerySequenceCodeRequest(void *data, const char *el, const char **attr) -{ - edg_wll_XML_ctx *XMLCtx = data; - - - strcpy(XMLCtx->element, el); - - switch (XMLCtx->level) { - case 0: if (strcasecmp(el,"edg_wll_QuerySequenceCodeRequest")) unexp() - break; - case 1: if ( (strcasecmp(el,"jobId")) && (strcasecmp(el,"source")) ) unexp() - break; - default: unexp() - break; - } - XMLCtx->level++; -} - - - -static void startStatsRequest(void *data, const char *el, const char **attr) -{ - edg_wll_XML_ctx *XMLCtx = data; - - - strcpy(XMLCtx->element, el); - - switch (XMLCtx->level) { - case 0: if (!strcasecmp(el,"edg_wll_StatsRequest") && attr[0] && attr[1]) { - if (strcmp(attr[0],"function")) { unexp() break;} - else XMLCtx->statsFunction = strdup(attr[1]); - } - else unexp() - break; - case 1: if (!strcasecmp(el,"and")) { - XMLCtx->jobQueryRec_begin = XML_GetCurrentByteIndex(XMLCtx->p); - } - else if ( (strcasecmp(el,"major")) && (strcasecmp(el,"minor")) && - (strcasecmp(el,"from")) && (strcasecmp(el,"to")) ) unexp() - break; - case 2: /* fall through */ - case 3: /* do not check xml tags, processed in startJobQueryRec */ - case 4: break; - default: unexp() - break; - } - XMLCtx->level++; -} - -#undef unexp - - -static void char_handler(void *data, const char *s, int len) -{ - edg_wll_XML_ctx *XMLCtx = data; - int i, found = -1; - char *temp_s; - - - /* if date are only spaces, t\, \r, \n ... don't bother with them */ - for (i=0; ichar_buf, XMLCtx->char_buf_len + len + 1); - if (temp_s == NULL) { - /* XXX propagate ENOMEM somehow */ - return; - } - XMLCtx->char_buf = temp_s; - memcpy(XMLCtx->char_buf + XMLCtx->char_buf_len, s, len); - XMLCtx->char_buf[XMLCtx->char_buf_len + len] = '\0'; - XMLCtx->char_buf_len += len; -} - - - -static void endJobQueryRec(void *data, const char *el UNUSED_VAR) -{ - edg_wll_XML_ctx *XMLCtx = data; - char *e; - char *s; - - - if (XMLCtx->level == 4 && - XMLCtx->job_conditions != NULL && - XMLCtx->job_conditions[XMLCtx->row] != NULL) { - switch (XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr) { - case EDG_WLL_QUERY_ATTR_JOBID: - case EDG_WLL_QUERY_ATTR_PARENT: - if ( (XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.j = - edg_wll_from_string_to_jobid(XMLCtx)) == NULL ) - { - s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf); - if (XMLCtx->errtxt) { - asprintf(&e,"%s\n%s: invalid JobId at line %d", - XMLCtx->errtxt, s, - XML_GetCurrentLineNumber(XMLCtx->p)); - free(XMLCtx->errtxt); - } else asprintf(&e,"%s: invalid JobId at line %d", - s,XML_GetCurrentLineNumber(XMLCtx->p)); - XMLCtx->errtxt = e; - free(s); - } - break; - case EDG_WLL_QUERY_ATTR_OWNER: - // XXX - this is way how to pass NULL, user will be extracted from ssl partner later - /* XXX char_buf contains an escaped value, however there's nothing to escape in 'NULL' so we're fine */ - if (XMLCtx->char_buf != NULL && !strcmp(XMLCtx->char_buf,"NULL")) { - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.c = NULL; - break; - } - else /* fall through */ - case EDG_WLL_QUERY_ATTR_LOCATION: - case EDG_WLL_QUERY_ATTR_DESTINATION: - case EDG_WLL_QUERY_ATTR_NETWORK_SERVER: - case EDG_WLL_QUERY_ATTR_USERTAG: - case EDG_WLL_QUERY_ATTR_JDL_ATTR: - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.c = - edg_wll_from_string_to_string(XMLCtx); - break; - case EDG_WLL_QUERY_ATTR_STATUS: - if ( !XMLCtx->bound ) - { - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.i = - edg_wll_from_string_to_edg_wll_JobStatCode(XMLCtx); - XMLCtx->bound++; - } - else - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.i = - edg_wll_from_string_to_edg_wll_JobStatCode(XMLCtx); - - break; - case EDG_WLL_QUERY_ATTR_DONECODE: - case EDG_WLL_QUERY_ATTR_EXITCODE: - case EDG_WLL_QUERY_ATTR_RESUBMITTED: - if ( !XMLCtx->bound ) - { - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.i = - edg_wll_from_string_to_int(XMLCtx); - XMLCtx->bound++; - } - else - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.i = - edg_wll_from_string_to_int(XMLCtx); - - break; - case EDG_WLL_QUERY_ATTR_TIME: - case EDG_WLL_QUERY_ATTR_STATEENTERTIME: - case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: - if ( !XMLCtx->bound ) - { - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.t.tv_sec = - edg_wll_from_string_to_time_t(XMLCtx); - XMLCtx->bound++; - } - else - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.t.tv_sec = - edg_wll_from_string_to_time_t(XMLCtx); - break; - default: - edg_wll_freeBuf(XMLCtx); - XMLCtx->level--; - s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf); - if (XMLCtx->errtxt) { - asprintf(&e,"%s\n%s: invalid attribute type at line %d", - XMLCtx->errtxt, s, - XML_GetCurrentLineNumber(XMLCtx->p)); - free(XMLCtx->errtxt); - } else asprintf(&e,"%s: invalid attribute type at line %d", - s,XML_GetCurrentLineNumber(XMLCtx->p)); - XMLCtx->errtxt = e; - free(s); - break; - } - } - edg_wll_freeBuf(XMLCtx); - XMLCtx->level--; -} - - - -static void endQueryJobsRequest(void *data, const char *el UNUSED_VAR) -{ - edg_wll_XML_ctx *XMLCtx = data; - char *s; - - - if (XMLCtx->level == 2) { - if (!strcmp(XMLCtx->element,"flags") && XMLCtx->char_buf) { - s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf); - // XXX: check if it works - XMLCtx->flags = edg_wll_string_to_stat_flags(s); - free(s); - } - else if (!strcmp(el,"and")) { - long len = (XML_GetCurrentByteIndex(XMLCtx->p) + XML_GetCurrentByteCount(XMLCtx->p)) - - XMLCtx->jobQueryRec_begin; - - parseJobQueryRec(XMLCtx->ctx, XMLCtx->message_body + XMLCtx->jobQueryRec_begin, len, - &XMLCtx->job_conditions); - } - } - edg_wll_freeBuf(XMLCtx); - XMLCtx->level--; -} - - -static void endQueryEventsRequest(void *data, const char *el UNUSED_VAR) -{ - edg_wll_XML_ctx *XMLCtx = data; - char *e; - char *s; - - if (XMLCtx->level == 2) { - if (!strcmp(XMLCtx->element,"orJobConditions")) { - /* make end-of-row */ - XMLCtx->job_conditions[XMLCtx->row] = realloc(XMLCtx->job_conditions[XMLCtx->row], - (++XMLCtx->position+1)*sizeof(**XMLCtx->job_conditions)); - memset(&XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position],0,sizeof(**XMLCtx->job_conditions)); - } - else if (!strcmp(XMLCtx->element,"orEventConditions")) { - /* make end-of-row */ - XMLCtx->event_conditions[XMLCtx->row2] = realloc(XMLCtx->event_conditions[XMLCtx->row2], - (++XMLCtx->position2+1)*sizeof(**XMLCtx->event_conditions)); - memset(&XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2],0,sizeof(**XMLCtx->event_conditions)); - } - } - else if (XMLCtx->level == 5) { - if (XMLCtx->type == EDG_WLL_QUERY_TYPE_JOB_CONDITION && - XMLCtx->job_conditions != NULL && - XMLCtx->job_conditions[XMLCtx->row] !=NULL) { - switch (XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr) { - case EDG_WLL_QUERY_ATTR_JOBID: - case EDG_WLL_QUERY_ATTR_PARENT: - if ( (XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.j = - edg_wll_from_string_to_jobid(XMLCtx)) == NULL ) - { - s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf); - if (XMLCtx->errtxt) { - asprintf(&e,"%s\n%s: invalid JobId at line %d", - XMLCtx->errtxt, s, - XML_GetCurrentLineNumber(XMLCtx->p)); - free(XMLCtx->errtxt); - } else asprintf(&e,"%s: invalid JobId at line %d", - s,XML_GetCurrentLineNumber(XMLCtx->p)); - XMLCtx->errtxt = e; - free(s); - } - break; - case EDG_WLL_QUERY_ATTR_OWNER: - case EDG_WLL_QUERY_ATTR_LOCATION: - case EDG_WLL_QUERY_ATTR_DESTINATION: - case EDG_WLL_QUERY_ATTR_USERTAG: - case EDG_WLL_QUERY_ATTR_JDL_ATTR: - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.c = - edg_wll_from_string_to_string(XMLCtx); - break; - case EDG_WLL_QUERY_ATTR_STATUS: - case EDG_WLL_QUERY_ATTR_DONECODE: - case EDG_WLL_QUERY_ATTR_EXITCODE: - case EDG_WLL_QUERY_ATTR_RESUBMITTED: - if ( !XMLCtx->bound ) - { - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.i = - edg_wll_from_string_to_int(XMLCtx); - XMLCtx->bound++; - } - else - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.i = - edg_wll_from_string_to_int(XMLCtx); - break; - case EDG_WLL_QUERY_ATTR_TIME: - case EDG_WLL_QUERY_ATTR_STATEENTERTIME: - if ( !XMLCtx->bound ) - { - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.t.tv_sec = - edg_wll_from_string_to_time_t(XMLCtx); - XMLCtx->bound++; - } - else - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.t.tv_sec = - edg_wll_from_string_to_time_t(XMLCtx); - break; - default: - edg_wll_freeBuf(XMLCtx); - XMLCtx->level--; - s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf); - if (XMLCtx->errtxt) { - asprintf(&e,"%s\n%s: invalid attribute type at line %d", - XMLCtx->errtxt, s, - XML_GetCurrentLineNumber(XMLCtx->p)); - free(XMLCtx->errtxt); - } else asprintf(&e,"%s: invalid attribute type at line %d", - s,XML_GetCurrentLineNumber(XMLCtx->p)); - XMLCtx->errtxt = e; - free(s); - break; - } - } - else if (XMLCtx->type == EDG_WLL_QUERY_TYPE_EVENT_CONDITION && - XMLCtx->event_conditions != NULL && - XMLCtx->event_conditions[XMLCtx->row2] != NULL) { - switch (XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].attr) { - case EDG_WLL_QUERY_ATTR_TIME: - if ( !XMLCtx->bound ) - { - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value.t.tv_sec = - edg_wll_from_string_to_time_t(XMLCtx); - XMLCtx->bound++; - } - else - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value2.t.tv_sec = - edg_wll_from_string_to_time_t(XMLCtx); - break; - case EDG_WLL_QUERY_ATTR_LEVEL: - case EDG_WLL_QUERY_ATTR_SOURCE: - case EDG_WLL_QUERY_ATTR_EVENT_TYPE: - if ( !XMLCtx->bound ) - { - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value.i = - edg_wll_from_string_to_int(XMLCtx); - XMLCtx->bound++; - } - else - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value2.i = - edg_wll_from_string_to_int(XMLCtx); - break; - case EDG_WLL_QUERY_ATTR_HOST: - case EDG_WLL_QUERY_ATTR_INSTANCE: - case EDG_WLL_QUERY_ATTR_USERTAG: - case EDG_WLL_QUERY_ATTR_JDL_ATTR: - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value.c = - edg_wll_from_string_to_string(XMLCtx); - break; - default: - edg_wll_freeBuf(XMLCtx); - XMLCtx->level--; - s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf); - if (XMLCtx->errtxt) { - asprintf(&e,"%s\n%s: invalid attribute type at line %d", - XMLCtx->errtxt, s, - XML_GetCurrentLineNumber(XMLCtx->p)); - free(XMLCtx->errtxt); - } else asprintf(&e,"%s: invalid attribute type at line %d", - s,XML_GetCurrentLineNumber(XMLCtx->p)); - XMLCtx->errtxt = e; - free(s); - break; - } - } - - edg_wll_freeBuf(XMLCtx); - } - XMLCtx->level--; -} - - -static void endPurgeRequest(void *data, const char *el UNUSED_VAR) -{ - edg_wll_XML_ctx *XMLCtx = data; - char *e, *s; - int index; - - if (XMLCtx->level == 2) { - if (!strcmp(XMLCtx->element,"flags")) { - s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf); - XMLCtx->purgeRequestGlobal.flags = edg_wll_string_to_purge_flags(s); - free(s); - } else if (!strcmp(XMLCtx->element,"target_runtime")) { - XMLCtx->purgeRequestGlobal.target_runtime = edg_wll_from_string_to_time_t(XMLCtx); - } - } - else if (XMLCtx->level == 3) { - if (!strcmp(XMLCtx->element,"jobId") && XMLCtx->purgeRequestGlobal.jobs != NULL) { - if ( (XMLCtx->purgeRequestGlobal.jobs[XMLCtx->position++] = - edg_wll_from_string_to_string(XMLCtx)) == NULL ) - { - /* XXX char_buf contains an escaped value, unescaping is done within edg_wll_from_string_to_string(), which failed */ - if (XMLCtx->errtxt) { - asprintf(&e,"%s\n%s: invalid JobId at line %d", - XMLCtx->errtxt, XMLCtx->char_buf, - XML_GetCurrentLineNumber(XMLCtx->p)); - free(XMLCtx->errtxt); - } else asprintf(&e,"%s: invalid JobId at line %d", - XMLCtx->char_buf,XML_GetCurrentLineNumber(XMLCtx->p)); - XMLCtx->errtxt = e; - } - } - else if ( ((index = XMLCtx->tagToIndex(XMLCtx->element)) >= 0 ) && XMLCtx->char_buf ) { - XMLCtx->purgeRequestGlobal.timeout[index] = - edg_wll_from_string_to_time_t(XMLCtx); - } - } - - edg_wll_freeBuf(XMLCtx); - XMLCtx->level--; -} - - -static void endDumpRequest(void *data, const char *el UNUSED_VAR) -{ - edg_wll_XML_ctx *XMLCtx = data; - char *s; - - if (XMLCtx->level == 2) { - s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf); - if (!strcmp(XMLCtx->element,"from")) { - if (isdigit(s[0])) - XMLCtx->dumpRequestGlobal.from = edg_wll_from_string_to_time_t(XMLCtx); - else - XMLCtx->dumpRequestGlobal.from = edg_wll_StringToDumpConst(s); - } - else if (!strcmp(XMLCtx->element,"to")) { - if (isdigit(s[0])) - XMLCtx->dumpRequestGlobal.to = edg_wll_from_string_to_time_t(XMLCtx); - else - XMLCtx->dumpRequestGlobal.to = edg_wll_StringToDumpConst(s); - } - free(s); - } - - edg_wll_freeBuf(XMLCtx); - XMLCtx->level--; -} - - - -static void endLoadRequest(void *data, const char *el UNUSED_VAR) -{ - edg_wll_XML_ctx *XMLCtx = data; - - if (XMLCtx->level == 2) { - if (!strcmp(XMLCtx->element,"server_file")) - XMLCtx->loadRequestGlobal.server_file = edg_wll_from_string_to_string(XMLCtx); - } - - edg_wll_freeBuf(XMLCtx); - XMLCtx->level--; -} - - - -static void endNotifRequest(void *data, const char *el UNUSED_VAR) -{ - edg_wll_XML_ctx *XMLCtx = data; - char *pom; - - if (XMLCtx->level == 2) { - if (!strcmp(XMLCtx->element,"notifId")) { - pom = edg_wll_from_string_to_string(XMLCtx); - edg_wll_NotifIdParse(pom, &XMLCtx->notifId); - free(pom); - } - else if (!strcmp(XMLCtx->element,"clientAddress")) { - XMLCtx->notifClientAddress = edg_wll_from_string_to_string(XMLCtx); - } - else if (!strcmp(XMLCtx->element,"notifChangeOp")) { - pom = edg_wll_from_string_to_string(XMLCtx); - XMLCtx->notifChangeOp = edg_wll_StringToNotifChangeOp(pom); - free(pom); - } - else if (!strcmp(XMLCtx->element,"requestedValidity")) { - XMLCtx->notifValidity = edg_wll_from_string_to_time_t(XMLCtx); - } - else if (!strcmp(el,"and")) { - long len = (XML_GetCurrentByteIndex(XMLCtx->p) + XML_GetCurrentByteCount(XMLCtx->p)) - - XMLCtx->jobQueryRec_begin; - - parseJobQueryRec(XMLCtx->ctx, XMLCtx->message_body + XMLCtx->jobQueryRec_begin, len, - &XMLCtx->job_conditions); - } - else if (!strcmp(XMLCtx->element,"flags") && XMLCtx->char_buf) { - char *s; - - s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf); - // XXX: check if it works - XMLCtx->flags = edg_wll_string_to_stat_flags(s); - free(s); - } - - } - - edg_wll_freeBuf(XMLCtx); - XMLCtx->level--; -} - - - -static void endQuerySequenceCodeRequest(void *data, const char *el UNUSED_VAR) -{ - edg_wll_XML_ctx *XMLCtx = data; - - if (XMLCtx->level == 2) { - if (!strcmp(XMLCtx->element,"jobId")) { - XMLCtx->jobId = edg_wll_from_string_to_jobid(XMLCtx); - } - else if (!strcmp(XMLCtx->element,"source")) { - XMLCtx->source = edg_wll_from_string_to_string(XMLCtx); - } - } - - edg_wll_freeBuf(XMLCtx); - XMLCtx->level--; -} - - - - -static void endStatsRequest(void *data, const char *el UNUSED_VAR) -{ - edg_wll_XML_ctx *XMLCtx = data; - - if (XMLCtx->level == 2) { - if (!strcmp(XMLCtx->element,"major")) { - XMLCtx->statsMajor = - edg_wll_from_string_to_edg_wll_JobStatCode(XMLCtx); - } - else if (!strcmp(XMLCtx->element,"minor")) { - XMLCtx->statsMinor = edg_wll_from_string_to_int(XMLCtx); - } - else if (!strcmp(XMLCtx->element,"from")) { - XMLCtx->statsFrom = edg_wll_from_string_to_time_t(XMLCtx);; - } - else if (!strcmp(XMLCtx->element,"to")) { - XMLCtx->statsTo = edg_wll_from_string_to_time_t(XMLCtx);; - } - else if (!strcmp(el,"and")) { - long len = (XML_GetCurrentByteIndex(XMLCtx->p) + XML_GetCurrentByteCount(XMLCtx->p)) - - XMLCtx->jobQueryRec_begin; - - parseJobQueryRec(XMLCtx->ctx, XMLCtx->message_body + XMLCtx->jobQueryRec_begin, len, - &XMLCtx->statsConditions); - } - } - - edg_wll_freeBuf(XMLCtx); - XMLCtx->level--; -} - - - -int parseJobQueryRec(edg_wll_Context ctx, const char *messageBody, long len, edg_wll_QueryRec ***conditions) -{ - int ret; - edg_wll_XML_ctx XMLCtx; - XML_Char *encoding = "ISO-8859-1"; - - errno = 0; - edg_wll_initXMLCtx(&XMLCtx); - XMLCtx.row = -1; - XMLCtx.ctx = ctx; - edg_wll_ResetError(ctx); - - - /* initialize parser */ - XMLCtx.p = XML_ParserCreate(encoding); - XML_SetElementHandler(XMLCtx.p, startJobQueryRec, endJobQueryRec); - XML_SetCharacterDataHandler(XMLCtx.p, char_handler); - XML_SetUserData(XMLCtx.p, (void *) &XMLCtx); - - - if (! XML_Parse(XMLCtx.p, messageBody, len, 1)) { - char *errorMessage; - - asprintf(&errorMessage, "Parse error at line %d:\n%s\n", - XML_GetCurrentLineNumber(XMLCtx.p), - XML_ErrorString(XML_GetErrorCode(XMLCtx.p))); - - edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage); - free(errorMessage); - } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt); - - - if ((ret = edg_wll_Error(ctx,NULL,NULL))) { - int i,j; - - if (XMLCtx.job_conditions) { - for (j = 0; XMLCtx.job_conditions[j]; j++) { - for (i = 0; (XMLCtx.job_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&XMLCtx.job_conditions[j][i]); - free(XMLCtx.job_conditions[j]); - } - free(XMLCtx.job_conditions); - } - - /* empty list terminators */ - conditions[0] = NULL; - } else { - *conditions = XMLCtx.job_conditions; - } - - - XML_ParserFree(XMLCtx.p); - edg_wll_freeXMLCtx(&XMLCtx); - return ret; -} - - -/* parse queryJobs request from client */ -int parseQueryJobsRequest(edg_wll_Context ctx, char *messageBody, edg_wll_QueryRec ***conditions, int *flags) -{ - int ret; - edg_wll_XML_ctx XMLCtx; - XML_Char *encoding = "ISO-8859-1"; - - errno = 0; - edg_wll_initXMLCtx(&XMLCtx); - XMLCtx.ctx = ctx; - XMLCtx.message_body = messageBody; - XMLCtx.position = 0; - edg_wll_ResetError(ctx); - - - /* initialize parser */ - XMLCtx.p = XML_ParserCreate(encoding); - XML_SetElementHandler(XMLCtx.p, startQueryJobsRequest, endQueryJobsRequest); - XML_SetCharacterDataHandler(XMLCtx.p, char_handler); - XML_SetUserData(XMLCtx.p, (void *) &XMLCtx); - - - if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) { - char *errorMessage; - - asprintf(&errorMessage, "Parse error at line %d:\n%s\n", - XML_GetCurrentLineNumber(XMLCtx.p), - XML_ErrorString(XML_GetErrorCode(XMLCtx.p))); - - edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage); - free(errorMessage); - } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt); - - - if ((ret = edg_wll_Error(ctx,NULL,NULL))) { - int i,j; - - if (XMLCtx.job_conditions) { - for (j = 0; XMLCtx.job_conditions[j]; j++) { - for (i = 0; (XMLCtx.job_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&XMLCtx.job_conditions[j][i]); - free(XMLCtx.job_conditions[j]); - } - free(XMLCtx.job_conditions); - } - - /* empty list terminators */ - conditions[0] = NULL; - *flags = 0; - } else { - *conditions = XMLCtx.job_conditions; - *flags = XMLCtx.flags; - } - - - XML_ParserFree(XMLCtx.p); - edg_wll_freeXMLCtx(&XMLCtx); - return ret; -} - - -/* parse queryEvents request from client */ -int parseQueryEventsRequest(edg_wll_Context ctx, char *messageBody, edg_wll_QueryRec ***job_conditions, edg_wll_QueryRec ***event_conditions) -{ - int ret; - edg_wll_XML_ctx XMLCtx; - XML_Char *encoding = "ISO-8859-1"; - - errno = 0; - edg_wll_initXMLCtx(&XMLCtx); - XMLCtx.row = -1; - XMLCtx.row2 = -1; - XMLCtx.ctx = ctx; - edg_wll_ResetError(ctx); - - - /* initialize parser */ - XMLCtx.p = XML_ParserCreate(encoding); - XML_SetElementHandler(XMLCtx.p, startQueryEventsRequest, endQueryEventsRequest); - XML_SetCharacterDataHandler(XMLCtx.p, char_handler); - XML_SetUserData(XMLCtx.p, (void *) &XMLCtx); - - - if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) { - char *errorMessage; - - asprintf(&errorMessage, "Parse error at line %d:\n%s\n", - XML_GetCurrentLineNumber(XMLCtx.p), - XML_ErrorString(XML_GetErrorCode(XMLCtx.p))); - - edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage); - free(errorMessage); - } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt); - - - if ((ret = edg_wll_Error(ctx,NULL,NULL))) { - int i,j; - - if (XMLCtx.job_conditions) { - for (j = 0; XMLCtx.job_conditions[j]; j++) { - for (i = 0 ; (XMLCtx.job_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&XMLCtx.job_conditions[j][i]); - free(XMLCtx.job_conditions[j]); - } - free(XMLCtx.job_conditions); - } - if (XMLCtx.event_conditions) { - for (j = 0; XMLCtx.event_conditions[j]; j++) { - for (i = 0 ; (XMLCtx.event_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&XMLCtx.event_conditions[j][i]); - free(XMLCtx.event_conditions[j]); - } - free(XMLCtx.event_conditions); - } - - /* empty list terminators */ - job_conditions[0] = NULL; - event_conditions[0] = NULL; - } else { - *job_conditions = XMLCtx.job_conditions; - *event_conditions = XMLCtx.event_conditions; - } - - - XML_ParserFree(XMLCtx.p); - edg_wll_freeXMLCtx(&XMLCtx); - return ret; -} - - - -/* parse purge request from client */ -int parsePurgeRequest(edg_wll_Context ctx, char *messageBody, int (*tagToIndex)(), edg_wll_PurgeRequest *request) -{ - int ret; - edg_wll_XML_ctx XMLCtx; - XML_Char *encoding = "ISO-8859-1"; - - errno = 0; - edg_wll_initXMLCtx(&XMLCtx); - XMLCtx.ctx = ctx; - edg_wll_ResetError(ctx); - XMLCtx.tagToIndex = tagToIndex; - - - /* initialize parser */ - XMLCtx.p = XML_ParserCreate(encoding); - XML_SetElementHandler(XMLCtx.p, startPurgeRequest, endPurgeRequest); - XML_SetCharacterDataHandler(XMLCtx.p, char_handler); - XML_SetUserData(XMLCtx.p, (void *) &XMLCtx); - - - if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) { - char *errorMessage; - - asprintf(&errorMessage, "Parse error at line %d:\n%s\n", - XML_GetCurrentLineNumber(XMLCtx.p), - XML_ErrorString(XML_GetErrorCode(XMLCtx.p))); - - edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage); - free(errorMessage); - } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt); - - - if ((ret = edg_wll_Error(ctx,NULL,NULL))) { - int i; - - if (XMLCtx.purgeRequestGlobal.jobs) { - for (i=0; XMLCtx.purgeRequestGlobal.jobs[i]; i++) - free(XMLCtx.purgeRequestGlobal.jobs[i]); - free(XMLCtx.purgeRequestGlobal.jobs); - } - memset(request,0,sizeof(*request)); - - } else { - memcpy(request, &XMLCtx.purgeRequestGlobal, sizeof(XMLCtx.purgeRequestGlobal)); - } - - - XML_ParserFree(XMLCtx.p); - edg_wll_freeXMLCtx(&XMLCtx); - return ret; -} - - - -/* parse dump request from client */ -int parseDumpRequest(edg_wll_Context ctx, char *messageBody, edg_wll_DumpRequest *request) -{ - int ret; - edg_wll_XML_ctx XMLCtx; - XML_Char *encoding = "ISO-8859-1"; - - errno = 0; - edg_wll_initXMLCtx(&XMLCtx); - XMLCtx.ctx = ctx; - edg_wll_ResetError(ctx); - - - /* initialize parser */ - XMLCtx.p = XML_ParserCreate(encoding); - XML_SetElementHandler(XMLCtx.p, startDumpRequest, endDumpRequest); - XML_SetCharacterDataHandler(XMLCtx.p, char_handler); - XML_SetUserData(XMLCtx.p, (void *) &XMLCtx); - - - if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) { - char *errorMessage; - - asprintf(&errorMessage, "Parse error at line %d:\n%s\n", - XML_GetCurrentLineNumber(XMLCtx.p), - XML_ErrorString(XML_GetErrorCode(XMLCtx.p))); - - edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage); - free(errorMessage); - } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt); - - - if ((ret = edg_wll_Error(ctx,NULL,NULL))) - memset(request,0,sizeof(*request)); - - else { - memcpy(request, &XMLCtx.dumpRequestGlobal, sizeof(XMLCtx.dumpRequestGlobal)); - } - - - XML_ParserFree(XMLCtx.p); - edg_wll_freeXMLCtx(&XMLCtx); - return ret; -} - -/* parse load request from client */ -int parseLoadRequest(edg_wll_Context ctx, char *messageBody, edg_wll_LoadRequest *request) -{ - int ret; - edg_wll_XML_ctx XMLCtx; - XML_Char *encoding = "ISO-8859-1"; - - errno = 0; - edg_wll_initXMLCtx(&XMLCtx); - XMLCtx.ctx = ctx; - edg_wll_ResetError(ctx); - - - /* initialize parser */ - XMLCtx.p = XML_ParserCreate(encoding); - XML_SetElementHandler(XMLCtx.p, startLoadRequest, endLoadRequest); - XML_SetCharacterDataHandler(XMLCtx.p, char_handler); - XML_SetUserData(XMLCtx.p, (void *) &XMLCtx); - - - if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) { - char *errorMessage; - - asprintf(&errorMessage, "Parse error at line %d:\n%s\n", - XML_GetCurrentLineNumber(XMLCtx.p), - XML_ErrorString(XML_GetErrorCode(XMLCtx.p))); - - edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage); - free(errorMessage); - } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt); - - - if ((ret = edg_wll_Error(ctx,NULL,NULL))) - memset(request,0,sizeof(*request)); - - else { - memcpy(request, &XMLCtx.loadRequestGlobal, sizeof(XMLCtx.loadRequestGlobal)); - } - - - XML_ParserFree(XMLCtx.p); - edg_wll_freeXMLCtx(&XMLCtx); - return ret; -} - - - - -/* parse Stats request from client */ -int parseStatsRequest(edg_wll_Context ctx, char *messageBody, char **function, edg_wll_QueryRec ***conditions, edg_wll_JobStatCode *major, int *minor, time_t *from, time_t *to) -{ - int ret; - edg_wll_XML_ctx XMLCtx; - XML_Char *encoding = "ISO-8859-1"; - - - /* returns emty variables as default; only some variables will be filled in */ - /* depending on vaule of XMLCtx.notifFunction */ - *function = NULL; - *major = EDG_WLL_JOB_UNDEF; - *minor = 0; - *from = 0; - *to = 0; - - errno = 0; - edg_wll_initXMLCtx(&XMLCtx); - XMLCtx.ctx = ctx; - XMLCtx.message_body = messageBody; - edg_wll_ResetError(ctx); - - - /* initialize parser */ - XMLCtx.p = XML_ParserCreate(encoding); - XML_SetElementHandler(XMLCtx.p, startStatsRequest, endStatsRequest); - XML_SetCharacterDataHandler(XMLCtx.p, char_handler); - XML_SetUserData(XMLCtx.p, (void *) &XMLCtx); - - - if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) { - char *errorMessage; - - asprintf(&errorMessage, "Parse error at line %d:\n%s\n", - XML_GetCurrentLineNumber(XMLCtx.p), - XML_ErrorString(XML_GetErrorCode(XMLCtx.p))); - - edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage); - free(errorMessage); - } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt); - - - if ((ret = edg_wll_Error(ctx,NULL,NULL))) { - int i,j; - - if (XMLCtx.statsConditions) { - for (j = 0; XMLCtx.statsConditions[j]; j++) { - for (i = 0; (XMLCtx.statsConditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&XMLCtx.statsConditions[j][i]); - free(XMLCtx.statsConditions[j]); - } - free(XMLCtx.statsConditions); - } - free(XMLCtx.notifFunction); - - *function = NULL; - *conditions = NULL; - *major = EDG_WLL_JOB_UNDEF; - *minor = 0; - *from = 0; - *to = 0; - } - else { - *function = XMLCtx.statsFunction; - *conditions = XMLCtx.statsConditions; - *major = XMLCtx.statsMajor; - *minor = XMLCtx.statsMinor; - *from = XMLCtx.statsFrom; - *to = XMLCtx.statsTo; - } - - - XML_ParserFree(XMLCtx.p); - edg_wll_freeXMLCtx(&XMLCtx); - return ret; -} -/* parse Notif request from client */ -int parseNotifRequest(edg_wll_Context ctx, char *messageBody, char **function, edg_wll_NotifId *notifId, char **address, edg_wll_NotifChangeOp *op, time_t *validity, edg_wll_QueryRec ***conditions, int *flags) -{ - int ret; - edg_wll_XML_ctx XMLCtx; - XML_Char *encoding = "ISO-8859-1"; - - - /* returns emty variables as default; only some variables will be filled in */ - /* depending on vaule of XMLCtx.notifFunction */ - *function = NULL; - *notifId = NULL; - *address = NULL; - *op = EDG_WLL_NOTIF_NOOP; - *conditions = NULL; - - errno = 0; - edg_wll_initXMLCtx(&XMLCtx); - XMLCtx.ctx = ctx; - XMLCtx.message_body = messageBody; - edg_wll_ResetError(ctx); - - - /* initialize parser */ - XMLCtx.p = XML_ParserCreate(encoding); - XML_SetElementHandler(XMLCtx.p, startNotifRequest, endNotifRequest); - XML_SetCharacterDataHandler(XMLCtx.p, char_handler); - XML_SetUserData(XMLCtx.p, (void *) &XMLCtx); - - - if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) { - char *errorMessage; - - asprintf(&errorMessage, "Parse error at line %d:\n%s\n", - XML_GetCurrentLineNumber(XMLCtx.p), - XML_ErrorString(XML_GetErrorCode(XMLCtx.p))); - - edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage); - free(errorMessage); - } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt); - - - if ((ret = edg_wll_Error(ctx,NULL,NULL))) { - int i,j; - - if (XMLCtx.job_conditions) { - for (j = 0; XMLCtx.job_conditions[j]; j++) { - for (i = 0; (XMLCtx.job_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&XMLCtx.job_conditions[j][i]); - free(XMLCtx.job_conditions[j]); - } - free(XMLCtx.job_conditions); - } - free(XMLCtx.notifFunction); - edg_wll_NotifIdFree(XMLCtx.notifId); - free(XMLCtx.notifClientAddress); - - *function = NULL; - *notifId = NULL; - *address = NULL; - *op = EDG_WLL_NOTIF_NOOP; - *validity = 0; - *conditions = NULL; - *flags = 0; - } else { - *function = XMLCtx.notifFunction; - *notifId = XMLCtx.notifId; - *address = XMLCtx.notifClientAddress; - *op = XMLCtx.notifChangeOp; - *validity = XMLCtx.notifValidity; - *conditions = XMLCtx.job_conditions; - *flags = XMLCtx.flags; - } - - - XML_ParserFree(XMLCtx.p); - edg_wll_freeXMLCtx(&XMLCtx); - return ret; -} - - - -/* parse Sequence Code request from client */ -int parseQuerySequenceCodeRequest(edg_wll_Context ctx, char *messageBody, edg_wlc_JobId *jobId, char **source) -{ - int ret; - edg_wll_XML_ctx XMLCtx; - XML_Char *encoding = "ISO-8859-1"; - - errno = 0; - edg_wll_initXMLCtx(&XMLCtx); - XMLCtx.ctx = ctx; - edg_wll_ResetError(ctx); - - - /* initialize parser */ - XMLCtx.p = XML_ParserCreate(encoding); - XML_SetElementHandler(XMLCtx.p, startQuerySequenceCodeRequest, endQuerySequenceCodeRequest); - XML_SetCharacterDataHandler(XMLCtx.p, char_handler); - XML_SetUserData(XMLCtx.p, (void *) &XMLCtx); - - - if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) { - char *errorMessage; - - asprintf(&errorMessage, "Parse error at line %d:\n%s\n", - XML_GetCurrentLineNumber(XMLCtx.p), - XML_ErrorString(XML_GetErrorCode(XMLCtx.p))); - - edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage); - free(errorMessage); - } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt); - - - if ((ret = edg_wll_Error(ctx,NULL,NULL))) { - if (XMLCtx.jobId) - edg_wlc_JobIdFree(XMLCtx.jobId); - - *jobId = NULL; - *source = NULL; - } - else { - *jobId = XMLCtx.jobId; - *source = XMLCtx.source; - } - - - XML_ParserFree(XMLCtx.p); - edg_wll_freeXMLCtx(&XMLCtx); - return ret; -} - - - - -int edg_wll_QueryEventsToXML(edg_wll_Context ctx, edg_wll_Event *eventsOut, char **message) -{ - char *pomA, *pomB; - char **list = NULL; - int i = 0, len, tot_len = 0; - int *len_list = NULL; - - - while (eventsOut && eventsOut[i].any.type != EDG_WLL_EVENT_UNDEF) { - pomB = edg_wll_EventToString(eventsOut[i].any.type); - trio_asprintf(&pomA," \r\n", pomB); - free(pomB); - pomB = pomA; - - -@@@{ - selectType $event '_common_'; - for (getFieldsOrdered $event) { - my $f = selectField $event $_; - my $ft = $f->{type}; - my $n = $f->{null}; - gen "\tedg_wll_add_$ft\_to_XMLBody(&pomB, eventsOut[i].any.$_, \"$_\", $n);\n"; - } - - gen "\tswitch (eventsOut[i].any.type) {\n"; - for my $t (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } getTypes $event) { - if ($t ne 'any') { - selectType $event $t; - my $u = uc $t; - gen "\t case EDG_WLL_EVENT_$u :\n"; - for (getFieldsOrdered $event) { - my $f = selectField $event $_; - my $ft = $f->{type}; - my $n = $f->{null}; - $t = lcfirst $t; - if ($t =~ m/^pBS/) { $t = ucfirst $t; } - if ($t =~ m/^cREAM/) { $t = ucfirst $t; } - if ($t =~ m/^condor/) { $t = ucfirst $t; } - gen "\t\tedg_wll_add_$ft\_to_XMLBody(&pomB, eventsOut[i].$t.$_, \"$_\", $n);\n"; - } - gen "\t\tbreak;\n"; - } - } - gen "\t default : break;\n"; - gen "\t}\n"; -@@@} - - - - len = asprintf(&pomA,"%s \r\n", pomB); - free(pomB); - i++; - tot_len += len; - - list = (char **) realloc(list, i * sizeof(*list)); - list[i-1] = pomA; - len_list = (int *) realloc(len_list, i * sizeof(*len_list)); - len_list[i-1] = len; - - } - - /* list termination */ - list = (char **) realloc(list, (i+1) * sizeof(*list)); - list[i] = NULL; - - /* test errors */ - if (ctx->errDesc || ctx->errCode) - len = trio_asprintf(&pomB," code=\"%d\" desc=\"%|Xs\">\r\n",ctx->errCode,ctx->errDesc); - else - len = asprintf(&pomB,">\r\n"); - - /* glueing all list fields together & freeing the list */ - pomA = (char *) malloc(tot_len * sizeof(char) + - sizeof(QUERY_EVENTS_BEGIN) + len + sizeof(QUERY_EVENTS_END) - 1); - - memcpy(pomA, QUERY_EVENTS_BEGIN, sizeof(QUERY_EVENTS_BEGIN)); - memcpy(pomA + sizeof(QUERY_EVENTS_BEGIN) - 1, pomB, len); - free(pomB); - pomB = pomA + sizeof(QUERY_EVENTS_BEGIN) + len - 1; - - i = 0; - while (list[i]) { - memcpy(pomB, list[i], len_list[i] ); - pomB += len_list[i]; - - /* freeing the list */ - free(list[i]); - - i++; - } - - strcpy(pomB, QUERY_EVENTS_END); - - - free(list); - free(len_list); - - - *message = pomA; - - return 0; -} - -int edg_wll_QueryJobsToXML(edg_wll_Context ctx, edg_wlc_JobId *jobsIn, edg_wll_JobStat *statesIn, char **message) -{ - char *pomA, *pomB, *pomC; - char **list = NULL; - int i = 0, len, tot_len = 0, nres = 0; - int *len_list = NULL; - - - if (jobsIn) for (nres = 0; jobsIn[nres]; nres++); - else if (statesIn) for (nres = 0; statesIn[nres].state; nres++); - - while (i < nres) { - trio_asprintf(&pomA,"\t\r\n"); - pomB = pomA; - - if (jobsIn) { - trio_asprintf(&pomA,"%s\t\t%|Xs\r\n", - pomB, pomC=edg_wlc_JobIdUnparse(jobsIn[i])); - free(pomC); - free(pomB); - pomB = pomA; - } - - if (statesIn) { - edg_wll_JobStatusToXML(ctx, statesIn[i], &pomC); - trio_asprintf(&pomA,"%s\t\t%s",pomB,pomC); - } - else { - pomC = edg_wll_StatToString(EDG_WLL_JOB_UNKNOWN); - trio_asprintf(&pomA,"%s\t\t\r\n\r\n\t\t\r\n", - pomB, pomC); - } - - free(pomB); - free(pomC); - pomB = pomA; - - - len = asprintf(&pomA,"%s\t\r\n", pomB); - free(pomB); - i++; - tot_len += len; - - list = (char **) realloc(list, i * sizeof(*list)); - list[i-1] = pomA; - len_list = (int *) realloc(len_list, i * sizeof(*len_list)); - len_list[i-1] = len; - } - - /* list termination */ - list = (char **) realloc(list, (i+1) * sizeof(*list)); - list[i] = NULL; - - /* test errors */ - if (ctx->errDesc || ctx->errCode) - len = trio_asprintf(&pomB," code=\"%d\" desc=\"%|Xs\">\r\n",ctx->errCode,ctx->errDesc); - else - len = asprintf(&pomB,">\r\n"); - - /* glueing all list fields together & freeing the list */ - pomA = (char *) malloc(tot_len * sizeof(char) + - sizeof(QUERY_JOBS_BEGIN) + len + sizeof(QUERY_JOBS_END) - 1); - - memcpy(pomA, QUERY_JOBS_BEGIN, sizeof(QUERY_JOBS_BEGIN)); - memcpy((pomA + sizeof(QUERY_JOBS_BEGIN) - 1), pomB, len); - free(pomB); - pomB = pomA + sizeof(QUERY_JOBS_BEGIN) + len - 1; - - i = 0; - while (list[i]) { - memcpy(pomB, list[i], len_list[i] ); - pomB += len_list[i]; - - /* freeing the list */ - free(list[i]); - - i++; - } - - strcpy(pomB, QUERY_JOBS_END); - - - free(list); - free(len_list); - - - *message = pomA; - - return 0; -} - -/* construct Message-Body of Response-Line for edg_wll_UserJobs */ -int edg_wll_UserJobsToXML(edg_wll_Context ctx, edg_wlc_JobId *jobsOut, char **message) -{ - char *pomA, *pomB; - char **list = NULL; - int i = 0, len, tot_len = 0; - int *len_list = NULL; - - - while (jobsOut[i]) { - len = trio_asprintf(&pomA," %|Xs\r\n", - pomB=edg_wlc_JobIdUnparse(jobsOut[i])); - - free(pomB); - - i++; - tot_len += len; - - list = (char **) realloc(list, i * sizeof(*list)); - list[i-1] = pomA; - pomA = NULL; - len_list = (int *) realloc(len_list, i * sizeof(*len_list)); - len_list[i-1] = len; - - } - - /* list termination */ - list = (char **) realloc(list, (i+1) * sizeof(*list)); - list[i] = NULL; - - /* test errors */ - if (ctx->errDesc || ctx->errCode) - len = trio_asprintf(&pomB," code=\"%d\" desc=\"%|Xs\">\r\n",ctx->errCode,ctx->errDesc); - else - len = asprintf(&pomB,">\r\n"); - - /* glueing all list fields together & freeing the list */ - pomA = (char *) malloc(tot_len * sizeof(char) + - sizeof(USERJOBS_BEGIN) + len + sizeof(USERJOBS_END) - 1); - - memcpy(pomA, USERJOBS_BEGIN, sizeof(USERJOBS_BEGIN)); - memcpy((pomA + sizeof(USERJOBS_BEGIN) - 1), pomB, len); - free(pomB); - pomB = pomA + sizeof(USERJOBS_BEGIN) + len - 1; - - i = 0; - while (list[i]) { - memcpy(pomB, list[i], len_list[i] ); - pomB += len_list[i]; - - /* freeing the list */ - free(list[i]); - - i++; - } - - strcpy(pomB, USERJOBS_END); - - - free(list); - free(len_list); - - - *message = pomA; - - return 0; -} - -static void edg_wll_add_stslist_to_XMLBody(edg_wll_Context ctx, char **body, const edg_wll_JobStat *toAdd, const char *tag, const char *UNUSED_subTag, const int null) -{ - char *pomA, *pomB, *newBody; - char **list = NULL; - int i = 0, len, tot_len = 0; - int *len_list = NULL; - - - while (toAdd[i].state != null) { - edg_wll_JobStatusToXML(ctx, toAdd[i], &pomA); - len = strlen(pomA); - - i++; - tot_len += len; - - list = (char **) realloc(list, i * sizeof(*list)); - list[i-1] = pomA; - pomA = NULL; - len_list = (int *) realloc(len_list, i * sizeof(*len_list)); - len_list[i-1] = len; - } - - /* list termination */ - list = (char **) realloc(list, (i+1) * sizeof(*list)); - list[i] = NULL; - - /* glueing all list fields together & freeing the list */ - pomA = (char *) malloc(tot_len * sizeof(char) + 1); - pomB = pomA; - - i = 0; - while (list[i]) { - memcpy(pomB, list[i], len_list[i] ); - pomB += len_list[i]; - - /* freeing the list */ - free(list[i]); - - i++; - } - *pomB = '\0'; - free(list); - free(len_list); - - asprintf(&newBody,"%s\t\t\t<%s>\r\n%s\t\t\t\r\n", *body, tag, pomA, tag); - free(*body); - free(pomA); - *body = newBody; -} - - - -/* construct Message-Body of Response-Line for edg_wll_JobStatus */ -int edg_wll_JobStatusToXML(edg_wll_Context ctx, edg_wll_JobStat stat, char **message) -{ - char *pomA, *pomB, *pomC; - - - pomB = strdup(""); - -@@@{ - selectType $status '_common_'; - for (getFieldsOrdered $status) { - my $f = selectField $status $_; - next if defined($f->{special}) && $f->{special} eq 'XMLstructured'; - my $ft = $f->{type}; - my $n = $f->{null}; - gen "edg_wll_add_$ft\_to_XMLBody(&pomB, stat.$_, \"$_\", $n);\n"; - } -@@@} - if (stat.possible_destinations) edg_wll_add_strlist_to_XMLBody(&pomB, stat.possible_destinations, "possible_destinations", "name", "\t\t\t", NULL); - if (stat.possible_ce_nodes) edg_wll_add_strlist_to_XMLBody(&pomB, stat.possible_ce_nodes, "possible_ce_nodes", "name", "\t\t\t", NULL); - if (stat.children) edg_wll_add_strlist_to_XMLBody(&pomB, stat.children, "children", "jobId", "\t\t\t", NULL); - if (stat.children_hist) edg_wll_add_intlist_to_XMLBody(&pomB, stat.children_hist, "children_hist", edg_wll_StatToString, "\t\t\t", 1, stat.children_hist[0]); - if (stat.children_states) edg_wll_add_stslist_to_XMLBody(ctx, &pomB, stat.children_states, "children_states", "", EDG_WLL_JOB_UNDEF); - if (stat.user_tags) edg_wll_add_taglist_to_XMLBody(&pomB, stat.user_tags, "user_tags", "tag", "name", "\t\t\t", NULL); - if (stat.stateEnterTimes) edg_wll_add_intlist_to_XMLBody(&pomB, stat.stateEnterTimes, "stateEnterTimes", edg_wll_StatToString, "\t\t\t",1, stat.stateEnterTimes[0]); - - pomC = edg_wll_StatToString(stat.state); - - if (ctx->errDesc || ctx->errCode) - trio_asprintf(&pomA,"\r\n%s", - pomC, ctx->errCode,ctx->errDesc, pomB); - else - trio_asprintf(&pomA,"\r\n%s", - pomC, pomB); - - free(pomB); - free(pomC); - - *message = pomA; - - return 0; -} - - - -/* construct Message-Body of Request-Line for edg_wll_Purge */ -int edg_wll_PurgeResultToXML( - edg_wll_Context ctx, - edg_wll_PurgeResult *result, - char **message) -{ - char *pomA, *pomB; - - - if (!result) { *message = NULL; return(-1); } - - pomA = strdup(""); - edg_wll_add_strlist_to_XMLBody(&pomA, result->jobs, "jobs", "jobId", "\t", NULL); - edg_wll_add_string_to_XMLBody(&pomA, result->server_file, "server_file", NULL); - - if (ctx->errDesc || ctx->errCode) - trio_asprintf(&pomB,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s", - PURGE_RESULT_BEGIN, ctx->errCode, ctx->errDesc, pomA, PURGE_RESULT_END); - else - trio_asprintf(&pomB,"%s>\r\n%s%s", PURGE_RESULT_BEGIN, pomA, PURGE_RESULT_END); - free(pomA); - - *message = pomB; - return 0; -} - - - -/* construct Message-Body of Request-Line for edg_wll_Dump */ -int edg_wll_DumpResultToXML( - edg_wll_Context ctx, - edg_wll_DumpResult *result, - char **message) -{ - char *pomA, *pomB; - - - if (!result) { *message = NULL; return(-1); } - - pomA = strdup(""); - edg_wll_add_string_to_XMLBody(&pomA, result->server_file, "server_file", NULL); - if (result->from < 0) - edg_wll_add_string_to_XMLBody(&pomA, - edg_wll_DumpConstToString(result->from), "from", NULL); - else - edg_wll_add_time_t_to_XMLBody(&pomA, result->from, "from", 0); - if (result->to < 0) - edg_wll_add_string_to_XMLBody(&pomA, - edg_wll_DumpConstToString(result->to), "to", NULL); - else - edg_wll_add_time_t_to_XMLBody(&pomA, result->to, "to", 0); - - if (ctx->errDesc || ctx->errCode) - trio_asprintf(&pomB,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s", - DUMP_RESULT_BEGIN, ctx->errCode, ctx->errDesc, pomA, DUMP_RESULT_END); - else - trio_asprintf(&pomB,"%s>\r\n%s%s", DUMP_RESULT_BEGIN, pomA, DUMP_RESULT_END); - free(pomA); - - *message = pomB; - return 0; -} - - -/* construct Message-Body of Request-Line for edg_wll_Load */ -int edg_wll_LoadResultToXML( - edg_wll_Context ctx, - edg_wll_LoadResult *result, - char **message) -{ - char *pomA, *pomB; - - - if (!result) { *message = NULL; return(-1); } - - pomA = strdup(""); - edg_wll_add_string_to_XMLBody(&pomA, result->server_file, "server_file", NULL); - edg_wll_add_time_t_to_XMLBody(&pomA, result->from, "from", 0); - edg_wll_add_time_t_to_XMLBody(&pomA, result->to, "to", 0); - - if (ctx->errDesc || ctx->errCode) - trio_asprintf(&pomB,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s", - LOAD_RESULT_BEGIN, ctx->errCode, ctx->errDesc, pomA, LOAD_RESULT_END); - else - trio_asprintf(&pomB,"%s>\r\n%s%s", LOAD_RESULT_BEGIN, pomA, LOAD_RESULT_END); - free(pomA); - - *message = pomB; - return 0; -} - - -/* construct Message-Body of Request-Line for edg_wll_GetIndexedAttrs */ -int edg_wll_IndexedAttrsToXML( - edg_wll_Context ctx, - char **message) -{ - int i,j; - char *pomA, *pomB; - - pomA = strdup(""); - if (ctx->job_index) { - for (i=0; ctx->job_index[i]; i++) { - asprintf(&pomB, "%s\t%s\r\n",pomA,""); - free(pomA); - pomA = pomB; - - for (j=0; ctx->job_index[i][j].attr != EDG_WLL_QUERY_ATTR_UNDEF; j++) { - asprintf(&pomB, "%s\t\t%s\r\n",pomA,""); - free(pomA); - pomA = pomB; - - edg_wll_add_string_to_XMLBody(&pomA, - edg_wll_query_attrToString(ctx->job_index[i][j].attr), - "attribute", NULL); - - if ( ctx->job_index[i][j].attr == EDG_WLL_QUERY_ATTR_TIME ) - edg_wll_add_string_to_XMLBody(&pomA, - edg_wll_StatToString(ctx->job_index[i][j].attr_id.state), - "state", NULL); - - if (ctx->job_index[i][j].attr == EDG_WLL_QUERY_ATTR_USERTAG) - edg_wll_add_string_to_XMLBody(&pomA, - ctx->job_index[i][j].attr_id.tag, - "name", NULL); - - if (ctx->job_index[i][j].attr == EDG_WLL_QUERY_ATTR_JDL_ATTR) - edg_wll_add_string_to_XMLBody(&pomA, - ctx->job_index[i][j].attr_id.tag, - "name", NULL); - - asprintf(&pomB, "%s\t\t%s\r\n",pomA,""); - free(pomA); - pomA = pomB; - } - - asprintf(&pomB, "%s\t%s\r\n",pomA,""); - free(pomA); - pomA = pomB; - } - } - - if (ctx->errDesc || ctx->errCode) - trio_asprintf(&pomB,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s", - INDEXED_ATTRS_BEGIN, ctx->errCode, ctx->errDesc, pomA, INDEXED_ATTRS_END); - else - trio_asprintf(&pomB,"%s>\r\n%s%s", INDEXED_ATTRS_BEGIN, pomA, INDEXED_ATTRS_END); - free(pomA); - - - *message = pomB; - return 0; -} - - - -/* construct Message-Body of Request-Line for edg_wll_Notif */ -int edg_wll_NotifResultToXML( - edg_wll_Context ctx, - time_t validity, - char **message) -{ - char *pomA, *pomB; - - - pomA = strdup(""); - edg_wll_add_time_t_to_XMLBody(&pomA, validity, "validity", -1); - - if (ctx->errDesc || ctx->errCode) - trio_asprintf(&pomB,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s", - NOTIF_RESULT_BEGIN, ctx->errCode, ctx->errDesc, pomA, NOTIF_RESULT_END); - else - trio_asprintf(&pomB,"%s>\r\n%s%s", NOTIF_RESULT_BEGIN, pomA, NOTIF_RESULT_END); - free(pomA); - - *message = pomB; - return 0; -} - - - -/* construct Message-Body of Request-Line for edg_wll_Notif */ -int edg_wll_QuerySequenceCodeResultToXML( - edg_wll_Context ctx, - char *seqCode, - char **message) -{ - char *pomA, *pomB; - - - pomA = strdup(""); - edg_wll_add_string_to_XMLBody(&pomA, seqCode, "sequence_code", NULL); - - if (ctx->errDesc || ctx->errCode) - trio_asprintf(&pomB,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s", - QUERY_SEQUENCE_CODE_RESULT_BEGIN, ctx->errCode, - ctx->errDesc, pomA, QUERY_SEQUENCE_CODE_RESULT_END); - else - trio_asprintf(&pomB,"%s>\r\n%s%s", QUERY_SEQUENCE_CODE_RESULT_BEGIN, - pomA, QUERY_SEQUENCE_CODE_RESULT_END); - free(pomA); - - *message = pomB; - return 0; -} - - - -/* construct Message-Body of Request-Line for edg_wll_Stats* */ -int edg_wll_StatsResultToXML( - edg_wll_Context ctx, - time_t from, - time_t to, - float rate, - float duration, - int res_from, - int res_to, - char **message) -{ - char *pomA, *pomB; - - - pomA = strdup(""); - edg_wll_add_time_t_to_XMLBody(&pomA, from, "from", -1); - edg_wll_add_time_t_to_XMLBody(&pomA, to, "to", -1); - edg_wll_add_float_to_XMLBody(&pomA, rate, "rate", 0); - edg_wll_add_float_to_XMLBody(&pomA, duration, "duration", 0); - edg_wll_add_int_to_XMLBody(&pomA, res_from, "res_from", -1); - edg_wll_add_int_to_XMLBody(&pomA, res_to, "res_to", -1); - - if (ctx->errDesc || ctx->errCode) - trio_asprintf(&pomB,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s", - STATS_RESULT_BEGIN, ctx->errCode, ctx->errDesc, pomA, STATS_RESULT_END); - else - trio_asprintf(&pomB,"%s>\r\n%s%s", STATS_RESULT_BEGIN, pomA, STATS_RESULT_END); - free(pomA); - - *message = pomB; - return 0; -} - - diff --git a/org.glite.lb.server/src/lb_xml_parse.h b/org.glite.lb.server/src/lb_xml_parse.h deleted file mode 100644 index 4096062..0000000 --- a/org.glite.lb.server/src/lb_xml_parse.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef GLITE_LB_LB_XML_PARSE_H -#define GLITE_LB_LB_XML_PARSE_H - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include "glite/lb/context.h" -#include "glite/lb/jobstat.h" -#include "glite/lb/notif_rec.h" -#include "glite/lb/query_rec.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* function for parsing/unparsing XML requests from client */ - -int parseJobQueryRec(edg_wll_Context ctx, const char *messageBody, long len, edg_wll_QueryRec ***conditions); -int parseQueryJobsRequest(edg_wll_Context ctx, char *messageBody, edg_wll_QueryRec ***conditions, int *flags); -int parseQueryEventsRequest(edg_wll_Context ctx, char *messageBody, edg_wll_QueryRec ***job_conditions, edg_wll_QueryRec ***event_conditions); -int parsePurgeRequest(edg_wll_Context ctx, char *messageBody, int (*tagToIndex)(), edg_wll_PurgeRequest *request); -int parseDumpRequest(edg_wll_Context ctx, char *messageBody, edg_wll_DumpRequest *request); -int parseLoadRequest(edg_wll_Context ctx, char *messageBody, edg_wll_LoadRequest *request); -int parseNotifRequest(edg_wll_Context ctx, char *messageBody, char **function, edg_wll_NotifId *notifId, char **address, edg_wll_NotifChangeOp *op, time_t *validity, edg_wll_QueryRec ***conditions, int *flags); -int parseQuerySequenceCodeRequest(edg_wll_Context ctx, char *messageBody, edg_wlc_JobId *jobId, char **source); -int edg_wll_QueryEventsToXML(edg_wll_Context, edg_wll_Event *, char **); -int edg_wll_QueryJobsToXML(edg_wll_Context, edg_wlc_JobId *, edg_wll_JobStat *, char **); -int edg_wll_JobStatusToXML(edg_wll_Context, edg_wll_JobStat, char **); -int edg_wll_UserJobsToXML(edg_wll_Context, edg_wlc_JobId *, char **); -int edg_wll_PurgeResultToXML(edg_wll_Context ctx, edg_wll_PurgeResult *result, char **message); -int edg_wll_DumpResultToXML(edg_wll_Context ctx, edg_wll_DumpResult *result, char **message); -int edg_wll_LoadResultToXML(edg_wll_Context ctx, edg_wll_LoadResult *result, char **message); -int edg_wll_IndexedAttrsToXML(edg_wll_Context ctx, char **message); -int edg_wll_NotifResultToXML(edg_wll_Context ctx, time_t validity, char **message); -int edg_wll_QuerySequenceCodeResultToXML(edg_wll_Context ctx, char *source, char **message); - -int edg_wll_StatsResultToXML(edg_wll_Context,time_t,time_t,float,float,int,int,char **); - -int parseStatsRequest(edg_wll_Context,char *,char **,edg_wll_QueryRec ***,edg_wll_JobStatCode *,int *,time_t *,time_t *); - - -#ifdef __cplusplus -} -#endif - -#endif /* GLITE_LB_LB_XML_PARSE_H */ diff --git a/org.glite.lb.server/src/lb_xml_parse_V21.c.T b/org.glite.lb.server/src/lb_xml_parse_V21.c.T deleted file mode 100644 index 540302a..0000000 --- a/org.glite.lb.server/src/lb_xml_parse_V21.c.T +++ /dev/null @@ -1,1262 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#include "glite/lbu/trio.h" -#include "glite/lbu/escape.h" - -#include "glite/lb/context-int.h" -#include "glite/lb/xml_conversions.h" - -#include "lb_xml_parse_V21.h" - -#ifdef __GNUC__ -#define UNUSED_VAR __attribute__((unused)) -#else -#define UNUSED_VAR -#endif - -#define QUERY_EVENTS_BEGIN "\r\n" -#define QUERY_JOBS_BEGIN "\r\n" -#define PURGE_RESULT_BEGIN "\r\n" -#define DUMP_RESULT_BEGIN "\r\n" - -// XXX will be redundant soon -#define USERJOBS_BEGIN "\r\n" - - -static char *ops[] = { "equal","less","greater","within" }, - *attrs[] = { "jobid","owner","status","location","destination", - "donecode","usertag","time","level","host","source", - "instance","type","chkpt_tag", "resubmitted", "parent_job", "exitcode" }; - -static const struct timeval null_timeval = {0,0}; - -#define unexp() {\ - char *e;\ -\ - if (XMLCtx->errtxt) {\ - asprintf(&e,"%s\nunexpected <%s> at line %d",XMLCtx->errtxt,\ - el,XML_GetCurrentLineNumber(XMLCtx->p));\ - free(XMLCtx->errtxt);\ - } else asprintf(&e,"unexpected <%s> at line %d",\ - el,XML_GetCurrentLineNumber(XMLCtx->p));\ - XMLCtx->errtxt = e;\ -} - - -/* Dummy function, returns only const string "el"; just for compatibility */ -static char *return_string_el(edg_wll_JobStatCode statCode) { - return("el"); -} - - -static void startQueryJobsRequest(void *data, const char *el, const char **attr) -{ - unsigned int i; - edg_wll_XML_ctx *XMLCtx = data; - - - strcpy(XMLCtx->element, el); - - switch (XMLCtx->level) { - case 0: if (strcasecmp(el,"edg_wll_QueryJobsRequest")) { unexp() break; } - for ( i = 0; attr[i] && attr[i+1]; i += 2 ) - { - if ( !strcmp(attr[i],"softLimit") ) - XMLCtx->ctx->softLimit = atoi(attr[i+1]); - else if ( !strcmp(attr[i],"queryRes") ) - XMLCtx->ctx->p_query_results = atoi(attr[i+1]); - else { unexp() break; } - } - break; - case 1: if (strcasecmp(el,"and") && strcasecmp(el,"flags")) unexp() - break; - case 2: if (strcasecmp(el,"or")) unexp() - else { - XMLCtx->position = -1; - XMLCtx->conditions = realloc(XMLCtx->conditions, - (++XMLCtx->row+2)*sizeof(*XMLCtx->conditions)); - XMLCtx->conditions[XMLCtx->row] = NULL; - XMLCtx->conditions[XMLCtx->row+1] = NULL; - } - break; - case 3: - for (i=0; iconditions[XMLCtx->row] = realloc(XMLCtx->conditions[XMLCtx->row], - (++XMLCtx->position+2)*sizeof(**XMLCtx->conditions)); - memset(&XMLCtx->conditions[XMLCtx->row][XMLCtx->position],0,2*sizeof(**XMLCtx->conditions)); - XMLCtx->conditions[XMLCtx->row][XMLCtx->position].op = i; - XMLCtx->bound = 0; - } - break; - case 4: for (i=0; iconditions[XMLCtx->row][XMLCtx->position].attr_id.tag = strdup(attr[1]); - } - else if ( (i+1) == EDG_WLL_QUERY_ATTR_TIME) { - if (!attr[0] || !attr[1]) { unexp() break;} - if (attr[0] && strcmp(attr[0],"state")) { unexp() break;} - XMLCtx->conditions[XMLCtx->row][XMLCtx->position].attr_id.state = edg_wll_StringToStat(attr[1]); - } - XMLCtx->conditions[XMLCtx->row][XMLCtx->position].attr = i+1; - } - break; - default: unexp(); break; - } - XMLCtx->level++; -} - - -static void startQueryEventsRequest(void *data, const char *el, const char **attr UNUSED_VAR) -{ - unsigned int i; - edg_wll_XML_ctx *XMLCtx = data; - - - strcpy(XMLCtx->element, el); - - switch (XMLCtx->level) { - case 0: if (strcasecmp(el,"edg_wll_QueryEventsRequest")) { unexp() break; } - for ( i = 0; attr[i] && attr[i+1]; i += 2 ) - { - if ( !strcmp(attr[i],"softLimit") ) - XMLCtx->ctx->softLimit = atoi(attr[i+1]); - else if ( !strcmp(attr[i],"queryRes") ) - XMLCtx->ctx->p_query_results = atoi(attr[i+1]); - else { unexp() break; } - } - break; - case 1: if (strcasecmp(el,"and")) unexp() - break; - case 2: if (!strcasecmp(el,"orJobConditions")) { - XMLCtx->type = EDG_WLL_QUERY_TYPE_JOB_CONDITION; - XMLCtx->position = -1; - XMLCtx->job_conditions = realloc(XMLCtx->job_conditions, - (++XMLCtx->row+2)*sizeof(*XMLCtx->job_conditions)); - XMLCtx->job_conditions[XMLCtx->row] = NULL; - XMLCtx->job_conditions[XMLCtx->row+1] = NULL; - - } - else if (!strcasecmp(el,"orEventConditions")) { - XMLCtx->type = EDG_WLL_QUERY_TYPE_EVENT_CONDITION; - XMLCtx->position2 = -1; - XMLCtx->event_conditions = realloc(XMLCtx->event_conditions, - (++XMLCtx->row2+2)*sizeof(*XMLCtx->event_conditions)); - XMLCtx->event_conditions[XMLCtx->row2] = NULL; - XMLCtx->event_conditions[XMLCtx->row2+1] = NULL; - } - else unexp() - break; - case 3: - for (i=0; itype == EDG_WLL_QUERY_TYPE_JOB_CONDITION) { - /* malloc also terminator and set it to 0 (= EDG_WLL_QUERY_ATTR_UNDEF) */ - XMLCtx->job_conditions[XMLCtx->row] = realloc(XMLCtx->job_conditions[XMLCtx->row], - (++XMLCtx->position+2)*sizeof(**XMLCtx->job_conditions)); - memset(&XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position],0,2*sizeof(**XMLCtx->job_conditions)); - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].op = i; - XMLCtx->bound = 0; - } - else if (XMLCtx->type == EDG_WLL_QUERY_TYPE_EVENT_CONDITION) { - /* malloc also terminator and set it to 0 (= EDG_WLL_QUERY_ATTR_UNDEF) */ - XMLCtx->event_conditions[XMLCtx->row2] = realloc(XMLCtx->event_conditions[XMLCtx->row2], - (++XMLCtx->position2+2)*sizeof(**XMLCtx->event_conditions)); - memset(&XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2],0,2*sizeof(**XMLCtx->event_conditions)); - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].op = i; - XMLCtx->bound = 0; - } - - break; - case 4: for (i=0; itype == EDG_WLL_QUERY_TYPE_JOB_CONDITION) { - if ( (i+1) == EDG_WLL_QUERY_ATTR_USERTAG) { - if (!attr[0] || !attr[1]) { unexp() break;} - if (attr[0] && strcmp(attr[0],"name")) { unexp() break;} - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.tag = strdup(attr[1]); - } - else if ( (i+1) == EDG_WLL_QUERY_ATTR_TIME) { - if (!attr[0] || !attr[1]) { unexp() break;} - if (attr[0] && strcmp(attr[0],"state")) { unexp() break;} - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.state = edg_wll_StringToStat(attr[1]); - //printf("\nchecking time attr\n%s = %s (%d)\n\n", attr[0], attr[1], edg_wll_StringToStat(attr[1])); - } - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr = i+1; - } - else if (XMLCtx->type == EDG_WLL_QUERY_TYPE_EVENT_CONDITION) { - if ( (i+1) == EDG_WLL_QUERY_ATTR_USERTAG) { - if (!attr[0] || !attr[1]) { unexp() break;} - if (attr[0] && strcmp(attr[0],"name")) { unexp() break;} - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position].attr_id.tag = strdup(attr[1]); - } - else if ( (i+1) == EDG_WLL_QUERY_ATTR_TIME) { - if (!attr[0] || !attr[1]) { unexp() break;} - if (attr[0] && strcmp(attr[0],"state")) { unexp() break;} - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position].attr_id.state = edg_wll_StringToStat(attr[1]); - } - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].attr = i+1; - } - break; - default: unexp(); break; - } - XMLCtx->level++; -} - - - -static void startPurgeRequest(void *data, const char *el, const char **attr) -{ - edg_wll_XML_ctx *XMLCtx = data; - - - strcpy(XMLCtx->element, el); - - switch (XMLCtx->level) { - case 0: if (strcasecmp(el,"edg_wll_PurgeRequest")) unexp() - break; - case 1: if (strcasecmp(el,"jobs") && strcasecmp(el,"timeout") - && strcasecmp(el,"flags")) unexp() - else - XMLCtx->position = 0; - break; - case 2: if (!strcasecmp(el,"jobId")) { - XMLCtx->purgeRequestGlobal.jobs = realloc(XMLCtx->purgeRequestGlobal.jobs, - (XMLCtx->position+2) * sizeof(XMLCtx->purgeRequestGlobal.jobs)); - - if (!XMLCtx->purgeRequestGlobal.jobs) { - edg_wll_SetError(XMLCtx->ctx, ENOMEM, NULL); - unexp() return; - } - XMLCtx->purgeRequestGlobal.jobs[XMLCtx->position+1] = NULL; - } - else if (!strcasecmp(el,"time")) { - /* static array, no need to initialize & allocate anything */ - } - else - unexp() - break; - default: unexp() - break; - } - XMLCtx->level++; -} - - -static void startDumpRequest(void *data, const char *el, const char **attr) -{ - edg_wll_XML_ctx *XMLCtx = data; - - - strcpy(XMLCtx->element, el); - - switch (XMLCtx->level) { - case 0: if (strcasecmp(el,"edg_wll_DumpRequest")) unexp() - break; - case 1: if (strcasecmp(el,"from") && strcasecmp(el,"to")) unexp() - break; - default: unexp() - break; - } - XMLCtx->level++; -} - -#undef unexp - - -static void char_handler(void *data, const char *s, int len) -{ - edg_wll_XML_ctx *XMLCtx = data; - int i, found = -1; - char *temp_s; - - - /* if date are only spaces, t\, \r, \n ... don't bother with them */ - for (i=0; ichar_buf, XMLCtx->char_buf_len + len + 1); - if (temp_s == NULL) { - /* XXX propagate ENOMEM somehow */ - return; - } - XMLCtx->char_buf = temp_s; - memcpy(XMLCtx->char_buf + XMLCtx->char_buf_len, s, len); - XMLCtx->char_buf[XMLCtx->char_buf_len + len] = '\0'; - XMLCtx->char_buf_len += len; -} - - - -static void endQueryJobsRequest(void *data, const char *el UNUSED_VAR) -{ - edg_wll_XML_ctx *XMLCtx = data; - char *e, *s; - - - if (XMLCtx->level == 2) { - if (!strcmp(XMLCtx->element,"flags") && XMLCtx->char_buf) { - s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf); -// XXX: check if it works - XMLCtx->flags = edg_wll_string_to_stat_flags(s); - free(s); - } - } - else if (XMLCtx->level == 5) { - switch (XMLCtx->conditions[XMLCtx->row][XMLCtx->position].attr) { - case EDG_WLL_QUERY_ATTR_JOBID: - case EDG_WLL_QUERY_ATTR_PARENT: - if ( (XMLCtx->conditions[XMLCtx->row][XMLCtx->position].value.j = - edg_wll_from_string_to_jobid(XMLCtx)) == NULL ) - { - s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf); - if (XMLCtx->errtxt) { - asprintf(&e,"%s\n%s: invalid JobId at line %d", - XMLCtx->errtxt, s, - XML_GetCurrentLineNumber(XMLCtx->p)); - free(XMLCtx->errtxt); - } else asprintf(&e,"%s: invalid JobId at line %d", - s,XML_GetCurrentLineNumber(XMLCtx->p)); - XMLCtx->errtxt = e; - free(s); - } - break; - case EDG_WLL_QUERY_ATTR_OWNER: - // XXX - this is way how to pass NULL, user will be extracted from ssl partner later - /* XXX char_buf contains an escaped value, however there's nothing to escape in 'NULL' so we're fine */ - if (XMLCtx->char_buf != NULL && !strcmp(XMLCtx->char_buf,"NULL")) { - XMLCtx->conditions[XMLCtx->row][XMLCtx->position].value.c = NULL; - break; - } - else /* fall through */ - case EDG_WLL_QUERY_ATTR_LOCATION: - case EDG_WLL_QUERY_ATTR_DESTINATION: - case EDG_WLL_QUERY_ATTR_USERTAG: - XMLCtx->conditions[XMLCtx->row][XMLCtx->position].value.c = - edg_wll_from_string_to_string(XMLCtx); - break; - case EDG_WLL_QUERY_ATTR_STATUS: - case EDG_WLL_QUERY_ATTR_DONECODE: - case EDG_WLL_QUERY_ATTR_EXITCODE: - case EDG_WLL_QUERY_ATTR_RESUBMITTED: - if ( !XMLCtx->bound ) - { - XMLCtx->conditions[XMLCtx->row][XMLCtx->position].value.i = - edg_wll_from_string_to_int(XMLCtx); - XMLCtx->bound++; - } - else - XMLCtx->conditions[XMLCtx->row][XMLCtx->position].value2.i = - edg_wll_from_string_to_int(XMLCtx); - - break; - case EDG_WLL_QUERY_ATTR_TIME: - if ( !XMLCtx->bound ) - { - XMLCtx->conditions[XMLCtx->row][XMLCtx->position].value.t.tv_sec = - edg_wll_from_string_to_time_t(XMLCtx); - XMLCtx->bound++; - } - else - XMLCtx->conditions[XMLCtx->row][XMLCtx->position].value2.t.tv_sec = - edg_wll_from_string_to_time_t(XMLCtx); - break; - default: - edg_wll_freeBuf(XMLCtx); - XMLCtx->level--; - s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf); - if (XMLCtx->errtxt) { - asprintf(&e,"%s\n%s: invalid attribute type at line %d", - XMLCtx->errtxt, s, - XML_GetCurrentLineNumber(XMLCtx->p)); - free(XMLCtx->errtxt); - } else asprintf(&e,"%s: invalid attribute type at line %d", - s,XML_GetCurrentLineNumber(XMLCtx->p)); - XMLCtx->errtxt = e; - free(s); - break; - } - } - XMLCtx->char_buf = NULL; - XMLCtx->char_buf_len = 0; - XMLCtx->level--; -} - - -static void endQueryEventsRequest(void *data, const char *el UNUSED_VAR) -{ - edg_wll_XML_ctx *XMLCtx = data; - char *e, *s; - - if (XMLCtx->level == 2) { - if (!strcmp(XMLCtx->element,"orJobConditions")) { - /* make end-of-row */ - XMLCtx->job_conditions[XMLCtx->row] = realloc(XMLCtx->job_conditions[XMLCtx->row], - (++XMLCtx->position+1)*sizeof(**XMLCtx->job_conditions)); - memset(&XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position],0,sizeof(**XMLCtx->job_conditions)); - } - else if (!strcmp(XMLCtx->element,"orEventConditions")) { - /* make end-of-row */ - XMLCtx->event_conditions[XMLCtx->row2] = realloc(XMLCtx->event_conditions[XMLCtx->row2], - (++XMLCtx->position2+1)*sizeof(**XMLCtx->event_conditions)); - memset(&XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2],0,sizeof(**XMLCtx->event_conditions)); - } - } - else if (XMLCtx->level == 5) { - if (XMLCtx->type == EDG_WLL_QUERY_TYPE_JOB_CONDITION) { - switch (XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr) { - case EDG_WLL_QUERY_ATTR_JOBID: - case EDG_WLL_QUERY_ATTR_PARENT: - if ( (XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.j = - edg_wll_from_string_to_jobid(XMLCtx)) == NULL ) - { - s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf); - if (XMLCtx->errtxt) { - asprintf(&e,"%s\n%s: invalid JobId at line %d", - XMLCtx->errtxt, s, - XML_GetCurrentLineNumber(XMLCtx->p)); - free(XMLCtx->errtxt); - } else asprintf(&e,"%s: invalid JobId at line %d", - s,XML_GetCurrentLineNumber(XMLCtx->p)); - XMLCtx->errtxt = e; - free(s); - } - break; - case EDG_WLL_QUERY_ATTR_OWNER: - case EDG_WLL_QUERY_ATTR_LOCATION: - case EDG_WLL_QUERY_ATTR_DESTINATION: - case EDG_WLL_QUERY_ATTR_USERTAG: - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.c = - edg_wll_from_string_to_string(XMLCtx); - break; - case EDG_WLL_QUERY_ATTR_STATUS: - case EDG_WLL_QUERY_ATTR_DONECODE: - case EDG_WLL_QUERY_ATTR_EXITCODE: - case EDG_WLL_QUERY_ATTR_RESUBMITTED: - if ( !XMLCtx->bound ) - { - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.i = - edg_wll_from_string_to_int(XMLCtx); - XMLCtx->bound++; - } - else - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.i = - edg_wll_from_string_to_int(XMLCtx); - break; - case EDG_WLL_QUERY_ATTR_TIME: - if ( !XMLCtx->bound ) - { - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.t.tv_sec = - edg_wll_from_string_to_time_t(XMLCtx); - XMLCtx->bound++; - } - else - XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.t.tv_sec = - edg_wll_from_string_to_time_t(XMLCtx); - break; - default: - edg_wll_freeBuf(XMLCtx); - XMLCtx->level--; - s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf); - if (XMLCtx->errtxt) { - asprintf(&e,"%s\n%s: invalid attribute type at line %d", - XMLCtx->errtxt, s, - XML_GetCurrentLineNumber(XMLCtx->p)); - free(XMLCtx->errtxt); - } else asprintf(&e,"%s: invalid attribute type at line %d", - s,XML_GetCurrentLineNumber(XMLCtx->p)); - XMLCtx->errtxt = e; - free(s); - break; - } - } - else if (XMLCtx->type == EDG_WLL_QUERY_TYPE_EVENT_CONDITION) { - switch (XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].attr) { - case EDG_WLL_QUERY_ATTR_TIME: - if ( !XMLCtx->bound ) - { - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value.t.tv_sec = - edg_wll_from_string_to_time_t(XMLCtx); - XMLCtx->bound++; - } - else - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value2.t.tv_sec = - edg_wll_from_string_to_time_t(XMLCtx); - break; - case EDG_WLL_QUERY_ATTR_LEVEL: - case EDG_WLL_QUERY_ATTR_SOURCE: - case EDG_WLL_QUERY_ATTR_EVENT_TYPE: - if ( !XMLCtx->bound ) - { - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value.i = - edg_wll_from_string_to_int(XMLCtx); - XMLCtx->bound++; - } - else - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value2.i = - edg_wll_from_string_to_int(XMLCtx); - break; - case EDG_WLL_QUERY_ATTR_HOST: - case EDG_WLL_QUERY_ATTR_INSTANCE: - case EDG_WLL_QUERY_ATTR_USERTAG: - XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value.c = - edg_wll_from_string_to_string(XMLCtx); - break; - default: - edg_wll_freeBuf(XMLCtx); - XMLCtx->level--; - s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf); - if (XMLCtx->errtxt) { - asprintf(&e,"%s\n%s: invalid attribute type at line %d", - XMLCtx->errtxt, s, - XML_GetCurrentLineNumber(XMLCtx->p)); - free(XMLCtx->errtxt); - } else asprintf(&e,"%s: invalid attribute type at line %d", - s,XML_GetCurrentLineNumber(XMLCtx->p)); - XMLCtx->errtxt = e; - free(s); - break; - } - } - - XMLCtx->char_buf = NULL; - XMLCtx->char_buf_len = 0; - } - XMLCtx->level--; -} - - -static void endPurgeRequest(void *data, const char *el UNUSED_VAR) -{ - edg_wll_XML_ctx *XMLCtx = data; - char *e; - - if (XMLCtx->level == 2) { - if (!strcmp(XMLCtx->element,"flags")) - XMLCtx->purgeRequestGlobal.flags = edg_wll_from_string_to_int(XMLCtx); - } - else if (XMLCtx->level == 3) { - if (!strcmp(XMLCtx->element,"jobId")) { - if ( (XMLCtx->purgeRequestGlobal.jobs[XMLCtx->position++] = - edg_wll_from_string_to_string(XMLCtx)) == NULL ) - { - /* XXX char_buf contains an escaped value, unescaping is done within edg_wll_from_string_to_string(), which failed */ - if (XMLCtx->errtxt) { - asprintf(&e,"%s\n%s: invalid JobId at line %d", - XMLCtx->errtxt, XMLCtx->char_buf, - XML_GetCurrentLineNumber(XMLCtx->p)); - free(XMLCtx->errtxt); - } else asprintf(&e,"%s: invalid JobId at line %d", - XMLCtx->char_buf,XML_GetCurrentLineNumber(XMLCtx->p)); - XMLCtx->errtxt = e; - } - } - else if (!strcmp(XMLCtx->element,"time") && XMLCtx->char_buf) { - XMLCtx->purgeRequestGlobal.timeout[XMLCtx->position++] = - edg_wll_from_string_to_time_t(XMLCtx); - } - } - - XMLCtx->char_buf = NULL; - XMLCtx->char_buf_len = 0; - XMLCtx->level--; -} - - -static void endDumpRequest(void *data, const char *el UNUSED_VAR) -{ - edg_wll_XML_ctx *XMLCtx = data; - - if (XMLCtx->level == 2) { - if (!strcmp(XMLCtx->element,"from")) - XMLCtx->dumpRequestGlobal.from = edg_wll_from_string_to_time_t(XMLCtx); - else if (!strcmp(XMLCtx->element,"to")) - XMLCtx->dumpRequestGlobal.to = edg_wll_from_string_to_time_t(XMLCtx); - } - - XMLCtx->char_buf = NULL; - XMLCtx->char_buf_len = 0; - XMLCtx->level--; -} - -/* parse queryJobs request from client */ -int parseQueryJobsRequestV21(edg_wll_Context ctx, char *messageBody, edg_wll_QueryRec ***conditions, int *flags) -{ - int ret; - edg_wll_XML_ctx XMLCtx; - XML_Char *encoding = "ISO-8859-1"; - - errno = 0; - edg_wll_initXMLCtx(&XMLCtx); - XMLCtx.row = -1; - XMLCtx.ctx = ctx; - edg_wll_ResetError(ctx); - - - /* initialize parser */ - XMLCtx.p = XML_ParserCreate(encoding); - XML_SetElementHandler(XMLCtx.p, startQueryJobsRequest, endQueryJobsRequest); - XML_SetCharacterDataHandler(XMLCtx.p, char_handler); - XML_SetUserData(XMLCtx.p, (void *) &XMLCtx); - - - if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) { - char *errorMessage; - - asprintf(&errorMessage, "Parse error at line %d:\n%s\n", - XML_GetCurrentLineNumber(XMLCtx.p), - XML_ErrorString(XML_GetErrorCode(XMLCtx.p))); - - edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage); - free(errorMessage); - } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt); - - - if ((ret = edg_wll_Error(ctx,NULL,NULL))) { - int i,j; - - if (XMLCtx.conditions) { - for (j = 0; XMLCtx.conditions[j]; j++) { - for (i = 0; (XMLCtx.conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&XMLCtx.conditions[j][i]); - free(XMLCtx.conditions[j]); - } - free(XMLCtx.conditions); - } - - /* empty list terminators */ - conditions[0] = NULL; - *flags = 0; - } else { - *conditions = XMLCtx.conditions; - *flags = XMLCtx.flags; - } - - - XML_ParserFree(XMLCtx.p); - edg_wll_freeXMLCtx(&XMLCtx); - return ret; -} - - -/* parse queryEvents request from client */ -int parseQueryEventsRequestV21(edg_wll_Context ctx, char *messageBody, edg_wll_QueryRec ***job_conditions, edg_wll_QueryRec ***event_conditions) -{ - int ret; - edg_wll_XML_ctx XMLCtx; - XML_Char *encoding = "ISO-8859-1"; - - errno = 0; - edg_wll_initXMLCtx(&XMLCtx); - XMLCtx.row = -1; - XMLCtx.row2 = -1; - XMLCtx.ctx = ctx; - edg_wll_ResetError(ctx); - - - /* initialize parser */ - XMLCtx.p = XML_ParserCreate(encoding); - XML_SetElementHandler(XMLCtx.p, startQueryEventsRequest, endQueryEventsRequest); - XML_SetCharacterDataHandler(XMLCtx.p, char_handler); - XML_SetUserData(XMLCtx.p, (void *) &XMLCtx); - - - if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) { - char *errorMessage; - - asprintf(&errorMessage, "Parse error at line %d:\n%s\n", - XML_GetCurrentLineNumber(XMLCtx.p), - XML_ErrorString(XML_GetErrorCode(XMLCtx.p))); - - edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage); - free(errorMessage); - } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt); - - - if ((ret = edg_wll_Error(ctx,NULL,NULL))) { - int i,j; - - if (XMLCtx.job_conditions) { - for (j = 0; XMLCtx.job_conditions[j]; j++) { - for (i = 0 ; (XMLCtx.job_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&XMLCtx.job_conditions[j][i]); - free(XMLCtx.job_conditions[j]); - } - free(XMLCtx.job_conditions); - } - if (XMLCtx.event_conditions) { - for (j = 0; XMLCtx.event_conditions[j]; j++) { - for (i = 0 ; (XMLCtx.event_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ ) - edg_wll_QueryRecFree(&XMLCtx.event_conditions[j][i]); - free(XMLCtx.event_conditions[j]); - } - free(XMLCtx.event_conditions); - } - - /* empty list terminators */ - job_conditions[0] = NULL; - event_conditions[0] = NULL; - } else { - *job_conditions = XMLCtx.job_conditions; - *event_conditions = XMLCtx.event_conditions; - } - - - XML_ParserFree(XMLCtx.p); - edg_wll_freeXMLCtx(&XMLCtx); - return ret; -} - - - -/* parse purge request from client */ -int parsePurgeRequestV21(edg_wll_Context ctx, char *messageBody, edg_wll_PurgeRequest *request) -{ - int ret; - edg_wll_XML_ctx XMLCtx; - XML_Char *encoding = "ISO-8859-1"; - - errno = 0; - edg_wll_initXMLCtx(&XMLCtx); - XMLCtx.ctx = ctx; - edg_wll_ResetError(ctx); - - - /* initialize parser */ - XMLCtx.p = XML_ParserCreate(encoding); - XML_SetElementHandler(XMLCtx.p, startPurgeRequest, endPurgeRequest); - XML_SetCharacterDataHandler(XMLCtx.p, char_handler); - XML_SetUserData(XMLCtx.p, (void *) &XMLCtx); - - - if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) { - char *errorMessage; - - asprintf(&errorMessage, "Parse error at line %d:\n%s\n", - XML_GetCurrentLineNumber(XMLCtx.p), - XML_ErrorString(XML_GetErrorCode(XMLCtx.p))); - - edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage); - free(errorMessage); - } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt); - - - if ((ret = edg_wll_Error(ctx,NULL,NULL))) { - int i; - - if (XMLCtx.purgeRequestGlobal.jobs) { - for (i=0; XMLCtx.purgeRequestGlobal.jobs[i]; i++) - free(XMLCtx.purgeRequestGlobal.jobs[i]); - free(XMLCtx.purgeRequestGlobal.jobs); - } - memset(request,0,sizeof(*request)); - - } else { - memcpy(request, &XMLCtx.purgeRequestGlobal, sizeof(XMLCtx.purgeRequestGlobal)); - } - - - XML_ParserFree(XMLCtx.p); - edg_wll_freeXMLCtx(&XMLCtx); - return ret; -} - - - -/* parse dump request from client */ -int parseDumpRequestV21(edg_wll_Context ctx, char *messageBody, edg_wll_DumpRequest *request) -{ - int ret; - edg_wll_XML_ctx XMLCtx; - XML_Char *encoding = "ISO-8859-1"; - - errno = 0; - edg_wll_initXMLCtx(&XMLCtx); - XMLCtx.ctx = ctx; - edg_wll_ResetError(ctx); - - - /* initialize parser */ - XMLCtx.p = XML_ParserCreate(encoding); - XML_SetElementHandler(XMLCtx.p, startDumpRequest, endDumpRequest); - XML_SetCharacterDataHandler(XMLCtx.p, char_handler); - XML_SetUserData(XMLCtx.p, (void *) &XMLCtx); - - - if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) { - char *errorMessage; - - asprintf(&errorMessage, "Parse error at line %d:\n%s\n", - XML_GetCurrentLineNumber(XMLCtx.p), - XML_ErrorString(XML_GetErrorCode(XMLCtx.p))); - - edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage); - free(errorMessage); - } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt); - - - if ((ret = edg_wll_Error(ctx,NULL,NULL))) - memset(request,0,sizeof(*request)); - - else { - memcpy(request, &XMLCtx.dumpRequestGlobal, sizeof(XMLCtx.dumpRequestGlobal)); - } - - - XML_ParserFree(XMLCtx.p); - edg_wll_freeXMLCtx(&XMLCtx); - return ret; -} - - - -int edg_wll_QueryEventsToXMLV21(edg_wll_Context ctx UNUSED_VAR, edg_wll_Event *eventsOut, char **message) -{ - char *pomA, *pomB; - char **list = NULL; - int i = 0, len, tot_len = 0; - int *len_list = NULL; - - - while (eventsOut && eventsOut[i].any.type != EDG_WLL_EVENT_UNDEF) { - pomB = edg_wll_EventToString(eventsOut[i].any.type); - trio_asprintf(&pomA," \r\n", pomB); - free(pomB); - pomB = pomA; - - -@@@{ - selectType $event '_common_'; - for (getFieldsOrdered $event) { - my $f = selectField $event $_; - my $ft = $f->{type}; - my $n = $f->{null}; - gen "\tedg_wll_add_$ft\_to_XMLBody(&pomB, eventsOut[i].any.$_, \"$_\", $n);\n"; - } - - gen "\tswitch (eventsOut[i].any.type) {\n"; - for my $t (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } getTypes $event) { - if ($t ne 'any') { - selectType $event $t; - my $u = uc $t; - gen "\t case EDG_WLL_EVENT_$u :\n"; - for (getFieldsOrdered $event) { - my $f = selectField $event $_; - my $ft = $f->{type}; - my $n = $f->{null}; - $t = lcfirst $t; - if ($t =~ m/^pBS/) { $t = ucfirst $t; } - if ($t =~ m/^cREAM/) { $t = ucfirst $t; } - if ($t =~ m/^condor/) { $t = ucfirst $t; } - gen "\t\tedg_wll_add_$ft\_to_XMLBody(&pomB, eventsOut[i].$t.$_, \"$_\", $n);\n"; - } - gen "\t\tbreak;\n"; - } - } - gen "\t default : break;\n"; - gen "\t}\n"; -@@@} - - - - len = asprintf(&pomA,"%s \r\n", pomB); - free(pomB); - i++; - tot_len += len; - - list = (char **) realloc(list, i * sizeof(*list)); - list[i-1] = pomA; - len_list = (int *) realloc(len_list, i * sizeof(*len_list)); - len_list[i-1] = len; - - } - - /* list termination */ - list = (char **) realloc(list, (i+1) * sizeof(*list)); - list[i] = NULL; - - /* test errors */ - if (ctx->errDesc || ctx->errCode) - len = trio_asprintf(&pomB," code=\"%d\" desc=\"%|Xs\">\r\n",ctx->errCode,ctx->errDesc); - else - len = asprintf(&pomB,">\r\n"); - - /* glueing all list fields together & freeing the list */ - pomA = (char *) malloc(tot_len * sizeof(char) + - sizeof(QUERY_EVENTS_BEGIN) + len + sizeof(QUERY_EVENTS_END) - 1); - - memcpy(pomA, QUERY_EVENTS_BEGIN, sizeof(QUERY_EVENTS_BEGIN)); - memcpy(pomA + sizeof(QUERY_EVENTS_BEGIN) - 1, pomB, len); - free(pomB); - pomB = pomA + sizeof(QUERY_EVENTS_BEGIN) + len - 1; - - i = 0; - while (list[i]) { - memcpy(pomB, list[i], len_list[i] ); - pomB += len_list[i]; - - /* freeing the list */ - free(list[i]); - - i++; - } - - strcpy(pomB, QUERY_EVENTS_END); - - - free(list); - free(len_list); - - - *message = pomA; - - return 0; -} - -int edg_wll_QueryJobsToXMLV21(edg_wll_Context ctx, edg_wlc_JobId *jobsIn, edg_wll_JobStat *statesIn, char **message) -{ - char *pomA, *pomB, *pomC; - char **list = NULL; - int i = 0, len, tot_len = 0, nres = 0; - int *len_list = NULL; - - - if (jobsIn) for (nres = 0; jobsIn[nres]; nres++); - else if (statesIn) for (nres = 0; statesIn[nres].state; nres++); - - while (i < nres) { - trio_asprintf(&pomA,"\t\r\n"); - pomB = pomA; - - if (jobsIn) { - trio_asprintf(&pomA,"%s\t\t%|Xs\r\n", - pomB, pomC=edg_wlc_JobIdUnparse(jobsIn[i])); - free(pomC); - free(pomB); - pomB = pomA; - } - - if (statesIn) { - edg_wll_JobStatusToXMLV21(ctx, statesIn[i], &pomC); - trio_asprintf(&pomA,"%s\t\t%s",pomB,pomC); - } - else { - pomC = edg_wll_StatToString(EDG_WLL_JOB_UNKNOWN); - trio_asprintf(&pomA,"%s\t\t\r\n\r\n\t\t\r\n", - pomB, pomC); - } - - free(pomB); - free(pomC); - pomB = pomA; - - - len = asprintf(&pomA,"%s\t\r\n", pomB); - free(pomB); - i++; - tot_len += len; - - list = (char **) realloc(list, i * sizeof(*list)); - list[i-1] = pomA; - len_list = (int *) realloc(len_list, i * sizeof(*len_list)); - len_list[i-1] = len; - } - - /* list termination */ - list = (char **) realloc(list, (i+1) * sizeof(*list)); - list[i] = NULL; - - /* test errors */ - if (ctx->errDesc || ctx->errCode) - len = trio_asprintf(&pomB," code=\"%d\" desc=\"%|Xs\">\r\n",ctx->errCode,ctx->errDesc); - else - len = asprintf(&pomB,">\r\n"); - - /* glueing all list fields together & freeing the list */ - pomA = (char *) malloc(tot_len * sizeof(char) + - sizeof(QUERY_JOBS_BEGIN) + len + sizeof(QUERY_JOBS_END) - 1); - - memcpy(pomA, QUERY_JOBS_BEGIN, sizeof(QUERY_JOBS_BEGIN)); - memcpy((pomA + sizeof(QUERY_JOBS_BEGIN) - 1), pomB, len); - free(pomB); - pomB = pomA + sizeof(QUERY_JOBS_BEGIN) + len - 1; - - i = 0; - while (list[i]) { - memcpy(pomB, list[i], len_list[i] ); - pomB += len_list[i]; - - /* freeing the list */ - free(list[i]); - - i++; - } - - strcpy(pomB, QUERY_JOBS_END); - - - free(list); - free(len_list); - - - *message = pomA; - - return 0; -} - -/* construct Message-Body of Response-Line for edg_wll_UserJobs */ -int edg_wll_UserJobsToXMLV21(edg_wll_Context ctx UNUSED_VAR, edg_wlc_JobId *jobsOut, char **message) -{ - char *pomA, *pomB; - char **list = NULL; - int i = 0, len, tot_len = 0; - int *len_list = NULL; - - - while (jobsOut[i]) { - len = trio_asprintf(&pomA," %|Xs\r\n", - pomB=edg_wlc_JobIdUnparse(jobsOut[i])); - - free(pomB); - - i++; - tot_len += len; - - list = (char **) realloc(list, i * sizeof(*list)); - list[i-1] = pomA; - pomA = NULL; - len_list = (int *) realloc(len_list, i * sizeof(*len_list)); - len_list[i-1] = len; - - } - - /* list termination */ - list = (char **) realloc(list, (i+1) * sizeof(*list)); - list[i] = NULL; - - /* test errors */ - if (ctx->errDesc || ctx->errCode) - len = trio_asprintf(&pomB," code=\"%d\" desc=\"%|Xs\">\r\n",ctx->errCode,ctx->errDesc); - else - len = asprintf(&pomB,">\r\n"); - - /* glueing all list fields together & freeing the list */ - pomA = (char *) malloc(tot_len * sizeof(char) + - sizeof(USERJOBS_BEGIN) + len + sizeof(USERJOBS_END) - 1); - - memcpy(pomA, USERJOBS_BEGIN, sizeof(USERJOBS_BEGIN)); - memcpy((pomA + sizeof(USERJOBS_BEGIN) - 1), pomB, len); - free(pomB); - pomB = pomA + sizeof(USERJOBS_BEGIN) + len - 1; - - i = 0; - while (list[i]) { - memcpy(pomB, list[i], len_list[i] ); - pomB += len_list[i]; - - /* freeing the list */ - free(list[i]); - - i++; - } - - strcpy(pomB, USERJOBS_END); - - - free(list); - free(len_list); - - - *message = pomA; - - return 0; -} - -static void edg_wll_add_stslist_to_XMLBodyV21(edg_wll_Context ctx, char **body, const edg_wll_JobStat *toAdd, const char *tag, const char *UNUSED_subTag, const int null) -{ - char *pomA, *pomB, *newBody; - char **list = NULL; - int i = 0, len, tot_len = 0; - int *len_list = NULL; - - - while (toAdd[i].state != null) { - edg_wll_JobStatusToXMLV21(ctx, toAdd[i], &pomA); - len = strlen(pomA); - - i++; - tot_len += len; - - list = (char **) realloc(list, i * sizeof(*list)); - list[i-1] = pomA; - pomA = NULL; - len_list = (int *) realloc(len_list, i * sizeof(*len_list)); - len_list[i-1] = len; - } - - /* list termination */ - list = (char **) realloc(list, (i+1) * sizeof(*list)); - list[i] = NULL; - - /* glueing all list fields together & freeing the list */ - pomA = (char *) malloc(tot_len * sizeof(char) + 1); - pomB = pomA; - - i = 0; - while (list[i]) { - memcpy(pomB, list[i], len_list[i] ); - pomB += len_list[i]; - - /* freeing the list */ - free(list[i]); - - i++; - } - *pomB = '\0'; - free(list); - free(len_list); - - asprintf(&newBody,"%s\t\t\t<%s>\r\n%s\t\t\t\r\n", *body, tag, pomA, tag); - free(*body); - free(pomA); - *body = newBody; -} - - -/* construct Message-Body of Response-Line for edg_wll_JobStatus */ -int edg_wll_JobStatusToXMLV21(edg_wll_Context ctx, edg_wll_JobStat stat, char **message) -{ - char *pomA, *pomB, *pomC; - - - pomB = strdup(""); - -@@@{ - selectType $status '_common_'; - for (getFieldsOrdered $status) { - my $f = selectField $status $_; - next if defined($f->{special}) && $f->{special} eq 'XMLstructured'; - my $ft = $f->{type}; - my $n = $f->{null}; - gen "edg_wll_add_$ft\_to_XMLBody(&pomB, stat.$_, \"$_\", $n);\n"; - } -@@@} - if (stat.children) edg_wll_add_strlist_to_XMLBody(&pomB, stat.children, "children", "jobId", "\t\t\t", NULL); - if (stat.children_hist) edg_wll_add_intlist_to_XMLBody(&pomB, stat.children_hist, "children_hist", return_string_el, "\t\t\t", 1, stat.children_hist[0]); - if (stat.children_states) edg_wll_add_stslist_to_XMLBodyV21(ctx, &pomB, stat.children_states, "children_states", "", EDG_WLL_JOB_UNDEF); - if (stat.user_tags) edg_wll_add_taglist_to_XMLBody(&pomB, stat.user_tags, "user_tags", "tag", "name", "\t\t\t", NULL); - if (stat.stateEnterTimes) edg_wll_add_intlist_to_XMLBody(&pomB, stat.stateEnterTimes, "stateEnterTimes", return_string_el, "\t\t\t",1, stat.stateEnterTimes[0]); - - pomC = edg_wll_StatToString(stat.state); - - if (ctx->errDesc || ctx->errCode) - trio_asprintf(&pomA,"\r\n%s", - pomC, ctx->errCode,ctx->errDesc, pomB); - else - trio_asprintf(&pomA,"\r\n%s", - pomC, pomB); - - free(pomB); - free(pomC); - - *message = pomA; - - return 0; -} - - - -/* construct Message-Body of Request-Line for edg_wll_Purge */ -int edg_wll_PurgeResultToXMLV21( - edg_wll_Context ctx, - edg_wll_PurgeResult *result, - char **message) -{ - char *pomA, *pomB; - - - if (!result) { *message = NULL; return(-1); } - - pomA = strdup(""); - edg_wll_add_strlist_to_XMLBody(&pomA, result->jobs, "jobs", "jobId", "\t", NULL); - edg_wll_add_string_to_XMLBody(&pomA, result->server_file, "server_file", NULL); - - if (ctx->errDesc || ctx->errCode) - trio_asprintf(&pomA,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s", - PURGE_RESULT_BEGIN, ctx->errCode, ctx->errDesc, pomA, PURGE_RESULT_END); - else - trio_asprintf(&pomB,"%s>\r\n%s%s", PURGE_RESULT_BEGIN, pomA, PURGE_RESULT_END); - free(pomA); - - *message = pomB; - return 0; -} - - - -/* construct Message-Body of Request-Line for edg_wll_Dump */ -int edg_wll_DumpResultToXMLV21( - edg_wll_Context ctx, - edg_wll_DumpResult *result, - char **message) -{ - char *pomA, *pomB; - - - if (!result) { *message = NULL; return(-1); } - - pomA = strdup(""); - edg_wll_add_string_to_XMLBody(&pomA, result->server_file, "server_file", NULL); - edg_wll_add_time_t_to_XMLBody(&pomA, result->from, "from", 0); - edg_wll_add_time_t_to_XMLBody(&pomA, result->to, "to", 0); - - if (ctx->errDesc || ctx->errCode) - trio_asprintf(&pomB,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s", - DUMP_RESULT_BEGIN, ctx->errCode, ctx->errDesc, pomA, DUMP_RESULT_END); - else - trio_asprintf(&pomB,"%s>\r\n%s%s", DUMP_RESULT_BEGIN, pomA, DUMP_RESULT_END); - free(pomA); - - *message = pomB; - return 0; -} diff --git a/org.glite.lb.server/src/lb_xml_parse_V21.h b/org.glite.lb.server/src/lb_xml_parse_V21.h deleted file mode 100644 index 7168f6f..0000000 --- a/org.glite.lb.server/src/lb_xml_parse_V21.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef GLITE_LB_LB_XML_PARSE_V21_H -#define GLITE_LB_LB_XML_PARSE_V21_H - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include "glite/lb/context.h" -#include "glite/lb/jobstat.h" -#include "glite/lb/query_rec.h" - -/* function for parsing/unparsing XML requests from client */ - -int parseQueryJobsRequestV21(edg_wll_Context ctx, char *messageBody, edg_wll_QueryRec ***conditions, int *flags); -int parseQueryEventsRequestV21(edg_wll_Context ctx, char *messageBody, edg_wll_QueryRec ***job_conditions, edg_wll_QueryRec ***event_conditions); -int parsePurgeRequestV21(edg_wll_Context ctx, char *messageBody, edg_wll_PurgeRequest *request); -int parseDumpRequestV21(edg_wll_Context ctx, char *messageBody, edg_wll_DumpRequest *request); -int edg_wll_QueryEventsToXMLV21(edg_wll_Context, edg_wll_Event *, char **); -int edg_wll_QueryJobsToXMLV21(edg_wll_Context, edg_wlc_JobId *, edg_wll_JobStat *, char **); -int edg_wll_JobStatusToXMLV21(edg_wll_Context, edg_wll_JobStat, char **); -int edg_wll_UserJobsToXMLV21(edg_wll_Context, edg_wlc_JobId *, char **); -int edg_wll_PurgeResultToXMLV21(edg_wll_Context ctx, edg_wll_PurgeResult *result, char **message); -int edg_wll_DumpResultToXMLV21(edg_wll_Context ctx, edg_wll_DumpResult *result, char **message); - -#endif /* GLITE_LB_LB_XML_PARSE_V21_H */ diff --git a/org.glite.lb.server/src/lcas_lb.c b/org.glite.lb.server/src/lcas_lb.c deleted file mode 100644 index 57e9b34..0000000 --- a/org.glite.lb.server/src/lcas_lb.c +++ /dev/null @@ -1,126 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include - -#include -#include -#include -#include -#include "authz_policy.h" -#include "lb_authz.h" - -static char *modname = "lcas_lb"; -static char *authfile = NULL; - -int -plugin_initialize(int argc, char *argv[]) -{ - lcas_log_debug(1, "%s-plugin_initialize()\n",modname); - - return LCAS_MOD_SUCCESS; -} - -int -plugin_confirm_authorization(lcas_request_t request, lcas_cred_id_t lcas_cred) -{ - char *user_dn; - int ret; - edg_wll_Context ctx; - struct _edg_wll_GssPrincipal_data princ; - X509 *cert = NULL; - STACK_OF(X509) * chain = NULL; - void *cred = NULL; - struct vomsdata *voms_info = NULL; - int err; - authz_action action; - - memset(&princ, 0, sizeof(princ)); - - lcas_log_debug(1,"\t%s-plugin: checking LB access policy\n", - modname); - - edg_wll_InitContext(&ctx); - - if ((action = find_authz_action(request)) == ACTION_UNDEF) { - lcas_log(0, "lcas.mod-lb() error: unsupported action\n"); - ret = LCAS_MOD_FAIL; - goto end; - } - - user_dn = lcas_get_dn(lcas_cred); - if (user_dn == NULL) { - lcas_log(0, "lcas.mod-lb() error: user DN empty\n"); - ret = LCAS_MOD_FAIL; - goto end; - } - princ.name = user_dn; - - cred = lcas_get_gss_cred(lcas_cred); - if (cred == NULL) { - lcas_log(0, "lcas.mod-lb() warning: user gss credential empty\n"); -#if 0 - ret = LCAS_MOD_FAIL; - goto end; -#endif - } - - if (cred) { - voms_info = VOMS_Init(NULL, NULL); - if (voms_info == NULL) { - lcas_log(0, "lcas.mod-lb() failed to initialize VOMS\n"); - ret = LCAS_MOD_FAIL; - goto end; - } - - ret = VOMS_RetrieveFromCred(cred, RECURSE_CHAIN, voms_info, &err); - if (ret == 1) - edg_wll_get_fqans(ctx, voms_info, &princ.fqans); - } - - ret = check_authz_policy(edg_wll_get_server_policy(), &princ, action); - ret = (ret == 1) ? LCAS_MOD_SUCCESS : LCAS_MOD_FAIL; - -end: - edg_wll_FreeContext(ctx); - if (voms_info) - VOMS_Destroy(voms_info); - if (cert) - X509_free(cert); - if (chain) - sk_X509_pop_free(chain, X509_free); - - return ret; -} - -int -plugin_terminate() -{ - lcas_log_debug(1, "%s-plugin_terminate(): terminating\n",modname); - - if (authfile) { - free(authfile); - authfile = NULL; - } - - return LCAS_MOD_SUCCESS; -} diff --git a/org.glite.lb.server/src/load.c b/org.glite.lb.server/src/load.c deleted file mode 100644 index e1d5ca1..0000000 --- a/org.glite.lb.server/src/load.c +++ /dev/null @@ -1,241 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "glite/lbu/trio.h" -#include "glite/lbu/log.h" - -#include "glite/lb/context-int.h" -#include "glite/lb/events_parse.h" -#include "glite/lb/ulm_parse.h" -#include "glite/lb/events.h" - -#include "store.h" -#include "purge.h" -#include "query.h" -#include "get_events.h" -#include "server_state.h" -#include "db_supp.h" -#include "lb_proto.h" - -static int read_line(char **buff, size_t *maxsize, int fd); - -int edg_wll_LoadEventsServer(edg_wll_Context ctx,const edg_wll_LoadRequest *req,edg_wll_LoadResult *result) -{ - int fd, - reject_fd = -1, - readret, i, ret; - size_t maxsize; - char *line = NULL, *errdesc, - buff[30]; - edg_wll_Event *event; - edg_wlc_JobId jobid = NULL; - - - edg_wll_ResetError(ctx); - - if ( !req->server_file ) - return edg_wll_SetError(ctx, EINVAL, "Server file is not specified for load"); - - if ( (fd = open(req->server_file, O_RDONLY)) == -1 ) - return edg_wll_SetError(ctx, errno, "Server can not open the file"); - - memset(result,0,sizeof(*result)); - i = 0; - while ( 1 ) - { - /* Read one line - */ - if ( (readret = read_line(&line, &maxsize, fd)) == -1 ) { - return edg_wll_SetError(ctx, errno, "reading dump file"); - } - - if ( readret == 0 ) - break; - - i++; - if ( sscanf(line, "DG.ARRIVED=%s %*s", buff) != 1 - || edg_wll_ParseEvent(ctx, line, &event) ) - { - char errs[100]; - sprintf(errs, "Error parsing event at line %d", i); - if ( !edg_wll_Error(ctx,NULL,NULL) ) - edg_wll_SetError(ctx, EINVAL, errs); - fprintf(stderr, errs); - continue; - } - edg_wll_ULMDateToTimeval(buff, &(event->any.arrived)); - - if ( i == 1 ) - { - result->from = event->any.arrived.tv_sec; - result->to = event->any.arrived.tv_sec; - } - ctx->event_load = 1; - - do { - if (edg_wll_Transaction(ctx)) goto err; - - edg_wll_StoreEvent(ctx, event, line, NULL); - - } while (edg_wll_TransNeedRetry(ctx)); - - if ((ret = edg_wll_Error(ctx, NULL, &errdesc)) != 0) { - int len = strlen(line), - total = 0, - written; - - glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, "Can't store event: %s", errdesc); - if ( reject_fd == -1 ) - { - char *s, *s1; - - if ( result->server_file != NULL ) - goto cycle_clean; - - s1 = strdup(req->server_file); - s = strrchr(s1, '/'); - if ( s ) - { - *s = '\0'; - reject_fd = edg_wll_CreateFileStorage(ctx,FILE_TYPE_LOAD,s1,&(result->server_file)); - } - else - reject_fd = edg_wll_CreateFileStorage(ctx,FILE_TYPE_LOAD,NULL,&(result->server_file)); - if ( reject_fd == -1 ) - goto cycle_clean; - glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "New reject file %s created", result->server_file); - free(s1); - } - /* Save the line into "reject_file" - */ - while (total != len) { - written = write(reject_fd, line+total, len-total); - if (written < 0 && errno != EAGAIN) { - edg_wll_SetError(ctx, errno, "writing load reject file"); - free(line); - break; - } - total += written; - } - write(reject_fd,"\n",1); - } - else { - result->to = event->any.arrived.tv_sec; - if ( jobid ) - { - char *md5_jobid = edg_wlc_JobIdGetUnique(jobid); - - if ( strcmp(md5_jobid, edg_wlc_JobIdGetUnique(event->any.jobId)) ) - { - edg_wll_JobStat st; - - edg_wll_JobStatusServer(ctx, jobid, 0, &st); - edg_wll_FreeStatus(&st); - - edg_wlc_JobIdFree(jobid); - edg_wlc_JobIdDup(event->any.jobId, &jobid); - } - free(md5_jobid); - } - else - edg_wlc_JobIdDup(event->any.jobId, &jobid); - } - - -cycle_clean: - ctx->event_load = 0; - edg_wll_FreeEvent(event); - } - -err: - if ( jobid ) - { - edg_wll_JobStat st; - - edg_wll_JobStatusServer(ctx, jobid, 0, &st); - edg_wll_FreeStatus(&st); - edg_wlc_JobIdFree(jobid); - } - - if ( reject_fd != -1 ) - close(reject_fd); - - return edg_wll_Error(ctx,NULL,NULL); -} - -#define BUFFSZ 1024 - -static int read_line(char **buff, size_t *maxsize, int fd) -{ - int ct, i; - void *tmp; - - - if ( *buff == NULL ) - { - *buff = malloc(BUFFSZ); - if ( *buff == NULL ) - return -1; - *maxsize = BUFFSZ; - } - - i = 0; - while ( 1 ) - { - if (i >= *maxsize) { - (*maxsize) *= 2; - if ((tmp = realloc(*buff, *maxsize)) == NULL) return -1; - *buff = (char *)tmp; - } - if ( (ct = read(fd, (*buff)+i, 1)) == -1 ) - return -1; - - if ( ct == 0 ) - return 0; - - if ( (*buff)[i] == '\n' ) - { - (*buff)[i--] = '\0'; - while ( (i != -1) && isspace((*buff)[i]) ) i--; - if ( i == -1 ) - { - /** empty line - */ - i = 0; - continue; - } - else - return 1; - } - - i++; - } -} - diff --git a/org.glite.lb.server/src/mon-db.c b/org.glite.lb.server/src/mon-db.c deleted file mode 100644 index c1ccf62..0000000 --- a/org.glite.lb.server/src/mon-db.c +++ /dev/null @@ -1,131 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include -#include - -#include "glite/jobid/strmd5.h" -#include "glite/lb/context-int.h" -#include "glite/lb/jobstat.h" -#include "db_supp.h" -#include "openserver.h" - -#ifdef LB_PERF -#include "glite/lb/lb_perftest.h" -#include "srv_perf.h" - -enum lb_srv_perf_sink sink_mode; -#endif - -/* XXX: referenced global variables, unsed in mon */ -char *server_key,*server_cert; -int enable_lcas; -int proxy_purge; -struct _edg_wll_authz_policy authz_policy; -char *policy_file; - -static struct option opts[] = { - { "mysql",1,NULL,'m' }, - { "debug",0,NULL,'d' }, - { "verbose",0,NULL,'v' }, - { NULL, 0, NULL, 0 } -}; - -int debug = 0; - -static void usage(); -static void do_exit(edg_wll_Context,int); -static const char *me; - -int main(int argc,char **argv) -{ - int opt, caps; - char *dbstring = getenv("LBDB"); - int verbose = 0, rows = 0, fields = 0, njobs = 0, i; - edg_wll_Context ctx; - char *stmt = NULL, *status = NULL; - char *str[2]; - glite_lbu_Statement sh; - int jobs[EDG_WLL_NUMBER_OF_STATCODES]; - - me = strdup(argv[0]); - - while ((opt = getopt_long(argc,argv,"m:dv",opts,NULL)) != EOF) switch (opt) { - case 'm': dbstring = optarg; break; - case 'd': debug++; verbose++; break; - case 'v': verbose++; break; - case '?': usage(); exit(EX_USAGE); - } - - edg_wll_InitContext(&ctx); - for (i = 1; idbctx)) < 0 || !(caps & GLITE_LBU_DB_CAP_INDEX)) do_exit(ctx,EX_SOFTWARE); - if (asprintf(&stmt,"SELECT status,count(status) FROM states GROUP BY status;") < 0) do_exit(ctx,EX_OSERR); - if (verbose) fprintf(stderr,"mysql query: %s\n",stmt); - if ((rows = edg_wll_ExecSQL(ctx,stmt,&sh)) < 0) do_exit(ctx,EX_SOFTWARE); - if (verbose) fprintf(stderr,"number of states returned: %d\n",rows); - if (rows > 0) fprintf(stdout,"Number of jobs in each state: \n"); - for (i = 0; i < rows; i++) { - fields = edg_wll_FetchRow(ctx, sh, sizeof(str)/sizeof(str[0]),NULL,str); - if (fields != 2) { - glite_lbu_FreeStmt(&sh); - do_exit(ctx,EX_SOFTWARE); - } - jobs[atoi(str[0])] = atoi(str[1]); - if (str[0]) free(str[0]); - if (str[1]) free(str[1]); - } - for (i = 1; i\n" - " -m,--mysql use non-default database connection\n" - " -d,--debug print debug info (if any)\n" - " -v,--verbose be verbose\n", - me); -} diff --git a/org.glite.lb.server/src/notif_match.c b/org.glite.lb.server/src/notif_match.c deleted file mode 100644 index 1d0b9f1..0000000 --- a/org.glite.lb.server/src/notif_match.c +++ /dev/null @@ -1,265 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include -#include - -#include "glite/lb/context-int.h" -#include "glite/lbu/trio.h" -#include "glite/lbu/log.h" - -#include "lb_authz.h" -#include "lb_xml_parse.h" -#include "query.h" -#include "il_notification.h" -#include "db_supp.h" -#include "index.h" -#include "authz_policy.h" - -static int notif_match_conditions(edg_wll_Context,const edg_wll_JobStat *,const edg_wll_JobStat *,const char *); -static int notif_check_acl(edg_wll_Context,const edg_wll_JobStat *,const char *, int *); - -extern int debug; - -int edg_wll_NotifExpired(edg_wll_Context,const char *); - -int edg_wll_NotifMatch(edg_wll_Context ctx, const edg_wll_JobStat *oldstat, const edg_wll_JobStat *stat) -{ - edg_wll_NotifId nid = NULL; - char *jobq,*ju = NULL,*jobc[6]; - glite_lbu_Statement jobs = NULL; - int ret,i,authz_flags = 0; - time_t expires,now = time(NULL); - - char *cond_where = NULL; - char *cond_and_where = NULL; - - edg_wll_ResetError(ctx); - - if (ctx->notif_index) { - edg_wll_IColumnRec *notif_index_cols = ctx->notif_index_cols; - - for (i=0; notif_index_cols[i].qrec.attr; i++) { - char *val = NULL; - - if (notif_index_cols[i].qrec.attr != EDG_WLL_QUERY_ATTR_JDL_ATTR) { - val = edg_wll_StatToSQL(stat,notif_index_cols[i].qrec.attr); - assert(val != (char *) -1); - } - else { // Special Treatment for JDL attributes - val = edg_wll_JDLStatToSQL(stat,notif_index_cols[i].qrec); - } - - if (val) { - char *aux; - if (!cond_where) cond_where = strdup(""); - trio_asprintf(&aux, "%s or %s = %s",cond_where, - notif_index_cols[i].colname,val); - free(cond_where); - cond_where = aux; - free(val); - } - else if (notif_index_cols[i].qrec.attr == EDG_WLL_QUERY_ATTR_JDL_ATTR) { - char *aux; - if (!cond_and_where) cond_and_where = strdup(""); - trio_asprintf(&aux, "%s AND %s is NULL",cond_and_where, - notif_index_cols[i].colname); - free(cond_and_where); - cond_and_where = aux; - free(val); - } - } - } - - if ( (ret = edg_wll_NotifIdCreate(ctx->srvName, ctx->srvPort, &nid)) ) - { - edg_wll_SetError(ctx, ret, "edg_wll_NotifMatch()"); - goto err; - } - - trio_asprintf(&jobq, - "select distinct n.notifid,n.destination,n.valid,u.cert_subj,n.conditions,n.flags " - "from notif_jobs j,users u,notif_registrations n " - "where j.notifid=n.notifid and n.userid=u.userid " - " and (j.jobid = '%|Ss' or j.jobid = '%|Ss' %s) %s", - ju = edg_wlc_JobIdGetUnique(stat->jobId),NOTIF_ALL_JOBS,cond_where ? cond_where : "",cond_and_where ? cond_and_where : ""); - - free(ju); ju = NULL; - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, jobq); - - if (edg_wll_ExecSQL(ctx,jobq,&jobs) < 0) goto err; - - while ((ret = edg_wll_FetchRow(ctx,jobs,sizeof(jobc)/sizeof(jobc[0]),NULL,jobc)) > 0) { - if (now > (expires = glite_lbu_StrToTime(jobc[2]))) { - edg_wll_NotifExpired(ctx,jobc[0]); - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, "[%d] NOTIFY:%s expired at %s UTC", - getpid(),jobc[0],asctime(gmtime(&expires))); - } - else if (notif_match_conditions(ctx,oldstat,stat,jobc[4]) && - notif_check_acl(ctx,stat,jobc[3], &authz_flags)) - { - char *dest, *aux; - int port; - - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, "NOTIFY: %s, job %s", jobc[0], ju = edg_wlc_JobIdGetUnique(stat->jobId)); - free(ju); ju = NULL; - - dest = strdup(jobc[1]); - if ( !(aux = strchr(dest, ':')) ) - { - edg_wll_SetError(ctx, EINVAL, "Can't parse notification destination"); - free(dest); - for (i=0; ip_instance = strdup(""); - if ( edg_wll_NotifJobStatus(ctx, nid, dest, port, jobc[3], atoi(jobc[5]), authz_flags, expires, *stat) ) - { - free(dest); - for (i=0; ip_instance); ctx->p_instance = NULL; - if ( nid ) edg_wll_NotifIdFree(nid); - free(jobq); - glite_lbu_FreeStmt(&jobs); - return edg_wll_Error(ctx,NULL,NULL); -} - -int edg_wll_NotifExpired(edg_wll_Context ctx,const char *notif) -{ - char *dn = NULL,*dj = NULL; - - trio_asprintf(&dn,"delete from notif_registrations where notifid='%|Ss'",notif); - trio_asprintf(&dj,"delete from notif_jobs where notifid='%|Ss'",notif); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, dn); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, dj); - - if (edg_wll_ExecSQL(ctx,dn,NULL) < 0 || - edg_wll_ExecSQL(ctx,dj,NULL) < 0) - { - char *et,*ed; - edg_wll_Error(ctx,&et,&ed); - - glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, - "delete notification %s: %s (%s)", notif, et, ed); - free(et); free(ed); - } - - free(dn); - free(dj); - return edg_wll_ResetError(ctx); -} - - -static int notif_match_conditions(edg_wll_Context ctx,const edg_wll_JobStat *oldstat, const edg_wll_JobStat *stat,const char *cond) -{ - edg_wll_QueryRec **c,**p; - int match,i; - - if (!cond) return 1; - - if (parseJobQueryRec(ctx,cond,strlen(cond),&c)) { - glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, - "notif_match_conditions(): parseJobQueryRec failed"); - - return 1; - } - - match = match_status(ctx,oldstat,stat,(const edg_wll_QueryRec **) c); - if ( c ) - { - for (p = c; *p; p++) { - for (i=0; (*p)[i].attr; i++) - edg_wll_QueryRecFree((*p)+i); - free(*p); - } - free(c); - } - return match; -} - -/* FIXME: does not favour any VOMS information in ACL - * effective VOMS groups of the recipient are not available here, should be - * probably stored along with the registration. - */ -static int notif_check_acl(edg_wll_Context ctx,const edg_wll_JobStat *stat,const char *recip, int *authz_flags) -{ - edg_wll_Acl acl = calloc(1,sizeof *acl); - int ret; - struct _edg_wll_GssPrincipal_data princ; - - memset(&princ, 0, sizeof(princ)); - *authz_flags = 0; - - edg_wll_ResetError(ctx); - if (strcmp(stat->owner,recip) == 0 - || edg_wll_amIroot(recip,NULL,&ctx->authz_policy)) return 1; - princ.name = (char *)recip; - if (check_authz_policy(&ctx->authz_policy, &princ, READ_ALL)) - return 1; - - if (stat->acl) { - ret = edg_wll_DecodeACL(stat->acl,&acl->value); - if (ret) { - edg_wll_FreeAcl(acl); - edg_wll_SetError(ctx,EINVAL,"decoding ACL"); - return 0; - } - - acl->string = stat->acl; - ret = edg_wll_CheckACL(ctx, acl, EDG_WLL_CHANGEACL_READ); - acl->string = NULL; - edg_wll_FreeAcl(acl); - if (ret == 0) - return 1; - edg_wll_ResetError(ctx); - } - - if (check_authz_policy(&ctx->authz_policy, &princ, STATUS_FOR_MONITORING)) { - *authz_flags |= STATUS_FOR_MONITORING; - return 1; - } - - return 0; -} diff --git a/org.glite.lb.server/src/notification.c b/org.glite.lb.server/src/notification.c deleted file mode 100644 index 34e9bc8..0000000 --- a/org.glite.lb.server/src/notification.c +++ /dev/null @@ -1,883 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include - -#include "glite/jobid/strmd5.h" -#include "glite/lbu/trio.h" -#include "glite/lb/context-int.h" -#include "glite/lb/xml_parse.h" -#include "glite/lbu/log.h" - -#include "il_notification.h" -#include "query.h" -#include "db_supp.h" -#include "index.h" - - -static char *get_user(edg_wll_Context ctx, int create); -static int check_notif_request(edg_wll_Context, const edg_wll_NotifId, char **, char **); -static int split_cond_list(edg_wll_Context, edg_wll_QueryRec const * const *, - edg_wll_QueryRec ***, char ***); -static int update_notif(edg_wll_Context, const edg_wll_NotifId, - const char *, const char *, const char *); - -static int get_indexed_cols(edg_wll_Context,char const *,edg_wll_QueryRec **,char **); -static void adjust_validity(edg_wll_Context,time_t *); -static int drop_notif_request(edg_wll_Context, const edg_wll_NotifId); -static int check_notif_age(edg_wll_Context, const edg_wll_NotifId); - - -int edg_wll_NotifNewServer( - edg_wll_Context ctx, - edg_wll_QueryRec const * const *conditions, - int flags, - char const *address_override, - const edg_wll_NotifId nid, - time_t *valid) -{ - int i; - char *q = NULL, - *nid_s = NULL, - *time_s = NULL, - *addr_s = NULL, - *xml_conds = NULL, - *owner = NULL, - **jobs = NULL; - edg_wll_QueryRec **nconds = NULL; - char *add_index = NULL; - - - /* Format notification ID - */ - if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) ) - goto cleanup; - - /* Get notification owner - */ - if ( !(owner = get_user(ctx, 1)) ) - goto cleanup; - - /* Format conditions - * - separate all jobids - * - format new condition list without jobids - */ - if ( split_cond_list(ctx, conditions, &nconds, &jobs) ) - goto cleanup; - - - /* - * encode new cond. list into a XML string - */ - if ( edg_wll_JobQueryRecToXML(ctx, (edg_wll_QueryRec const * const *) nconds, &xml_conds) ) - { - /* XXX: edg_wll_JobQueryRecToXML() do not set errors in context! - * can't get propper error number :( - */ - edg_wll_SetError(ctx, errno, "Can't encode data into xml"); - goto cleanup; - } - - /* Format time of validity - */ - - if (*valid == 0) - *valid = time(NULL) + ctx->notifDuration; - adjust_validity(ctx,valid); - - glite_lbu_TimeToStr(*valid, &time_s); - if ( !time_s ) - { - edg_wll_SetError(ctx, errno, NULL); - goto cleanup; - } - - /* Format the address - */ - if ( address_override ) - { - char *aux; - - if ( !(aux = strrchr(address_override, ':')) ) - { - edg_wll_SetError(ctx, EINVAL, "Addres overrirde not in format host:port"); - goto cleanup; - } - if ( !strncmp(address_override, "0.0.0.0", aux-address_override) || - !strncmp(address_override, "::", aux-address_override) ) - trio_asprintf(&addr_s, "%s:%s", ctx->connections->serverConnection->peerName, aux+1); - } - - do { - if (edg_wll_Transaction(ctx) != 0) goto cleanup; - - /* Format DB insert statement - */ - trio_asprintf(&q, - "insert into notif_registrations(notifid,destination,valid,userid,conditions,flags) " - "values ('%|Ss','%|Ss',%s,'%|Ss', '%|Ss', '%d')", - nid_s, addr_s? addr_s: address_override, time_s, owner, xml_conds, flags); - - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, - q); - if ( edg_wll_ExecSQL(ctx, q, NULL) < 0 ) - goto rollback; - - if (get_indexed_cols(ctx,nid_s,nconds,&add_index) || - (add_index && edg_wll_ExecSQL(ctx,add_index,NULL) < 0) - ) goto rollback; - - - if (jobs) for ( i = 0; jobs[i]; i++ ) - { - free(q); - trio_asprintf(&q, - "insert into notif_jobs(notifid,jobid) values ('%|Ss','%|Ss')", - nid_s, jobs[i]); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, - LOG_PRIORITY_DEBUG, q); - if ( edg_wll_ExecSQL(ctx, q, NULL) < 0 ) - goto rollback; - } - else { - trio_asprintf(&q,"insert into notif_jobs(notifid,jobid) values ('%|Ss','%|Ss')", - nid_s,NOTIF_ALL_JOBS); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, - LOG_PRIORITY_DEBUG, q); - if ( edg_wll_ExecSQL(ctx, q, NULL) < 0 ) goto rollback; - - } - -rollback: - free(q); q= NULL; - free(add_index); add_index = NULL; - - } while (edg_wll_TransNeedRetry(ctx)); - -cleanup: - if ( q ) free(q); - if ( nid_s ) free(nid_s); - if ( time_s ) free(time_s); - if ( addr_s ) free(addr_s); - if ( xml_conds ) free(xml_conds); - if ( owner ) free(owner); - if ( jobs ) - { - for ( i = 0; jobs[i]; i++ ) - free(jobs[i]); - free(jobs); - } - if ( nconds ) free(nconds); - free(add_index); - - return edg_wll_Error(ctx, NULL, NULL); -} - - -int edg_wll_NotifBindServer( - edg_wll_Context ctx, - const edg_wll_NotifId nid, - const char *address_override, - time_t *valid) -{ - char *time_s = NULL, - *addr_s = NULL; - - - if ( !address_override ) - { - edg_wll_SetError(ctx, EINVAL, "Address parameter not given"); - goto err; - } - - do { - if (edg_wll_Transaction(ctx) != 0) goto err; - - if ( check_notif_request(ctx, nid, NULL, NULL) ) - goto rollback; - - if ( check_notif_age(ctx, nid) ) { - drop_notif_request(ctx, nid); - goto rollback; - } - - /* Format time of validity - */ - - if (*valid == 0) - *valid = time(NULL) + ctx->notifDuration; - adjust_validity(ctx,valid); - - glite_lbu_TimeToStr(*valid, &time_s); - if ( !time_s ) - { - edg_wll_SetError(ctx, errno, "Formating validity time"); - goto rollback; - } - - /* Format the address - */ - if ( address_override ) - { - char *aux; - - if ( !(aux = strrchr(address_override, ':')) ) - { - edg_wll_SetError(ctx, EINVAL, "Addres overrirde not in format host:port"); - goto rollback; - } - if ( !strncmp(address_override, "0.0.0.0", aux-address_override) || - !strncmp(address_override, "::", aux-address_override) ) - trio_asprintf(&addr_s, "%s:%s", ctx->connections->serverConnection->peerName, aux+1); - } - - - update_notif(ctx, nid, NULL, addr_s? addr_s: address_override, (const char *)(time_s)); - -rollback: - free(time_s); time_s = NULL; - free(addr_s); addr_s = NULL; - - } while (edg_wll_TransNeedRetry(ctx)); - -err: - return edg_wll_Error(ctx, NULL, NULL); -} - - -int edg_wll_NotifChangeServer( - edg_wll_Context ctx, - const edg_wll_NotifId nid, - edg_wll_QueryRec const * const *conditions, - edg_wll_NotifChangeOp op) -{ - int i; - char *q = NULL, - *nid_s = NULL, - *xml_conds = NULL, - **jobs = NULL; - edg_wll_QueryRec **nconds = NULL; - - - /* Format notification ID - */ - if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) ) - goto err; - - do { - if (edg_wll_Transaction(ctx) != 0) goto err; - - if ( check_notif_request(ctx, nid, NULL, NULL) ) - goto rollback; - - if ( check_notif_age(ctx, nid) ) { - drop_notif_request(ctx, nid); - goto rollback; - } - - switch ( op ) - { - case EDG_WLL_NOTIF_REPLACE: - /* Format conditions - * - separate all jobids - * - format new condition list without jobids - */ - if ( split_cond_list(ctx, conditions, &nconds, &jobs) ) - goto rollback; - - /* - * encode new cond. list into a XML string - */ - if ( edg_wll_JobQueryRecToXML(ctx, (edg_wll_QueryRec const * const *) nconds, &xml_conds) ) - { - /* XXX: edg_wll_JobQueryRecToXML() do not set errors in context! - * can't get propper error number :( - */ - edg_wll_SetError(ctx, errno, "Can't encode data into xml"); - goto rollback; - } - - /* Format DB insert statement - */ - if ( update_notif(ctx, nid, xml_conds, NULL, NULL) ) - goto rollback; - - if ( jobs ) - { - /* Format DB insert statement - */ - trio_asprintf(&q, "delete from notif_jobs where notifid='%|Ss'", nid_s); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, - LOG_PRIORITY_DEBUG, q); - if ( edg_wll_ExecSQL(ctx, q, NULL) < 0 ) - goto rollback; - - for ( i = 0; jobs[i]; i++ ) - { - free(q); - trio_asprintf(&q, - "insert into notif_jobs(notifid,jobid) values ('%|Ss','%|Ss')", - nid_s, jobs[i]); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, q); - if ( edg_wll_ExecSQL(ctx, q, NULL) < 0 ) - { - /* XXX: Remove uncoplete registration? - * Which error has to be returned? - */ - free(q); - trio_asprintf(&q, "delete from notif_jobs where notifid='%|Ss'", nid_s); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, q); - edg_wll_ExecSQL(ctx, q, NULL); - free(q); - trio_asprintf(&q,"delete from notif_registrations where notifid='%|Ss'", nid_s); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, q); - edg_wll_ExecSQL(ctx, q, NULL); - goto rollback; - } - } - } - break; - - case EDG_WLL_NOTIF_ADD: - break; - case EDG_WLL_NOTIF_REMOVE: - break; - default: - break; - } - -rollback: - free(q); q = NULL; - free(xml_conds); xml_conds = NULL; - free(nid_s); nid_s = NULL; - if ( jobs ) { - for ( i = 0; jobs[i]; i++ ) - free(jobs[i]); - free(jobs); jobs = NULL; - } - free(nconds); nconds = NULL; - - } while (edg_wll_TransNeedRetry(ctx)); - -err: - return edg_wll_Error(ctx, NULL, NULL); -} - -int edg_wll_NotifRefreshServer( - edg_wll_Context ctx, - const edg_wll_NotifId nid, - time_t *valid) -{ - char *time_s = NULL, *dest = NULL; - - do { - if (edg_wll_Transaction(ctx) != 0) goto err; - - if ( check_notif_request(ctx, nid, NULL, &dest) ) - goto rollback; - - if ( check_notif_age(ctx, nid) ) { - drop_notif_request(ctx, nid); - goto rollback; - } - - /* Format time of validity - */ - - if (*valid == 0) - *valid = time(NULL) + ctx->notifDuration; - adjust_validity(ctx,valid); - - glite_lbu_TimeToStr(*valid, &time_s); - if ( !time_s ) - { - edg_wll_SetError(ctx, errno, "Formating validity time"); - goto rollback; - } - - update_notif(ctx, nid, NULL, dest, time_s); - -rollback: - free(time_s); time_s = NULL; - free(dest); dest = NULL; - - } while (edg_wll_TransNeedRetry(ctx)); - -err: - return edg_wll_Error(ctx, NULL, NULL); -} - -int edg_wll_NotifDropServer( - edg_wll_Context ctx, - edg_wll_NotifId nid) -{ - do { - if (edg_wll_Transaction(ctx) != 0) goto err; - - if ( check_notif_request(ctx, nid, NULL, NULL) ) - goto rollback; - - if ( drop_notif_request(ctx, nid) ) - goto rollback; - -rollback: - ; - } while (edg_wll_TransNeedRetry(ctx)); - -err: - return edg_wll_Error(ctx, NULL, NULL); -} - - -static char *get_user(edg_wll_Context ctx, int create) -{ - glite_lbu_Statement stmt = NULL; - char *userid = NULL, - *q = NULL; - int ret; - char *can_peername = NULL; - - if ( !ctx->peerName ) - { - edg_wll_SetError(ctx, EPERM, "Annonymous access not allowed"); - goto cleanup; - } - can_peername = edg_wll_gss_normalize_subj(ctx->peerName, 0); - trio_asprintf(&q, "select userid from users where cert_subj='%|Ss'", can_peername); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, q); - if ( edg_wll_ExecSQL(ctx, q, &stmt) < 0 ) - goto cleanup; - - /* returned value: - * 0 no user find - continue only when 'create' parameter is set - * >0 user found - return selected value - * <0 SQL error - */ - if ( ((ret = edg_wll_FetchRow(ctx, stmt, 1, NULL, &userid)) != 0) || !create ) - goto cleanup; - - if ( !(userid = strdup(strmd5(ctx->peerName, NULL))) ) - { - edg_wll_SetError(ctx, errno, "Creating user ID"); - goto cleanup; - } - free(q); - trio_asprintf(&q, "insert into users(userid,cert_subj) values ('%|Ss','%|Ss')", - userid, can_peername); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, q); - if ( edg_wll_ExecSQL(ctx, q, NULL) < 0 ) - { - if ( edg_wll_Error(ctx,NULL,NULL) != EEXIST ) - { - free(userid); - userid = NULL; - } - else - edg_wll_ResetError(ctx); - } - -cleanup: - if ( q ) free(q); - if ( stmt ) glite_lbu_FreeStmt(&stmt); - free(can_peername); - - return userid; -} - - -static int check_notif_request( - edg_wll_Context ctx, - const edg_wll_NotifId nid, - char **owner, - char **destination) -{ - char *nid_s = NULL, - *stmt = NULL, *user, *dest = NULL; - int ret; - glite_lbu_Statement s = NULL; - - - /* XXX: rewrite select below in order to handle cert_subj format changes */ - if ( !(user = get_user(ctx, 0)) ) - { - if ( !edg_wll_Error(ctx, NULL, NULL) ) - edg_wll_SetError(ctx, EPERM, "Unknown user"); - - return edg_wll_Error(ctx, NULL, NULL); - } - - if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) ) - goto cleanup; - - trio_asprintf(&stmt, - "select destination from notif_registrations " - "where notifid='%|Ss' and userid='%|Ss' FOR UPDATE", - nid_s, user); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if ( (ret = edg_wll_ExecSQL(ctx, stmt, &s)) < 0 ) - goto cleanup; - if ( ret == 0 ) - { - free(stmt); - trio_asprintf(&stmt, - "select notifid from notif_registrations where notifid='%|Ss'", nid_s); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, - stmt); - ret = edg_wll_ExecSQL(ctx, stmt, NULL); - if ( ret == 0 ) - edg_wll_SetError(ctx, ENOENT, "Unknown notification ID"); - else if ( ret > 0 ) - edg_wll_SetError(ctx, EPERM, "Only owner could access the notification"); - goto cleanup; - } - else edg_wll_FetchRow(ctx,s,1,NULL,&dest); - -cleanup: - if ( !edg_wll_Error(ctx, NULL, NULL)) { - if (owner) *owner = user; else free(user); - if (destination) *destination = dest; else free(dest); - } - - if ( nid_s ) free(nid_s); - if ( stmt ) free(stmt); - glite_lbu_FreeStmt(&s); - - return edg_wll_Error(ctx, NULL, NULL); -} - - - /* Format conditions - * - first of all separate all jobids - * - then format new condition list without jobids and encode it into an XML string - */ -static int split_cond_list( - edg_wll_Context ctx, - edg_wll_QueryRec const * const *conditions, - edg_wll_QueryRec ***nconds_out, - char ***jobs_out) -{ - edg_wll_QueryRec **nconds = NULL; - char **jobs = NULL; - int i, j, jobs_ct, nconds_ct; - - - if ( !conditions || !conditions[0] ) { - if (ctx->noAuth) nconds_ct = jobs_ct = 0; - else return edg_wll_SetError(ctx, EINVAL, "Empty condition list"); - } - else for ( nconds_ct = jobs_ct = i = 0; conditions[i]; i++ ) { - if ( conditions[i][0].attr && conditions[i][0].attr != EDG_WLL_QUERY_ATTR_JOBID ) - nconds_ct++; - for ( j = 0; conditions[i][j].attr; j++ ) - if ( conditions[i][j].attr == EDG_WLL_QUERY_ATTR_JOBID ) - jobs_ct++; - } - - if ( jobs_out && jobs_ct ) - if ( !(jobs = calloc(jobs_ct+1, sizeof(char *))) ) - { - edg_wll_SetError(ctx, errno, NULL); - goto cleanup; - } - - if ( nconds_out && nconds_ct ) - if ( !(nconds = calloc(nconds_ct+1, sizeof(edg_wll_QueryRec *))) ) - { - edg_wll_SetError(ctx, errno, NULL); - goto cleanup; - } - - if ( jobs ) for ( jobs_ct = i = 0; conditions[i]; i++ ) - for ( j = 0; conditions[i][j].attr; j++ ) - if ( conditions[i][j].attr == EDG_WLL_QUERY_ATTR_JOBID ) - if ( !(jobs[jobs_ct++] = edg_wlc_JobIdGetUnique(conditions[i][j].value.j)) ) - { - edg_wll_SetError(ctx, errno, NULL); - goto cleanup; - } - - if ( nconds ) for ( nconds_ct = i = 0; conditions[i]; i++ ) - if ( conditions[i][0].attr && conditions[i][0].attr != EDG_WLL_QUERY_ATTR_JOBID ) - /* !!! DO NOT DEALLOCATE this arrays (it is not neccessary to allocate new - * mem - it's used only once and only for xml parsing - */ - nconds[nconds_ct++] = (edg_wll_QueryRec *) (conditions[i]); - - if ( jobs_out ) { *jobs_out = jobs; jobs = NULL; } - if ( nconds_out ) { *nconds_out = nconds; nconds = NULL; } - -cleanup: - if ( nconds ) free(nconds); - if ( jobs ) - { - for ( i = 0; jobs[i]; i++ ) - free(jobs[i]); - free(jobs); - } - - return edg_wll_Error(ctx, NULL, NULL); -} - - -static int update_notif( - edg_wll_Context ctx, - const edg_wll_NotifId nid, - const char *conds, - const char *dest, - const char *valid) -{ - char *nid_s = NULL, *host = NULL, - *stmt = NULL, *aux = NULL; - int ret, port = 0; - - - if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) ) - { - edg_wll_SetError(ctx, EINVAL, "Malformed notification ID."); - goto cleanup; - } - - /* Format SQL update string - * (Only the owner could update the notification registration) - */ - if ( !(stmt = strdup("update notif_registrations set")) ) - { - edg_wll_SetError(ctx, errno, "updating notification records"); - goto cleanup; - } - if ( dest ) - { - host = strchr(dest, ':'); - port = atoi(host+1); - if ( !(host = strndup(dest, host-dest)) ) - { - edg_wll_SetError(ctx, errno, "updating notification records"); - goto cleanup; - } - trio_asprintf(&aux, "%s destination='%|Ss'", stmt, dest); - free(stmt); - stmt = aux; - } - if ( valid ) - { - trio_asprintf(&aux, "%s %svalid=%s", stmt, dest? ",": "", valid); - free(stmt); - stmt = aux; - } - if ( conds ) - { - trio_asprintf(&aux, "%s %sconditions='%|Ss'", - stmt, (dest||valid)? ",": "", conds); - free(stmt); - stmt = aux; - } - trio_asprintf(&aux, "%s where notifid='%|Ss'", stmt, nid_s); - free(stmt); - stmt = aux; - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if ( (ret = edg_wll_ExecSQL(ctx, stmt, NULL)) < 0 ) - goto cleanup; - if ( ret == 0 ) - { - free(stmt); - trio_asprintf(&stmt, - "select notifid from notif_registrations where notifid='%|Ss'", nid_s); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - ret = edg_wll_ExecSQL(ctx, stmt, NULL); - if ( ret == 0 ) - edg_wll_SetError(ctx, ENOENT, "Unknown notification ID"); - /* - * XXX: Be happy? - * May be: Rows matched: 1 Changed: 0 Warnings: 0 :-) - else if ( ret > 0 ) - edg_wll_SetError(ctx, EPERM, "Updating notification records"); - */ - } - - if ( host || valid) { - char *v = strdup(valid),*v2 = strchr(v+1,'\''); - int expires; - - *v2 = 0; - expires = glite_lbu_StrToTime(v+1); -/* - printf("edg_wll_NotifChangeIL(ctx, %s, %s, %d)\n", - nid_s? nid_s: "nid", host, port); -*/ - if ( edg_wll_NotifChangeIL(ctx, nid, host, port, expires) ) { - char *errt, *errd; - - edg_wll_Error(ctx, &errt, &errd); - glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, "edg_wll_NotifChangeIL(): %s (%s)", errt, errd); - free(errt); - free(errd); - } - free(v); - } - - -cleanup: - if ( nid_s ) free(nid_s); - if ( stmt ) free(stmt); - if ( host ) free(host); - - return edg_wll_Error(ctx, NULL, NULL); -} - -static int get_indexed_cols(edg_wll_Context ctx,char const *notif,edg_wll_QueryRec **conds,char **update_out) -{ - int i,j; - edg_wll_IColumnRec * notif_cols = ctx->notif_index_cols; - char *cols = NULL,*aux; - - for (i=0; conds && conds[i]; i++) { - for (j=0; notif_cols[j].qrec.attr && - (notif_cols[j].qrec.attr != conds[i]->attr || - (notif_cols[j].qrec.attr == EDG_WLL_QUERY_ATTR_JDL_ATTR && - (!conds[i]->attr_id.tag || strcmp(notif_cols[j].qrec.attr_id.tag,conds[i]->attr_id.tag)) - ) - ); j++); - if (notif_cols[j].qrec.attr) { - if (conds[i][1].attr && conds[i][0].op != EDG_WLL_QUERY_OP_EQUAL) { - char buf[1000]; - sprintf(buf,"%s: indexed, only one and only `equals' condition supported", - notif_cols[j].colname); - - return edg_wll_SetError(ctx,EINVAL,buf); - } - trio_asprintf(&aux,"%s%c %s = '%|Ss'", - cols ? cols : "", - cols ? ',': ' ', - notif_cols[j].colname,conds[i]->value.c - ); - free(cols); - cols = aux; - - } - } - if (cols) trio_asprintf(&aux,"update notif_registrations set %s where notifid = '%s'", - cols,notif); - else aux = NULL; - - free(cols); - *update_out = aux; - return edg_wll_ResetError(ctx); -} - -static void adjust_validity(edg_wll_Context ctx,time_t *valid) -{ - time_t now; - - time(&now); - - if (*valid <= 0) { - *valid = now + ctx->notifDuration; - } - - if (ctx->peerProxyValidity && ctx->peerProxyValidity < *valid) - *valid = ctx->peerProxyValidity; - - if (*valid - now > ctx->notifDurationMax) - *valid = now + ctx->notifDurationMax; -} - -static int drop_notif_request(edg_wll_Context ctx, const edg_wll_NotifId nid) { - char *nid_s = NULL, - *stmt = NULL, - *errDesc; - int errCode; - - errCode = edg_wll_Error(ctx, NULL, &errDesc); - - if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) ) - goto rollback; - - trio_asprintf(&stmt, "delete from notif_registrations where notifid='%|Ss'", nid_s); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - if ( edg_wll_ExecSQL(ctx, stmt, NULL) < 0 ) - goto rollback; - free(stmt); - trio_asprintf(&stmt, "delete from notif_jobs where notifid='%|Ss'", nid_s); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - if ( edg_wll_ExecSQL(ctx, stmt, NULL) < 0 ) - goto rollback; - edg_wll_NotifCancelRegId(ctx, nid); - if (edg_wll_Error(ctx, NULL, NULL) == ECONNREFUSED) { - /* Let notification erase from DB, - * on notif-IL side it will be autopurged later anyway */ - - glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, - "[%d] edg_wll_NotifDropServer() - NotifID found and " \ - "dropped, however, connection to notif-IL was " \ - " refused (notif-IL not running?)", getpid()); - - edg_wll_ResetError(ctx); - } - -rollback: - free(nid_s); nid_s = NULL; - free(stmt); stmt = NULL; - /* take precedence to previous error */ - if (errCode || errDesc) { - edg_wll_SetError(ctx, errCode, errDesc); - free(errDesc); - } - - return edg_wll_Error(ctx, NULL, NULL); -} - -static int check_notif_age(edg_wll_Context ctx, const edg_wll_NotifId nid) { - time_t now = time(NULL); - char *time_s = NULL, - *nid_s = NULL, - *q = NULL; - int ret; - - if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) ) - goto cleanup; - - glite_lbu_TimeToStr(now, &time_s); - if ( !time_s ) - { - edg_wll_SetError(ctx, errno, NULL); - goto cleanup; - } - - trio_asprintf(&q, "select notifid from notif_registrations WHERE notifid='%|Ss' AND valid < %s", nid_s, time_s); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, q); - if ( (ret = edg_wll_ExecSQL(ctx, q, NULL)) < 0 ) - goto cleanup; - - if (ret > 0) - edg_wll_SetError(ctx, EINVAL, "Notification expired."); - -cleanup: - free(q); - free(nid_s); - free(time_s); - return edg_wll_Error(ctx, NULL, NULL); -} - diff --git a/org.glite.lb.server/src/openserver.c b/org.glite.lb.server/src/openserver.c deleted file mode 100644 index dabfe8a..0000000 --- a/org.glite.lb.server/src/openserver.c +++ /dev/null @@ -1,116 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include - -#include "glite/lb/context-int.h" -#include "glite/lbu/log.h" -#include "openserver.h" -#include "db_supp.h" - -edg_wll_ErrorCode edg_wll_Open(edg_wll_Context ctx, char *cs) -{ - int ret, hit = 0, i; - char *table[1]; - char *cols[20]; - glite_lbu_Statement stmt; - - if (!ctx->dbctx && glite_lbu_InitDBContext((glite_lbu_DBContext*) &ctx->dbctx, GLITE_LBU_DB_BACKEND_MYSQL, LOG_CATEGORY_LB_SERVER_DB) != 0) { - char *ed; - - glite_lbu_DBError(ctx->dbctx, NULL, &ed); - edg_wll_SetError(ctx, EDG_WLL_ERROR_DB_INIT, ed); - free(ed); - return EDG_WLL_ERROR_DB_INIT; - } - if (glite_lbu_DBConnect(ctx->dbctx,cs) != 0) return edg_wll_SetErrorDB(ctx); - - hit = 0; - // new columns added to jobs - if ((ret = glite_lbu_ExecSQL(ctx->dbctx, "DESC jobs", &stmt)) <= 0) goto err; - while (hit < 4 && (ret = glite_lbu_FetchRow(stmt, 1, NULL, cols)) > 0) { - assert(ret <= (int)(sizeof cols/sizeof cols[0])); - if (strcasecmp(cols[0], "proxy") == 0 || - strcasecmp(cols[0], "server") == 0 || - strcasecmp(cols[0], "grey") == 0 || - strcasecmp(cols[0], "nevents") == 0) hit++; - for (i = 0; i < ret; i++) free(cols[i]); - } - if (ret < 0) goto err; - glite_lbu_FreeStmt(&stmt); - // new columns added to events - if (glite_lbu_ExecSQL(ctx->dbctx, "DESC events", &stmt) <= 0) goto err; - while (hit < 5 && (ret = glite_lbu_FetchRow(stmt, 1, NULL, cols)) > 0) { - assert(ret <= (int)(sizeof cols/sizeof cols[0])); - if (strcasecmp(cols[0], "seqcode") == 0) hit++; - for (i = 0; i < ret; i++) free(cols[i]); - } - if (ret < 0) goto err; - glite_lbu_FreeStmt(&stmt); - // new columns added to notif_registrations - if (glite_lbu_ExecSQL(ctx->dbctx, "DESC notif_registrations", &stmt) <= 0) goto err; - while (hit < 6 && (ret = glite_lbu_FetchRow(stmt, 1, NULL, cols)) > 0) { - assert(ret <= (int)(sizeof cols/sizeof cols[0])); - if (strcasecmp(cols[0], "flags") == 0) hit++; - for (i = 0; i < ret; i++) free(cols[i]); - } - if (ret < 0) goto err; - glite_lbu_FreeStmt(&stmt); - - if (hit != 6) { - ret = edg_wll_SetError(ctx, EDG_WLL_ERROR_DB_INIT, "old DB schema found, migration to new schema needed"); - goto close_db; - } - - // events_flesh table added - if (glite_lbu_ExecSQL(ctx->dbctx, "SHOW TABLES", &stmt) <= 0) goto err; - hit = 0; - while (hit < 3 && (ret = glite_lbu_FetchRow(stmt, 1, NULL, table)) > 0) { - if (strcasecmp(table[0], "events_flesh") == 0 || - strcasecmp(table[0], "zombie_jobs") == 0 || - strcasecmp(table[0], "zombie_suffixes") == 0 || - strcasecmp(table[0], "zombie_prefixes") == 0) hit++; - free(table[0]); - } - if (ret < 0) goto err; - glite_lbu_FreeStmt(&stmt); - if (hit != 3) { - ret = edg_wll_SetError(ctx, EDG_WLL_ERROR_DB_INIT, "events_flesh or zombie_jobs or zombie_prefixes or zombie_suffixes table not found, migration to new schema needed"); - goto close_db; - } - - return 0; - -err: - edg_wll_SetErrorDB(ctx); - glite_lbu_FreeStmt(&stmt); -close_db: - glite_lbu_DBClose(ctx->dbctx); - return ret; -} - -edg_wll_ErrorCode edg_wll_Close(edg_wll_Context ctx) -{ - glite_lbu_DBClose(ctx->dbctx); - glite_lbu_FreeDBContext(ctx->dbctx); - ctx->dbctx = NULL; - return edg_wll_ResetError(ctx); -} diff --git a/org.glite.lb.server/src/openserver.h b/org.glite.lb.server/src/openserver.h deleted file mode 100644 index fe22738..0000000 --- a/org.glite.lb.server/src/openserver.h +++ /dev/null @@ -1,23 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include "glite/lb/context.h" - -edg_wll_ErrorCode edg_wll_Open(edg_wll_Context ctx, char *cs); -edg_wll_ErrorCode edg_wll_Close(edg_wll_Context ctx); diff --git a/org.glite.lb.server/src/perftest_proxy.sh b/org.glite.lb.server/src/perftest_proxy.sh deleted file mode 100755 index bee512f..0000000 --- a/org.glite.lb.server/src/perftest_proxy.sh +++ /dev/null @@ -1,173 +0,0 @@ -#!/bin/bash -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -numjobs=10 - -# XXX - there must be better way to find stage -STAGEDIR=$GLITE_LOCATION -. $GLITE_LOCATION/sbin/perftest_common.sh - -LOGEVENT=${LOGEVENT:-$GLITE_LOCATION/bin/glite-lb-logevent} - -DEBUG=${DEBUG:-0} - -DBNAME=${DBNAME:-lbserver20} -export LBDB=lbserver/@localhost:$DBNAME - -SILENT=0 -while getopts "t:n:s" OPTION -do - case "$OPTION" in - "t") TEST_VARIANT=$OPTARG - ;; - - "n") numjobs=$OPTARG - ;; - - "s") SILENT=1 - ;; - - esac -done - -# CONSUMER_ARGS= -# PERFTEST_COMPONENT= -# COMPONENT_ARGS= -#LOGJOBS_ARGS="" - -check_test_files || exit 1 -check_file_executable $LOGEVENT || exit 1 - -SEQCODE="UI=999990:NS=9999999990:WM=999990:BH=9999999990:JSS=999990:LM=999990:LRMS=999990:APP=999990" - -purge_proxy () -{ - for jobid in $@ - do - cat < /dev/null 2>&1 - done | mysql -u lbserver $DBNAME -} - -group_a () { -echo "----------------------------------" -echo "LB Proxy test" -echo "----------------------------------" -echo "Events are consumed:" -echo "1) before parsing" -echo "2) after parsing, before storing into database" -echo "3) after storing into db, before computing state" -echo "4) after computing state, before sending to IL" -echo "5) by IL on input socket" -echo "6) by IL at delivery" -echo "" -LOGJOBS_ARGS="-s /tmp/proxy.perf" -} - -echo -e "\tavg_job \t big_job \t avg_dag \t big_dag" - - -group_a_test_n () -{ - PERFTEST_CONSUMER=$GLITE_LOCATION/bin/glite-lb-bkserverd - i=$1 - CONSUMER_ARGS="-P -d --silent --perf-sink $i -o /tmp/proxy.perf -D /tmp -t 1 " - export PERFTEST_NAME="proxy_test_$i" - echo -n "${i})" - run_test proxy $numjobs - print_result - # purge jobs from database - # we have to start proxy again - #$PERFTEST_CONSUMER -P -d -o /tmp/proxy.perf -D /tmp -t 1 >/dev/null 2>&1 & - #PID=$! - purge_proxy `i=0; for file in ${JOB_FILE[*]}; do sPN=$PERFTEST_NAME; PERFTEST_NAME="${PERFTEST_NAME}_${JOB_DESC[i]}"; $LOGJOBS -f $file -n $numjobs 2>/dev/null; PERFTEST_NAME=$sPN; i=$(($i + 1)); done | sort | uniq` - #sleep 2 - #shutdown $PID -} - -group_a_test_5 () -{ - PERFTEST_COMPONENT="$GLITE_LOCATION/bin/glite-lb-bkserverd" - COMPONENT_ARGS="-P -d --silent -o /tmp/proxy.perf --proxy-il-sock /tmp/interlogger.perf --proxy-il-fprefix /tmp/perftest.log -D /tmp -t 1 " - - PERFTEST_CONSUMER="$GLITE_LOCATION/bin/glite-lb-interlogd-perf-empty" - CONSUMER_ARGS="-d -s /tmp/interlogger.perf --file-prefix=/tmp/perftest.log -i /tmp/il-perf.pid" - export PERFTEST_NAME="proxy_test_5" - echo -n "5)" - run_test proxy $numjobs - print_result - #$PERFTEST_COMPONENT -P -d -o /tmp/proxy.perf -t 1 -D /tmp >/dev/null 2>&1 & - #PID=$! - purge_proxy `i=0; for file in ${JOB_FILE[*]}; do sPN=$PERFTEST_NAME; PERFTEST_NAME="${PERFTEST_NAME}_${JOB_DESC[i]}"; $LOGJOBS -f $file -n $numjobs 2>/dev/null ; PERFTEST_NAME=$sPN; i=$(($i + 1)); done | sort | uniq` - #sleep 2 - #shutdown $PID - rm -f /tmp/perftest.log.* -} - -group_a_test_6 () -{ - PERFTEST_COMPONENT="$GLITE_LOCATION/bin/glite-lb-bkserverd" - COMPONENT_ARGS="-P -d --silent -o /tmp/proxy.perf --proxy-il-sock /tmp/interlogger.perf --proxy-il-fprefix /tmp/perftest.log -D /tmp -t 1 " - - PERFTEST_CONSUMER="$GLITE_LOCATION/bin/glite-lb-interlogd-perf" - CONSUMER_ARGS="-d --nosend -s /tmp/interlogger.perf --file-prefix=/tmp/perftest.log -i /tmp/il-perf.pid" - export PERFTEST_NAME="proxy_test_6" - echo -n "6)" - run_test proxy $numjobs - print_result - #$PERFTEST_COMPONENT -P -d -o /tmp/proxy.perf -t 1 -D /tmp >/dev/null 2>&1 & - #PID=$! - purge_proxy `i=0; for file in ${JOB_FILE[*]}; do sPN=$PERFTEST_NAME; PERFTEST_NAME="${PERFTEST_NAME}_${JOB_DESC[i]}"; $LOGJOBS -f $file -n $numjobs 2>/dev/null ; PERFTEST_NAME=$sPN; i=$(($i + 1)); done | sort | uniq` - #sleep 2 - #shutdown $PID - rm -f /tmp/perftest.log.* -} - -group="a" - -group_$group - -if [[ $SILENT -eq 0 ]] -then - while [[ -z $TEST_VARIANT ]] - do - echo -n "Your choice: " - read -e TEST_VARIANT - done - #echo -e "\tavg_job \t big_job \t avg_dag \t big_dag" - print_result_header -fi - -if [[ "x$TEST_VARIANT" = "x*" ]] -then - TEST_VARIANT="1 2 3 4 5 6" -fi - -for variant in $TEST_VARIANT -do - if [[ "$variant" = "5" || "$variant" = "6" ]] - then - group_${group}_test_${variant} - else - group_${group}_test_n $variant - fi -done diff --git a/org.glite.lb.server/src/policy_gram.y b/org.glite.lb.server/src/policy_gram.y deleted file mode 100644 index 53a4a4d..0000000 --- a/org.glite.lb.server/src/policy_gram.y +++ /dev/null @@ -1,154 +0,0 @@ -%{ - -#ident "$Header$" - -#include -#include -#include -#include - -#include "glite/lb/context-int.h" -#include "authz_policy.h" - -void yyerror (const char *); -void set_error(const char *format, ...); - -static edg_wll_Context parse_ctx; -static const char *parse_fname; -static edg_wll_authz_policy parse_policy; - -extern unsigned lineno; - -extern FILE *yyin; - -struct _rules { - struct _edg_wll_authz_rule *rule; - struct _rules *next; -} _rules; - -%} - -%union { - char *string; - struct _rules *rules; - struct _edg_wll_authz_rule *rule; - struct _edg_wll_authz_attr *attr; -} - -%token RESOURCE ACTION RULE PERMIT -%token STRING -%token LITERAL -%type assignment -%type assignments -%type rule rules - -%start policy - -%% - -policy : RESOURCE STRING '{' actions '}' - { - if (strcmp($2, "LB") != 0) - set_error("Undefined resource '%s'", $2); - } - ; - -actions : - | action actions - ; - -action : ACTION STRING '{' rules '}' - { - struct _rules *r; - - authz_action ac = find_authz_action($2); - - if (ac == ACTION_UNDEF) - set_error("undefined action '%s'", $2); - - for (r = $4; r; r = r->next) { - edg_wll_add_authz_rule(parse_ctx, parse_policy, - ac, r->rule); - } - } - ; - -rules : - { - $$ = NULL; - } - | rule rules - { - $1->next = $2; - $$ = $1; - } - ; - -rule : RULE PERMIT '{' assignments '}' - { - $$ = malloc(sizeof(*$$)); - $$->rule = $4; - $$->next = NULL; - } - ; - -assignments : - { - $$ = calloc(1, sizeof(*$$)); - } - | assignment assignments - { - edg_wll_add_authz_attr(parse_ctx, $2, $1->id, $1->value); - $$ = $2; - } - ; - -assignment : LITERAL '=' STRING - { - $$ = malloc(sizeof(*$$)); - $$->id = find_authz_attr($1); - if ($$->id == ATTR_UNDEF) - set_error("undefined attribute '%s'", $1); - $$->value = $3; - } - ; - -%% - -void set_error(const char *format, ...) -{ - va_list args; - char *buf, *msg; - - va_start (args, format); - vasprintf (&buf, format, args); - va_end(args); - - asprintf(&msg, "%s:%d: %s", parse_fname, lineno, buf); - edg_wll_SetError(parse_ctx, EINVAL, msg); - free(buf); - free(msg); -} - -void yyerror(const char *str) -{ - set_error("%s", str); -} - -int -parse_server_policy(edg_wll_Context ctx, const char *filename, edg_wll_authz_policy policy) -{ - lineno = 1; - yyin = fopen(filename, "r"); - if (yyin == NULL) - return edg_wll_SetError(ctx,errno,filename); - - parse_ctx = ctx; - parse_fname = filename; - parse_policy = policy; - edg_wll_ResetError(ctx); - yyparse(); - fclose(yyin); - - return edg_wll_Error(ctx,NULL,NULL); -} diff --git a/org.glite.lb.server/src/policy_lex.l b/org.glite.lb.server/src/policy_lex.l deleted file mode 100644 index ffc075c..0000000 --- a/org.glite.lb.server/src/policy_lex.l +++ /dev/null @@ -1,39 +0,0 @@ -%{ - -#ident "$Header$" - -#include -#include -#include -#include "policy_gram.h" - -unsigned lineno = 1; - -#define YY_NO_UNPUT - -%} -%% - -resource { return RESOURCE; } -action { return ACTION; } -rule { return RULE; } -permit { return PERMIT; } -[A-Za-z0-9_]+ { - yylval.string = strdup ((const char *)yytext); - return LITERAL; - } -\"[^\"\n]*\" { - int len; - yylval.string = malloc(len = strlen(yytext)-1); - strncpy(yylval.string,yytext+1,len-1); - yylval.string[len-1] = '\0'; - return STRING; - } -[={}] { return *yytext; } -"\n" { lineno++; } -#[^\n]*\n ; -[ \t]+ ; -. { return *yytext; } -%% - -int yywrap() { return 1; } diff --git a/org.glite.lb.server/src/pretty_print_wrapper.cpp b/org.glite.lb.server/src/pretty_print_wrapper.cpp deleted file mode 100644 index 8acd280..0000000 --- a/org.glite.lb.server/src/pretty_print_wrapper.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include "pretty_print_wrapper.h" - -#include -#include -#include - -int pretty_print(char *jdl, char **formated_print){ - ClassAd *classad; - ClassAdParser parser; - - classad = parser.ParseClassAd(std::string(jdl), true); - if (! classad){ - *formated_print = NULL; - return -1; // not ClassAd data - } - - PrettyPrint pp; - std::string buf; - pp.Unparse(buf, classad); - *formated_print = strdup(buf.c_str()); - - return 0; -} - diff --git a/org.glite.lb.server/src/purge.h b/org.glite.lb.server/src/purge.h deleted file mode 100644 index 9284f02..0000000 --- a/org.glite.lb.server/src/purge.h +++ /dev/null @@ -1,86 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#ifndef GLITE_LB_PURGE_H -#define GLITE_LB_PURGE_H - -#ident "$Header" - -#include -#include "glite/lb/context.h" - -extern volatile sig_atomic_t purge_quit; - -/** Server side implementation - * besides output to the SSL stream (in the context) it may produce - * the server-side dump files - */ -int edg_wll_PurgeServer( - edg_wll_Context ctx, - const edg_wll_PurgeRequest *request, - edg_wll_PurgeResult *result -); - -/** LB Proxy purge implementation - * it gives no output - purge only one job from LB Proxy DB - */ -int edg_wll_PurgeServerProxy( - edg_wll_Context ctx, - glite_jobid_const_t job -); - -#define FILE_TYPE_ANY "" -#define FILE_TYPE_PURGE "purge" -#define FILE_TYPE_DUMP "dump" -#define FILE_TYPE_LOAD "load" - -extern int edg_wll_CreateTmpFileStorage( - edg_wll_Context ctx, - char *prefix, - char **fname -); - -extern int edg_wll_CreateFileStorageFromTmp( - edg_wll_Context ctx, - char *tmp_type, - char *file_type, - char **fname -); - -extern int edg_wll_CreateFileStorage( - edg_wll_Context ctx, - char *file_type, - char *prefix, - char **fname -); - -extern int edg_wll_DumpEventsServer(edg_wll_Context ctx,const edg_wll_DumpRequest *req,edg_wll_DumpResult *result); - -extern int edg_wll_LoadEventsServer(edg_wll_Context ctx,const edg_wll_LoadRequest *req,edg_wll_LoadResult *result); - -#define edg_wll_CreateTmpDumpFile(ctx, f) edg_wll_CreateTmpFileStorage(ctx,ctx->dumpStorage,f) -#define edg_wll_CreateTmpPurgeFile(ctx, f) edg_wll_CreateTmpFileStorage(ctx,ctx->purgeStorage,f) - -#define edg_wll_CreateDumpFileFromTmp(ctx, f, f2) \ - edg_wll_CreateFileStorageFromTmp(ctx, f, FILE_TYPE_DUMP, f2) -#define edg_wll_CreatePurgeFileFromTmp(ctx, f, f2) \ - edg_wll_CreateFileStorageFromTmp(ctx, f, FILE_TYPE_PURGE, f2) - -#define edg_wll_CreateDumpFile(ctx, f) edg_wll_CreateFileStorage(ctx,FILE_TYPE_DUMP,NULL,f) -#define edg_wll_CreatePurgeFile(ctx, f) edg_wll_CreateFileStorage(ctx,FILE_TYPE_PURGE,NULL,f) - -#endif /* GLITE_LB_PURGE_H */ diff --git a/org.glite.lb.server/src/query.c b/org.glite.lb.server/src/query.c deleted file mode 100644 index 8664b24..0000000 --- a/org.glite.lb.server/src/query.c +++ /dev/null @@ -1,1833 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include "glite/jobid/strmd5.h" -#include "glite/lbu/trio.h" - -#include "glite/lb/context-int.h" -#include "glite/lb/xml_conversions.h" - -#include "glite/lbu/log.h" - -#include "get_events.h" -#include "index.h" -#include "query.h" -#include "store.h" -#include "lb_authz.h" -#include "db_supp.h" -#include "jobstat.h" - -#define FL_SEL_STATUS 1 -#define FL_SEL_TAGS (1<<1) -#define FL_SEL_JOB (1<<2) -#define FL_FILTER (1<<3) // DB query result needs further filtering -#define FL_SEL_JDL (1<<4) // Retrieve classads while filtering - - -static int check_event_query_index(edg_wll_Context,const edg_wll_QueryRec **,const edg_wll_QueryRec **); -static char *jc_to_head_where(edg_wll_Context, const edg_wll_QueryRec **, int *); -static char *ec_to_head_where(edg_wll_Context, const edg_wll_QueryRec **); -static int match_flesh_conditions(const edg_wll_Event *,const edg_wll_QueryRec **); -static int check_strict_jobid_cond(edg_wll_Context, const edg_wll_QueryRec **); - -static int cmp_string(const char *,edg_wll_QueryOp,const char *,const char *); -static int is_all_query(const edg_wll_QueryRec **); - - - -#define sizofa(a) (sizeof(a)/sizeof((a)[0])) - -int edg_wll_QueryEventsServer( - edg_wll_Context ctx, - int noAuth, - const edg_wll_QueryRec **job_conditions, - const edg_wll_QueryRec **event_conditions, - edg_wll_Event **events) -{ - char *job_where = NULL, - *event_where = NULL, - *qbase = NULL, - *q = NULL, - *res[12]; - edg_wll_Event *out = NULL; - glite_lbu_Statement sh = NULL; - int i = 0, - ret = 0, - offset = 0, limit = 0, - limit_loop = 1, - eperm = 0, - where_flags = 0; - char *peerid = NULL; - char *can_peername = NULL, *can_peerid = NULL; - char *j_old = NULL; - int match_status_old = 0; - edg_wll_JobStat state_out; - - edg_wll_ResetError(ctx); - memset(&state_out, 0, sizeof(edg_wll_JobStat)); - - if ( (ctx->p_query_results == EDG_WLL_QUERYRES_ALL) && - (!job_conditions || !job_conditions[0] || job_conditions[1] || - (job_conditions[0][0].attr != EDG_WLL_QUERY_ATTR_JOBID) || - (job_conditions[0][1].attr != EDG_WLL_QUERY_ATTR_UNDEF)) ) - { - edg_wll_SetError(ctx, EINVAL, "Invalid parameter EDG_WLL_PARAM_QUERY_RESULTS"); - goto cleanup; - } - - if ((!ctx->noIndex && check_event_query_index(ctx,job_conditions,event_conditions)) || - check_strict_jobid_cond(ctx,job_conditions) || - check_strict_jobid_cond(ctx,event_conditions)) - goto cleanup; - - if (event_conditions && *event_conditions && (*event_conditions)->attr && - !(event_where = ec_to_head_where(ctx,event_conditions)) && - edg_wll_Error(ctx,NULL,NULL) != 0) - if (!ctx->noIndex) goto cleanup; - - if ( job_conditions && *job_conditions && (*job_conditions)->attr && - !(job_where = jc_to_head_where(ctx, job_conditions, &where_flags)) && - edg_wll_Error(ctx,NULL,NULL) != 0 ) - /* XXX: covered with error check above: if (!ctx->noIndex) */ - goto cleanup; - - if (ctx->peerName) peerid = strdup(strmd5(ctx->peerName,NULL)); - can_peername = edg_wll_gss_normalize_subj(ctx->peerName, 0); - if (can_peername) can_peerid = strdup(strmd5(can_peername,NULL)); - -/* XXX: similar query in srv_purge.c ! They has to match due to common - * convert_event_head() called on the result - */ - trio_asprintf(&qbase,"SELECT e.event,j.userid,j.dg_jobid,e.code," - "e.prog,e.host,u.cert_subj,e.time_stamp,e.usec,e.level,e.arrived,e.seqcode " - "FROM events e,users u,jobs j%s " - "WHERE %se.jobid=j.jobid AND j.grey=0 AND e.userid=u.userid AND e.code != %d " - "%s %s %s %s %s %s", - where_flags & FL_SEL_STATUS ? ",states s" : "", - where_flags & FL_SEL_STATUS ? "s.jobid=j.jobid AND " : "", - EDG_WLL_EVENT_UNDEF, - job_where ? "AND" : "", - job_where ? job_where : "", - event_where ? "AND" : "", - event_where ? event_where : "", - (ctx->isProxy) ? "AND j.proxy='1'" : "AND j.server='1'", - (where_flags & FL_FILTER) ? "order by j.dg_jobid" : ""); - - if ( ctx->softLimit ) - { - if ( ctx->hardEventsLimit ) - limit = ctx->softLimit < ctx->hardEventsLimit? ctx->softLimit: ctx->hardEventsLimit; - else - limit = ctx->softLimit; - } - else if ( ctx->hardEventsLimit ) - limit = ctx->hardEventsLimit; - else - limit = 0; - - i = 0; - out = calloc(1, sizeof(*out)); - do - { - if ( limit ) - trio_asprintf(&q, "%s LIMIT %d, %d", qbase, offset, limit); - else if ( !q ) - q = qbase; - - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, - q); - ret = edg_wll_ExecSQL(ctx, q, &sh); - if ( limit ) - free(q); - if ( ret < 0 ) - { - glite_lbu_FreeStmt(&sh); - goto cleanup; - } - if ( ret == 0 ) - { - limit_loop = 0; - goto limit_cycle_cleanup; - } - if ( !limit || (ret < limit) ) - limit_loop = 0; - - offset += ret; - while ( (ret = edg_wll_FetchRow(ctx, sh, sizofa(res), NULL, res)) == sizofa(res) ) - { - int n = atoi(res[0]); - free(res[0]); - - /* Check non-indexed event conditions */ - if ( convert_event_head(ctx, res+2, out+i) || edg_wll_get_event_flesh(ctx, n, out+i) ) - { - char *et,*ed, *dbjob; - - /* Most likely sort of internal inconsistency. - * Must not be fatal -- just complain - */ - edg_wll_Error(ctx,&et,&ed); - - dbjob = res[2]; - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_WARN, "%s event %d: %s (%s)", dbjob, n, et, ed); - free(et); free(ed); - edg_wll_ResetError(ctx); - - goto fetch_cycle_cleanup; - } - - if ( !match_flesh_conditions(out+i,event_conditions) || check_strict_jobid(ctx,out[i].any.jobId) ) - { - edg_wll_FreeEvent(out+i); - edg_wll_ResetError(ctx); /* check_strict_jobid() sets it */ - goto fetch_cycle_cleanup; - } - - /* Check non-indexed job conditions */ - if (where_flags & FL_FILTER) { - if (!j_old || strcmp(res[2], j_old)) { - // event of different jobId than last time? - // => count jobStatus for this jobId - - if (j_old) edg_wll_FreeStatus(&state_out); - - if ( edg_wll_JobStatusServer(ctx, out[i].any.jobId, 0, &state_out) ) - { - edg_wll_FreeEvent(out+i); - if (edg_wll_Error(ctx,NULL,NULL) == EPERM) eperm = 1; - goto fetch_cycle_cleanup; - } - - if ( !(match_status_old = match_status(ctx, NULL, (&state_out), job_conditions)) ) - { - edg_wll_FreeEvent(out+i); - edg_wll_ResetError(ctx); /* check_strict_jobid() sets it */ - goto fetch_cycle_cleanup; - } - } - else - // the same jobId => the same jobStatus - // => the same result of match_status() - - if (!match_status_old) { - edg_wll_FreeEvent(out+i); - edg_wll_ResetError(ctx); /* check_strict_jobid() sets it */ - goto fetch_cycle_cleanup; - } - } - - // Auth checked in edg_wll_JobStatusServer above - if ( !(where_flags & FL_FILTER) && !noAuth ) - { - if (!ctx->peerName || (strcmp(res[1],peerid) && strcmp(res[1], can_peerid))) { - edg_wll_Acl acl = NULL; - char *jobid = NULL; - - ret = edg_wll_GetACL(ctx, out[i].any.jobId, &acl); - free(jobid); - if (ret || acl == NULL) { - eperm = 1; - edg_wll_FreeEvent(out+i); - edg_wll_ResetError(ctx); /* XXX: should be reported somewhere at least in debug mode */ - goto fetch_cycle_cleanup; - } - - ret = edg_wll_CheckACL(ctx, acl, EDG_WLL_CHANGEACL_READ); - edg_wll_FreeAcl(acl); - if (ret) { - eperm = 1; - edg_wll_FreeEvent(out+i); - edg_wll_ResetError(ctx); /* XXX: should be reported somewhere at least in debug mode */ - goto fetch_cycle_cleanup; - } - } - } - - if ( (ctx->p_query_results != EDG_WLL_QUERYRES_ALL) && limit && (i+1 > limit) ) - { - free(res[1]); - memset(out+i, 0, sizeof(*out)); - edg_wll_SetError(ctx, E2BIG, "Query result size limit exceeded"); - if ( ctx->p_query_results == EDG_WLL_QUERYRES_LIMITED ) - { - limit_loop = 0; - goto limit_cycle_cleanup; - } - goto cleanup; - } - - i++; - out = (edg_wll_Event *) realloc(out, (i+1) * sizeof(*out)); - -fetch_cycle_cleanup: - memset(out+i, 0, sizeof(*out)); - free(res[1]); - free(j_old); - j_old=res[2]; - } -limit_cycle_cleanup: - glite_lbu_FreeStmt(&sh); - } while ( limit_loop ); - - if ( i == 0 && eperm ) - edg_wll_SetError(ctx, EPERM, "matching events found but authorization failed"); - else if ( i == 0 ) - edg_wll_SetError(ctx, ENOENT, "no matching events found"); - else - { - edg_wll_SortEvents(out); - *events = out; - out = NULL; - } - -cleanup: - if ( out ) - { - for ( i = 0; out[i].type; i++ ) - edg_wll_FreeEvent(out+i); - free(out); - } - free(qbase); - free(job_where); - free(event_where); - free(j_old); - if (state_out.jobId) edg_wll_FreeStatus(&state_out); - free(peerid); - free(can_peername); free(can_peerid); - - return edg_wll_Error(ctx,NULL,NULL); -} - -int jobid_only_query(const edg_wll_QueryRec **conditions) { - int i = 0, j; - int jobid_in_this_or; - int not_jobid_only = 0; - - while(conditions[i]) { - jobid_in_this_or = 0; - j = 0; - while(conditions[i][j].attr) { - if(conditions[i][j].attr == EDG_WLL_QUERY_ATTR_JOBID) jobid_in_this_or++; - j++; - } - if (!jobid_in_this_or) not_jobid_only++; - i++; - } - - return not_jobid_only; -} - -int edg_wll_QueryJobsServer( - edg_wll_Context ctx, - const edg_wll_QueryRec **conditions, - int flags, - edg_wlc_JobId **jobs, - edg_wll_JobStat **states) -{ - char *job_where = NULL, - *state_where = NULL, - *tags_where = NULL, - *q = NULL, - *qbase = NULL, - *zquery = NULL, - *res[3], - *dbjob, - *zomb_where = NULL, - *zomb_where_temp = NULL; - edg_wlc_JobId *jobs_out = NULL; - edg_wll_JobStat *states_out = NULL; - glite_lbu_Statement sh; - int i = 0, - j = 0, - ret = 0, - eperm = 0, - limit = 0, offset = 0, - limit_loop = 1, - where_flags = 0, - first_or; - - memset(res,0,sizeof res); - edg_wll_ResetError(ctx); - - if ( !conditions ) - { - edg_wll_SetError(ctx, EINVAL, "empty condition list"); - goto cleanup; - } - - - - if ( (ctx->p_query_results == EDG_WLL_QUERYRES_ALL) && - (!conditions[0] || conditions[1] || - (conditions[0][0].attr != EDG_WLL_QUERY_ATTR_OWNER) || - (conditions[0][1].attr != EDG_WLL_QUERY_ATTR_UNDEF)) ) - { - edg_wll_SetError(ctx, EINVAL, "Invalid parameter EDG_WLL_PARAM_QUERY_RESULTS"); - goto cleanup; - } - - if ( (!ctx->noIndex && check_job_query_index(ctx, conditions)) || check_strict_jobid_cond(ctx,conditions)) - goto cleanup; - - if ( !(job_where = jc_to_head_where(ctx, conditions, &where_flags)) && edg_wll_Error(ctx,NULL,NULL) != 0) - /* XXX: covered with error check above: if (!ctx->noIndex) */ - goto cleanup; - - if ( (where_flags & FL_SEL_STATUS) ) - trio_asprintf(&qbase,"SELECT DISTINCT j.dg_jobid,j.userid " - "FROM jobs j, states s WHERE j.jobid=s.jobid AND j.grey=0 %s %s AND %s ORDER BY j.jobid", - (job_where) ? "AND" : "", - (job_where) ? job_where : "", - (ctx->isProxy) ? "j.proxy='1'" : "j.server='1'"); - else - trio_asprintf(&qbase,"SELECT DISTINCT j.dg_jobid,j.userid " - "FROM jobs j WHERE j.grey=0 AND %s %s %s " - "ORDER BY j.jobid", - (job_where) ? job_where : "", - (job_where) ? "AND" : "", - (ctx->isProxy) ? "j.proxy='1'" : "j.server='1'"); - - if ( ctx->softLimit ) - { - if ( ctx->hardJobsLimit ) - limit = ctx->softLimit < ctx->hardJobsLimit? ctx->softLimit: ctx->hardJobsLimit; - else - limit = ctx->softLimit; - } - else if ( ctx->hardJobsLimit ) - limit = ctx->hardJobsLimit; - else - limit = 0; - - jobs_out = calloc(1, sizeof(*jobs_out)); - states_out = calloc(1, sizeof(*states_out)); - i = 0; - do - { - if ( limit ) - trio_asprintf(&q, "%s LIMIT %d, %d", qbase, offset, limit); - else if ( !q ) - q = qbase; - - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, - q); - ret = edg_wll_ExecSQL(ctx, q, &sh); - if ( limit ) - free(q); - if ( ret < 0 ) - { - glite_lbu_FreeStmt(&sh); - goto cleanup; - } - if ( ret == 0 ) - { - limit_loop = 0; - goto limit_cycle_cleanup; - } - if ( !limit || (ret < limit) ) - limit_loop = 0; - - offset += ret; - while ( (ret=edg_wll_FetchRow(ctx,sh,sizofa(res),NULL,res)) > 0 ) - { - if ( (ret = edg_wlc_JobIdParse(res[0], jobs_out+i)) ) - { /* unlikely to happen, internal inconsistency */ - char buf[200]; - snprintf(buf,sizeof buf,"JobIdParse(%s)",res[0]); - edg_wll_SetError(ctx,ret,buf); - free(res[0]); free(res[1]); free(res[2]); - jobs_out[i] = NULL; - goto cleanup; - } - - if ( check_strict_jobid(ctx, jobs_out[i]) ) - { - edg_wlc_JobIdFree(jobs_out[i]); - edg_wll_ResetError(ctx); /* check_strict_jobid() sets it */ - goto fetch_cycle_cleanup; - } - - // if some condition hits unindexed column or states of matching jobs wanted - - if ((where_flags & FL_FILTER) || !(flags & EDG_WLL_STAT_NO_STATES)) { - if ( edg_wll_JobStatusServer(ctx, jobs_out[i], (where_flags & FL_SEL_JDL)?(flags|EDG_WLL_STAT_CLASSADS):flags, &states_out[i]) ) - { - edg_wlc_JobIdFree(jobs_out[i]); - if (edg_wll_Error(ctx,NULL,NULL) == EPERM) eperm = 1; - goto fetch_cycle_cleanup; - } - - } - if (where_flags & FL_FILTER) { - if ( !match_status(ctx, NULL, states_out+i, conditions) ) - { - edg_wlc_JobIdFree(jobs_out[i]); - edg_wll_FreeStatus(states_out+i); - edg_wll_ResetError(ctx); /* check_strict_jobid() sets it */ - goto fetch_cycle_cleanup; - } - } - -#if 0 - if ( !ctx->noAuth && (!ctx->peerName || strcmp(res[1], strmd5(ctx->peerName, NULL))) ) - { - eperm = 1; - edg_wlc_JobIdFree(jobs_out[i]); - edg_wll_FreeStatus(states_out+i); - goto fetch_cycle_cleanup; - } -#endif - - if ( (ctx->p_query_results != EDG_WLL_QUERYRES_ALL) && limit && (i+1 > limit) ) - { - edg_wll_SetError(ctx, E2BIG, "Query result size limit exceeded"); - free(res[0]); free(res[1]); free(res[2]); - memset(states_out+i, 0, sizeof(*states_out)); - jobs_out[i] = NULL; - if ( ctx->p_query_results == EDG_WLL_QUERYRES_LIMITED ) - { - limit_loop = 0; - goto limit_cycle_cleanup; - } - goto cleanup; - } - - i++; - jobs_out = (edg_wlc_JobId *) realloc(jobs_out, (i+1) * sizeof(*jobs_out)); - states_out = (edg_wll_JobStat *) realloc(states_out, (i+1) * sizeof(*states_out)); - -fetch_cycle_cleanup: - free(res[0]); free(res[1]); free(res[2]); - memset(states_out+i, 0, sizeof(*states_out)); - jobs_out[i] = NULL; - } -limit_cycle_cleanup: - glite_lbu_FreeStmt(&sh); - } while ( limit_loop ); - - if ( !*jobs_out ) { - if(!jobid_only_query(conditions)) { - i = 0; - while(conditions[i]) { - asprintf(&zomb_where_temp,"%s%s", zomb_where ? zomb_where : "(", zomb_where ? " AND (" : ""); - free(zomb_where); - zomb_where = zomb_where_temp; zomb_where_temp = NULL; - - first_or = 0; - j = 0; - while(conditions[i][j].attr) { - - if(conditions[i][j].attr == EDG_WLL_QUERY_ATTR_JOBID) { - dbjob = glite_jobid_unparse(conditions[i][j].value.j); - trio_asprintf(&zomb_where_temp,"%s%s(result.dg_jobid='%|Ss')", - zomb_where, - first_or ? " OR " : "", - dbjob); - free(dbjob); - free(zquery); - free(zomb_where); - zomb_where = zomb_where_temp; zomb_where_temp = NULL; - first_or++; - } - j++; - } - asprintf(&zomb_where_temp,"%s)", zomb_where ? zomb_where : ""); - free(zomb_where); - zomb_where = zomb_where_temp; zomb_where_temp = NULL; - i++; - } - - trio_asprintf(&zquery,"SELECT * FROM " - "(SELECT concat('https://',p.prefix,j.jobid,s.suffix) AS dg_jobid FROM " - "zombie_suffixes AS s, zombie_jobs AS j, zombie_prefixes AS p WHERE " - "(s.suffix_id = j.suffix_id) AND (p.prefix_id = j.prefix_id)) AS result " - "WHERE %s", zomb_where); - - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, - LOG_PRIORITY_DEBUG, zquery); - j = edg_wll_ExecSQL(ctx,zquery,&sh); - - if (j > 0) { - jobs_out = (edg_wlc_JobId *) calloc(j+1, sizeof(*jobs_out)); - states_out = (edg_wll_JobStat *) calloc(j+1, sizeof(*states_out)); - - i = 0; - while ( (ret=edg_wll_FetchRow(ctx,sh,sizofa(res),NULL,res)) > 0 ) { - edg_wlc_JobIdParse(res[0], jobs_out+i); - edg_wlc_JobIdParse(res[0], &(states_out[i].jobId)); - states_out[i].state = EDG_WLL_JOB_PURGED; - free(res[0]); free(res[1]); free(res[2]); - - i++; - } - } - glite_lbu_FreeStmt(&sh); - } - } - - if ( !*jobs_out ) { - if (eperm) edg_wll_SetError(ctx, EPERM, "matching jobs found but authorization failed"); - else edg_wll_SetError(ctx, ENOENT, "no matching jobs found"); - } - - if ( i && (ret == 0) ) - { - if ( states ) - { - *states = states_out; - states_out = NULL; - } - if ( jobs ) - { - *jobs = jobs_out; - jobs_out = NULL; - } - } - - -cleanup: - free(qbase); - free(state_where); - free(tags_where); - free(job_where); - - if (jobs_out) - { - for ( i = 0; jobs_out[i]; i++ ) - edg_wlc_JobIdFree(jobs_out[i]); - free(jobs_out); - } - - if (states_out) - { - for (i=0; states_out[i].state; i++) edg_wll_FreeStatus(states_out+i); - free(states_out); - } - - return edg_wll_Error(ctx,NULL,NULL); -} - - -static int check_event_query_index(edg_wll_Context ctx,const edg_wll_QueryRec **jc,const edg_wll_QueryRec **ec) -{ - int i, j; - - if (check_job_query_index(ctx,jc) == 0) return 0; - edg_wll_ResetError(ctx); - - if (ec && *ec) for (i=0; ec[i]; i++) for (j=0; ec[i][j].attr; j++) switch (ec[i][j].attr) { - case EDG_WLL_QUERY_ATTR_TIME: - return 0; - default: break; - } - return edg_wll_SetError(ctx,EDG_WLL_ERROR_NOINDEX, - is_all_query(jc) ? "\"-all\" queries denied by server configuration" : NULL); -} - -int check_job_query_index(edg_wll_Context ctx, const edg_wll_QueryRec **jc) -{ - int i, j, jj; - - - edg_wll_ResetError(ctx); - - if ( !jc || !*jc ) - return edg_wll_SetError(ctx,EDG_WLL_ERROR_NOINDEX,"unrestricted queries unsupported"); - - /* - * First check presense of jobid - Primary key - */ - for ( i = 0; jc[i]; i++ ) for ( j = 0; jc[i][j].attr; j++ ) - if ( jc[i][j].attr == EDG_WLL_QUERY_ATTR_JOBID ) return 0; - - if ( !ctx->job_index ) - return edg_wll_SetError(ctx, EDG_WLL_ERROR_NOINDEX, "no indices configured: jobid required in query"); - - for ( j = 0; ctx->job_index[j]; j++ ) - { - if ( !ctx->job_index[j][0].attr ) - continue; - - if ( ctx->job_index[j][1].attr ) - { - /* - * check multi comlumn indexes - */ - for ( jj = 0; ctx->job_index[j][jj].attr; jj++ ) - { - for ( i = 0; jc[i]; i++ ) - if ( !edg_wll_CmpColumn(&ctx->job_index[j][jj], &jc[i][0]) ) break; - if ( !jc[i] ) - break; - } - if ( !ctx->job_index[j][jj].attr ) - return 0; - } - else - for ( i = 0; jc[i]; i++ ) - if ( !edg_wll_CmpColumn(&ctx->job_index[j][0], &jc[i][0]) ) return 0; - } - - return edg_wll_SetError(ctx,EDG_WLL_ERROR_NOINDEX, - is_all_query(jc) ? "\"-all\" queries denied by server configuration" : NULL); -} - -#define opToString(op) \ - ((op) == EDG_WLL_QUERY_OP_EQUAL ? "=" : \ - ((op) == EDG_WLL_QUERY_OP_UNEQUAL ? "!=" : \ - ((op) == EDG_WLL_QUERY_OP_LESS ? "<" : ">" ))) - -static char *ec_to_head_where(edg_wll_Context ctx,const edg_wll_QueryRec **ec) -{ - int n, ct, m; - char msg[100], - *out, - *aux, - *conds, *retconds, - *dbt; - - - /* - * check correctness only - */ - for ( ct = m = 0; ec[m]; m++ ) - { - for ( n = 0; ec[m][n].attr; n++ ) switch ( ec[m][n].attr ) - { - case EDG_WLL_QUERY_ATTR_HOST: - if ( ec[m][n].op != EDG_WLL_QUERY_OP_EQUAL && ec[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL ) - { - edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with host attr"); - return NULL; - } - ct++; - break; - - case EDG_WLL_QUERY_ATTR_SOURCE: - if ( ec[m][n].op != EDG_WLL_QUERY_OP_EQUAL && ec[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL ) - { - edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with host attr"); - return NULL; - } - ct++; - break; - - case EDG_WLL_QUERY_ATTR_USERTAG: - if ( ec[m][n].op != EDG_WLL_QUERY_OP_EQUAL && ec[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL ) - { - edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with usertag attr"); - return NULL; - } - ct++; - break; - - case EDG_WLL_QUERY_ATTR_JDL_ATTR: - if ( ec[m][n].op != EDG_WLL_QUERY_OP_EQUAL && ec[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL ) - { - edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with jdl_attr"); - return NULL; - } - ct++; - break; - - case EDG_WLL_QUERY_ATTR_INSTANCE: - if ( ec[m][n].op != EDG_WLL_QUERY_OP_EQUAL && ec[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL ) - { - edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with instance attr"); - return NULL; - } - ct++; - break; - - case EDG_WLL_QUERY_ATTR_EVENT_TYPE: - case EDG_WLL_QUERY_ATTR_LEVEL: - /* - * Any op allowed - but be careful - */ - case EDG_WLL_QUERY_ATTR_TIME: - case EDG_WLL_QUERY_ATTR_STATEENTERTIME: - case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: - /* any operator allowed */ - ct++; - break; - - default: - sprintf(msg, "ec_to_head_where(): attr=%d unsupported", ec[m][n].attr); - edg_wll_SetError(ctx, EINVAL, msg); - return NULL; - } - } - - if ( ct == 0 ) - { - edg_wll_SetError(ctx,EINVAL,"ec_to_head_where(): empty conditions"); - return NULL; - } - - conds = retconds = NULL; - for ( m = 0; ec[m]; m++ ) - { - /* - * conditions captured by match_flesh_conditions() have to be skipped here. - * with all conditions in same "or clause" - */ - for ( n = 0; ec[m][n].attr; n++ ) - if ( /* (ec[m][n].attr == EDG_WLL_QUERY_ATTR_USERTAG) || */ - (ec[m][n].attr == EDG_WLL_QUERY_ATTR_INSTANCE) ) - break; - if ( ec[m][n].attr ) - continue; - - for ( n = 0; ec[m][n].attr; n++ ) switch ( ec[m][n].attr ) - { - case EDG_WLL_QUERY_ATTR_TIME: - case EDG_WLL_QUERY_ATTR_STATEENTERTIME: - case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: - glite_lbu_TimeToStr(ec[m][n].value.t.tv_sec, &dbt); - if ( conds ) - { - if ( ec[m][n].op == EDG_WLL_QUERY_OP_WITHIN ) - { - trio_asprintf(&aux, "%s", dbt); - free(dbt); - glite_lbu_TimeToStr(ec[m][n].value2.t.tv_sec, &dbt); - trio_asprintf(&out, "%s OR (e.time_stamp >= %s AND e.time_stamp <= %s)", conds, aux, dbt); - free(aux); - } - else if (ec[m][n].op == EDG_WLL_QUERY_OP_EQUAL) { - trio_asprintf(&out, "%s OR (e.time_stamp = %s AND e.usec = %d)", - conds, dbt, ec[m][n].value.t.tv_usec); - } - else - trio_asprintf(&out, "%s OR e.time_stamp %s %s", conds, opToString(ec[m][n].op), dbt); - free(conds); - conds = out; - } - else if ( ec[m][n].op == EDG_WLL_QUERY_OP_WITHIN ) - { - trio_asprintf(&aux, "%s", dbt); - free(dbt); - glite_lbu_TimeToStr(ec[m][n].value2.t.tv_sec, &dbt); - trio_asprintf(&conds, "(e.time_stamp >= %s AND e.time_stamp <= %s)", aux, dbt); - free(aux); - } - else if (ec[m][n].op == EDG_WLL_QUERY_OP_EQUAL) { - trio_asprintf(&conds, "(e.time_stamp = %s AND e.usec = %d)", - dbt, ec[m][n].value.t.tv_usec); - } - else { - trio_asprintf(&conds, "e.time_stamp %s %s", opToString(ec[m][n].op), dbt); - } - free(dbt); - break; - - case EDG_WLL_QUERY_ATTR_LEVEL: - if ( conds ) - { - if ( ec[m][n].op == EDG_WLL_QUERY_OP_WITHIN ) - trio_asprintf(&out, "%s OR (e.level >= %d AND e.level <= %d)", conds, ec[m][n].value.i, ec[m][n].value2.i); - else - trio_asprintf(&out, "%s OR e.level %s %d", conds, opToString(ec[m][n].op), ec[m][n].value.i); - free(conds); conds = out; - } - else - if ( ec[m][n].op == EDG_WLL_QUERY_OP_WITHIN ) - trio_asprintf(&conds, "(e.level >= %d AND e.level <= %d)", ec[m][n].value.i, ec[m][n].value2.i); - else - trio_asprintf(&conds, "e.level %s %d", opToString(ec[m][n].op), ec[m][n].value.i); - break; - - case EDG_WLL_QUERY_ATTR_SOURCE: - aux = edg_wll_SourceToString(ec[m][n].value.i); - if ( conds ) - { - trio_asprintf(&out, "%s OR e.prog %s '%|Ss'", conds, opToString(ec[m][n].op), aux); - free(conds); conds = out; - } - else - trio_asprintf(&conds, "e.prog %s '%|Ss'", opToString(ec[m][n].op), aux); - free(aux); - break; - - case EDG_WLL_QUERY_ATTR_HOST: - if ( conds ) - { - trio_asprintf(&out, "%s OR e.host %s '%|Ss'", conds, opToString(ec[m][n].op), ec[m][n].value.c); - free(conds); conds = out; - } - else - trio_asprintf(&conds, "e.host %s '%|Ss'", opToString(ec[m][n].op), ec[m][n].value.c); - break; - - case EDG_WLL_QUERY_ATTR_USERTAG: - if ( conds ) - { - trio_asprintf(&out, "%s OR e.code = %d", conds, EDG_WLL_EVENT_USERTAG); - free(conds); conds = out; - } - else - trio_asprintf(&conds, "e.code = %d", EDG_WLL_EVENT_USERTAG); - break; - case EDG_WLL_QUERY_ATTR_EVENT_TYPE: - if ( conds ) - { - if ( ec[m][n].op == EDG_WLL_QUERY_OP_WITHIN ) - trio_asprintf(&out, "%s OR (e.code >= %d AND e.code <= %d)", conds, ec[m][n].value.i, ec[m][n].value2.i); - else - trio_asprintf(&out, "%s OR e.code %s %d", conds, opToString(ec[m][n].op), ec[m][n].value.i); - free(conds); conds = out; - } - else - if ( ec[m][n].op == EDG_WLL_QUERY_OP_WITHIN ) - trio_asprintf(&conds, "(e.code >= %d AND e.code <= %d)", ec[m][n].value.i, ec[m][n].value2.i); - else - trio_asprintf(&conds, "e.code %s %d", opToString(ec[m][n].op), ec[m][n].value.i); - break; - - default: - return NULL; - } - - if ( !conds ) - continue; - - if ( retconds ) - { - trio_asprintf(&out, "%s AND (%s)", retconds, conds); - free(retconds); retconds = out; - free(conds); conds = NULL; - } - else - { - trio_asprintf(&retconds, "(%s)", conds); - free(conds); conds = NULL; - } - } - - return retconds; -} - -static int is_indexed(const edg_wll_QueryRec *cond, const edg_wll_Context ctx) -{ - int i, j; - - - if ( !(ctx->job_index) ) - return 0; - - for ( i = 0; ctx->job_index[i]; i++ ) for ( j = 0; ctx->job_index[i][j].attr; j++ ) - if ( !edg_wll_CmpColumn(&ctx->job_index[i][j], cond) ) return 1; - - return 0; -} - -/* - * use where_flags to recognize which table to jois in SQL select - * - */ -static char *jc_to_head_where( - edg_wll_Context ctx, - const edg_wll_QueryRec **jc, - int *where_flags) -{ - int ct, n, m; - char *aux, - *tmps, - *tmps2, - *dbt, - *cname = NULL, - msg[100]; - char *conds, *retconds; - char *can_peername = NULL; - - retconds = conds = NULL; - - /* - * check correctness only - */ - for ( ct = m = 0; jc[m]; m++ ) for ( n = 0; jc[m][n].attr; n++ ) - { - if ( (jc[m][0].attr != jc[m][n].attr) - || ( (jc[m][n].attr == EDG_WLL_QUERY_ATTR_USERTAG) - && strcmp(jc[m][0].attr_id.tag, jc[m][n].attr_id.tag)) ) - { - edg_wll_SetError(ctx, EINVAL, "only same attribute types supported in 'or' expressions"); - return NULL; - } - - switch ( jc[m][n].attr ) - { - case EDG_WLL_QUERY_ATTR_JOBID: - ct++; - if ( jc[m][n].op != EDG_WLL_QUERY_OP_EQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_GREATER) - { - edg_wll_SetError(ctx, EINVAL, "only `=', '>' and '!=' supported with jobid"); - return NULL; - } - break; - - case EDG_WLL_QUERY_ATTR_OWNER: - ct++; - if ( jc[m][n].op != EDG_WLL_QUERY_OP_EQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL ) - { - edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with job owner"); - return NULL; - } - break; - - case EDG_WLL_QUERY_ATTR_LOCATION: - ct++; - if ( jc[m][n].op != EDG_WLL_QUERY_OP_EQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL ) - { - edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with job location"); - return NULL; - } - break; - - case EDG_WLL_QUERY_ATTR_DESTINATION: - ct++; - if ( jc[m][n].op != EDG_WLL_QUERY_OP_EQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL ) - { - edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with job destinations"); - return NULL; - } - break; - - case EDG_WLL_QUERY_ATTR_PARENT: - ct++; - if ( jc[m][n].op != EDG_WLL_QUERY_OP_EQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL ) - { - edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with job parent"); - return NULL; - } - break; - - case EDG_WLL_QUERY_ATTR_RESUBMITTED: - ct++; - if ( jc[m][n].op != EDG_WLL_QUERY_OP_EQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL ) - { - edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with resubmitted attr"); - return NULL; - } - break; - - case EDG_WLL_QUERY_ATTR_TIME: - if ( jc[m][n].attr_id.state == EDG_WLL_JOB_UNDEF ) - { - edg_wll_SetError(ctx, EINVAL, "Time attribut have to be associated with status specification"); - return NULL; - } - ct++; - break; - case EDG_WLL_QUERY_ATTR_DONECODE: - case EDG_WLL_QUERY_ATTR_EXITCODE: - case EDG_WLL_QUERY_ATTR_STATUS: - case EDG_WLL_QUERY_ATTR_STATEENTERTIME: - case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: - ct++; - break; - - case EDG_WLL_QUERY_ATTR_USERTAG: - ct++; - break; - case EDG_WLL_QUERY_ATTR_JDL_ATTR: - ct++; - if ( jc[m][n].op != EDG_WLL_QUERY_OP_EQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL ) - { - edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with JDL attributes"); - return NULL; - } - break; - - default: - sprintf(msg, "jc_to_head_where(): attr=%d unsupported", jc[m][n].attr); - edg_wll_SetError(ctx, EINVAL, msg); - return NULL; - } - } - - if ( ct == 0 ) - { - edg_wll_SetError(ctx, EINVAL, "jc_to_head_where(): empty conditions"); - return NULL; - } - - /* - * Now process conversion - */ - for ( m = 0; jc[m]; m++ ) - { - for ( n = 0; jc[m][n].attr; n++ ) switch (jc[m][n].attr) - { - case EDG_WLL_QUERY_ATTR_TIME: - case EDG_WLL_QUERY_ATTR_STATEENTERTIME: - case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: - if ( !is_indexed(&(jc[m][n]), ctx) - || !(cname = edg_wll_QueryRecToColumn(&(jc[m][n]))) ) - { - *where_flags |= FL_FILTER; - break; - } - - *where_flags |= FL_SEL_STATUS; - - glite_lbu_TimeToStr(jc[m][n].value.t.tv_sec, &dbt); - if ( conds ) - { - if ( jc[m][n].op == EDG_WLL_QUERY_OP_WITHIN ) - { - trio_asprintf(&aux, "%s", dbt); - free(dbt); - glite_lbu_TimeToStr(jc[m][n].value2.t.tv_sec, &dbt); - trio_asprintf(&tmps, "%s OR (s.%s >= %s AND s.%s <= %s)", conds, cname, aux, cname, dbt); - free(dbt); - free(aux); - } - else - trio_asprintf(&tmps, "%s OR s.%s %s %s", conds, cname, opToString(jc[m][n].op), dbt); - - free(conds); - conds = tmps; - } - else if ( jc[m][n].op == EDG_WLL_QUERY_OP_WITHIN ) - { - trio_asprintf(&aux, "%s", dbt); - free(dbt); - glite_lbu_TimeToStr(jc[m][n].value2.t.tv_sec, &dbt); - trio_asprintf(&conds, "(s.%s >= %s AND s.%s <= %s)", cname, aux, cname, dbt); - free(dbt); - free(aux); - } - else - trio_asprintf(&conds, "s.%s %s %s", cname, opToString(jc[m][n].op), dbt); - - free(cname); - break; - - case EDG_WLL_QUERY_ATTR_JOBID: - *where_flags |= FL_SEL_JOB; - aux = edg_wlc_JobIdGetUnique(jc[m][n].value.j); - if ( conds ) - { - trio_asprintf(&tmps, "%s OR j.jobid%s'%|Ss'", conds, opToString(jc[m][n].op), aux); - free(conds); conds = tmps; - } - else - trio_asprintf(&conds, "j.jobid%s'%|Ss'", opToString(jc[m][n].op), aux); - free(aux); - break; - - case EDG_WLL_QUERY_ATTR_PARENT: - if ( !is_indexed(&(jc[m][n]), ctx) - || !(cname = edg_wll_QueryRecToColumn(&(jc[m][n]))) ) - { - *where_flags |= FL_FILTER; - break; - } - - *where_flags |= FL_SEL_STATUS; - aux = edg_wlc_JobIdGetUnique(jc[m][n].value.j); - if ( conds ) - { - trio_asprintf(&tmps, "%s OR s.%s%s'%|Ss'", conds, cname, opToString(jc[m][n].op), aux); - free(conds); conds = tmps; - } - else - trio_asprintf(&conds, "s.%s%s'%|Ss'", cname, opToString(jc[m][n].op), aux); - free(aux); - break; - - case EDG_WLL_QUERY_ATTR_OWNER: - if ( !is_indexed(&(jc[m][n]), ctx) - || !(cname = edg_wll_QueryRecToColumn(&(jc[m][n]))) ) - { - *where_flags |= FL_FILTER; - break; - } - - if ( !jc[m][n].value.c && !ctx->peerName ) - { - edg_wll_SetError(ctx, EPERM, "jc_to_head_where(): ctx->peerName empty"); - free(cname); free(conds); free(retconds); - return NULL; - } - - tmps2 = edg_wll_gss_normalize_subj(jc[m][n].value.c, 0); - if (!jc[m][n].value.c && !can_peername) { - can_peername = edg_wll_gss_normalize_subj(ctx->peerName, 0); - } - - *where_flags |= FL_SEL_STATUS; - if ( conds ) - { - if ( jc[m][n].value.c ) - trio_asprintf(&tmps, "%s OR s.%s%s'%|Ss'", conds, cname, opToString(jc[m][n].op), tmps2); - else - trio_asprintf(&tmps, "%s OR s.%s%s'%|Ss'", conds, cname, opToString(jc[m][n].op), can_peername); - free(conds); conds = tmps; - } - else - { - if ( jc[m][n].value.c ) - trio_asprintf(&conds, "s.%s%s'%|Ss'", cname, opToString(jc[m][n].op), tmps2); - else - trio_asprintf(&conds, "s.%s%s'%|Ss'", cname, opToString(jc[m][n].op), can_peername); - } - free(tmps2); - break; - - case EDG_WLL_QUERY_ATTR_DONECODE: - case EDG_WLL_QUERY_ATTR_EXITCODE: - case EDG_WLL_QUERY_ATTR_STATUS: - if ( !is_indexed(&(jc[m][n]), ctx) - || !(cname = edg_wll_QueryRecToColumn(&(jc[m][n]))) ) - { - *where_flags |= FL_FILTER; - break; - } - - *where_flags |= FL_SEL_STATUS; - if ( conds ) - { - if ( jc[m][n].op == EDG_WLL_QUERY_OP_WITHIN ) - trio_asprintf(&tmps, "%s OR (s.%s >= %d AND s.%s <= %d)", conds, cname, jc[m][n].value.i, cname, jc[m][n].value2.i); - else - trio_asprintf(&tmps, "%s OR s.%s %s %d", conds, cname, opToString(jc[m][n].op), jc[m][n].value.i); - free(conds); conds = tmps; - } - else - if ( jc[m][n].op == EDG_WLL_QUERY_OP_WITHIN ) - trio_asprintf(&conds, "(s.%s >= %d AND s.%s <= %d)", cname, jc[m][n].value.i, cname, jc[m][n].value2.i); - else - trio_asprintf(&conds, "s.%s %s %d", cname, opToString(jc[m][n].op),jc[m][n].value.i); - - free(cname); - break; - - case EDG_WLL_QUERY_ATTR_DESTINATION: - case EDG_WLL_QUERY_ATTR_LOCATION: - case EDG_WLL_QUERY_ATTR_RESUBMITTED: - case EDG_WLL_QUERY_ATTR_USERTAG: - case EDG_WLL_QUERY_ATTR_JDL_ATTR: - if ( !is_indexed(&(jc[m][n]), ctx) - || !(cname = edg_wll_QueryRecToColumn(&(jc[m][n]))) ) - { - *where_flags |= FL_FILTER | FL_SEL_JDL; - break; - } - - *where_flags |= FL_SEL_STATUS; - if ( conds ) - { - trio_asprintf(&tmps, "%s OR s.%s%s'%s'", conds, cname, opToString(jc[m][n].op), jc[m][n].value.c); - free(conds); conds = tmps; - } - else - trio_asprintf(&conds, "s.%s%s'%s'", cname, opToString(jc[m][n].op), jc[m][n].value.c); - - free(cname); - break; - - default: - /* this may never occure, but keep compiler happy */ - *where_flags |= FL_FILTER; // just to be sure - break; - } - - if ( !conds ) continue; - - if ( retconds ) - { - trio_asprintf(&tmps, "%s AND (%s)", retconds, conds); - free(retconds); retconds = tmps; - free(conds); conds = NULL; - } - else - { - trio_asprintf(&retconds, "(%s)", conds); - free(conds); conds = NULL; - } - } - - free(can_peername); - return retconds; -} - - -static int match_flesh_conditions(const edg_wll_Event *e,const edg_wll_QueryRec **ec) -{ - int i, j; - - - if ( !ec ) - return 1; - - for ( i = 0; ec[i]; i++ ) - { - j = 0; - while ( (ec[i][j].attr) - && (ec[i][j].attr != EDG_WLL_QUERY_ATTR_USERTAG) - && (ec[i][j].attr != EDG_WLL_QUERY_ATTR_INSTANCE) ) j++; - if ( !ec[i][j].attr ) - continue; - - for ( j = 0; ec[i][j].attr; j++ ) - { - if ( ec[i][j].attr == EDG_WLL_QUERY_ATTR_TIME ) - { - if ( ((ec[i][j].op == EDG_WLL_QUERY_OP_EQUAL) && (e->any.timestamp.tv_sec == ec[i][j].value.t.tv_sec)) - || ((ec[i][j].op == EDG_WLL_QUERY_OP_LESS) && (e->any.timestamp.tv_sec < ec[i][j].value.t.tv_sec)) - || ((ec[i][j].op == EDG_WLL_QUERY_OP_GREATER) && (e->any.timestamp.tv_sec < ec[i][j].value.t.tv_sec)) - || ( (ec[i][j].op == EDG_WLL_QUERY_OP_WITHIN) - && (e->any.timestamp.tv_sec >= ec[i][j].value.t.tv_sec) - && (e->any.timestamp.tv_sec <= ec[i][j].value2.t.tv_sec)) ) - break; - } - else if ( ec[i][j].attr == EDG_WLL_QUERY_ATTR_SOURCE ) - { - if ( e->any.source == EDG_WLL_SOURCE_NONE ) - continue; - if ( ((ec[i][j].op == EDG_WLL_QUERY_OP_EQUAL) && (e->any.source == ec[i][j].value.i)) - || ((ec[i][j].op == EDG_WLL_QUERY_OP_LESS) && (e->any.source < ec[i][j].value.i)) - || ((ec[i][j].op == EDG_WLL_QUERY_OP_GREATER) && (e->any.source < ec[i][j].value.i)) - || ( (ec[i][j].op == EDG_WLL_QUERY_OP_WITHIN) - && (e->any.source >= ec[i][j].value.i) - && (e->any.source <= ec[i][j].value2.i)) ) - break; - } - else if ( ec[i][j].attr == EDG_WLL_QUERY_ATTR_LEVEL ) - { - if ( ((ec[i][j].op == EDG_WLL_QUERY_OP_EQUAL) && (e->any.level == ec[i][j].value.i)) - || ((ec[i][j].op == EDG_WLL_QUERY_OP_LESS) && (e->any.level < ec[i][j].value.i)) - || ((ec[i][j].op == EDG_WLL_QUERY_OP_GREATER) && (e->any.level < ec[i][j].value.i)) - || ( (ec[i][j].op == EDG_WLL_QUERY_OP_WITHIN) - && (e->any.level >= ec[i][j].value.i) - && (e->any.level <= ec[i][j].value2.i)) ) - break; - } - else if ( ec[i][j].attr == EDG_WLL_QUERY_ATTR_HOST ) - { - if ( !strcmp(ec[i][j].value.c, e->any.host) ) - break; - } - else if ( ec[i][j].attr == EDG_WLL_QUERY_ATTR_EVENT_TYPE ) - { - if ( e->any.type == ec[i][j].value.i ) - break; - } - else if ( ec[i][j].attr == EDG_WLL_QUERY_ATTR_USERTAG ) - { - if ( e->any.type == EDG_WLL_EVENT_USERTAG && - !strcmp(ec[i][j].attr_id.tag,e->userTag.name) - && cmp_string(e->userTag.value,ec[i][j].op,ec[i][j].value.c,ec[i][j].value2.c)) - break; - } - else if ( ec[i][j].attr == EDG_WLL_QUERY_ATTR_INSTANCE ) - { - if ( e->any.src_instance - && cmp_string(e->any.src_instance, ec[i][j].op, ec[i][j].value.c, ec[i][j].value2.c) ) - break; - } - } - if ( !ec[i][j].attr ) - /* - * No condition in "or" clause is valid - */ - return 0; - } - - return 1; -} - -/* XXX: has to match exactly the main query in edg_wll_QueryEvents - * and similar one in srv_purge.c - */ -int convert_event_head(edg_wll_Context ctx,char **f,edg_wll_Event *e) -{ - int ret,i; - - memset(e,0,sizeof *e); - edg_wll_ResetError(ctx); - - - if ((ret=edg_wlc_JobIdParse(f[0],&e->any.jobId))) { - edg_wll_SetError(ctx,-ret,"edg_wlc_JobIdParse()"); - goto err; - } - - e->type = atoi(f[1]); - free(f[1]); f[1] = NULL; - - e->any.source = edg_wll_StringToSource(f[2]); - free(f[2]); f[2] = NULL; - - e->any.host = f[3]; - f[3] = NULL; - - e->any.user = f[4]; - f[4] = NULL; - - e->any.timestamp.tv_sec = glite_lbu_StrToTime(f[5]); - free(f[5]); f[5] = NULL; - - e->any.timestamp.tv_usec = atoi(f[6]); - free(f[6]); f[6] = NULL; - - e->any.level = atoi(f[7]); - free(f[7]); f[7] = NULL; - - e->any.arrived.tv_sec = glite_lbu_StrToTime(f[8]); - e->any.arrived.tv_usec = 0; - free(f[8]); f[8] = NULL; - - e->any.seqcode = f[9]; - f[9] = NULL; - - return 0; - -err: - edg_wll_FreeEvent(e); - memset(e,0,sizeof *e); - for (i=0; i<9; i++) free(f[i]); - return edg_wll_Error(ctx,NULL,NULL); -} - - - -/* FIXME: other op's, ORed conditions */ -int match_status(edg_wll_Context ctx, const edg_wll_JobStat *oldstat, const edg_wll_JobStat *stat, const edg_wll_QueryRec **conds) -{ - int i, j, n; - char *s, *s1; - - - if ( !conds ) return 1; - - for ( i = 0; conds[i]; i++ ) - { - for ( j = 0; conds[i][j].attr; j++ ) - { - // ignore operator CHANGED for non-notification matches - if ( (conds[i][j].op == EDG_WLL_QUERY_OP_CHANGED) && !oldstat) continue; - - switch ( conds[i][j].attr ) - { - case EDG_WLL_QUERY_ATTR_STATUS: - switch ( conds[i][j].op ) - { - case EDG_WLL_QUERY_OP_EQUAL: - if ( conds[i][j].value.i == stat->state ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_UNEQUAL: - if ( conds[i][j].value.i != stat->state ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_LESS: - if ( conds[i][j].value.i > stat->state ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_GREATER: - if ( conds[i][j].value.i < stat->state ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_WITHIN: - if ( conds[i][j].value.i <= stat->state - && conds[i][j].value2.i >= stat->state ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_CHANGED: - if ( oldstat->state != stat->state ) goto or_satisfied; - break; - } - break; - case EDG_WLL_QUERY_ATTR_RESUBMITTED: - switch ( conds[i][j].op ) - { - case EDG_WLL_QUERY_OP_EQUAL: - if ( conds[i][j].value.i == stat->resubmitted ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_UNEQUAL: - if ( conds[i][j].value.i != stat->resubmitted ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_LESS: - case EDG_WLL_QUERY_OP_GREATER: - case EDG_WLL_QUERY_OP_WITHIN: - break; - case EDG_WLL_QUERY_OP_CHANGED: - if ( oldstat->resubmitted != stat->resubmitted ) goto or_satisfied; - break; - } - break; - case EDG_WLL_QUERY_ATTR_DONECODE: - switch ( conds[i][j].op ) - { - case EDG_WLL_QUERY_OP_EQUAL: - if ( conds[i][j].value.i == stat->done_code ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_UNEQUAL: - if ( conds[i][j].value.i != stat->done_code ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_LESS: - if ( conds[i][j].value.i > stat->done_code ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_GREATER: - if ( conds[i][j].value.i < stat->done_code ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_WITHIN: - if ( conds[i][j].value.i <= stat->done_code - && conds[i][j].value2.i >= stat->done_code ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_CHANGED: - if ( oldstat->done_code != stat->done_code ) goto or_satisfied; - break; - } - break; - case EDG_WLL_QUERY_ATTR_EXITCODE: - switch ( conds[i][j].op ) - { - case EDG_WLL_QUERY_OP_EQUAL: - if ( conds[i][j].value.i == stat->exit_code ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_UNEQUAL: - if ( conds[i][j].value.i != stat->exit_code ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_LESS: - if ( conds[i][j].value.i > stat->exit_code ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_GREATER: - if ( conds[i][j].value.i < stat->exit_code ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_WITHIN: - if ( conds[i][j].value.i <= stat->exit_code - && conds[i][j].value2.i >= stat->exit_code ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_CHANGED: - if ( oldstat->exit_code != stat->exit_code ) goto or_satisfied; - break; - } - break; - case EDG_WLL_QUERY_ATTR_OWNER: - if (stat->owner) { - if (conds[i][j].value.c) { - if (edg_wll_gss_equal_subj(conds[i][j].value.c, stat->owner) ) { - if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied; - } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied; - } else if (ctx->peerName) { - if (edg_wll_gss_equal_subj(ctx->peerName, stat->owner) ) { - if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied; - } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied; - } - // TODO: EDG_WLL_QUERY_OP_LESS, EDG_WLL_QUERY_OP_GREATER, EDG_WLL_QUERY_OP_WITHIN - } - break; - case EDG_WLL_QUERY_ATTR_LOCATION: - if ( stat->location ) - { - int tmp = strcmp(conds[i][j].value.c, stat->location); - - switch ( conds[i][j].op ) - { - case EDG_WLL_QUERY_OP_EQUAL: - if (!tmp) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_UNEQUAL: - if (tmp) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_LESS: - if (tmp < 0) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_GREATER: - if (tmp > 0) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_WITHIN: - if (tmp <= 0 && strcmp(conds[i][j].value2.c, stat->location) >= 0) - goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_CHANGED: - if (strcmp(oldstat->location,stat->location) != 0) goto or_satisfied; - break; - } - } - break; - case EDG_WLL_QUERY_ATTR_DESTINATION: - if ( stat->destination ) - { - if ( !strcmp(conds[i][j].value.c, stat->destination) ) { - if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied; - } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied; - // TODO: EDG_WLL_QUERY_OP_LESS, EDG_WLL_QUERY_OP_GREATER, EDG_WLL_QUERY_OP_WITHIN, EDG_WLL_QUERY_OP_CHANGED - } - case EDG_WLL_QUERY_ATTR_NETWORK_SERVER: - if ( stat->network_server ) - { - if ( !strcmp(conds[i][j].value.c, stat->network_server) ) { - if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied; - } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied; - // TODO: EDG_WLL_QUERY_OP_LESS, EDG_WLL_QUERY_OP_GREATER, EDG_WLL_QUERY_OP_WITHIN, EDG_WLL_QUERY_OP_CHANGED - } - break; - case EDG_WLL_QUERY_ATTR_JOBID: - if ( !stat->jobId ) - break; - s = edg_wlc_JobIdUnparse(stat->jobId); - s1 = edg_wlc_JobIdUnparse(conds[i][j].value.j); - if ( s && s1 ) - { - int r = strcmp(s1, s); - free(s); free(s1); - if ( !r ) { - if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied; - } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied; - } - break; - case EDG_WLL_QUERY_ATTR_PARENT: - if ( !stat->parent_job ) - break; - s = edg_wlc_JobIdUnparse(stat->parent_job); - s1 = edg_wlc_JobIdUnparse(conds[i][j].value.j); - if ( s && s1 ) - { - int r = strcmp(s1, s); - free(s); free(s1); - if ( !r ) { - if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied; - } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied; - } - break; - case EDG_WLL_QUERY_ATTR_USERTAG: - if ( !stat->user_tags ) - { - if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) - goto or_satisfied; - - break; - } - for ( n = 0; stat->user_tags[n].tag; n++ ) - if ( !strcasecmp(conds[i][j].attr_id.tag, stat->user_tags[n].tag) ) - { - if ( !strcmp(conds[i][j].value.c, stat->user_tags[n].value) ) { - if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied; - } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied; - - break; - } - if ( !stat->user_tags[n].tag && conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) - goto or_satisfied; - break; - case EDG_WLL_QUERY_ATTR_TIME: - if ( !stat->stateEnterTimes || !stat->stateEnterTimes[1+conds[i][j].attr_id.state] ) - break; - switch ( conds[i][j].op ) - { - case EDG_WLL_QUERY_OP_EQUAL: - if ( conds[i][j].value.t.tv_sec == stat->stateEnterTimes[1+conds[i][j].attr_id.state] ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_UNEQUAL: - if ( conds[i][j].value.t.tv_sec != stat->stateEnterTimes[1+conds[i][j].attr_id.state] ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_LESS: - if ( conds[i][j].value.t.tv_sec > stat->stateEnterTimes[1+conds[i][j].attr_id.state] ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_GREATER: - if ( conds[i][j].value.t.tv_sec < stat->stateEnterTimes[1+conds[i][j].attr_id.state] ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_WITHIN: - if ( conds[i][j].value.t.tv_sec <= stat->stateEnterTimes[1+conds[i][j].attr_id.state] - && conds[i][j].value2.t.tv_sec >= stat->stateEnterTimes[1+conds[i][j].attr_id.state] ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_CHANGED: - if (oldstat->stateEnterTimes[1+conds[i][j].attr_id.state] != stat->stateEnterTimes[1+conds[i][j].attr_id.state]) goto or_satisfied; - break; - } - break; - case EDG_WLL_QUERY_ATTR_JDL_ATTR: - if (conds[i][j].op == EDG_WLL_QUERY_OP_CHANGED && - conds[i][j].attr_id.tag == NULL && - oldstat && - (oldstat->jdl == NULL || - (stat->jdl && strcmp(oldstat->jdl,stat->jdl)) - ) - ) goto or_satisfied; - - if (stat->jdl != NULL && conds[i][j].attr_id.tag) { - struct cclassad *ad = NULL; - char *extr_val = NULL; - - // Jobs that do not have a JDL come with blabla: - if (!strcmp(stat->jdl,"blabla")) break; - - ad = cclassad_create(stat->jdl); - if (ad) { - if (!cclassad_evaluate_to_string(ad, conds[i][j].attr_id.tag, &extr_val)) // Extract attribute value - extr_val = NULL; - cclassad_delete(ad); - } - if (extr_val) { - - if ( !strcmp(conds[i][j].value.c, extr_val) ) { - if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied; - else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied; - } - } - } - break; - case EDG_WLL_QUERY_ATTR_STATEENTERTIME: - if ( !stat->stateEnterTime.tv_sec ) - break; - switch ( conds[i][j].op ) - { - case EDG_WLL_QUERY_OP_EQUAL: - if ( conds[i][j].value.t.tv_sec == stat->stateEnterTime.tv_sec ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_UNEQUAL: - if ( conds[i][j].value.t.tv_sec != stat->stateEnterTime.tv_sec ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_LESS: - if ( conds[i][j].value.t.tv_sec > stat->stateEnterTime.tv_sec ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_GREATER: - if ( conds[i][j].value.t.tv_sec < stat->stateEnterTime.tv_sec ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_WITHIN: - if ( conds[i][j].value.t.tv_sec <= stat->stateEnterTime.tv_sec - && conds[i][j].value2.t.tv_sec >= stat->stateEnterTime.tv_sec ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_CHANGED: - if (oldstat->stateEnterTime.tv_sec != stat->stateEnterTime.tv_sec) goto or_satisfied; - break; - } - case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: - if ( !stat->lastUpdateTime.tv_sec ) - break; - switch ( conds[i][j].op ) - { - case EDG_WLL_QUERY_OP_EQUAL: - if ( conds[i][j].value.t.tv_sec == stat->lastUpdateTime.tv_sec ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_UNEQUAL: - if ( conds[i][j].value.t.tv_sec != stat->lastUpdateTime.tv_sec ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_LESS: - if ( conds[i][j].value.t.tv_sec > stat->lastUpdateTime.tv_sec ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_GREATER: - if ( conds[i][j].value.t.tv_sec < stat->lastUpdateTime.tv_sec ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_WITHIN: - if ( conds[i][j].value.t.tv_sec <= stat->lastUpdateTime.tv_sec - && conds[i][j].value2.t.tv_sec >= stat->lastUpdateTime.tv_sec ) goto or_satisfied; - break; - case EDG_WLL_QUERY_OP_CHANGED: - if (oldstat->lastUpdateTime.tv_sec != stat->lastUpdateTime.tv_sec) goto or_satisfied; - break; - } - default: - break; - } - } - - /* - * No one condition in "or clause satisfied - */ - return 0; - -or_satisfied: - - // just for escaping from nested cycles - ; /* prevent compiler to complain */ - } - - return 1; -} - -static int cmp_string(const char *s1,edg_wll_QueryOp op,const char *s2,const char *s2b) -{ - switch (op) { - case EDG_WLL_QUERY_OP_EQUAL: - case EDG_WLL_QUERY_OP_CHANGED: - return !strcmp(s1,s2); - case EDG_WLL_QUERY_OP_UNEQUAL: - return !!strcmp(s1,s2); - case EDG_WLL_QUERY_OP_LESS: return strcmp(s1,s2)<0; - case EDG_WLL_QUERY_OP_GREATER: return strcmp(s1,s2)>0; - case EDG_WLL_QUERY_OP_WITHIN: - if (strcmp(s1, s2) >= 0 && strcmp(s1, s2b) <= 0) return 0; - } - return 0; -} - - -int check_strict_jobid(edg_wll_Context ctx, glite_jobid_const_t job) -{ - char *job_host; - unsigned int job_port; - - edg_wll_ResetError(ctx); - - /* Allow all jobids when server name is not set. */ - if ( (ctx->srvName == NULL) || (ctx->isProxy)) return edg_wll_Error(ctx,NULL,NULL); - - edg_wlc_JobIdGetServerParts(job,&job_host,&job_port); - - if (strcasecmp(job_host,ctx->srvName) || job_port != ctx->srvPort) - { - char *jobid,msg[300]; - - jobid = edg_wlc_JobIdUnparse(job); - snprintf(msg,sizeof msg,"%s: does not match server address (%s:%d)",jobid,ctx->srvName,ctx->srvPort); - msg[sizeof msg - 1] = 0; - edg_wll_SetError(ctx,EINVAL,msg); - free(jobid); - } - - free(job_host); - return edg_wll_Error(ctx,NULL,NULL); -} - -static int check_strict_jobid_cond(edg_wll_Context ctx, const edg_wll_QueryRec **cond) -{ - int i,j,ret; - - if (!cond) return edg_wll_ResetError(ctx); - for (i=0; cond[i]; i++) for (j=0; cond[i][j].attr; j++) - if (cond[i][j].attr == EDG_WLL_QUERY_ATTR_JOBID && - (ret = check_strict_jobid(ctx,cond[i][j].value.j))) - return ret; - - return 0; -} - -static int is_all_query(const edg_wll_QueryRec **jc) -{ - if (!jc || !*jc) return 1; - - if (jc[0][0].attr == EDG_WLL_QUERY_ATTR_OWNER && - jc[0][0].op == EDG_WLL_QUERY_OP_EQUAL && - !jc[0][1].attr && !jc[1]) return 1; - - return 0; -} - diff --git a/org.glite.lb.server/src/request.c b/org.glite.lb.server/src/request.c deleted file mode 100644 index a9cf708..0000000 --- a/org.glite.lb.server/src/request.c +++ /dev/null @@ -1,102 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include - -#include "glite/lb/il_string.h" -#include "glite/lb/il_msg.h" -#include "glite/lb/context-int.h" - -#include "store.h" -#include "db_supp.h" - -#ifdef __GNUC__ -#define UNUSED_VAR __attribute__((unused)) -#else -#define UNUSED_VAR -#endif - - -int -handle_il_message(edg_wll_Context ctx,char *buf) -{ - il_octet_string_t event; - int ret; - - edg_wll_ResetError(ctx); - - ret = decode_il_msg(&event, buf); - if(ret < 0) { - edg_wll_SetError(ctx,EDG_WLL_IL_PROTO,"decoding event string failed"); - return EDG_WLL_IL_PROTO; - } - - ret = db_store(ctx, event.data); - - if(event.data) - free(event.data); - - return(ret); -} - - -int -create_reply(const edg_wll_Context ctx, char **buf) -{ - int len, err_code, err_code_min; - char *err_msg; - - err_code_min = 0; - - switch(edg_wll_Error(ctx,NULL,&err_msg)) { - - case 0: - err_code = LB_OK; - break; - - case ENOMEM: - err_code = LB_NOMEM; - break; - - case EPERM: - err_code = LB_PERM; - break; - - case EDG_WLL_IL_PROTO: - err_code = LB_PROTO; - break; - - default: - err_code = LB_DBERR; - err_code_min = edg_wll_Error(ctx,NULL,NULL); - break; - - } - - if (!err_msg) err_msg=strdup("OK"); - - len = encode_il_reply(buf, err_code, err_code_min, err_msg); - free(err_msg); - return(len); -} - - diff --git a/org.glite.lb.server/src/seqcode.c b/org.glite.lb.server/src/seqcode.c deleted file mode 100644 index 0ef16d6..0000000 --- a/org.glite.lb.server/src/seqcode.c +++ /dev/null @@ -1,86 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include - -#include "glite/lbu/trio.h" -#include "glite/lb/context-int.h" -#include "glite/lbu/log.h" - -#include "get_events.h" -#include "store.h" -#include "jobstat.h" -/* -#include "lb_authz.h" -*/ -#include "db_supp.h" -#include "lb_proto.h" - - -int edg_wll_QuerySequenceCodeServer(edg_wll_Context ctx, edg_wlc_JobId jobid, const char *source, char **seqcode) -{ - glite_lbu_Statement sh; - intJobStat *istat = NULL; - char *jobid_md5 = NULL, - *stmt = NULL, - *res = NULL, - *res_rest = NULL; - int nstates; - - - edg_wll_ResetError(ctx); - jobid_md5 = edg_wlc_JobIdGetUnique(jobid); - - trio_asprintf(&stmt, - "select int_status from states " - "where jobid='%|Ss' and version='%|Ss'", - jobid_md5, INTSTAT_VERSION); - - if ( stmt == NULL ) return edg_wll_SetError(ctx, ENOMEM, NULL); - - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if ( (nstates = edg_wll_ExecSQL(ctx, stmt, &sh)) < 0 ) goto cleanup; - if ( nstates == 0 ) { - edg_wll_SetError(ctx, ENOENT, "no state in DB"); - goto cleanup; - } - if ( edg_wll_FetchRow(ctx, sh, 1, NULL, &res) < 0 ) goto cleanup; - - istat = dec_intJobStat(res, &res_rest); - if ( res_rest && istat ) { - *seqcode = istat->last_seqcode; - istat->last_seqcode = NULL; - } - else edg_wll_SetError(ctx, EDG_WLL_ERROR_DB_CALL, - "error decoding DB intJobStatus"); - -cleanup: - free(res); - free(jobid_md5); - free(stmt); - glite_lbu_FreeStmt(&sh); - if ( istat ) { - destroy_intJobStat(istat); - free(istat); - } - - return edg_wll_Error(ctx, NULL, NULL); -} - diff --git a/org.glite.lb.server/src/server_notification.h b/org.glite.lb.server/src/server_notification.h deleted file mode 100644 index b2768d5..0000000 --- a/org.glite.lb.server/src/server_notification.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef GLITE_LB_SERVER_NOTIFICATION_H -#define GLITE_LB_SERVER_NOTIFICATION_H - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -int edg_wll_NotifNewServer(edg_wll_Context, - edg_wll_QueryRec const * const *, int flags, char const *, - const edg_wll_NotifId, time_t *); -int edg_wll_NotifBindServer(edg_wll_Context, - const edg_wll_NotifId, const char *, time_t *); -int edg_wll_NotifChangeServer(edg_wll_Context, - const edg_wll_NotifId, edg_wll_QueryRec const * const *, - edg_wll_NotifChangeOp); -int edg_wll_NotifRefreshServer(edg_wll_Context, - const edg_wll_NotifId, time_t *); -int edg_wll_NotifDropServer(edg_wll_Context, edg_wll_NotifId); - -#endif diff --git a/org.glite.lb.server/src/server_state.c b/org.glite.lb.server/src/server_state.c deleted file mode 100644 index d61007d..0000000 --- a/org.glite.lb.server/src/server_state.c +++ /dev/null @@ -1,78 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include - -#include "glite/lbu/trio.h" -#include "glite/lb/context-int.h" -#include "glite/lbu/log.h" - -#include "server_state.h" -#include "db_supp.h" - -int edg_wll_GetServerState(edg_wll_Context ctx,const char *name,char **val) -{ - char *stmt = NULL; - glite_lbu_Statement q = NULL; - - - trio_asprintf(&stmt,"select value from server_state " - "where prefix = 'https://%|Ss:%d' and name = '%|Ss'", - ctx->srvName,ctx->srvPort,name); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - switch (edg_wll_ExecSQL(ctx,stmt,&q)) { - case 0: edg_wll_SetError(ctx,ENOENT,name); break; - case -1: break; - default: edg_wll_FetchRow(ctx,q,sizeof(val)/sizeof(val[0]),NULL,val); break; - } - - glite_lbu_FreeStmt(&q); - free(stmt); - return edg_wll_Error(ctx,NULL,NULL); -} - -int edg_wll_SetServerState(edg_wll_Context ctx,const char *name,const char *val) -{ - char *stmt = NULL; - - trio_asprintf(&stmt,"insert into server_state (prefix,name,value) " - "values ('https://%|Ss:%d','%|Ss','%|Ss')", - ctx->srvName,ctx->srvPort,name,val); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - switch(edg_wll_ExecSQL(ctx,stmt,NULL)) { - case 1: break; - case -1: if (edg_wll_Error(ctx,NULL,NULL) == EEXIST) { - free(stmt); - trio_asprintf(&stmt,"update server_state set value = '%|Ss' " - "where prefix = 'https://%|Ss:%d' " - "and name = '%|Ss'", - val,ctx->srvName,ctx->srvPort,name); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, - LOG_PRIORITY_DEBUG, stmt); - edg_wll_ExecSQL(ctx,stmt,NULL); - } - break; - - default: abort(); - } - free(stmt); - return edg_wll_Error(ctx,NULL,NULL); -} diff --git a/org.glite.lb.server/src/server_state.h b/org.glite.lb.server/src/server_state.h deleted file mode 100644 index 25b3db1..0000000 --- a/org.glite.lb.server/src/server_state.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef GLITE_LB_SERVER_STATE_H -#define GLITE_LB_SERVER_STATE_H - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#define EDG_WLL_STATE_DUMP_START "StartDump" -#define EDG_WLL_STATE_DUMP_END "EndDump" - -int edg_wll_GetServerState(edg_wll_Context,const char *,char **); -int edg_wll_SetServerState(edg_wll_Context,const char *,const char *); - -#endif /* GLITE_LB_SERVER_STATE_H */ diff --git a/org.glite.lb.server/src/srv_purge.c b/org.glite.lb.server/src/srv_purge.c deleted file mode 100644 index bbc2de7..0000000 --- a/org.glite.lb.server/src/srv_purge.c +++ /dev/null @@ -1,1056 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#include "glite/lbu/trio.h" - -#include "glite/lbu/log.h" - -#include "glite/lb/context-int.h" -#include "glite/lb/events_parse.h" -#include "glite/lb/mini_http.h" -#include "glite/lb/ulm_parse.h" - -#include "lb_html.h" -#include "lb_proto.h" -#include "store.h" -#include "query.h" -#include "get_events.h" -#include "purge.h" -#include "lb_xml_parse.h" -#include "db_calls.h" -#include "db_supp.h" -#include "jobstat.h" -#include "il_notification.h" -#include "authz_policy.h" - - -#define DUMP_FILE_STORAGE "/tmp/" - -#define sizofa(a) (sizeof(a)/sizeof((a)[0])) - -typedef struct { - int naffected_jobs; - int parse; - int dumpfile; - - int jobs_to_exa; - double purge_end; - double time_per_job; - time_t target_runtime; -} purge_ctx_t; - -extern volatile sig_atomic_t purge_quit; - -static const char* const resp_headers[] = { - "Cache-Control: no-cache", - "Server: edg_wll_Server/" PROTO_VERSION "/" COMP_PROTO, - "Content-Type: application/x-dglb", - NULL -}; - -static int purge_check(edg_wll_Context ctx, edg_wll_JobStat *stat, time_t start, time_t *timeout); -static int purge_one_with_subjobs(edg_wll_Context ctx, purge_ctx_t *prg, edg_wll_JobStat *stat, const edg_wll_PurgeRequest *request, edg_wll_PurgeResult *result); -static int purge_one(edg_wll_Context ctx,edg_wll_JobStat *,int,int,int); -int unset_proxy_flag(edg_wll_Context ctx, glite_jobid_const_t job); -static int unset_server_flag(edg_wll_Context ctx, glite_jobid_const_t job); -int job_exists(edg_wll_Context ctx, glite_jobid_const_t job); -static void purge_throttle(purge_ctx_t *prg); - - -int edg_wll_CreateTmpFileStorage(edg_wll_Context ctx, char *prefix, char **fname) -{ - char fname_buf[1024]; - struct timeval tv; - int retfd; - - - while ( 1 ) - { - gettimeofday(&tv, NULL); - snprintf(fname_buf, 1024, "%s/%ld_%ld", prefix, tv.tv_sec, tv.tv_usec); - - if ( (retfd = open(fname_buf, O_WRONLY|O_CREAT|O_EXCL|O_APPEND,0600)) == -1 ) - { - if ( errno != EEXIST ) - { - char buff[100]; - - sprintf(buff, "couldn't create temporary server file"); - edg_wll_SetError(ctx, errno, buff); - return -1; - } - } - else - break; - } - - *fname = strdup(fname_buf); - - return retfd; -} - -int edg_wll_CreateFileStorageFromTmp(edg_wll_Context ctx, char *old_file, char *file_type, char **fname) -{ - char fname_buf[1024], - fname_prefix[1024], - stimebuf[100]; - char *stmp; - struct timeval tv; - int retfd; - - - if ( (stmp = strrchr(old_file, '/')) ) - { - strncpy(fname_prefix, old_file, stmp - old_file); - fname_prefix[stmp - old_file] = '\0'; - } - - while ( 1 ) - { - gettimeofday(&tv, NULL); - edg_wll_ULMTimevalToDate(tv.tv_sec, tv.tv_usec, stimebuf); - snprintf(fname_buf, 1024, "%s/%s_%s", fname_prefix, file_type, stimebuf); - - if ( !link(old_file, fname_buf) ) - break; - - if ( errno != EEXIST ) - { - char buff[100]; - - sprintf(buff, "couldn't create server %s file", file_type); - return edg_wll_SetError(ctx, errno, buff); - } - } - - *fname = strdup(fname_buf); - - return retfd; -} - -int edg_wll_CreateFileStorage(edg_wll_Context ctx, char *file_type, char *prefix, char **fname) -{ - char fname_buf[1024], - stimebuf[100]; - struct timeval tv; - int retfd; - - if ( *fname ) - { - snprintf(fname_buf, 1024, "%s/%s", prefix? prefix: "", *fname); - if ( (retfd = open(*fname, O_WRONLY|O_CREAT|O_EXCL|O_APPEND,0600)) == -1 ) - { - char buff[100]; - if ( errno == EEXIST ) - sprintf(buff, "Server file %s exist", fname_buf); - else - sprintf(buff, "Server couldn't create file %s", fname_buf); - edg_wll_SetError(ctx, errno, buff); - - return -1; - } - if ( prefix ) - { - free(*fname); - *fname = strdup(fname_buf); - } - - return retfd; - } - - while ( 1 ) - { - gettimeofday(&tv, NULL); - edg_wll_ULMTimevalToDate(tv.tv_sec, tv.tv_usec, stimebuf); - if ( !prefix ) - { - if ( strcmp(file_type,FILE_TYPE_PURGE) == 0 ) - prefix = ctx->purgeStorage; - else if ( strcmp(file_type,FILE_TYPE_DUMP) == 0 ) - prefix = ctx->dumpStorage; - else - prefix = ""; - } - snprintf(fname_buf, 1024, "%s/%s_%s", prefix, file_type, stimebuf); - - if ( (retfd = open(fname_buf, O_WRONLY|O_CREAT|O_EXCL|O_APPEND,0600)) == -1 ) - { - if ( errno != EEXIST ) - { - char buff[100]; - - sprintf(buff, "couldn't create server %s file", file_type); - edg_wll_SetError(ctx, errno, buff); - - return -1; - } - } - else - break; - } - - *fname = strdup(fname_buf); - - return retfd; -} - -int edg_wll_PurgeServerProxy(edg_wll_Context ctx, glite_jobid_const_t job) -{ - edg_wll_JobStat stat; - - memset(&stat, 0, sizeof stat); - stat.jobId = (glite_jobid_t)job; - switch ( purge_one(ctx, &stat, -1, 1, 1) ) { - case 0: - case ENOENT: - return(edg_wll_ResetError(ctx)); - break; - default: - return(edg_wll_Error(ctx,NULL,NULL)); - break; - } -} - -int edg_wll_PurgeServer(edg_wll_Context ctx,const edg_wll_PurgeRequest *request, edg_wll_PurgeResult *result) -{ - int i; - glite_jobid_t job; - char *tmpfname = NULL; - int ret; - double now; - struct timeval tp; - edg_wll_JobStat stat; - purge_ctx_t prg; - struct _edg_wll_GssPrincipal_data princ; - - princ.name = ctx->peerName; - princ.fqans = ctx->fqans; - - if (!ctx->noAuth && !check_authz_policy(&ctx->authz_policy, &princ, PURGE)) { - edg_wll_SetError(ctx,EPERM,"only superusers may purge"); - goto abort; - } - - edg_wll_ResetError(ctx); - memset(result, 0, sizeof(*result)); - - memset(&prg, 0, sizeof prg); - prg.naffected_jobs = 0; - prg.parse = 0; - prg.dumpfile = -1; - - if ( (request->flags & EDG_WLL_PURGE_SERVER_DUMP) && - ((prg.dumpfile = edg_wll_CreateTmpPurgeFile(ctx, &tmpfname)) == -1 ) ) - goto abort; - - /* - should be changed so that only purged events are sent to whole-server dumps - (with this commented out, severely delayed events (>purge interval) can miss - whole-server dumps, but it is more acceptable than invoking whole-server dump - on each purge request (whole-server dumps are used rarely if at all) - if (request->flags&EDG_WLL_PURGE_REALLY_PURGE) { - edg_wll_DumpRequest req = { - EDG_WLL_DUMP_LAST_END, EDG_WLL_DUMP_NOW - }; - edg_wll_DumpResult res; - - if (edg_wll_DumpEventsServer(ctx,&req,&res)) - { - if ( request->flags & EDG_WLL_PURGE_SERVER_DUMP ) - unlink(tmpfname); - goto abort; - } - } - */ - - /* throttle parameters */ - gettimeofday(&tp, NULL); - now = tp.tv_sec + (double)tp.tv_usec / 1000000.0; - prg.purge_end = now + request->target_runtime; - prg.target_runtime = request->target_runtime; - prg.time_per_job = -1.0; - - if (request->jobs) { - - for (prg.jobs_to_exa=0; request->jobs[prg.jobs_to_exa]; prg.jobs_to_exa++); - for (i=0; request->jobs[i] && !purge_quit; i++) { - if (edg_wlc_JobIdParse(request->jobs[i],&job)) { - glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, "%s: parse error", request->jobs[i]); - prg.parse = 1; - prg.jobs_to_exa--; - } - else { - if (check_strict_jobid(ctx,job)) { - glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "%s: not my job", request->jobs[i]); - prg.parse = 1; - prg.jobs_to_exa--; - } - else { - if (purge_quit) break; - - memset(&stat,0,sizeof stat); - if (edg_wll_JobStatusServer(ctx,job,EDG_WLL_STAT_CHILDSTAT | EDG_WLL_STAT_CHILDREN,&stat)) { - if (edg_wll_Error(ctx, NULL, NULL) == ENOENT) { - /* job purged meanwhile, ignore */ - edg_wll_ResetError(ctx); - glite_jobid_free(job); - purge_throttle(&prg); - continue; - } - edg_wll_FreeStatus(&stat); - goto abort; - } - - switch (purge_one_with_subjobs(ctx, &prg, &stat, request, result)) { - case 0: - break; - case ENOENT: /* job does not exist, consider purged and ignore */ - edg_wll_ResetError(ctx); - break; - default: goto abort; - } - - edg_wll_FreeStatus(&stat); - } - glite_jobid_free(job); - } - } - } - else { - glite_lbu_Statement s; - char *job_s; - time_t timeout[EDG_WLL_NUMBER_OF_STATCODES], - start = time(NULL); - - for (i=0; itimeout[i] < 0) { // no specific timeout - if (request->timeout[i] == -2) //no purge - timeout[i] = request->timeout[i]; - else {// use server default - timeout[i] = ctx->purge_timeout[i]; - } - } - else timeout[i] = request->timeout[i]; //specific given - - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, - (ctx->isProxy) - ? "select dg_jobid from jobs where proxy='1'" - : "select dg_jobid from jobs where server='1'"); - - if ((prg.jobs_to_exa = edg_wll_ExecSQL(ctx, (ctx->isProxy) ? "select dg_jobid from jobs where proxy='1'" : - "select dg_jobid from jobs where server='1'", &s)) < 0) goto abort; - - while (edg_wll_FetchRow(ctx,s,1,NULL,&job_s) > 0 && !purge_quit) { - if (edg_wlc_JobIdParse(job_s,&job)) { - glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, "%s: parse error (internal inconsistency !)", job_s); - prg.parse = 1; - prg.jobs_to_exa--; - } - else { - if (check_strict_jobid(ctx,job)) { - edg_wlc_JobIdFree(job); - free(job_s); - prg.parse = 1; - prg.jobs_to_exa--; - continue; - } - - if (purge_quit) break; - - memset(&stat,0,sizeof stat); - if (edg_wll_JobStatusServer(ctx,job,EDG_WLL_STAT_CHILDSTAT | EDG_WLL_STAT_CHILDREN,&stat)) { - if (edg_wll_Error(ctx, NULL, NULL) == ENOENT) { - /* job purged meanwhile, ignore */ - edg_wll_ResetError(ctx); - glite_jobid_free(job); - free(job_s); - purge_throttle(&prg); - continue; - } - edg_wll_FreeStatus(&stat); - goto abort; - } - - if (purge_check(ctx, &stat, start, timeout)) { - if (purge_one_with_subjobs(ctx, &prg, &stat, request, result)) { - edg_wll_FreeStatus(&stat); - if (edg_wll_Error(ctx, NULL, NULL) == ENOENT) { - /* job purged meanwhile, ignore */ - edg_wll_ResetError(ctx); - glite_jobid_free(job); - free(job_s); - continue; - } - goto abort; - } - } - - glite_jobid_free(job); - edg_wll_FreeStatus(&stat); - } - free(job_s); - } - glite_lbu_FreeStmt(&s); - } - -abort: - if (prg.parse && !edg_wll_Error(ctx,NULL,NULL)) - { - if ( prg.naffected_jobs ) { - glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "[%d] Found only jobs not matching server address/port; these were not purged.", getpid()); - } - else { - glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "[%d] Found only jobs not matching server address/port; these were not purged.", getpid()); - } - } - - ret = edg_wll_Error(ctx,NULL,NULL); - if (ret == 0 || ret == ENOENT || ret == EPERM || ret == EINVAL) { - if ( request->flags & EDG_WLL_PURGE_SERVER_DUMP && tmpfname ) - { - edg_wll_CreatePurgeFileFromTmp(ctx, tmpfname, &(result->server_file)); - unlink(tmpfname); - } - } - - return edg_wll_Error(ctx,NULL,NULL); -} - -/* FIXME: defined but not used */ -#if 0 -static void unlock_and_check(edg_wll_Context ctx,edg_wlc_JobId job) -{ - char *job_s,*et,*ed; - - if (edg_wll_UnlockJob(ctx,job)) { - job_s = edg_wlc_JobIdUnparse(job); - - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"%s: edg_wll_UnlockJob(): %s (%s) -- expect bogus things\n", - job_s,et,ed); - syslog(LOG_CRIT,"%s: edg_wll_UnlockJob(): %s (%s) -- expect bogus things", - job_s,et,ed); - free(et); free(ed); free(job_s); - } -} -#endif - -static int dump_events(edg_wll_Context ctx, glite_jobid_const_t job, int dump, char **res) -{ - edg_wll_Event e; - int event; - - - event = atoi(res[0]); - free(res[0]); res[0] = NULL; - - res[0] = edg_wlc_JobIdUnparse(job); - if (convert_event_head(ctx,res,&e) || edg_wll_get_event_flesh(ctx,event,&e)) - { - char *et,*ed, *dbjob; - - - /* Most likely sort of internal inconsistency. - * Must not be fatal -- just complain - */ - edg_wll_Error(ctx,&et,&ed); - dbjob = edg_wlc_JobIdGetUnique(job); - glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, - "%s event %d: %s (%s)", dbjob, event, et, ed); - free(et); free(ed); free(dbjob); - edg_wll_ResetError(ctx); - } - else { - char *event_s = edg_wll_UnparseEvent(ctx,&e); - char arr_s[100]; - int len, written, total; - - strcpy(arr_s, "DG.ARRIVED="); - edg_wll_ULMTimevalToDate(e.any.arrived.tv_sec, - e.any.arrived.tv_usec, - arr_s+strlen("DG.ARRIVED=")); - - len = strlen(arr_s); - total = 0; - while (total != len) { - written = write(dump,arr_s+total,len-total); - if (written < 0 && errno != EAGAIN) { - edg_wll_SetError(ctx,errno,"writing dump file"); - free(event_s); - return edg_wll_Error(ctx,NULL,NULL); - } - total += written; - } - write(dump, " ", 1); - - len = strlen(event_s); - total = 0; - while (total != len) { - written = write(dump,event_s+total,len-total); - if (written < 0 && errno != EAGAIN) { - glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, "dump to file"); - dump = -1; /* XXX: likely to be a permanent error - * give up writing but do purge */ - break; - } - total += written; - } - /* write(dump,"\n",1); edg_wll_UnparseEvent does so */ - free(event_s); - } - edg_wll_FreeEvent(&e); - - - return edg_wll_Error(ctx,NULL,NULL); -} - -static enum edg_wll_StatJobtype get_job_type(edg_wll_Context ctx, glite_jobid_const_t job) -{ - edg_wll_JobStat stat; - enum edg_wll_StatJobtype type; - - memset(&stat, 0, sizeof(stat)); - if (edg_wll_JobStatusServer(ctx, job, 0 /*no flags*/, &stat)) { - edg_wll_FreeStatus(&stat); - return(EDG_WLL_NUMBER_OF_JOBTYPES); - } - - type = stat.jobtype; - edg_wll_FreeStatus(&stat); - - return(type); -} - -static int get_jobid_suffix(edg_wll_Context ctx, glite_jobid_const_t job, enum edg_wll_StatJobtype jobtype, char **unique, char **suffix) -{ - char *ptr = NULL, *dbjob = NULL; - - - dbjob = glite_jobid_getUnique(job); - - switch (jobtype) { - case EDG_WLL_STAT_SIMPLE: - case EDG_WLL_STAT_DAG: - case EDG_WLL_STAT__PARTITIONABLE_UNUSED: - case EDG_WLL_STAT__PARTITIONED_UNUSED: - case EDG_WLL_STAT_COLLECTION: - // glite jobs, no suffix - *suffix = strdup(""); - *unique = strdup(dbjob); - break; - - case EDG_WLL_STAT_PBS: - // PBS jobs; suffix is everything starting from first '.' - ptr = strchr(dbjob,'.'); - if (ptr) { - *suffix = strdup(ptr); - ptr[0] = '\0'; - *unique = strdup(dbjob); - ptr[0] = '.'; - } - else { - edg_wll_SetError(ctx,EINVAL,"Uknown PBS job format"); - goto err; - } - break; - - case EDG_WLL_STAT_CONDOR: - // condor jobs - assert(0); // XXX: todo - break; - default: - edg_wll_SetError(ctx,EINVAL,"Uknown job type"); - goto err; - break; - } - -err: - free(dbjob); - - return edg_wll_Error(ctx, NULL, NULL); -} - -static int get_jobid_prefix(edg_wll_Context ctx, glite_jobid_const_t job, enum edg_wll_StatJobtype jobtype, char **prefix) -{ - char *ser = NULL; - - - switch (jobtype) { - case EDG_WLL_STAT_SIMPLE: - case EDG_WLL_STAT_DAG: - case EDG_WLL_STAT__PARTITIONABLE_UNUSED: - case EDG_WLL_STAT__PARTITIONED_UNUSED: - case EDG_WLL_STAT_COLLECTION: - // glite job prefix - ser = glite_jobid_getServer(job); - asprintf(prefix,"%s/",ser); - free(ser); - break; - - case EDG_WLL_STAT_PBS: - // PBS jobs; prefix same as glite job prefix - ser = glite_jobid_getServer(job); - asprintf(prefix,"%s/",ser); - free(ser); - break; - - case EDG_WLL_STAT_CONDOR: - // condor jobs - assert(0); // XXX: todo - break; - default: - edg_wll_SetError(ctx,EINVAL,"Uknown job type"); - goto err; - break; - } - -err: - return edg_wll_Error(ctx, NULL, NULL); -} - - -static int purge_check(edg_wll_Context ctx, edg_wll_JobStat *stat, time_t start, time_t *timeout) { - int to_purge = 0; - int i; - edg_wll_JobStat *substat; - - if (timeout[stat->state] >=0 && stat->lastUpdateTime.tv_sec && start-stat->lastUpdateTime.tv_sec > timeout[stat->state] - // job from this server - && !check_strict_jobid(ctx, stat->jobId) - // if subjob purge only when orphan - && (!stat->parent_job || job_exists(ctx, stat->parent_job) == 0)) { - to_purge = 1; - } - // check the whole collection yet - if (to_purge && stat->children_num && stat->children_states) { - for (i = 0; i < stat->children_num && stat->children_states[i].state != EDG_WLL_JOB_UNDEF; i++) { - substat = stat->children_states + i; - if (timeout[substat->state] >=0 && substat->lastUpdateTime.tv_sec && start-substat->lastUpdateTime.tv_sec > timeout[substat->state]) ; - else { - to_purge = 0; - break; - } - } - } - - return to_purge; -} - - -#define GRAN 32 - -static int purge_one_with_subjobs(edg_wll_Context ctx, purge_ctx_t *prg, edg_wll_JobStat *stat, const edg_wll_PurgeRequest *request, edg_wll_PurgeResult *result) { - char *job_s; - int i; - - if (purge_one(ctx,stat,prg->dumpfile,request->flags&EDG_WLL_PURGE_REALLY_PURGE,ctx->isProxy)) return edg_wll_Error(ctx, NULL, NULL); - purge_throttle(prg); - -/* XXX: change with the streaming interface */ - if (request->flags & EDG_WLL_PURGE_LIST_JOBS) { - job_s = glite_jobid_unparse(stat->jobId); - if (prg->naffected_jobs % GRAN == 0 || !result->jobs) - result->jobs = realloc(result->jobs,(prg->naffected_jobs+GRAN+1) * sizeof(*(result->jobs))); - result->jobs[prg->naffected_jobs] = job_s; - result->jobs[prg->naffected_jobs+1] = NULL; - } - prg->naffected_jobs++; - - /* purge the subjobs */ - if (stat->children_num && stat->children) { - for (i = 0; i < stat->children_num && stat->children[i]; i++) { - if (purge_one(ctx, stat->children_states + i, prg->dumpfile, request->flags&EDG_WLL_PURGE_REALLY_PURGE,ctx->isProxy)) { - return edg_wll_Error(ctx, NULL, NULL); - } - purge_throttle(prg); - - if (request->flags & EDG_WLL_PURGE_LIST_JOBS) { - if (prg->naffected_jobs % GRAN == 0 || !result->jobs) - result->jobs = realloc(result->jobs,(prg->naffected_jobs+GRAN+1) * sizeof(*(result->jobs))); - result->jobs[prg->naffected_jobs] = strdup(stat->children[i]); - result->jobs[prg->naffected_jobs+1] = NULL; - } - prg->naffected_jobs++; - } - } - - return edg_wll_Error(ctx, NULL, NULL); -} - - -int purge_one(edg_wll_Context ctx,edg_wll_JobStat *stat,int dump, int purge, int purge_from_proxy_only) -{ - char *dbjob = NULL; - char *stmt = NULL; - glite_lbu_Statement q = NULL; - int ret,dumped = 0; - char *res[10]; - char *prefix = NULL, *suffix = NULL, *root = NULL; - char *prefix_id = NULL, *suffix_id = NULL; - int sql_retval; - glite_jobid_const_t job = stat->jobId; - edg_wll_JobStat new_stat; - - edg_wll_ResetError(ctx); - if ( !purge && dump < 0 ) return 0; - - do { - if (edg_wll_Transaction(ctx)) goto err; - - switch (edg_wll_jobMembership(ctx, job)) { - case DB_PROXY_JOB: - if (!ctx->isProxy) { - /* should not happen */ - goto commit; - } - /* continue */ - break; - case DB_SERVER_JOB: - if (purge_from_proxy_only) { - /* no action needed */ - goto commit; - } - if (ctx->isProxy) { - /* should not happen */ - goto commit; - } - /* continue */ - break; - case DB_PROXY_JOB+DB_SERVER_JOB: - if (ctx->isProxy) { - purge = 0; - if (unset_proxy_flag(ctx, job) < 0) { - goto rollback; - } - } - else { - purge = 0; - /* if server&proxy DB is shared ... */ - if (is_job_local(ctx,job) && purge_from_proxy_only) { - if (unset_proxy_flag(ctx, job) < 0) { - goto rollback; - } - } - else { - if (unset_server_flag(ctx, job) < 0) { - goto rollback; - } - } - } - break; - case 0: - // Zombie job (server=0, proxy=0)? should not happen; - // clear it to keep DB healthy - break; - default: - goto rollback; - break; - } - - dbjob = glite_jobid_getUnique(job); /* XXX: strict jobid already checked */ - - if ( purge ) - { - enum edg_wll_StatJobtype jobtype = get_job_type(ctx, job); - - // get job prefix/suffix before its state is deleted - if ( jobtype == EDG_WLL_NUMBER_OF_JOBTYPES) goto rollback; - if (get_jobid_suffix(ctx, job, jobtype, &root, &suffix) - || get_jobid_prefix(ctx, job, jobtype, &prefix)) { - glite_common_log(LOG_CATEGORY_CONTROL, - LOG_PRIORITY_WARN, - "[%d] unknown job type of the '%s'.", - getpid(), dbjob); - edg_wll_ResetError(ctx); - } - } - - if ( purge ) - { - trio_asprintf(&stmt,"delete from jobs where jobid = '%|Ss'",dbjob); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto rollback; - free(stmt); stmt = NULL; - - trio_asprintf(&stmt,"delete from states where jobid = '%|Ss'",dbjob); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto rollback; - free(stmt); stmt = NULL; - - trio_asprintf(&stmt,"delete from status_tags where jobid = '%|Ss'",dbjob); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto rollback; - free(stmt); stmt = NULL; - } - - if ( purge && prefix && suffix ) - { - /* Store zombie prefix */ - - // See if that prefix is already stored in the database - trio_asprintf(&stmt,"select prefix_id from zombie_prefixes where prefix = '%|Ss'", prefix); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - sql_retval = edg_wll_ExecSQL(ctx,stmt,&q); - free(stmt); stmt = NULL; - - if (sql_retval < 0) goto rollback; - - if (sql_retval == 0) { //prefix does not exist yet - glite_lbu_FreeStmt(&q); - - trio_asprintf(&stmt,"insert into zombie_prefixes (prefix) VALUES ('%|Ss')", prefix); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if (edg_wll_ExecSQL(ctx,stmt,&q) <= 0) goto rollback; - - free(stmt); stmt = NULL; - glite_lbu_FreeStmt(&q); - - // The record should exist now, however we need to look up the prefix_id - trio_asprintf(&stmt,"select prefix_id from zombie_prefixes where prefix = '%|Ss'", prefix); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if (edg_wll_ExecSQL(ctx,stmt,&q) <= 0) goto rollback; - free(stmt); stmt = NULL; - } - ret = edg_wll_FetchRow(ctx,q, 1, NULL, &prefix_id); - glite_lbu_FreeStmt(&q); - - - /* Store zombie suffix */ - - // See if that suffix is already stored in the database - trio_asprintf(&stmt,"select suffix_id from zombie_suffixes where suffix = '%|Ss'", suffix); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - sql_retval = edg_wll_ExecSQL(ctx,stmt,&q); - free(stmt); stmt = NULL; - - if (sql_retval < 0) goto rollback; - - if (sql_retval == 0) { //suffix does not exist yet - glite_lbu_FreeStmt(&q); - - trio_asprintf(&stmt,"insert into zombie_suffixes (suffix) VALUES ('%|Ss')", suffix); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if (edg_wll_ExecSQL(ctx,stmt,&q) <= 0) goto rollback; - - free(stmt); stmt = NULL; - glite_lbu_FreeStmt(&q); - - // The record should exist now, however we need to look up the suffix_id - trio_asprintf(&stmt,"select suffix_id from zombie_suffixes where suffix = '%|Ss'", suffix); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if (edg_wll_ExecSQL(ctx,stmt,&q) <= 0) goto rollback; - free(stmt); stmt = NULL; - } - ret = edg_wll_FetchRow(ctx,q, 1, NULL, &suffix_id); - glite_lbu_FreeStmt(&q); - - - /* Store zombie job */ - - trio_asprintf(&stmt,"insert into zombie_jobs (jobid, prefix_id, suffix_id)" - " VALUES ('%|Ss', '%|Ss', '%|Ss')", root, prefix_id, suffix_id); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if (edg_wll_ExecSQL(ctx,stmt,&q) < 0) { - if (edg_wll_Error(ctx, NULL, NULL) == EEXIST) { - /* job already among zombies */ - /* print warning but continue */ - /* erasing other jobs */ - char *et, *ed, *msg, *job_s; - - edg_wll_Error(ctx, &et, &ed); - job_s = glite_jobid_unparse(job); - - asprintf(&msg,"Warning: erasing job %s that already existed in this LB " - "(reused jobid or corruped DB) (%s: %s)",job_s,et,ed); - glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "[%d] %s", getpid(), msg); - free(et); free(ed); free(msg); free(job_s); - edg_wll_ResetError(ctx); - } - else goto rollback; - } - glite_lbu_FreeStmt(&q); - free(stmt); stmt = NULL; - } - - if ( purge ) - { - // notifications - memcpy(&new_stat, stat, sizeof new_stat); - new_stat.state = EDG_WLL_JOB_PURGED; - edg_wll_NotifMatch(ctx, stat, &new_stat); - } - - if (dump >= 0) - trio_asprintf(&stmt, - "select event,code,prog,host,u.cert_subj,time_stamp,usec,level,arrived,seqcode " - "from events e,users u " - "where e.jobid='%|Ss' " - "and u.userid=e.userid " - "order by event", dbjob); - else - trio_asprintf(&stmt,"select event from events " - "where jobid='%|Ss' " - "order by event", dbjob); - - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if (edg_wll_ExecSQL(ctx,stmt,&q) < 0) goto rollback; - free(stmt); stmt = NULL; - - dumped = 1; - while ((ret = edg_wll_FetchRow(ctx,q,sizofa(res),NULL,res)) > 0) { - int event, ret_dump = 0, i; - - event = atoi(res[0]); - - if (dump >= 0) { - assert(ret == 10); - ret_dump = dump_events( ctx, job, dump, (char **) &res); - } - - for (i=0; i= 0 && ret_dump) goto rollback; - - if ( purge ) - if (edg_wll_delete_event(ctx,dbjob,event)) goto rollback; - } - glite_lbu_FreeStmt(&q); - if (ret < 0) goto rollback; - -commit: -rollback:; - } while (edg_wll_TransNeedRetry(ctx)); - - -err: - free(root); - free(suffix); - free(prefix); - free(prefix_id); - free(suffix_id); - free(dbjob); - free(stmt); - glite_lbu_FreeStmt(&q); - - return edg_wll_Error(ctx,NULL,NULL); -} - - -int unset_proxy_flag(edg_wll_Context ctx, glite_jobid_const_t job) -{ - char *stmt = NULL; - char *dbjob; - - edg_wll_ResetError(ctx); - - dbjob = glite_jobid_getUnique(job); - trio_asprintf(&stmt,"update jobs set proxy='0' where jobid='%|Ss'", dbjob); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - free(dbjob); - - return(edg_wll_ExecSQL(ctx,stmt,NULL)); -} - - -int unset_server_flag(edg_wll_Context ctx, glite_jobid_const_t job) -{ - char *stmt = NULL; - char *dbjob; - - edg_wll_ResetError(ctx); - - dbjob = glite_jobid_getUnique(job); - trio_asprintf(&stmt,"update jobs set server='0' where jobid='%|Ss'", dbjob); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - free(dbjob); - - return(edg_wll_ExecSQL(ctx,stmt,NULL)); -} - - -int job_exists(edg_wll_Context ctx, glite_jobid_const_t job) { - char *stmt, *dbjob; - int retval; - - edg_wll_ResetError(ctx); - - if (check_strict_jobid(ctx, job)) return 0; - - dbjob = glite_jobid_getUnique(job); - trio_asprintf(&stmt, "SELECT jobid FROM jobs WHERE jobid='%|Ss'", dbjob); - retval = edg_wll_ExecSQL(ctx, stmt, NULL); - free(dbjob); - free(stmt); - - return retval; -} - - -/* throttle purging according to the required target_runtime */ -static void purge_throttle(purge_ctx_t *prg) { - struct timeval tp; - double target_this, now; - - if (prg->time_per_job < 0.0) { - prg->time_per_job = prg->jobs_to_exa ? (double)(prg->target_runtime) / prg->jobs_to_exa : 0.0; - //glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_DEBUG, "purge, target runtime: %ld, end: %lf, jobs: %d, s/job: %lf\n", - // prg->target_runtime, prg->purge_end, prg->jobs_to_exa, prg->time_per_job); - } - - if (--prg->jobs_to_exa < 0) prg->jobs_to_exa = 0; - - if (prg->target_runtime) { - target_this = prg->purge_end - prg->time_per_job * prg->jobs_to_exa; - gettimeofday(&tp, NULL); - now = tp.tv_sec + (double)tp.tv_usec / 1000000.0; - if (target_this > now) { /* enough time */ - //glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_DEBUG, "purge, sleeping for %lf seconds...\n", target_this - now); - usleep(1e6*(target_this - now)); - } - if (target_this < now) { /* speed up */ - prg->time_per_job = (prg->purge_end-now)/prg->jobs_to_exa; - /* limit not catched, maximal speed */ - if (prg->time_per_job <= 0) { - prg->time_per_job = 0.0; - prg->target_runtime = 0; - } - } - //glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_DEBUG, "purge, s/job: %lf\n", prg->time_per_job); - } -} - diff --git a/org.glite.lb.server/src/stats.c b/org.glite.lb.server/src/stats.c deleted file mode 100644 index 4319c7e..0000000 --- a/org.glite.lb.server/src/stats.c +++ /dev/null @@ -1,493 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "glite/lb/events.h" -#include "glite/lb/jobstat.h" -#include "glite/lb/context-int.h" - -#include "glite/lbu/log.h" - -#include "glite/jobid/strmd5.h" - -#include "stats.h" -#include "authz_policy.h" -static int stats_inc_counter(edg_wll_Context,const edg_wll_JobStat *,edg_wll_Stats *); -static int stats_record_duration(edg_wll_Context,const edg_wll_JobStat *,const edg_wll_JobStat *,edg_wll_Stats *); - -#define dprintf(x) { printf("[%d] ",getpid()); printf x; } - -/* XXX: should be configurable at run time */ -static struct _edg_wll_StatsArchive default_archives[] = { - { 10, 60 }, - { 60, 30 }, - { 900, 12 }, - { 0, 0 } -}; - -static edg_wll_QueryRec default_group[2] = { - { EDG_WLL_QUERY_ATTR_DESTINATION, }, - { EDG_WLL_QUERY_ATTR_UNDEF, } -}; - -static edg_wll_Stats default_stats[] = { - { STATS_COUNT, default_group, EDG_WLL_JOB_READY, 0, default_archives }, - { STATS_COUNT, default_group, EDG_WLL_JOB_SCHEDULED, 0, default_archives }, - { STATS_COUNT, default_group, EDG_WLL_JOB_RUNNING, 0, default_archives }, - { STATS_COUNT, default_group, EDG_WLL_JOB_DONE, EDG_WLL_STAT_OK, default_archives }, - { STATS_COUNT, default_group, EDG_WLL_JOB_DONE, EDG_WLL_STAT_FAILED, default_archives }, - { STATS_DURATION, default_group, EDG_WLL_JOB_SCHEDULED, 0, default_archives }, - { STATS_DURATION, default_group, EDG_WLL_JOB_RUNNING, 0, default_archives }, - { STATS_UNDEF, } - -}; - -extern int debug; - -int edg_wll_InitStatistics(edg_wll_Context ctx) -{ - edg_wll_Stats *stats = default_stats; /* XXX: hardcoded */ - int i,j; - - for (i=0; stats[i].type; i++) { - char fname[50],*zero; - - strcpy(fname,"/tmp/lb_stats.XXXXXX"); - stats[i].fd = mkstemp(fname); - if (stats[i].fd < 0) return edg_wll_SetError(ctx,errno,fname); - /* XXX: should be initialized from LB data */ - stats[i].grpno = 0; - - stats[i].grpsize = sizeof(struct edg_wll_stats_group)-sizeof(struct edg_wll_stats_archive); - - for (j=0; stats[i].archives[j].interval; j++) { - stats[i].grpsize += sizeof(struct edg_wll_stats_archive)-sizeof(struct edg_wll_stats_cell); - stats[i].grpsize += stats[i].archives[j].length * sizeof(struct edg_wll_stats_cell); - } - zero = calloc(1,stats[i].grpsize); - write(stats[i].fd,zero,stats[i].grpsize); - stats[i].map = mmap(NULL,stats[i].grpsize,PROT_READ|PROT_WRITE,MAP_SHARED,stats[i].fd,0); - if (stats[i].map == MAP_FAILED) return edg_wll_SetError(ctx,errno,"mmap()"); - - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, - "stats: using %s",fname); - unlink(fname); - } - return 0; -} - -int edg_wll_UpdateStatistics( - edg_wll_Context ctx, - const edg_wll_JobStat *from, - const edg_wll_Event *e, - const edg_wll_JobStat *to) -{ - int i; - - /* XXX: should be propagated somhow via context, not hardcoded */ - edg_wll_Stats *stats = default_stats; - - if (!ctx->count_statistics) return 0; - - for (i=0; stats[i].type; i++) switch (stats[i].type) { - case STATS_COUNT: - if (!to) continue; - if (to->state == stats[i].major && (!from || from->state != to->state)) { - switch (to->state) { - case EDG_WLL_JOB_DONE: - if (to->done_code != stats[i].minor) continue; - break; - default: break; - } - stats_inc_counter(ctx,to,stats+i); - } - break; - case STATS_DURATION: - if (!to || !from) continue; - if (from->state == stats[i].major && from->state != to->state) - stats_record_duration(ctx,from,to,stats+i); - default: break; - } - return 0; -} - -static struct edg_wll_stats_archive *archive_skip( - const struct edg_wll_stats_archive *a, - int len) -{ - return (struct edg_wll_stats_archive *) - (((char *) a) + sizeof(struct edg_wll_stats_archive) - - sizeof(struct edg_wll_stats_cell) - + len * sizeof(struct edg_wll_stats_cell) - ); -} - -static int stats_remap(edg_wll_Stats *stats) -{ - int newgrpno = stats->map->grpno; - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, - "stats_remap: size changed (%d != %d), remap", - stats->grpno, newgrpno); - munmap(stats->map,(stats->grpno ? stats->grpno : 1) * stats->grpsize); - stats->map = mmap(NULL,newgrpno * stats->grpsize, - PROT_READ|PROT_WRITE,MAP_SHARED,stats->fd,0); - if (stats->map == MAP_FAILED) { - if (debug) abort(); - return -1; - } - assert(stats->map->grpno == newgrpno); - stats->grpno = newgrpno; - return 0; -} - - -static int stats_inc_counter(edg_wll_Context ctx,const edg_wll_JobStat *jobstat,edg_wll_Stats *stats) -{ - int i,j; - char *sig = NULL; - struct edg_wll_stats_group *g; - struct edg_wll_stats_archive *a; - time_t now = jobstat->stateEnterTime.tv_sec; - - /* XXX: we support destination grouping only */ - if (!jobstat->destination) return 0; - edg_wll_ResetError(ctx); - - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, - "inc_counter: destination %s, stats %d", - jobstat->destination, (int) (stats - (edg_wll_Stats *) default_stats)); - - if (flock(stats->fd,LOCK_EX)) return edg_wll_SetError(ctx,errno,"flock()"); - - /* remap the file if someone changed its size */ - if (stats->map->grpno != stats->grpno && stats_remap(stats)) { - edg_wll_SetError(ctx,errno,"shmem remap failed"); - goto cleanup; - } - - sig = str2md5base64(jobstat->destination); - - for (i=0; igrpno; i++) { - g = (struct edg_wll_stats_group *) ( - ((char *) stats->map) + stats->grpsize * i - ); - if (!strcmp(sig,g->sig)) break; - } - - /* not found, initialize new */ - if (i == stats->grpno) { - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, - "group %s not found",sig); - if (stats->grpno) { - char *zero = calloc(1,stats->grpsize); - munmap(stats->map,stats->grpno * stats->grpsize); - lseek(stats->fd,0,SEEK_END); - write(stats->fd,zero,stats->grpsize); - free(zero); - stats->map = mmap(NULL,(stats->grpno+1) * stats->grpsize, - PROT_READ|PROT_WRITE,MAP_SHARED,stats->fd,0); - - if (stats->map == MAP_FAILED) { - edg_wll_SetError(ctx,errno,"mmap()"); - goto cleanup; - } - } - stats->grpno++; - stats->map->grpno++; - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, - "allocated"); - - g = (struct edg_wll_stats_group *) ( - ((char *) stats->map) + stats->grpsize * i); - - /* invalidate all cells in all archives */ - a = g->archive; - for (i=0; stats->archives[i].interval; i++) { - for (j=0; jarchives[i].length; j++) a->cells[j].cnt = -1; - a = archive_skip(a,stats->archives[i].length); - } - - strcpy(g->sig,sig); - g->last_update = now; - } - else - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, - "group %s found at %d", sig, i); - - a = g->archive; - for (i=0; stats->archives[i].interval; i++) { - time_t pt = g->last_update; - - pt -= pt % stats->archives[i].interval; - - /* nothing happened longer than is history of this archive */ - if (now-pt > stats->archives[i].interval * stats->archives[i].length) { - for (j=0; jarchives[i].length; j++) a->cells[j].cnt = 0; - a->ptr = 0; - } - /* catch up eventually, cleaning not touched cells */ - else for (pt += stats->archives[i].interval; pt < now; - pt += stats->archives[i].interval) - { - if (++(a->ptr) == stats->archives[i].length) a->ptr = 0; - a->cells[a->ptr].cnt = 0; - } - - /* validate an unused cell */ - if (a->cells[a->ptr].cnt < 0) a->cells[a->ptr].cnt = 0; - - /* now we can do IT */ - a->cells[a->ptr].cnt++; - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, - "update archive %d, cell %d to %d", - i, a->ptr, a->cells[a->ptr].cnt); - - /* go to next archive */ - a = archive_skip(a,stats->archives[i].length); - } - - g->last_update = now; - - -cleanup: - free(sig); - flock(stats->fd,LOCK_UN); - return edg_wll_Error(ctx,NULL,NULL); -} - -static int stats_record_duration( - edg_wll_Context ctx, - const edg_wll_JobStat *from, - const edg_wll_JobStat *to, - edg_wll_Stats *stats) -{ - return 0; -} - -int edg_wll_StateRateServer( - edg_wll_Context ctx, - const edg_wll_QueryRec *group, - edg_wll_JobStatCode major, - int minor, - time_t *from, - time_t *to, - float *rate, - int *res_from, - int *res_to -) -{ - edg_wll_Stats *stats = default_stats; /* XXX: hardcoded */ - struct edg_wll_stats_group *g; - struct edg_wll_stats_archive *a; - int i,j,matchi; - char *sig = NULL; - time_t afrom,ato; - long match; - struct _edg_wll_GssPrincipal_data princ; - - princ.name = ctx->peerName; - princ.fqans = ctx->fqans; - - edg_wll_ResetError(ctx); - - switch (ctx->count_statistics) { - case 0: return edg_wll_SetError(ctx,ENOSYS,NULL); - case 1: if (!ctx->noAuth && !check_authz_policy(&ctx->authz_policy, &princ, GET_STATISTICS)) return edg_wll_SetError(ctx,EPERM,NULL); - break; - case 2: break; - default: abort(); - } - - if (group[0].attr != EDG_WLL_QUERY_ATTR_DESTINATION - || group[1].attr != EDG_WLL_QUERY_ATTR_UNDEF) - return edg_wll_SetError(ctx,ENOSYS, - "the only supported grouping is by destination"); - - if (*from >= *to) return edg_wll_SetError(ctx,EINVAL,"from >= to"); - - for (;stats->type; stats++) { - if (stats->type != STATS_COUNT || stats->major != major) continue; - switch (major) { - case EDG_WLL_JOB_DONE: - if (stats->minor != minor) continue; - break; - default: break; - } - break; - } - - if (!stats->type) return edg_wll_SetError(ctx,ENOENT,"no matching state counter"); - - /* remap the file if someone changed its size */ - if (stats->map->grpno != stats->grpno) - { - if (flock(stats->fd,LOCK_EX)) return edg_wll_SetError(ctx,errno,"flock()"); - if (stats_remap(stats)) { - edg_wll_SetError(ctx,errno,"shmem remap failed"); - goto cleanup; - } - } - - if (flock(stats->fd,LOCK_SH)) return edg_wll_SetError(ctx,errno,"flock()"); - - /* XXX */ - sig = str2md5base64(group->value.c); - - - for (i=0, g=stats->map; igrpno; i++) { - if (!strcmp(sig,g->sig)) break; - g = (struct edg_wll_stats_group *) (((char *) g) + stats->grpsize); - } - - if (i == stats->grpno) { - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, - "no match: %s\n",sig); - edg_wll_SetError(ctx,ENOENT,"no matching group"); - goto cleanup; - } - - match = 0; - matchi = -1; - /* XXX: assumes decreasing resolution of archives */ - for (j=0; stats->archives[j].interval; j++) { - afrom = ato = g->last_update; - - ato += stats->archives[j].interval - ato % stats->archives[j].interval; - afrom -= afrom % stats->archives[j].interval; - afrom -= stats->archives[j].interval * (stats->archives[j].length-1); - - /* intersection of [from,to] and [afrom,ato] */ - if (afrom < *from) afrom = *from; - if (ato > *to) ato = *to; - - /* find the best match */ - if (ato-afrom > match) { - match = ato - afrom; - matchi = j; - } - } - - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, - "best match: archive %d, interval %ld", matchi, match); - - if (matchi < 0) { - if (*from > g->last_update) { - /* special case -- we are sure that nothing arrived */ - *rate = 0; - *res_from = *res_to = stats->archives[0].interval; - goto cleanup; - } - edg_wll_SetError(ctx,ENOENT,"no data available"); - goto cleanup; - } - - *res_from = *res_to = stats->archives[matchi].interval; - - a = g->archive; - for (j=0; jarchives[j].length); - - i = stats->archives[matchi].interval; - afrom = g->last_update - g->last_update % i - - (stats->archives[matchi].length-1)*i; - - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, - "archive from %ld = %s", afrom, ctime(&afrom)); - - if (afrom > *from) *from = afrom; - if (afrom + stats->archives[matchi].length * i < *to) *to = afrom + stats->archives[matchi].length * i; - - *rate = 0; - match = 0; - - - for (j=0; jarchives[matchi].length; j++,afrom += i) { - struct edg_wll_stats_cell *c = a->cells + ((a->ptr+j+1) % stats->archives[matchi].length); - - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, - "cell %d (abs %d): ", - j, (a->ptr+j+1) % stats->archives[matchi].length); - if (c->cnt < 0) { - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, "invalid"); - continue; /* invalid cell */ - } - - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, - "search %ld in %ld, %ld", *from, afrom, afrom+i); - - if (*from >= afrom && *from < afrom+i) { - match += *from - afrom; - *rate += c->cnt * (1.0 - ((float) *from-afrom)/i); - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, "matched from: match %ld, rate %f", match, *rate); - } - else if (*from < afrom && *to >= afrom) { - match += i; - *rate += c->cnt; - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, "matched in: match %ld, rate %f", match, *rate); - } - - if (*to >= afrom && *to < afrom+i) { - match -= i-(*to-afrom); - *rate -= c->cnt * (((float) i)-(*to - afrom))/i; - - glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, "matched to: match %ld, rate %f", match, *rate); - - /* asi blbost - if (j == stats->archives[matchi].length - 1 - && *to > g->last_update) - { - match -= *to - g->last_update; - *rate -= c->cnt * (((float) *to) - g->last_update)/i; - dprintf(("corrected wrt. last_update: match %ld, rate %f\n",match,*rate)); - } - */ - - break; - } - } - *rate /= match; - -cleanup: - free(sig); - flock(stats->fd,LOCK_UN); - return edg_wll_Error(ctx,NULL,NULL); -} - -int edg_wll_StateDurationServer( - edg_wll_Context ctx, - const edg_wll_QueryRec *group, - edg_wll_JobStatCode major, - int minor, - time_t *from, - time_t *to, - float *duration, - int *res_from, - int *res_to -) -{ - return edg_wll_SetError(ctx,ENOSYS,NULL); -} - diff --git a/org.glite.lb.server/src/stats.h b/org.glite.lb.server/src/stats.h deleted file mode 100644 index aad067e..0000000 --- a/org.glite.lb.server/src/stats.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef GLITE_LB_STATS_H -#define GLITE_LB_STATS_H - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include "glite/lb/context.h" -#include "glite/lb/events.h" -#include "glite/lb/jobstat.h" -#include "glite/lb/query_rec.h" - -int edg_wll_InitStatistics(edg_wll_Context); - -int edg_wll_UpdateStatistics( - edg_wll_Context, - const edg_wll_JobStat *, - const edg_wll_Event *, - const edg_wll_JobStat *); - - -struct edg_wll_stats_cell { - int cnt; - float value; -}; - -struct edg_wll_stats_archive { - int ptr; - struct edg_wll_stats_cell cells[1]; -}; - -struct edg_wll_stats_group { - int grpno; - char sig[33]; - time_t last_update; - struct edg_wll_stats_archive archive[1]; -}; - - -typedef struct { - enum { STATS_UNDEF = 0, STATS_COUNT, STATS_DURATION } type; - edg_wll_QueryRec *group; - edg_wll_JobStatCode major; - int minor; - struct _edg_wll_StatsArchive { - int interval,length; - } *archives; - - int fd; - struct edg_wll_stats_group *map; - int grpno,grpsize; -} edg_wll_Stats; - -int edg_wll_StateRateServer( - edg_wll_Context context, - const edg_wll_QueryRec *group, - edg_wll_JobStatCode major, - int minor, - time_t *from, - time_t *to, - float *rate, - int *res_from, - int *res_to -); - - -int edg_wll_StateDurationServer( - edg_wll_Context context, - const edg_wll_QueryRec *group, - edg_wll_JobStatCode major, - int minor, - time_t *from, - time_t *to, - float *duration, - int *res_from, - int *res_to -); - -#endif /* GLITE_LB_STATS_H */ diff --git a/org.glite.lb.server/src/store.c.T b/org.glite.lb.server/src/store.c.T deleted file mode 100644 index 9213926..0000000 --- a/org.glite.lb.server/src/store.c.T +++ /dev/null @@ -1,865 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -/* - -@@@AUTO - - * XXX: still lots of hardcoded stuff - * there's mapping db.column <-> event struct field - */ - -@@@LANG: C - -#include -#include -#include -#include -#include -#include - -#include "glite/jobid/strmd5.h" -#include "glite/lbu/trio.h" -#include "glite/lbu/log.h" - -#include "glite/lb/events_parse.h" -#include "glite/lb/context-int.h" -#include "glite/lb/log_proto.h" /* for EDG_WLL_LOG_USER_DEFAULT */ - -#include "store.h" -#include "get_events.h" -#include "lb_authz.h" -#include "jobstat.h" -#include "db_calls.h" -#include "db_supp.h" -#include "index.h" - -static int store_user(edg_wll_Context,const char *,const char *); -static int store_job(edg_wll_Context,glite_jobid_const_t,const char *, int, int, int, int); -static int store_flesh(edg_wll_Context,edg_wll_Event *,const char *ulm, char *,int); -/* FIXME: 'check_dup' defined but not used */ -static int check_dup(edg_wll_Context,edg_wll_Event *); -static int check_auth(edg_wll_Context,edg_wll_Event *e); -static void lowercase_usertag(edg_wll_Event *ev); - -void edg_wll_StoreAnonymous(edg_wll_Context ctx,int anon) { - ctx->allowAnonymous = anon; -} - - -/* !!! to be called from OPEN TRANSACTION only !!! - */ -int edg_wll_StoreEvent(edg_wll_Context ctx,edg_wll_Event *e,const char *ulm,int *seq) -{ - char *userid, *jobid, *stmt, *ssrc, *now_s, *stamp, *dummy, *max; - glite_lbu_Statement sh = NULL; - int next = 0xDEAD, nr; - - - userid = ssrc = jobid = stmt = now_s = stamp = dummy = max = NULL; - - lowercase_usertag(e); - jobid = edg_wlc_JobIdGetUnique(e->any.jobId); - glite_lbu_TimeToStr(e->any.timestamp.tv_sec, &stamp); - ssrc = edg_wll_SourceToString(e->any.source); - - if ( ctx->event_load ) - glite_lbu_TimeToStr(e->any.arrived.tv_sec, &now_s); - else - glite_lbu_TimeToStr(time(NULL), &now_s); - - edg_wll_ResetError(ctx); - switch (check_auth(ctx,e)) { - case 0: break; - case ENOENT: - /* job not registered */ - // should not happen, store_job_server_proxy() miscoded or going thu load? - goto clean; - break; - case EPERM: - if (!ctx->noAuth) goto clean; - edg_wll_ResetError(ctx); - break; - default: goto clean; - } - - trio_asprintf(&stmt,"select userid from jobs where jobid='%|Ss'", jobid); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if (edg_wll_ExecSQL(ctx,stmt,&sh) < 0 || edg_wll_FetchRow(ctx,sh,1,NULL,&userid) < 0) goto clean; - if (sh) glite_lbu_FreeStmt(&sh); - free(stmt); stmt = NULL; - - -/* check duplicity */ - trio_asprintf(&stmt, - "select arrived from events where jobid='%|Ss' and code='%d'" - " and prog='%|Ss' and host='%|Ss' and time_stamp=%s and usec='%d'" - " and level='%d' and userid='%|Ss' and seqcode='%|Ss'", - jobid, (int) e->any.type, - ssrc,e->any.host, - stamp,e->any.timestamp.tv_usec, - e->any.level,userid, e->any.seqcode); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if (edg_wll_ExecSQL(ctx,stmt,&sh) < 0) goto clean; - nr = edg_wll_FetchRow(ctx,sh,1,NULL,&dummy); - if (sh) glite_lbu_FreeStmt(&sh); - free(stmt); stmt = NULL; - free(dummy); - - if (nr < 0) goto clean; - if (nr > 0) { - /* possible duplicity (99%) */ - // XXX: check event flesh to be 100% sure - edg_wll_SetError(ctx,EEXIST,"duplicate event"); - goto clean; - } - /* else (nr == 0) -> unique event, continue */ - - -/* obtain number of stored events */ - trio_asprintf(&stmt, - "select nevents from jobs " - "where jobid = '%|Ss'",jobid); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if (edg_wll_ExecSQL(ctx,stmt,&sh) < 0 || - edg_wll_FetchRow(ctx,sh,1,NULL,&max) < 0) goto clean; - glite_lbu_FreeStmt(&sh); - free(stmt); - - next = (max && *max) ? atoi(max) : 0; - free(max); - - -/* store event */ - trio_asprintf(&stmt, - "insert into events(jobid,event,code,prog,host,time_stamp,usec,arrived,level,userid,seqcode) " - "values ('%|Ss',%d,%d,'%|Ss','%|Ss',%s,%d,%s,%d,'%|Ss','%|Ss')", - jobid,next, - (int) e->any.type, - ssrc,e->any.host, - stamp,e->any.timestamp.tv_usec, - now_s, e->any.level,userid, e->any.seqcode); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto clean; - free(stmt); stmt = NULL; - -/* increase number of stored events */ - trio_asprintf(&stmt, - "update jobs set nevents='%d'" - "where jobid = '%|Ss'", next+1, jobid); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto clean; - free(stmt); stmt = NULL; - - -/* store event record */ - if (store_flesh(ctx,e,ulm,jobid,next)) goto clean; - -clean: - free(now_s); - free(userid); - free(jobid); - free(stmt); - free(ssrc); - if (sh) glite_lbu_FreeStmt(&sh); - if (!edg_wll_Error(ctx,NULL,NULL) && seq) *seq = next; - free(stamp); - return edg_wll_Error(ctx,NULL,NULL); -} - -static int store_user(edg_wll_Context ctx,const char *userid,const char *subj) -{ - char *stmt; - - trio_asprintf(&stmt,"insert into users(userid,cert_subj) " - "values ('%|Ss','%|Ss')",userid,subj); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) { - if (edg_wll_Error(ctx,NULL,NULL) == EEXIST) - edg_wll_ResetError(ctx); - } - - free(stmt); - return edg_wll_Error(ctx,NULL,NULL); -} - -static int store_job(edg_wll_Context ctx,glite_jobid_const_t job,const char *userid, int proxy, int server,int grey, int update) -{ - char *jobstr = edg_wlc_JobIdUnparse(job); - char *jobid = edg_wlc_JobIdGetUnique(job); - char *stmt; - char *srvName; - unsigned int srvPort; - -/* debug Duplicate key on index: Duplicate entry '(nil)' for key 1 - */ - if (jobid == NULL || jobstr == NULL) - return edg_wll_SetError(ctx,EINVAL,"store_job()"); - - edg_wll_ResetError(ctx); - - if (ctx->isProxy) { - proxy = 1; - - /* If host&port in jobId match bkserver hostname and port and bkserver - * runs server service, mark the proxy job to belong to bkserver too - */ - edg_wlc_JobIdGetServerParts(job, &srvName, &srvPort); - if ( (ctx->serverRunning) && (ctx->srvPort == srvPort) && - !strcmp(ctx->srvName, srvName)) { - server=1; - } - } - else { - server = 1; - } - - if (update) { - trio_asprintf(&stmt,"update jobs set userid='%|Ss', proxy='%|Sd', server='%|Sd', grey='%|Sd' where jobid='%|Ss'", - userid,proxy,server,grey,jobid); - } - else { - trio_asprintf(&stmt,"insert into jobs(jobid,dg_jobid,userid,proxy,server,grey) " - "values ('%|Ss','%|Ss','%|Ss', '%|Sd', '%|Sd', '%|Sd')",jobid,jobstr,userid,proxy,server,grey); - } - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) { - if (edg_wll_Error(ctx,NULL,NULL) == EEXIST && !update) - edg_wll_ResetError(ctx); - else - goto err; - } - free(stmt); stmt = NULL; - -err: - free(stmt); - free(jobstr); - free(jobid); - return edg_wll_Error(ctx,NULL,NULL); -} - - -/* test whether job shares LB proxy and server DB or not */ -int is_job_local(edg_wll_Context ctx, glite_jobid_const_t jobId) -{ - char *srvName = NULL; - unsigned int srvPort; - int ret; - - if (!ctx->serverRunning) return 0; /* XXX */ - - edg_wlc_JobIdGetServerParts(jobId, &srvName, &srvPort); - ret = ((ctx->srvPort == srvPort) && ctx->srvName && !strcmp(srvName,ctx->srvName)); - free(srvName); - - return(ret); -} - -int store_job_server_proxy(edg_wll_Context ctx, edg_wll_Event *event, int *register_to_JP) -{ - char *unique = edg_wlc_JobIdGetUnique(event->any.jobId); - char *q = NULL, *userid = NULL, *subj = NULL, *owner = NULL; - glite_lbu_Statement stmt = NULL, stmt_zomb = NULL; - int nar, grey = 0; - char *can_peername = NULL; - int local_job = is_job_local(ctx, event->any.jobId); - char *res[3] = {NULL, NULL, NULL}; - - - /* check auth */ - if (!ctx->isProxy && !ctx->peerName) - return edg_wll_SetError(ctx,EPERM,"LB server can't store using unauthenticated connection"); - if (ctx->isProxy && (!event->any.user || !strcmp(event->any.user,EDG_WLL_LOG_USER_DEFAULT)) ) - return edg_wll_SetError(ctx,EPERM,"LB proxy can't store using unauthenticated connection"); - - - trio_asprintf(&q,"select proxy,server,grey from jobs where jobid='%|Ss' for update", unique); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, q); - - nar = edg_wll_ExecSQL(ctx,q,&stmt); - free(q); q = NULL; - -/* XXX: greyjobs semantics is overloaded here: - * we trust the registration event content to specify job owner unconditionally. - * It's fine for the time being but should be solved with new authz. - * */ - - if (nar < 0) goto err; - else if (nar == 0) { - /* Job not stored yet */ - if (event->any.type == EDG_WLL_EVENT_REGJOB) { - - /* XXX: directness is checked by any.user == peerName. Not perfect but better than event flags. */ - - if (!ctx->isProxy && !edg_wll_gss_equal_subj(event->any.user, ctx->peerName) && !ctx->greyjobs) { - edg_wll_SetError(ctx,EPERM,"job registration must go directly"); - goto err; - - } - if ((event->any.priority & EDG_WLL_LOGLFLAG_EXCL) && ctx->exclusive_zombies) { - trio_asprintf(&q,"select jobid from zombie_jobs " - "where zombie_jobs.jobid='%|Ss'",unique); - - if (edg_wll_ExecSQL(ctx,q,&stmt_zomb) > 0) { - edg_wll_SetError(ctx,EEXIST,"Zombie job with given jobid already exists. Rejecting event."); - goto err; - } - if (stmt_zomb) { glite_lbu_FreeStmt(&stmt_zomb); stmt_zomb = NULL; } - free (q); q = NULL; - } - - /* else OK */ - } - else { - if (ctx->greyjobs) grey = 1; - else { - edg_wll_SetError(ctx, ENOENT, "job not registered"); - goto err; - } - } - - can_peername = grey ? strdup("GREY JOB") : edg_wll_gss_normalize_subj(event->any.user, 0); - userid = strdup(strmd5(can_peername, NULL)); - if (store_user(ctx,userid,can_peername)) goto err; - if (store_job(ctx,(glite_jobid_const_t) event->any.jobId, - userid, ctx->isProxy, local_job, grey, 0 )) goto err; - if (event->any.type == EDG_WLL_EVENT_REGJOB && event->regJob.wms_dn) { - char *names = strdup(event->regJob.wms_dn); - char *p, *name; - int ret; - - name = names; - while ((p = strchr(name, '\n'))) { - *p = '\0'; - ret = edg_wll_UpdateACL(ctx, event->any.jobId, name, - EDG_WLL_CHANGEACL_DN, - EDG_WLL_CHANGEACL_READ, - EDG_WLL_CHANGEACL_ALLOW, - EDG_WLL_CHANGEACL_ADD); - if (ret) { - free(names); - goto err; - } - name = p+1; - } - free(names); - } - - *register_to_JP = (local_job) ? REG_JOB_TO_JP : 0; - } - else { - /* Job already stored */ - - if (edg_wll_FetchRow(ctx,stmt,sizeof(res)/sizeof(res[0]),NULL,res) < 0) goto err; - if (stmt) { glite_lbu_FreeStmt(&stmt); stmt = NULL; } - - - if (ctx->greyjobs && !strcmp(res[2],"1") && - (event->any.type == EDG_WLL_EVENT_REGJOB)) - { - can_peername = edg_wll_gss_normalize_subj(event->any.user, 0); - userid = strdup(strmd5(can_peername, NULL)); - if (store_user(ctx,userid,can_peername)) goto err; - if (store_job(ctx,(glite_jobid_const_t) event->any.jobId, - userid, (ctx->isProxy || !strcmp(res[0],"1")), - !strcmp(res[1],"1") || (local_job ? ctx->serverRunning : 0), 0, 1)) goto err; - } - else { - /* check possible server vs. proxy registration ownership clash */ - if (event->any.type == EDG_WLL_EVENT_REGJOB) - { - trio_asprintf(&q,"select u.cert_subj from jobs j, users u " - "where j.jobid='%|Ss' and u.userid=j.userid",unique); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, q); - - if (edg_wll_ExecSQL(ctx,q,&stmt) < 0 - || edg_wll_FetchRow(ctx,stmt,1,NULL,&owner) < 0 - ) goto err; - - if (!edg_wll_gss_equal_subj(event->any.user, owner)) { - edg_wll_SetError(ctx,EPERM,"Job already registered with different owner. Rejecting event."); - goto err; - } - - if (event->any.priority & EDG_WLL_LOGLFLAG_EXCL) { - edg_wll_SetError(ctx,EEXIST,"Job with given jobid already exists. Rejecting event."); - goto err; - } - } - - /* update job membership if needed */ - // if (!strcmp(res[0],"1") && !strcmp(res[1],"1") ) /*nothing to do */; - if ( (!strcmp(res[0],"0") && ctx->isProxy) || (!strcmp(res[1],"0") && !ctx->isProxy) ) { - trio_asprintf(&q,"update jobs set server='1', proxy='1' where jobid='%|Ss'", - unique); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, q); - if (edg_wll_ExecSQL(ctx,q,NULL) < 0) goto err; - free(q); q = NULL; - } - } - } - -err: - free(res[0]); free(res[1]); free(res[2]); - if (stmt) glite_lbu_FreeStmt(&stmt); - free(subj); - free(userid); - free(unique); - if (q) free(q); - if (owner) free(owner); - - return edg_wll_Error(ctx,NULL,NULL); - -} - - - -#define SHORT_LEN 255 /* short_fiels.value db column lenght */ - -static int store_flesh(edg_wll_Context ctx,edg_wll_Event *e,const char *ulm,char *jobid,int no) -{ -#ifndef LB_EVENTS_BLOB - struct { - char *key; - char *val; - } f[20]; - unsigned int i; -#endif - - char *stmt; - int err = 0; - - assert(ulm || e); - edg_wll_ResetError(ctx); - if (!ulm) ulm = edg_wll_UnparseEvent(ctx, e); - if (!ulm) return edg_wll_Error(ctx, NULL, NULL); - -#ifndef LB_EVENTS_BLOB - // in both ways if some preparsed flesh fields in events too - if (!e) { - if (edg_wll_ParseEvent(ctx, (char *)ulm, &e) != 0) return edg_wll_Error(ctx, NULL, NULL); - } - - memset(f,0,sizeof(f)); assert(f[0].key == NULL); - - switch (e->type) { -@@@{ - for my $type (getTypesOrdered $event) { - next if $type eq '_common_'; - selectType $event $type; - my $uctype = uc $type; - my $flctype = lcfirst $type; - if ($flctype =~ m/^pBS/) { $flctype = ucfirst $flctype; } - if ($flctype =~ m/^cREAM/) { $flctype = ucfirst $flctype; } - if ($flctype =~ m/^condor/) { $flctype = ucfirst $flctype; } - gen qq{ -! case EDG_WLL_EVENT_$uctype: -}; - my $idx = 0; - for (getFieldsOrdered $event) { - my $f = selectField $event $_; - my $name = getName $f; - my $ucname = uc $name; - my $fucname = ucfirst $name; - my $tos = $f->{codes} ? - "f[$idx].val = edg_wll\_$type${fucname}ToString(e->$flctype.$name);" : - toString $f "e->$flctype.$name","f[$idx].val"; - gen qq{ -! f[$idx].key = "$ucname"; -! $tos -}; - $idx++; - } - gen qq{ -! assert($idxany.src_instance); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) err = edg_wll_Error(ctx,NULL,NULL); - free(stmt); - } -#else - if (!ulm) ulm = edg_wll_UnparseEvent(ctx, e); - trio_asprintf(&stmt, "insert into events_flesh (jobid, event, ulm) values ('%|Ss', %d, '%|Ss')", jobid, no, ulm); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) err = edg_wll_Error(ctx,NULL,NULL); -#endif - - return err; -} - -static int check_dup(edg_wll_Context ctx,edg_wll_Event *e) -{ - int i,dup_detected = 0; - int err; - char *es,*es2; - edg_wll_QueryRec jc[2],ec[2]; - edg_wll_QueryRec **jca, **eca; - edg_wll_Event *e2; - - edg_wll_ResetError(ctx); - - jc[0].attr = EDG_WLL_QUERY_ATTR_JOBID; - jc[0].value.j = e->any.jobId; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - ec[0].attr = EDG_WLL_QUERY_ATTR_TIME; - memcpy(&ec[0].value.t,&e->any.timestamp,sizeof(struct timeval)); - ec[0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - jca = (edg_wll_QueryRec **) malloc (2 * sizeof(edg_wll_QueryRec **)); - eca = (edg_wll_QueryRec **) malloc (2 * sizeof(edg_wll_QueryRec **)); - jca[0] = jc; - jca[1] = NULL; - eca[0] = ec; - eca[1] = NULL; - - err = edg_wll_QueryEventsServer(ctx,1,(const edg_wll_QueryRec **)jca, - (const edg_wll_QueryRec **)eca,&e2); - switch (err) { - case 0: /* continue normally */ - break; - case ENOENT: - free(jca); - free(eca); - return edg_wll_ResetError(ctx); - break; - default: - free(jca); - free(eca); - return edg_wll_Error(ctx,NULL,NULL); - break; - } - - es = edg_wll_UnparseEvent(ctx,e); - assert(es); - - for (i=0;e2[i].type && !dup_detected;i++) { - /* Ignore priority */ - e2[i].any.priority = e->any.priority; - es2 = edg_wll_UnparseEvent(ctx,e2+i); - assert(es2); - if (!strcmp(es,es2)) { - dup_detected = 1; - edg_wll_SetError(ctx,EEXIST,"duplicate event"); - } - free(es2); - } - - free(jca); - free(eca); - free(es); - for (i=0; e2[i].type; i++) edg_wll_FreeEvent(e2+i); - free(e2); - return edg_wll_Error(ctx,NULL,NULL); -} - -static int check_auth(edg_wll_Context ctx,edg_wll_Event *e) -{ - char *jobid = edg_wlc_JobIdGetUnique(e->any.jobId); - char *q = NULL,*owner = NULL; - glite_lbu_Statement stmt = NULL; - - edg_wll_ResetError(ctx); - - if (!ctx->isProxy && !ctx->peerName) - return edg_wll_SetError(ctx,EPERM,"can't store using unauthenticated connection"); - - trio_asprintf(&q,"select u.cert_subj from jobs j, users u " - "where j.jobid='%|Ss' and u.userid=j.userid",jobid); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, q); - - if (edg_wll_ExecSQL(ctx,q,&stmt) < 0 - || edg_wll_FetchRow(ctx,stmt,1,NULL,&owner) < 0 - ) goto clean; - - if (!owner) { - edg_wll_SetError(ctx, ENOENT, "job not registered"); - goto clean; - } - - switch (e->any.source) { - case EDG_WLL_SOURCE_USER_INTERFACE: - case EDG_WLL_SOURCE_LRMS: - case EDG_WLL_SOURCE_APPLICATION: - if (!edg_wll_gss_equal_subj(owner,e->any.user)) - edg_wll_SetError(ctx,EPERM,"check_auth()"); - break; - default: - /* XXX: just don't allow anonymous */ - if (!strcmp(e->any.user,EDG_WLL_LOG_USER_DEFAULT)) - edg_wll_SetError(ctx,EPERM,"check_auth()"); - break; - } - - -clean: - if (stmt) glite_lbu_FreeStmt(&stmt); - free(q); - free(owner); - return edg_wll_Error(ctx,NULL,NULL); -} - - -edg_wll_ErrorCode intJobStat_embryonic( - edg_wll_Context ctx, - glite_jobid_const_t jobid, - const edg_wll_RegJobEvent *e, - intJobStat *stat) -{ - if (edg_wlc_JobIdDup(jobid, &stat->pub.jobId) || - edg_wlc_JobIdDup(e->jobId, &stat->pub.parent_job)) goto err; - stat->pub.state = EDG_WLL_JOB_SUBMITTED; - stat->pub.owner = strdup(e->user); - stat->pub.jobtype = EDG_WLL_STAT_SIMPLE; - stat->pub.stateEnterTimes[1 + EDG_WLL_JOB_SUBMITTED] = (int)e->timestamp.tv_sec; - stat->pub.lastUpdateTime = e->timestamp; - -err: - return edg_wll_Error(ctx,NULL,NULL); -} - -/* - * Returns encoded SQL table states record for embryonic DAG subjob - */ - -static edg_wll_ErrorCode states_values_embryonic( - edg_wll_Context ctx, - glite_jobid_const_t jobid, - const edg_wll_RegJobEvent *e, - char **icnames, - char **values) -{ - char *jobid_md5, *stat_enc, *parent_md5; - char *stmt = NULL; - char *icvalues; - intJobStat stat_rec; - intJobStat *stat = &stat_rec; - - init_intJobStat(stat); - - if (intJobStat_embryonic(ctx, jobid, e, stat)) goto err; - - jobid_md5 = edg_wlc_JobIdGetUnique(jobid); - parent_md5 = edg_wlc_JobIdGetUnique(e->jobId); - stat_enc = enc_intJobStat(strdup(""), stat); - if (jobid_md5 == NULL || parent_md5 == NULL || stat_enc == NULL) goto err; - - - if (edg_wll_IColumnsSQLPart(ctx, ctx->job_index_cols, &stat->pub, 1, icnames, &icvalues)) goto err; - trio_asprintf(&stmt, - "'%|Ss',%d,%d,'%|Ss','%|Ss','%|Ss'%s", - jobid_md5, stat->pub.state, 1, stat_enc, - INTSTAT_VERSION, parent_md5, icvalues); - free(icvalues); - -err: - destroy_intJobStat(stat); - free(jobid_md5); - free(stat_enc); - free(parent_md5); - *values = stmt; - return edg_wll_Error(ctx,NULL,NULL); -} - - -int register_subjobs_embryonic(edg_wll_Context ctx,const edg_wll_RegJobEvent *e) -{ - int i, j, err = 0; - edg_wlc_JobId *subjobs = NULL; - char *jobid = NULL, *jobid_md5 = NULL, *jobid_md5_old = NULL; - size_t jobid_len; - char *icnames = NULL, *values = NULL, *userid = NULL, *stmt = NULL; - int server, proxy, membership = 0; - glite_lbu_Statement sh = NULL; - - - edg_wll_ResetError(ctx); - - if (e->nsubjobs == 0) return 0; - if (e->nsubjobs < 0) return edg_wll_SetError(ctx,EINVAL,"negative number of subjobs"); - if ((err = edg_wll_GenerateSubjobIds(ctx,e->jobId,e->nsubjobs,e->seed,&subjobs))) - return err; - - /* find out icnames and values once, then only change jobids */ - if (states_values_embryonic(ctx, subjobs[0], e, &icnames, &values)) - edg_wll_Error(ctx, NULL, NULL); - jobid_md5_old = edg_wlc_JobIdGetUnique(subjobs[0]); - jobid_len = strlen(jobid_md5_old); - - - /* increase the overall request timeout. */ - ctx->p_tmp_timeout.tv_sec += e->nsubjobs/10; - if (ctx->p_tmp_timeout.tv_sec > 86400) ctx->p_tmp_timeout.tv_sec = 86400; - - if ((membership = edg_wll_jobMembership(ctx, e->jobId)) < 0) goto err; - - proxy = membership & DB_PROXY_JOB; - server = membership & DB_SERVER_JOB; - - /* get userid of parent job */ - jobid = edg_wlc_JobIdGetUnique(e->jobId); - trio_asprintf(&stmt,"select userid from jobs where jobid='%|Ss'", jobid); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - if (edg_wll_ExecSQL(ctx,stmt,&sh) < 0 || edg_wll_FetchRow(ctx,sh,1,NULL,&userid) < 0) goto err; - - for (i=0; insubjobs; i++) { - char *et,*ed,*job_s,*p,*p1; - - /* save jobid-userid relation into jobs table */ - if ((err = store_job(ctx, subjobs[i], userid, proxy, server, 0, 0))) - if (edg_wll_Error(ctx,&et,&ed) == EDEADLK) goto err; - - /* interchange variable parts (jobids) in values */ - /* there are only two occurences of subjob jobid */ - jobid_md5 = edg_wlc_JobIdGetUnique(subjobs[i]); - if (i) { - p = strstr(values, jobid_md5_old); - assert(p); - memcpy(p, jobid_md5, jobid_len); - - p1 = strstr(p + jobid_len, jobid_md5_old); - assert(p1); - memcpy(p1, jobid_md5, jobid_len); - } - free(jobid_md5_old); - jobid_md5_old = jobid_md5; - - if (!err && (err = edg_wll_StoreIntStateEmbryonic(ctx, icnames, values))) - edg_wll_Error(ctx,&et,&ed); - - if (err) { - job_s = edg_wlc_JobIdUnparse(subjobs[i]); - glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, "%s: %s (%s)", job_s, et, ed); - free(job_s); free(et); free(ed); - edg_wll_ResetError(ctx); - } - edg_wlc_JobIdFree(subjobs[i]); - } - -err: - free(jobid_md5_old); //free the last one - free(icnames); - free(values); - /* free the rest of subjobs if DEADLOCK occurs */ - for (j=i; jnsubjobs; j++) edg_wlc_JobIdFree(subjobs[j]); - free(subjobs); - if (sh) glite_lbu_FreeStmt(&sh); - free(stmt); - - return edg_wll_Error(ctx,NULL,NULL); -} - - -int edg_wll_delete_event(edg_wll_Context ctx,const char *jobid,int event) -{ - char *stmt; - -/* The order of tables is important to prevent another process calling - * StoreEvent() to get our event number and mess up the fields together. - * - * XXX: best effort: more or less ignore errors - * - */ - - trio_asprintf(&stmt, - "delete from short_fields where jobid='%|Ss' and event=%d", - jobid,event); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - edg_wll_ExecSQL(ctx,stmt,NULL); - free(stmt); - - trio_asprintf(&stmt, - "delete from long_fields where jobid='%|Ss' and event=%d", - jobid,event); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - edg_wll_ExecSQL(ctx,stmt,NULL); - free(stmt); - - trio_asprintf(&stmt, - "delete from events_flesh where jobid='%|Ss' and event=%d", - jobid,event); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - edg_wll_ExecSQL(ctx,stmt,NULL); - free(stmt); - - trio_asprintf(&stmt, - "delete from events where jobid='%|Ss' and event=%d", - jobid,event); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - edg_wll_ExecSQL(ctx,stmt,NULL); - free (stmt); - - return edg_wll_Error(ctx,NULL,NULL); -} - - -/* XXX: if event type is user tag, convert the tag name to lowercase! - * (not sure whether to convert a value too is reasonable - * or keep it 'case sensitive') - */ -static void lowercase_usertag(edg_wll_Event *ev) -{ - int i; - - if ( ev->any.type == EDG_WLL_EVENT_USERTAG ) { - - for ( i = 0; ev->userTag.name[i] != '\0'; i++ ) - ev->userTag.name[i] = tolower(ev->userTag.name[i]); - } -} diff --git a/org.glite.lb.server/src/stored_master.c b/org.glite.lb.server/src/stored_master.c deleted file mode 100644 index b265435..0000000 --- a/org.glite.lb.server/src/stored_master.c +++ /dev/null @@ -1,147 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include -#include - -#include "glite/security/glite_gss.h" -#include "glite/lb/il_msg.h" -#include "glite/lb/lb_plain_io.h" -#include "glite/lb/context-int.h" -#include "glite/lbu/log.h" - -#include "store.h" - -#ifdef LB_PERF -#include "srv_perf.h" -#endif - - -static -int -gss_reader(void *user_data, char *buffer, int max_len) -{ - edg_wll_Context tmp_ctx = (edg_wll_Context)user_data; - int ret; - size_t len; - edg_wll_GssStatus gss_code; - - ret = edg_wll_gss_read_full(&tmp_ctx->connections->serverConnection->gss, - buffer, max_len, - &tmp_ctx->p_tmp_timeout, - &len, &gss_code); - if(ret < 0) { - switch(ret) { - - case EDG_WLL_GSS_ERROR_GSS: - edg_wll_SetErrorGss(tmp_ctx,"gss_reader",&gss_code); - break; - - case EDG_WLL_GSS_ERROR_TIMEOUT: - edg_wll_SetError(tmp_ctx, ETIMEDOUT, "gss_reader"); - break; - - case EDG_WLL_GSS_ERROR_EOF: - edg_wll_SetError(tmp_ctx, ENOTCONN, NULL); - break; - - case EDG_WLL_GSS_ERROR_ERRNO: - edg_wll_SetError(tmp_ctx, errno, "gss_reader"); - break; - - default: - edg_wll_SetError(tmp_ctx, EDG_WLL_ERROR_GSS, "gss_reader"); - break; - } - ret = -2; /* -1 is used by read_il_data internals */ - } - - return(ret); -} - -static -int -gss_plain_reader(void *user_data, char *buffer, int max_len) -{ - edg_wll_Context tmp_ctx = (edg_wll_Context)user_data; - int ret; - - ret = edg_wll_plain_read_full(&tmp_ctx->connProxy->conn, buffer, max_len, - &tmp_ctx->p_tmp_timeout); - if(ret < 0) { - edg_wll_SetError(tmp_ctx, errno, "gss_plain_reader"); - return -2; - } - - return(ret); -} - -int edg_wll_StoreProto(edg_wll_Context ctx) -{ - char *buf; - size_t len; - int ret; - size_t total; - edg_wll_GssStatus gss_code; - - edg_wll_ResetError(ctx); - - if (ctx->isProxy) { - ret = read_il_data(ctx, &buf, gss_plain_reader); - } else { - ret = read_il_data(ctx, &buf, gss_reader); - } - - if (ret == -1) - return edg_wll_SetError(ctx,EIO,"StoreProto(): interlogger protocol error"); - if (ret < 0) - return edg_wll_Error(ctx,NULL,NULL); -#ifdef LB_PERF - if (sink_mode == GLITE_LB_SINK_PARSE) glite_wll_perftest_consumeEventIlMsg(buf); - else -#endif - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_DEBUG,buf); - handle_il_message(ctx, buf); - free(buf); - - if ( (len = create_reply(ctx, &buf)) > 0 ) { - if (ctx->isProxy) { - if ((ret = edg_wll_plain_write_full(&ctx->connProxy->conn, - buf, len, &ctx->p_tmp_timeout)) < 0) { - edg_wll_UpdateError(ctx, - ret == EDG_WLL_GSS_ERROR_TIMEOUT ? - ETIMEDOUT : EDG_WLL_ERROR_GSS, - "StoreProto(): error sending reply"); - } - } else { - if ((ret = edg_wll_gss_write_full(&ctx->connections->serverConnection->gss, - buf,len,&ctx->p_tmp_timeout,&total,&gss_code)) < 0) { - edg_wll_UpdateError(ctx, errno, "StoreProto(): error sending reply"); - } - } - } else ret = edg_wll_UpdateError(ctx, E2BIG, "StoreProto(): error creating reply"); - - return edg_wll_Error(ctx,NULL,NULL); -} - diff --git a/org.glite.lb.server/src/userjobs.c b/org.glite.lb.server/src/userjobs.c deleted file mode 100644 index d859a51..0000000 --- a/org.glite.lb.server/src/userjobs.c +++ /dev/null @@ -1,140 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#include "glite/jobid/strmd5.h" -#include "glite/lbu/trio.h" -#include "glite/lb/context-int.h" -#include "glite/lbu/log.h" - -#include "jobstat.h" -#include "db_supp.h" -#include "query.h" -#include "lb_proto.h" - -int edg_wll_UserJobsServer( - edg_wll_Context ctx, - edg_wlc_JobId **jobs, - edg_wll_JobStat **states) -{ - char *userid, *stmt = NULL, - *res = NULL; - char *can_peername; - char *srv_name = NULL; - int name_len; - int njobs = 0,ret,i,idx; - edg_wlc_JobId *out = NULL; - glite_lbu_Statement sth = NULL; - edg_wll_ErrorCode err = 0; - - edg_wll_ResetError(ctx); - - if (!ctx->peerName) { - return edg_wll_SetError(ctx,EPERM, "user not authenticated (edg_wll_UserJobs)"); - } - can_peername = edg_wll_gss_normalize_subj(ctx->peerName, 0); - userid = strmd5(can_peername,NULL); - free(can_peername); - - trio_asprintf(&stmt,"select cert_subj from users where userid = '%|Ss'",userid); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - - switch (edg_wll_ExecSQL(ctx,stmt,&sth)) { - case 0: edg_wll_SetError(ctx,ENOENT,ctx->peerName); - case -1: goto err; - default: - if (edg_wll_FetchRow(ctx,sth,1,NULL,&res) < 0) goto err; - if (!edg_wll_gss_equal_subj(ctx->peerName,res)) { - edg_wll_SetError(ctx,EDG_WLL_ERROR_MD5_CLASH,ctx->peerName); - goto err; - } - } - - glite_lbu_FreeStmt(&sth); - free(stmt); stmt = NULL; - free(res); res = NULL; - - trio_asprintf(&stmt,"select dg_jobid from jobs where userid = '%|Ss' and grey='0'",userid); - glite_common_log(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - switch (njobs = edg_wll_ExecSQL(ctx,stmt,&sth)) { - case 0: edg_wll_SetError(ctx,ENOENT,ctx->peerName); - case -1: goto err; - } - - out = malloc(sizeof(*out)*(njobs+1)); - memset(out,0,sizeof(*out)*(njobs+1)); - - name_len = asprintf(&srv_name, "https://%s:%d/", - ctx->srvName, ctx->srvPort); - idx = 0; - for (i=0; (ret = edg_wll_FetchRow(ctx,sth,1,NULL,&res)); i++) { - if (ret < 0) goto err; - if (strncmp(res, srv_name, name_len)){ - njobs--; - continue; - } - if ((ret = edg_wlc_JobIdParse(res,out+idx))) { - edg_wll_SetError(ctx,errno,res); - goto err; - } - idx++; - free(res); res = NULL; - } - free(srv_name); - - if (states) { - edg_wll_QueryRec oc[2],*ocp[2] = { oc, NULL }; - - oc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - oc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - if (check_job_query_index(ctx,ocp)) { - edg_wll_ResetError(ctx); - *states = NULL; - goto err; - } - - *states = calloc(njobs+1, sizeof(**states)); - idx = 0; - for (i = 0; i < njobs; i++) { - if (edg_wll_JobStatusServer(ctx, out[idx], -1, &(*states)[idx]) != 0) - edg_wll_ResetError(ctx); - idx++; - } - } -err: - free(res); - free(stmt); - glite_lbu_FreeStmt(&sth); - if ((err = edg_wll_Error(ctx,NULL,NULL))) { - if (out) { - for (i=0; i -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include - -#include "glite/lbu/trio.h" -#include "glite/lb/context-int.h" -#include "glite/lb/jobstat.h" - -#include "get_events.h" -#include "store.h" -#include "index.h" -#include "jobstat.h" - -static int rgma_fd = -1; - -static void write2rgma_line(char *line, int old_style) -{ - - int slen; - int sysret; - struct iovec iov[2]; - - static int rgma_sock = -1; - static char *rgma_fname = NULL; - static struct sockaddr_un rgma_saddr; - - static int rgma_fd_locked = 0; - struct stat stat_buf,stat_fbuf; - struct flock filelock; - int filelock_status; - - assert(line != NULL); - - if (rgma_fd < -1) return; - if (rgma_fd == -1) { - rgma_fname = getenv("GLITE_WMS_LCGMON_FILE"); - if (rgma_fname == NULL) { - rgma_fname = getenv("EDG_WL_RGMA_FILE"); - if (rgma_fname == NULL) { - rgma_fd = -2; - return; - } - } - - rgma_fd = open(rgma_fname, O_WRONLY|O_CREAT|O_APPEND, 0777); - if (rgma_fd == -1) return; - } - - - slen = strlen(line); - if (old_style) { - iov[0].iov_base = &slen; - iov[0].iov_len = sizeof(slen); - iov[1].iov_base = line; - iov[1].iov_len = slen + 1; - } else { - iov[0].iov_base = line; - iov[0].iov_len = slen; - } - - if (old_style) { - - if ((sysret = flock(rgma_fd, LOCK_SH)) != -1) { - sysret = writev(rgma_fd, iov, 2); - flock(rgma_fd, LOCK_UN); - } - if (sysret == -1) return; - } else { - if (!rgma_fd_locked) { - do { - filelock.l_type = F_WRLCK; - filelock.l_whence = SEEK_SET; - filelock.l_start = 0; - filelock.l_len = 0; - } while((filelock_status = fcntl(rgma_fd,F_SETLKW,&filelock))<0 && errno==EINTR); - if (filelock_status<0) goto leave; - } - rgma_fd_locked = 1; - if (fstat(rgma_fd, &stat_fbuf)<0 || stat(rgma_fname, &stat_buf)<0) - goto leave; - if (stat_fbuf.st_dev != stat_buf.st_dev || stat_fbuf.st_ino != stat_buf.st_ino) - goto leave; - if (writev(rgma_fd, iov, 1) < 0) - goto leave; - fsync(rgma_fd); - do { - filelock.l_type = F_UNLCK; - filelock.l_whence = SEEK_SET; - filelock.l_start = 0; - filelock.l_len = 0; - } while((filelock_status = fcntl(rgma_fd,F_SETLKW,&filelock))<0 && errno==EINTR); - if (filelock_status < 0) goto leave; - rgma_fd_locked = 0; - leave: - /* add explicit unlock, incase the later close should fail for some reason */ - if (rgma_fd_locked) { - do { - filelock.l_type = F_UNLCK; - filelock.l_whence = SEEK_SET; - filelock.l_start = 0; - filelock.l_len = 0; - } while((filelock_status = fcntl(rgma_fd,F_SETLKW,&filelock))<0 && errno==EINTR); - if (filelock_status == 0) { - rgma_fd_locked = 0; - } - } - /* close the statefile */ - if (close(rgma_fd)==0) { - rgma_fd = -1; - rgma_fd_locked = 0; - } - - } - - if (rgma_sock < -1) return; - - if (rgma_sock == -1) { - rgma_fname = getenv("EDG_WL_RGMA_SOCK"); - if (rgma_fname == NULL - || (strlen(rgma_fname) + 1) > sizeof(rgma_saddr.sun_path) ) { - rgma_sock = -2; - return; - } - - rgma_sock = socket(PF_UNIX, SOCK_DGRAM,0); - if (rgma_sock == -1) return; - - memset(&rgma_saddr, sizeof(rgma_saddr), 0); - rgma_saddr.sun_family = PF_UNIX; - strcpy(rgma_saddr.sun_path, rgma_fname); - } - - sendto(rgma_sock, &slen, 1, MSG_DONTWAIT, - (struct sockaddr*) &rgma_saddr, SUN_LEN(&rgma_saddr)); - - return; -} - -static char* format_strlist(char **list, char sep) -{ - char *a, *b; - int i; - - if (list && list[0]) { - a = strdup(list[0]); - for (i = 1; list[i]; i++) { - b = NULL; - trio_asprintf(&b,"%s%c%s",a,sep,list[i]); - free(a); - if (!b) { return strdup(""); } - a = b; - } - return a; - } else { - return strdup(""); - } -} - -char* write2rgma_statline(intJobStat *intstat) -{ - edg_wll_JobStat *stat = &intstat->pub; - char *stmt = NULL; - char *string_jobid, *string_stat, *string_server; - char *string_vo = NULL; - char *string_fqans = NULL; - - string_jobid = edg_wlc_JobIdUnparse(stat->jobId); - string_stat = edg_wll_StatToString(stat->state); - string_server = edg_wlc_JobIdGetServer(stat->jobId); - string_fqans = format_strlist(intstat->pub.user_fqans, '|'); - - if (stat->jdl != NULL) { - struct cclassad *ad; - - ad = cclassad_create(stat->jdl); - if (ad) { - if (!cclassad_evaluate_to_string(ad, "VirtualOrganisation", &string_vo)) - string_vo = NULL; - cclassad_delete(ad); - } - } - - trio_asprintf(&stmt, - "JOBID=%|Ss " - "OWNER=%|Ss " - "BKSERVER=%|Ss " - "NETWORKSERVER=%|Ss " - "VO=%|Ss " - "LASTUPDATETIME=%d " - "STATENAME=%s " - "STATEENTERTIME=%d " - "CONDORID=%|Ss " - "DESTINATION=%|Ss " - "EXITCODE=%d " - "DONECODE=%d " - "UIHOST=%s " - "VOMS=%s " - "STATUSREASON=%|Ss" - "\n", - string_jobid, - stat->owner, - string_server, - (stat->network_server) ? (stat->network_server) : "", - (string_vo) ? string_vo : "", - stat->lastUpdateTime.tv_sec, - string_stat, - stat->stateEnterTime.tv_sec, - (stat->condorId) ? (stat->condorId) : "", - (stat->destination) ? (stat->destination) : "", - stat->exit_code, - stat->done_code, - (stat->ui_host) ? (stat->ui_host) : "", - string_fqans ? string_fqans : "", - (stat->reason) ? (stat->reason) : "" - ); - - free(string_vo); - free(string_jobid); - free(string_stat); - free(string_server); - free(string_fqans); - - return stmt; -} - -void write2rgma_status(intJobStat *intstat) -{ - char *line; - int lcgmon = 0; - - if (rgma_fd < -1) return; - - line = write2rgma_statline(intstat); - if (line) { - if (getenv("GLITE_WMS_LCGMON_FILE")) lcgmon = 1; - write2rgma_line(line, !lcgmon); - } - free(line); -} - -/* Export status record only if new status line is different from - previous one. free() prev_statline parameter. */ - -void write2rgma_chgstatus(intJobStat *intstat, char *prev_statline) -{ - char *line; - int lcgmon = 0; - - if (rgma_fd < -1) return; - - line = write2rgma_statline(intstat); - if (line && (!prev_statline || strcmp(line, prev_statline))) { - if (getenv("GLITE_WMS_LCGMON_FILE")) lcgmon = 1; - write2rgma_line(line, !lcgmon); - } - free(line); - free(prev_statline); -} - -#ifdef TEST -int main(int argc, char* argv[]) -{ - setenv("EDG_WL_RGMA_FILE", "/tmp/rgma_statefile", 1); - setenv("EDG_WL_RGMA_SOCK", "/tmp/rgma_statesock", 1); - - write2rgma_line("123---789\n", 0); - return 0; -} -#endif diff --git a/org.glite.lb.server/src/ws_fault.c b/org.glite.lb.server/src/ws_fault.c deleted file mode 100644 index 581c11a..0000000 --- a/org.glite.lb.server/src/ws_fault.c +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include - -#include "glite/lb/context-int.h" -#include "soap_version.h" -#include "glite/security/glite_gscompat.h" - -#include "bk_ws_H.h" -#include "bk_ws_Stub.h" - - -#if GSOAP_VERSION >= 20709 - #define GFNUM SOAP_TYPE_lbt__genericFault -#else - #define GFNUM SOAP_TYPE__genericFault -#endif - - -void edg_wll_ErrToFault(const edg_wll_Context ctx,struct soap *soap) -{ - char *et,*ed; - struct SOAP_ENV__Detail *detail; -#if GSOAP_VERSION >= 20709 - struct lbt__genericFault *f = soap_malloc(soap,sizeof *f); - struct lbt__genericFault *item = f; -#else - struct _genericFault *f = soap_malloc(soap,sizeof *f); - struct lbt__genericFault *item = f->lbe__genericFault = soap_malloc(soap, sizeof *item); -#endif - - memset(item, 0, sizeof(*item)); - - item->code = edg_wll_Error(ctx,&et,&ed); - item->text = soap_malloc(soap,strlen(et)+1); - strcpy(item->text, et); - free(et); - if (ed) { - item->description = soap_malloc(soap,strlen(ed)+1); - strcpy(item->description,ed); - free(ed); - } - - detail = (struct SOAP_ENV__Detail *)soap_faultdetail(soap); - detail->__type = GFNUM; -#if GSOAP_VERSION >= 20700 - detail->fault = f; -#else - detail->value = f; -#endif - detail->__any = NULL; - - soap_receiver_fault(soap,"An error occurred, see detail",NULL); - if (soap->version == 2) soap->fault->SOAP_ENV__Detail = detail; - else soap->fault->detail = detail; -} diff --git a/org.glite.lb.server/src/ws_fault.h b/org.glite.lb.server/src/ws_fault.h deleted file mode 100644 index 35f987e..0000000 --- a/org.glite.lb.server/src/ws_fault.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef GLITE_LB_WS_FAULT_H -#define GLITE_LB_WS_FAULT_H - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include "glite/lb/context.h" - -extern void edg_wll_ErrToFault(const edg_wll_Context, struct soap *); -extern void edg_wll_FaultToErr(const struct soap *, edg_wll_Context); - -#endif /* GLITE_LB_WS_FAULT_H */ diff --git a/org.glite.lb.server/src/ws_lb4agu.c b/org.glite.lb.server/src/ws_lb4agu.c deleted file mode 100644 index 22ac007..0000000 --- a/org.glite.lb.server/src/ws_lb4agu.c +++ /dev/null @@ -1,443 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include - -#include "soap_version.h" -#include "glite/security/glite_gsplugin.h" -#include "glite/security/glite_gscompat.h" - -#include "glite/lbu/log.h" -#include "glite/lb/context-int.h" -#include "glite/lb/xml_conversions.h" - -#include "bk_ws_Stub.h" -#include "bk_ws_H.h" -#include "ws_fault.h" -#include "ws_typeref.h" -#include "jobstat.h" - -extern int debug; - -#define LB_GLUE_STATE_PREFIX "urn:org.glite.lb" - -/** - * __lb4agu__GetActivityStatus - return states of given jobs (list of jobIds) - * \param[in,out] soap soap to work with - * \param[in] in list of jobIds - * \param[out] out list of job states for each jobId - * \returns SOAP_OK or SOAP_FAULT - * TODO: distinguish also faults - * UNKNOWNACTIVITYID - * UNABLETORETRIEVESTATUS - */ -SOAP_FMAC5 int SOAP_FMAC6 __lb4agu__GetActivityStatus( - struct soap* soap, - struct _lb4ague__GetActivityStatusRequest *in, - struct _lb4ague__GetActivityStatusResponse *out) -{ - edg_wll_Context ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap); - edg_wlc_JobId j; - edg_wll_JobStat s; - int i,flags; - - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_DEBUG, - "[%d] WS call %s", getpid(), __FUNCTION__); - - if (!in) return SOAP_FAULT; - if (!in->id) return SOAP_FAULT; - - out->status = soap_malloc(soap, in->__sizeid * (sizeof(char *))); - - /* process each request individually: */ - for (i=0; i__sizeid && in->id[i]; i++) { - char buf[1000],*stat = NULL; - - /* first parse jobId */ - if ( edg_wlc_JobIdParse(in->id[i], &j) ) { - edg_wll_SetError(ctx, EINVAL, in->id[i]); - edg_wll_ErrToFault(ctx, soap); - return SOAP_FAULT; - } - - flags = 0; - if (debug) { - char *cjobid = NULL, *cflags = NULL; - - cjobid = edg_wlc_JobIdUnparse(j); - cflags = edg_wll_stat_flags_to_string(flags); - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, - LOG_PRIORITY_DEBUG, - "[%d] \n\t%s\n\t%s\n", - getpid(), cflags, cjobid); - free(cjobid); - free(cflags); - } - - /* get job status */ - if ( edg_wll_JobStatusServer(ctx, j, flags, &s) ) { - edg_wll_ErrToFault(ctx, soap); - return SOAP_FAULT; - } - - /* fill in the response fields */ - snprintf(buf,sizeof buf,LB_GLUE_STATE_PREFIX ":%s",stat = edg_wll_StatToString(s.state)); - buf[sizeof(buf) - 1] = 0; - out->status[i] = soap_strdup(soap,buf); - free(stat); - } - out->__sizestatus = in->__sizeid; - - return SOAP_OK; -} - -/** - * edg_wll_JobStatusToGlueComputingActivity - edg_wll_JobStat to glue__ComputingActivity_USCOREt - * \param[in,out] soap soap to work with - * \param[in] src job status in the LB native (edg_wll_JobStat) structure - * \param[out] js job status in the Glue2 soap (glue__ComputingActivity_USCOREt) structure - * \returns SOAP_OK or SOAP_FAULT - */ -static int edg_wll_JobStatusToGlueComputingActivity( - struct soap *soap, - edg_wll_JobStat *src, - struct glue__ComputingActivity_USCOREt *js) -{ - int i; - char buf[1000],*s = NULL,*aux,*aux2; - - memset(js, 0, sizeof(*js)); - - // ID (required, glue:ID_t) = jobId - s = edg_wlc_JobIdUnparse(src->jobId); - js->ID = soap_strdup(soap,s); - free(s); s=NULL; - - // BaseType (required, xsd:string) = "Activity"? - GLITE_SECURITY_GSOAP_SET_FIXED(soap,js->BaseType,"Activity"); - - // CreationTime (optional, xsd:dateTime) = submission time? - js->CreationTime = soap_malloc(soap,sizeof *js->CreationTime); - *js->CreationTime = src->stateEnterTimes[1+EDG_WLL_JOB_SUBMITTED]; - - // Validity (optional, xsd:unsignedLong) = N/A - js->Validity = 0; - - // Name (optional, xsd:string) = N/A - js->Name = NULL; - - // Type (optional, glue:ComputingActivityType_t) = jobtype? - // see glue__ComputingActivityType_USCOREt - js->Type = soap_malloc(soap,sizeof *js->Type); - switch (src->jobtype) { - case EDG_WLL_STAT_SIMPLE: - *js->Type = src->parent_job ? - glue__ComputingActivityType_USCOREt__collectionelement : - glue__ComputingActivityType_USCOREt__single; - break; - case EDG_WLL_STAT_DAG: - case EDG_WLL_STAT_COLLECTION: - case EDG_WLL_STAT_FILE_TRANSFER_COLLECTION: - *js->Type = glue__ComputingActivityType_USCOREt__single; /* XXX: no equivalent in glue */ - break; - case EDG_WLL_STAT_PBS: - case EDG_WLL_STAT_CONDOR: - case EDG_WLL_STAT_CREAM: - case EDG_WLL_STAT_FILE_TRANSFER: - *js->Type = glue__ComputingActivityType_USCOREt__single; - break; - default: - *js->Type = glue__ComputingActivityType_USCOREt__single; - break; - } - - // IDFromEndpoint (required, xsd:anyURI) = globusId? - // TODO: put CREAM id here once it's available - js->IDFromEndpoint = soap_strdup(soap,src->globusId); - - // LocalIDFromManager (optional, xsd:string) = localId - js->LocalIDFromManager = soap_strdup(soap,src->localId); - - // JobDescription (required, glue:JobDescription_t) = matched_jdl - js->JobDescription = soap_strdup(soap,src->matched_jdl); - - // State (required, glue:ComputingActivityState_t) = state - // i.e. job status with buf,LB_GLUE_STATE_PREFIX? - s = edg_wll_StatToString(src->state); - snprintf(buf,sizeof buf,LB_GLUE_STATE_PREFIX ":%s",s); - buf[sizeof(buf) - 1] = 0; - js->State = soap_strdup(soap,buf); - free(s); s = NULL; - - // RestartState (optional, glue:ComputingActivityState_t) = N/A - js->RestartState = NULL; - - // ExitCode (optional, xsd:int) - js->ExitCode = soap_malloc(soap,sizeof *js->ExitCode); - *js->ExitCode = src->exit_code; - - // ComputingManagerExitCode (optional, xsd:string) = done_code - s=edg_wll_DoneStatus_codeToString(src->done_code); - js->ComputingManagerExitCode = soap_strdup(soap,s); - free(s); s=NULL; - - // Error (optional, xsd:string) = failure_reasons - if (src->failure_reasons) { - js->__sizeError = 1; - js->Error = soap_malloc(soap,sizeof js->Error[0]); - js->Error[0] = soap_strdup(soap,src->failure_reasons); - } else { - js->__sizeError = 0; - js->Error = NULL; - } - - // WaitingPosition (optional, xsd:unsignedInt) = N/A - js->WaitingPosition = 0; - - // UserDomain (optional, xsd:string) = user_fqans? - if (src->user_fqans) { - aux2 = strdup(""); - for (i=0; src->user_fqans && src->user_fqans[i]; i++) { - asprintf(&aux,"%s\n%s",aux2,src->user_fqans[i]); - free(aux2); aux2 = aux; aux = NULL; - } - js->UserDomain = soap_strdup(soap,aux2); - free(aux2); aux2 = NULL; - } else js->UserDomain = NULL; - - // Owner (required, xsd:string) = owner - js->Owner = soap_strdup(soap,src->owner); - - // LocalOwner (optional, xsd:string) = N/A - js->LocalOwner = NULL; - - // RequestedTotalWallTime (optional, xsd:unsignedLong) = N/A - js->RequestedTotalWallTime = NULL; - - // RequestedTotalCPUTime (optional, xsd:unsignedLong) = N/A - js->RequestedTotalCPUTime = 0; - - // RequestedSlots (optional, xsd:unsignedInt) = NodeNumber from JDL - s = edg_wll_JDLField(src,"NodeNumber"); - js->RequestedSlots = soap_malloc(soap,sizeof *js->RequestedSlots); - *js->RequestedSlots = s ? atoi(s) : 1; - free(s); s = NULL; - - // RequestedApplicationEnvironment = N/A - js->__sizeRequestedApplicationEnvironment = 0; - js->RequestedApplicationEnvironment = NULL; - - // StdIn (optional, xsd:string) = StdInput from JDL - if ((s = edg_wll_JDLField(src,"StdInput"))) js->StdIn = soap_strdup(soap,s); - free(s); s = NULL; - - // StdOut (optional, xsd:string) = StdOutput from JDL - if ((s = edg_wll_JDLField(src,"StdOutput"))) js->StdOut = soap_strdup(soap,s); - free(s); s = NULL; - - // StdErr (optional, xsd:string) = StdError from JDL - if ((s = edg_wll_JDLField(src,"StdError"))) js->StdErr = soap_strdup(soap,s); - free(s); s = NULL; - - // LogDir (optional, xsd:string) = N/A - js->LogDir = NULL; - - // ExecutionNode (optional, xsd:string) = ce_node? - if (src->ce_node) { - js->__sizeExecutionNode = 1; - js->ExecutionNode = soap_malloc(soap,sizeof js->ExecutionNode[0]); - js->ExecutionNode[0] = soap_strdup(soap,src->ce_node); - } else { - js->__sizeExecutionNode = 0; - js->ExecutionNode = NULL; - } - - // Queue (optional, xsd:string) = destination (ID of CE where the job is being sent)? - js->Queue = soap_strdup(soap,src->destination); - - // UsedTotalWallTime (optional, xsd:unsignedLong) = N/A - // TODO: put resource usage once available - js->UsedTotalWallTime = 0; - - // UsedTotalCPUTime (optional, xsd:unsignedLong) = cpuTime? - // TODO: put resource usage once available - if (src->cpuTime != -1) { - js->UsedTotalCPUTime = soap_malloc(soap,sizeof *js->UsedTotalCPUTime); - *js->UsedTotalCPUTime = src->cpuTime; - } - - // UsedMainMemory (optional, xsd:unsignedLong) = N/A - // TODO: put resource usage once available - js->UsedMainMemory = 0; - - // SubmissionTime (optional, xsd:dateTime) = time of JOB_WAITING - if (src->stateEnterTimes[1+EDG_WLL_JOB_WAITING]) { - js->SubmissionTime = soap_malloc(soap,sizeof *js->SubmissionTime); - *js->SubmissionTime = src->stateEnterTimes[1+EDG_WLL_JOB_WAITING]; - } else js->SubmissionTime = NULL; - - // ComputingManagerSubmissionTime (optional, xsd:dateTime) = time of JOB_SCHEDULED - if (src->stateEnterTimes[1+EDG_WLL_JOB_SCHEDULED]) { - js->ComputingManagerSubmissionTime = soap_malloc(soap,sizeof *js->ComputingManagerSubmissionTime); - *js->ComputingManagerSubmissionTime = src->stateEnterTimes[1+EDG_WLL_JOB_SCHEDULED]; - } else js->ComputingManagerSubmissionTime = NULL; - - // StartTime (optional, xsd:dateTime) = time of JOB_RUNNING - if (src->stateEnterTimes[1+EDG_WLL_JOB_RUNNING]) { - js->StartTime = soap_malloc(soap,sizeof *js->StartTime); - *js->StartTime = src->stateEnterTimes[1+EDG_WLL_JOB_RUNNING]; - } else js->StartTime = NULL; - - // ComputingManagerEndTime (optional, xsd:dateTime) = time of JOB_DONE? - if (src->stateEnterTimes[1+EDG_WLL_JOB_DONE]) { - js->ComputingManagerEndTime = soap_malloc(soap,sizeof *js->ComputingManagerEndTime); - *js->ComputingManagerEndTime = src->stateEnterTimes[1+EDG_WLL_JOB_DONE]; - } else js->ComputingManagerEndTime = NULL; - - // EndTime (optional, xsd:dateTime) = time of JOB_DONE - if (src->stateEnterTimes[1+EDG_WLL_JOB_DONE]) { - js->EndTime = soap_malloc(soap,sizeof *js->EndTime); - *js->EndTime = src->stateEnterTimes[1+EDG_WLL_JOB_DONE]; - } else js->EndTime = NULL; - - // WorkingAreaEraseTime (optional, xsd:dateTime) = time of JOB_CLEARED - if (src->stateEnterTimes[1+EDG_WLL_JOB_CLEARED]) { - js->WorkingAreaEraseTime = soap_malloc(soap,sizeof *js->WorkingAreaEraseTime); - *js->WorkingAreaEraseTime = src->stateEnterTimes[1+EDG_WLL_JOB_CLEARED]; - } else js->WorkingAreaEraseTime = NULL; - - // ProxyExpirationTime (optional, xsd:dateTime) = N/A - js->ProxyExpirationTime = 0; - - // SubmissionHost (optional, xsd:string) = ui_host - js->SubmissionHost = soap_strdup(soap,src->ui_host); - - // SubmissionClientName (optional, xsd:string) = N/A - js->SubmissionClientName = NULL; - - // OtherMessages (optional, xsd:string) = reason? - if (src->reason) { - js->__sizeOtherMessages = 1; - js->OtherMessages = soap_malloc(soap,sizeof js->OtherMessages[0]); - js->OtherMessages[0] = soap_strdup(soap,src->reason); - } else { - js->__sizeOtherMessages = 0; - js->OtherMessages = NULL; - } - - // Extensions (optional, glue:Extensions_t) = user tags? - // see glue__Extensions_USCOREt structure - if (src->user_tags) { - js->Extensions = soap_malloc(soap,sizeof *js->Extensions); - for (i=0; src->user_tags[i].tag; i++); - js->Extensions->__sizeExtension = i; - js->Extensions->Extension = soap_malloc(soap,i*sizeof js->Extensions->Extension[0]); - - for (i=0; src->user_tags[i].tag; i++) { - GLITE_SECURITY_GSOAP_LIST_TYPE(glue,Extension_USCOREt) - e = js->Extensions->Extension; - - GLITE_SECURITY_GSOAP_LIST_GET(e,i)->Key = soap_strdup(soap,src->user_tags[i].tag); - GLITE_SECURITY_GSOAP_LIST_GET(e,i)->__item = soap_strdup(soap,src->user_tags[i].value); - } - } - else js->Extensions = NULL; - - // Associations (optional, glue:ComputingActivity_t-Associations) = subjobs? - // see _glue__ComputingActivity_USCOREt_Associations structure - if (src->children_num) { - js->Associations = soap_malloc(soap,sizeof *js->Associations); - memset(js->Associations,0,sizeof *js->Associations); - js->Associations->__sizeActivityID = src->children_num; - js->Associations->ActivityID = soap_malloc(soap,src->children_num * sizeof js->Associations->ActivityID[0]); - for (i=0; src->children[i]; i++) js->Associations->ActivityID[i] = soap_strdup(soap,src->children[i]); - } - else js->Associations = NULL; - - - return SOAP_OK; -} - -/** - * __lb4agu__GetActivityInfo - return complete state information (history?) of given jobs (list of jobIds) - * \param[in,out] soap soap to work with - * \param[in] in list of jobIds - * \param[out] out list of complete job state information for each jobId - * \returns SOAP_OK or SOAP_FAULT - * TODO: distinguish also faults - * UNKNOWNACTIVITYID - * UNKNOWNGLUE2ACTIVITYATTRIBUTE - */ -SOAP_FMAC5 int SOAP_FMAC6 __lb4agu__GetActivityInfo( - struct soap* soap, - struct _lb4ague__GetActivityInfoRequest *in, - struct _lb4ague__GetActivityInfoResponse *out) -{ - edg_wll_Context ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap); - edg_wlc_JobId j; - edg_wll_JobStat s; - int i,flags; - - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_DEBUG, - "[%d] WS call %s", getpid(), __FUNCTION__); - - if (!in) return SOAP_FAULT; - if (!in->id) return SOAP_FAULT; - - GLITE_SECURITY_GSOAP_LIST_CREATE(soap, out, status, struct glue__ComputingActivity_USCOREt, in->__sizeid); - - /* process each request individually: */ - for (i=0; i__sizeid && in->id[i]; i++) { - - /* first parse jobId */ - if ( edg_wlc_JobIdParse(in->id[i], &j) ) { - edg_wll_SetError(ctx, EINVAL, in->id[i]); - edg_wll_ErrToFault(ctx, soap); - return SOAP_FAULT; - } - - flags = EDG_WLL_STAT_CLASSADS | EDG_WLL_STAT_CHILDREN; - if (debug) { - char *cjobid = NULL, *cflags = NULL; - - cjobid = edg_wlc_JobIdUnparse(j); - cflags = edg_wll_stat_flags_to_string(flags); - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, - LOG_PRIORITY_DEBUG, - "[%d] \t%s\n\t%s", - getpid(), cflags, cjobid); - free(cjobid); - free(cflags); - } - - /* get job status */ - if ( edg_wll_JobStatusServer(ctx, j, flags, &s) ) { - edg_wll_ErrToFault(ctx, soap); - return SOAP_FAULT; - } - - /* fill in the glue__ComputingActivity_USCOREt structure */ - if (edg_wll_JobStatusToGlueComputingActivity(soap, &s, - GLITE_SECURITY_GSOAP_LIST_GET(out->status, i))) { - return SOAP_FAULT; - } - } - out->__sizestatus = in->__sizeid; - - return SOAP_OK; -} - diff --git a/org.glite.lb.server/src/ws_query.c b/org.glite.lb.server/src/ws_query.c deleted file mode 100644 index 8c6a7e4..0000000 --- a/org.glite.lb.server/src/ws_query.c +++ /dev/null @@ -1,479 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include - -#include "glite/lb/context-int.h" -#include "glite/lb/xml_parse.h" -#include "glite/lb/xml_conversions.h" - -#include "glite/lbu/log.h" - -#include "soap_version.h" -#include "glite/security/glite_gsplugin.h" -#include "glite/security/glite_gscompat.h" - -#include "jobstat.h" -#include "query.h" -#include "bk_ws_H.h" -#include "get_events.h" -#include "ws_fault.h" -#include "ws_typeref.h" -#include "lb_proto.h" -#include "server_notification.h" - -#if GSOAP_VERSION <= 20602 -#define __lb__GetVersion __ns1__GetVersion -#define __lb__JobStatus __ns1__JobStatus -#define __lb__UserJobs __ns1__UserJobs -#define __lb__QueryJobs __ns1__QueryJobs -#define __lb__QueryEvents __ns1__QueryEvents -#endif - -extern int debug; -#define dprintf(x) if (debug) printf x - -static void freeQueryRecsExt(edg_wll_QueryRec **qr); -static void freeJobIds(edg_wlc_JobId *jobs); -static void freeJobStats(edg_wll_JobStat *stats); -static void freeEvents(edg_wll_Event *events); - - -SOAP_FMAC5 int SOAP_FMAC6 __lb__GetVersion( - struct soap* soap, - struct _lbe__GetVersion *in, - struct _lbe__GetVersionResponse *out) -{ - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_DEBUG, - "[%d] WS call %s", getpid(), __FUNCTION__); - - out->version = soap_strdup(soap, VERSION); - - return out->version ? SOAP_OK : SOAP_FAULT; -} - - -SOAP_FMAC5 int SOAP_FMAC6 __lb__JobStatus( - struct soap *soap, - struct _lbe__JobStatus *in, - struct _lbe__JobStatusResponse *out) -{ - edg_wll_Context ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap); - edg_wlc_JobId j; - edg_wll_JobStat s; - int flags; - - - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_DEBUG, - "[%d] WS call %s", getpid(), __FUNCTION__); - - if ( edg_wlc_JobIdParse(in->jobid, &j) ) - { - edg_wll_SetError(ctx, EINVAL, in->jobid); - edg_wll_ErrToFault(ctx, soap); - return SOAP_FAULT; - } - - edg_wll_SoapToJobStatFlags(in->flags, &flags); - - if (debug) { - char *cjobid = NULL, *cflags = NULL; - - cjobid = edg_wlc_JobIdUnparse(j); - cflags = edg_wll_stat_flags_to_string(flags); - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, - LOG_PRIORITY_DEBUG, - "[%d] \t%s\n\t%s", - getpid(), cflags, cjobid); - free(cjobid); - free(cflags); - } - - if ( edg_wll_JobStatusServer(ctx, j, flags, &s) ) - { - edg_wll_ErrToFault(ctx, soap); - return SOAP_FAULT; - } - - out->stat = soap_malloc(soap, sizeof(*out->stat)); - edg_wll_StatusToSoap(soap, &s, out->stat); - - return SOAP_OK; -} - - -SOAP_FMAC5 int SOAP_FMAC6 __lb__QueryJobs( - struct soap *soap, - struct _lbe__QueryJobs *in, - struct _lbe__QueryJobsResponse *out) -{ - edg_wll_Context ctx; - edg_wll_QueryRec **conditions; - int flags; - edg_wlc_JobId *jobs; - edg_wll_JobStat *states; - int ret = SOAP_FAULT; - - - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_DEBUG, - "[%d] WS call %s", getpid(), __FUNCTION__); - - out->states = soap_malloc(soap, sizeof(*out->states)); - out->jobs = soap_malloc(soap, sizeof(*out->jobs)); - if ( !out->states || !out->jobs ) goto cleanup; - - ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap); - jobs = NULL; - states = NULL; - - edg_wll_ResetError(ctx); - if ( edg_wll_SoapToQueryCondsExt(in->conditions, in->__sizeconditions, &conditions) ) { - edg_wll_SetError(ctx, ENOMEM, "Couldn't create internal structures"); - goto err; - } - edg_wll_SoapToJobStatFlags(in->flags, &flags); - - if (debug) { - char *message = NULL; - - if (edg_wll_QueryJobsRequestToXML(ctx, - (const edg_wll_QueryRec **) conditions, - flags, &message)) { - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_DEBUG, "[%d] %s", getpid(), "edg_wll_QueryJobsRequestToXML() returned error"); - } - else { - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_DEBUG, "[%d] %s", getpid(), message); - } - free(message); - } - - if (edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, &jobs, &states) != 0) goto err; - - if (edg_wll_JobsQueryResToSoap(soap, jobs, states, out) != SOAP_OK) goto err; - ret = SOAP_OK; - -err: - if ( ret == SOAP_FAULT ) edg_wll_ErrToFault(ctx, soap); -cleanup: - freeQueryRecsExt(conditions); - freeJobIds(jobs); - freeJobStats(states); - - return ret; -} - - -SOAP_FMAC5 int SOAP_FMAC6 __lb__UserJobs( - struct soap *soap, - struct _lbe__UserJobs *in, - struct _lbe__UserJobsResponse *out) -{ - edg_wll_Context ctx; - edg_wlc_JobId *jobs; - edg_wll_JobStat *states; - - - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_DEBUG, - "[%d] WS call %s", getpid(), __FUNCTION__); - - ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap); - memset(out, 0, sizeof *out); - if (edg_wll_UserJobsServer(ctx, &jobs, &states) != 0) goto fault; - if (edg_wll_UserJobsResToSoap(soap, (glite_jobid_const_t *)jobs, (const edg_wll_JobStat *)states, out) != SOAP_OK) { - edg_wll_SetError(ctx, ENOMEM, "Couldn't create internal structures"); - goto freefault; - } - freeJobIds(jobs); - freeJobStats(states); - return SOAP_OK; -freefault: - freeJobIds(jobs); - freeJobStats(states); -fault: - edg_wll_ErrToFault(ctx, soap); - return SOAP_FAULT; -} - - -SOAP_FMAC5 int SOAP_FMAC6 __lb__QueryEvents( - struct soap *soap, - struct _lbe__QueryEvents *in, - struct _lbe__QueryEventsResponse *out) -{ - edg_wll_Context ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap); - edg_wll_QueryRec **job_conditions; - edg_wll_QueryRec **event_conditions; - edg_wll_Event *events = NULL; - int ret = SOAP_OK; - - - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_DEBUG, - "[%d] WS call %s", getpid(), __FUNCTION__); - - edg_wll_ResetError(ctx); - if ( edg_wll_SoapToQueryCondsExt(in->jobConditions, in->__sizejobConditions, - &job_conditions) ) - { - edg_wll_SetError(ctx, ENOMEM, "Couldn't create internal structures"); - edg_wll_ErrToFault(ctx, soap); - ret = SOAP_FAULT; - goto cleanup; - } - - if ( edg_wll_SoapToQueryCondsExt(in->eventConditions, in->__sizeeventConditions, - &event_conditions) ) - { - edg_wll_SetError(ctx, ENOMEM, "Couldn't create internal structures"); - edg_wll_ErrToFault(ctx, soap); - ret = SOAP_FAULT; - goto cleanup; - } - - if (debug) { - char *message = NULL; - - if (edg_wll_QueryEventsRequestToXML(ctx, - (const edg_wll_QueryRec **) job_conditions, - (const edg_wll_QueryRec **) event_conditions, - &message)) { - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_DEBUG, "[%d] %s", getpid(), "edg_wll_QueryEventsRequestToXML() returned error"); - } - else { - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_DEBUG, "[%d] %s", getpid(), message); - } - free(message); - } - - if (edg_wll_QueryEventsServer(ctx, ctx->noAuth, - (const edg_wll_QueryRec **)job_conditions, - (const edg_wll_QueryRec **)event_conditions, - &events)) - { - edg_wll_ErrToFault(ctx, soap); - ret = SOAP_FAULT; - goto cleanup; - } - - if (edg_wll_EventsQueryResToSoap(soap, events, out) != SOAP_OK) - { - ret = SOAP_FAULT; - goto cleanup; - } - -cleanup: - freeQueryRecsExt(job_conditions); - freeQueryRecsExt(event_conditions); - freeEvents(events); - - return ret; -} - -SOAP_FMAC5 int SOAP_FMAC6 __lb__GetServerLimit( - struct soap *soap, - struct _lbe__GetServerLimit *in, - struct _lbe__GetServerLimitResponse *out -) -{ - edg_wll_Context ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap); - - out->limit = ctx->hardJobsLimit; - return SOAP_OK; -} - -SOAP_FMAC5 int SOAP_FMAC6 __lb__GetIndexedAttrs( - struct soap *soap, - struct _lbe__GetIndexedAttrs *in, - struct _lbe__GetIndexedAttrsResponse *out -) -{ - edg_wll_Context ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap); - - if (ctx->job_index) - return edg_wll_QueryCondsExtToSoap(soap, - (const edg_wll_QueryRec **) ctx->job_index, - &out->__sizeattrs,&out->attrs); - else { - edg_wll_SetError(ctx,ENOENT,"no indexed attributes"); - edg_wll_ErrToFault(ctx, soap); - return SOAP_FAULT; - } -} - -SOAP_FMAC5 int SOAP_FMAC6 __lb__NotifNew( - struct soap *soap, - struct _lbe__NotifNew *in, - struct _lbe__NotifNewResponse *out -) { - edg_wll_Context ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap); - edg_wll_QueryRec **conditions = NULL; - int flags; - edg_wll_NotifId nid = NULL; - int ret = SOAP_OK; - - glite_common_log(LOG_CATEGORY_LB_SERVER_REQUEST, LOG_PRIORITY_DEBUG, - "[%d] WS call %s", getpid(), __FUNCTION__); - - edg_wll_ResetError(ctx); - if ( edg_wll_SoapToQueryCondsExt(in->conditions, in->__sizeconditions, &conditions) ) - { - edg_wll_SetError(ctx, ENOMEM, "Couldn't create internal structures"); - edg_wll_ErrToFault(ctx, soap); - ret = SOAP_FAULT; - goto cleanup; - } - edg_wll_SoapToJobStatFlags(in->flags, &flags); - - if (edg_wll_NotifIdParse(in->notifId,&nid)) { - edg_wll_SetError(ctx,EINVAL,"Parse notifid"); - edg_wll_ErrToFault(ctx, soap); - ret = SOAP_FAULT; - goto cleanup; - } - - out->valid = in->valid ? *in->valid : 0; - if (edg_wll_NotifNewServer(ctx,(const edg_wll_QueryRec **)conditions,flags,in->destination,nid,&out->valid)) { - edg_wll_ErrToFault(ctx, soap); - ret = SOAP_FAULT; - goto cleanup; - } - - -cleanup: - edg_wll_NotifIdFree(nid); - freeQueryRecsExt(conditions); - return ret; -} - -SOAP_FMAC5 int SOAP_FMAC6 __lb__NotifBind( - struct soap *soap, - struct _lbe__NotifBind *in, - struct _lbe__NotifBindResponse *out -) { - edg_wll_Context ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap); - edg_wll_NotifId nid = NULL; - - if (edg_wll_NotifIdParse(in->notifId,&nid)) { - edg_wll_SetError(ctx,EINVAL,"Parse notifid"); - edg_wll_ErrToFault(ctx, soap); - return SOAP_FAULT; - } - out->valid = in->valid ? *in->valid : 0; - - if (edg_wll_NotifBindServer(ctx,nid,in->destination,&out->valid)) { - edg_wll_ErrToFault(ctx, soap); - edg_wll_NotifIdFree(nid); - return SOAP_FAULT; - } - return SOAP_OK; -} - -SOAP_FMAC5 int SOAP_FMAC6 __lb__NotifRefresh( - struct soap *soap, - struct _lbe__NotifRefresh *in, - struct _lbe__NotifRefreshResponse *out -) { - edg_wll_Context ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap); - edg_wll_NotifId nid = NULL; - - if (edg_wll_NotifIdParse(in->notifId,&nid)) { - edg_wll_SetError(ctx,EINVAL,"Parse notifid"); - edg_wll_ErrToFault(ctx, soap); - return SOAP_FAULT; - } - out->valid = in->valid ? *in->valid : 0; - - if (edg_wll_NotifRefreshServer(ctx,nid,&out->valid)) { - edg_wll_ErrToFault(ctx, soap); - edg_wll_NotifIdFree(nid); - return SOAP_FAULT; - } - return SOAP_OK; -} - -SOAP_FMAC5 int SOAP_FMAC6 __lb__NotifDrop( - struct soap *soap, - struct _lbe__NotifDrop *in, - struct _lbe__NotifDropResponse *out -) { - edg_wll_Context ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap); - edg_wll_NotifId nid = NULL; - - if (edg_wll_NotifIdParse(in->notifId,&nid)) { - edg_wll_SetError(ctx,EINVAL,"Parse notifid"); - edg_wll_ErrToFault(ctx, soap); - return SOAP_FAULT; - } - - if (edg_wll_NotifDropServer(ctx,nid)) { - edg_wll_ErrToFault(ctx, soap); - edg_wll_NotifIdFree(nid); - return SOAP_FAULT; - } - return SOAP_OK; -} - - -static void freeQueryRecsExt(edg_wll_QueryRec **qr) { - int i, j; - - if ( qr ) { - for ( i = 0; qr[i]; i++ ) { - if (qr[i]) { - for ( j = 0; qr[i][j].attr; j++ ) edg_wll_QueryRecFree(&qr[i][j]); - free(qr[i]); - } - } - free(qr); - } -} - - -static void freeJobIds(edg_wlc_JobId *jobs) { - int i; - - if ( jobs ) { - for ( i = 0; jobs[i]; i++ ) - edg_wlc_JobIdFree(jobs[i]); - free(jobs); - } -} - - -static void freeJobStats(edg_wll_JobStat *stats) { - int i; - - if ( stats ) { - for ( i = 0; stats[i].state; i++ ) - edg_wll_FreeStatus(&stats[i]); - free(stats); - } -} - - -static void freeEvents(edg_wll_Event *events) -{ - int i; - - if (events != NULL) { - 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); - } -} - diff --git a/org.glite.lb.server/src/ws_typemap.dat b/org.glite.lb.server/src/ws_typemap.dat deleted file mode 100644 index c0ce9338..0000000 --- a/org.glite.lb.server/src/ws_typemap.dat +++ /dev/null @@ -1,7 +0,0 @@ -lb = http://glite.org/wsdl/services/lb -lbt = http://glite.org/wsdl/types/lb -lbe = http://glite.org/wsdl/elements/lb -lb4ague = http://glite.org/wsdl/elements/lb4agu -lb4agu = http://glite.org/wsdl/services/lb4agu -glue = http://schemas.ogf.org/glue/2008/05/spec_2.0_d42_r01 - diff --git a/org.glite.lb.server/src/ws_typemap.h b/org.glite.lb.server/src/ws_typemap.h deleted file mode 100644 index 425ce65..0000000 --- a/org.glite.lb.server/src/ws_typemap.h +++ /dev/null @@ -1,93 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#ifndef GLITE_LB_WS_TYPEMAP_H -#define GLITE_LB_WS_TYPEMAP_H - -#ident "$Header" - -#if GSOAP_VERSION >= 20700 - -#define JOBID lbt__queryAttr__JOBID -#define OWNER lbt__queryAttr__OWNER -#define STATUS lbt__queryAttr__STATUS -#define LOCATION lbt__queryAttr__LOCATION -#define DESTINATION lbt__queryAttr__DESTINATION -#define DONECODE lbt__queryAttr__DONECODE -#define USERTAG lbt__queryAttr__USERTAG -#define TIME lbt__queryAttr__TIME -#define LEVEL lbt__queryAttr__LEVEL -#define HOST lbt__queryAttr__HOST -#define SOURCE lbt__queryAttr__SOURCE -#define INSTANCE lbt__queryAttr__INSTANCE -#define EVENTTYPE lbt__queryAttr__EVENTTYPE -#define CHKPTTAG lbt__queryAttr__CHKPTTAG -#define RESUBMITTED lbt__queryAttr__RESUBMITTED -#define PARENT lbt__queryAttr__PARENT -#define EXITCODE lbt__queryAttr__EXITCODE -#define JDLATTR lbt__queryAttr__JDLATTR -#define STATEENTERTIME lbt__queryAttr__STATEENTERTIME -#define LASTUPDATETIME lbt__queryAttr__LASTUPDATETIME -#define NETWORKSERVER lbt__queryAttr__NETWORKSERVER - -#define EQUAL lbt__queryOp__EQUAL -#define UNEQUAL lbt__queryOp__UNEQUAL -#define LESS lbt__queryOp__LESS -#define GREATER lbt__queryOp__GREATER -#define WITHIN lbt__queryOp__WITHIN -#define CHANGED lbt__queryOp__CHANGED - -#define SUBMITTED lbt__statName__SUBMITTED -#define WAITING lbt__statName__WAITING -#define READY lbt__statName__READY -#define SCHEDULED lbt__statName__SCHEDULED -#define RUNNING lbt__statName__RUNNING -#define DONE lbt__statName__DONE -#define CLEARED lbt__statName__CLEARED -#define ABORTED lbt__statName__ABORTED -#define CANCELLED lbt__statName__CANCELLED -#define UNKNOWN lbt__statName__UNKNOWN -#define PURGED lbt__statName__PURGED - -#define SIMPLE lbt__jobtype__SIMPLE -#define DAG lbt__jobtype__DAG - -#define OK lbt__doneCode__OK -#define FAILED lbt__doneCode__FAILED -#define CANCELLED_ lbt__doneCode__CANCELLED - -#define CLASSADS lbt__jobFlagsValue__CLASSADS -#define CHILDREN lbt__jobFlagsValue__CHILDREN -#define CHILDSTAT lbt__jobFlagsValue__CHILDSTAT -#define CHILDHIST_FAST lbt__jobFlagsValue__CHILDHIST_USCOREFAST -#define CHILDHIST_THOROUGH lbt__jobFlagsValue__CHILDHIST_USCORETHOROUGH - -#define UserInterface lbt__eventSource__UserInterface -#define NetworkServer lbt__eventSource__NetworkServer -#define WorkloadManager lbt__eventSource__WorkloadManager -#define BigHelper lbt__eventSource__BigHelper -#define JobSubmission lbt__eventSource__JobSubmission -#define LogMonitor lbt__eventSource__LogMonitor -#define LRMS lbt__eventSource__LRMS -#define Application lbt__eventSource__Application -#define LBServer lbt__eventSource__LBServer -#define CREAMInterface lbt__eventSource__CREAMInterface -#define CREAMExecutor lbt__eventSource__CREAMExecutor - -#endif - -#endif /* GLITE_LB_WS_TYPEMAP_H */ diff --git a/org.glite.lb.server/src/ws_typeref.c.T b/org.glite.lb.server/src/ws_typeref.c.T deleted file mode 100644 index 71d62c4..0000000 --- a/org.glite.lb.server/src/ws_typeref.c.T +++ /dev/null @@ -1,1224 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include - -#include "soap_version.h" -#include "bk_ws_H.h" -#include "ws_typemap.h" - -#include "glite/lb/events.h" -#include "glite/lb/query_rec.h" -/* XXX: references only, src and dest share pointers */ - -#include "glite/security/glite_gscompat.h" - -#define VALUEEV_GET(X, V) GLITE_SECURITY_GSOAP_CHOICE_GET((X), V, event, 1) -#define VALUEEV_SET(X, V, VALUE) GLITE_SECURITY_GSOAP_CHOICE_SET((X), V, lbt, event, 1, VALUE) -#define VALUEEV_ISTYPE(X, V) GLITE_SECURITY_GSOAP_CHOICE_ISTYPE((X), V, lbt, event, 1) -#define VALUEQR_GET(X, V) GLITE_SECURITY_GSOAP_CHOICE_GET((X), V, queryRecValue, 2) -#define VALUEQR_SETTYPE(X, V) GLITE_SECURITY_GSOAP_CHOICE_SETTYPE((X), V, lbt, queryRecValue, 2) -#define VALUEQR_SET(X, V, VALUE) GLITE_SECURITY_GSOAP_CHOICE_SET((X), V, lbt, queryRecValue, 2, VALUE) -#define VALUEQR_ISTYPE(X, V) GLITE_SECURITY_GSOAP_CHOICE_ISTYPE((X), V, lbt, queryRecValue, 2) - -@@@{ -# -# generate the command for move native data to soap web services structures -# -# if the field is optional, is ALWAYS assigned! -# -sub eventFieldAssign { - my ($indent, $src, $dst, $e, $f, $is_common) = @_; - my ($tn, $soap_en, $soap_fn, $native_en, $native_fn, $soap_En, $soap_Fn, $func_name, $source, $dest); - - $tn = $f->{type}; - $native_en = lcfirst $e; - if ($native_en =~ m/^pBS/) { $native_en = ucfirst $native_en; } - if ($native_en =~ m/^cREAM/) { $native_en = ucfirst $native_en; } - if ($native_en =~ m/^condor/) { $native_en = ucfirst $native_en; } - $native_fn = $f->{name}; - $soap_en = $e; - while ($soap_en =~ /([[:alpha:]]*)_([[:alpha:]_]*)/) { - $soap_en = $1.ucfirst($2); - }; - $soap_fn = $native_fn; - while ($soap_fn =~ /([[:alpha:]]*)_([[:alpha:]_]*)/) { - $soap_fn = $1.ucfirst($2); - }; - $source = "$src->$native_en.$native_fn"; - $dest = "VALUEEV_GET($dst, $soap_en)->$soap_fn"; -# print STDERR "$src, $dst, $soap_en, $soap_fn, $native_fn, $tn, $usuc\n"; - - if ($tn eq 'int') { - if ($f->{codes}) { - $soap_En = ucfirst $soap_en; - $soap_Fn = ucfirst $soap_fn; - $func_name = $is_common ? "edg_wll_${soap_Fn}ToSoap" : "edg_wll_${soap_En}${soap_Fn}ToSoap"; - gen $indent."$func_name(soap, $source, &$dest);\n"; - } elsif ($f->{optional}) { - gen $indent."$dest = soap_malloc(soap, sizeof(*$dest));\n"; - gen $indent."*$dest = $source;\n"; - } else { - gen $indent."$dest = $source;\n"; - } - } elsif ($tn eq 'port' || $tn eq 'bool' || $tn eq 'float' || $tn eq 'double') { - if ($f->{optional}) { - gen $indent."$dest = soap_malloc(soap, sizeof(*$dest));\n"; - gen $indent."*$dest = $source;\n"; - } else { - gen $indent."$dest = $source;\n"; - } - } elsif ($tn eq 'logsrc') { - gen $indent."edg_wll_SourceToSoap($source, &$dest);\n"; - } elsif ($tn eq 'string' || $tn eq 'notifid') { - gen $indent."$dest = soap_strdup(soap, $source);\n"; - } elsif ($tn eq 'jobstat') { - gen $indent."$dest = soap_malloc(soap, sizeof(struct lbt__jobStatus))"; - gen $indent."edg_wll_StatusToSoap(soap, $source, $dest);\n"; - } elsif ($tn eq 'timeval') { - gen $indent."$dest = soap_malloc(soap, sizeof(struct lbt__timeval));\n"; - gen $indent."$dest->tvSec = $source.tv_sec;\n"; - gen $indent."$dest->tvUsec = $source.tv_usec;\n"; - } elsif ($tn eq 'jobid') { - gen $indent."s = edg_wlc_JobIdUnparse($source);\n"; - gen $indent."$dest = soap_strdup(soap, s);\n"; - } elsif ($tn eq 'usertag') { - gen $indent."$dest = soap_malloc(soap, sizeof(*$dst->$soap_fn));\n"; - gen $indent."$dest->tag = soap_strdup(soap, $source.tag);\n"; - gen $indent."$dest->value = soap_strdup(soap, $source.value);\n"; - } else { - die "Unknown type $tn"; - } -} - - -sub eventFieldFree { - my ($indent, $dst, $e, $f) = @_; - my ($tn, $soap_en, $soap_fn, $dest); - - $tn = $f->{type}; - $soap_en = $e; - while ($soap_en =~ /([[:alpha:]]*)_([[:alpha:]_]*)/) { - $soap_en = $1.ucfirst($2); - }; - $soap_fn = $f->{name}; - while ($soap_fn =~ /([[:alpha:]]*)_([[:alpha:]_]*)/) { - $soap_fn = $1.ucfirst($2); - }; - $dest = "VALUEEV_GET($dst, $soap_en)->$soap_fn"; - - if ($tn eq 'int' || $tn eq 'port' || $tn eq 'bool' || $tn eq 'float' || $tn eq 'double' || $tn eq 'logsrc') { - if ($f->{optional}) { - gen $indent."if ($dest) soap_dealloc(soap, $dest);\n"; - } - } elsif ($tn eq 'string' || $tn eq 'notifid' || $tn eq 'jobid' || $tn eq 'timeval') { - gen $indent."if ($dest) soap_dealloc(soap, $dest);\n"; - } elsif ($tn eq 'usertag') { - gen $indent."if ($dest) {\n"; - gen $indent." if ($dest->tag) soap_dealloc(soap, $dest->tag);\n"; - gen $indent." if ($dest->value) soap_dealloc(soap, $dest->value);\n"; - gen $indent." soap_dealloc(soap, $dest);\n"; - gen $indent."}\n"; - } else { - die "Unknown type $tn"; - } -} -@@@} - -void edg_wll_JobStatCodeToSoap(edg_wll_JobStatCode in, enum lbt__statName *out) -{ - switch ( in ) - { -/* XXX: these two should never occur */ - case EDG_WLL_NUMBER_OF_STATCODES: - case EDG_WLL_JOB_UNDEF: *out = -1; break; -@@@{ - for my $stat ($status->getTypesOrdered) { - my $u = uc $stat; - my $c = getTypeComment $status $stat; - gen qq{ -! case EDG_WLL_JOB_$u: *out = $u; break; /**< $c */ -}; - } -@@@} - } -} - -void edg_wll_SoapToJobStatCode(enum lbt__statName in, edg_wll_JobStatCode *out) -{ - switch ( in ) - { -// case UNDEF: *out = EDG_WLL_JOB_UNDEF; break; -@@@{ - for my $stat ($status->getTypesOrdered) { - my $u = uc $stat; - my $c = getTypeComment $status $stat; - gen qq{ -! case $u: *out = EDG_WLL_JOB_$u; break; /**< $c */ -}; - } -@@@} - } -} - -int edg_wll_StatusToSoap(struct soap *soap,edg_wll_JobStat const *src,struct lbt__jobStatus *js) -{ - int i,j; - char *s; - - memset(js, 0, sizeof(*js)); - edg_wll_JobStatCodeToSoap(src->state, &(js->state)); -@@@{ - selectType $status '_common_'; - for (getFieldsOrdered $status) { - my $f = selectField $status $_; - my $ft = $f->{type}; - my $usuc = $_; - $usuc = $1.uc($2).$3 while ($usuc =~ /([^_]*)_([a-z])(.*)/); - if ($ft eq 'jobid') { - gen "\ts = edg_wlc_JobIdUnparse(src->$_);\n"; - gen "\tjs->$usuc = soap_strdup(soap,s); free(s);\n"; - } - elsif ($ft eq 'strlist') { - gen qq{ -! for (i=0; src->$_ && src->$_\[i]; i++); -! js->__size$usuc = i; -! js->$usuc = soap_malloc(soap,sizeof(char *) * i); -! for (j=0; j$usuc\[j] = soap_strdup(soap,src->$_\[j]); -}; - } elsif ($ft eq 'intlist') { - my %fmap = ( children_hist=>'count', stateEnterTimes=>'time'); - gen qq{ -! /* XXX: don't count UNDEF */ -! if (src->$_) { -! GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, ${usuc}Item) h; -! -! GLITE_SECURITY_GSOAP_LIST_CREATE(soap, js, ${usuc}, struct lbt__${usuc}Item, EDG_WLL_NUMBER_OF_STATCODES-1); -! h = js->${usuc}; -! for (i=1; istate); -! GLITE_SECURITY_GSOAP_LIST_GET(h, i-1)->$fmap{$_} = src->$_\[i+1]; -! } -! } -! else { -! js->__size$usuc = 0; -! js->$usuc = NULL; -! } -}; - } elsif ($ft eq 'taglist') { - gen qq{ -! { -! struct lbt__tagValue *t; -! -! for (i=0; src->$_ && src->$_\[i].tag; i++); -! GLITE_SECURITY_GSOAP_LIST_CREATE(soap, js, $usuc, struct lbt__tagValue, i); -! for (i=0; src->$_ && src->$_\[i].tag; i++) { -! t = GLITE_SECURITY_GSOAP_LIST_GET(js->$usuc, i); -! t->tag = soap_strdup(soap,src->$_\[i].tag); -! t->value = soap_strdup(soap,src->$_\[i].value); -! } -! } -}; - } elsif ($ft eq 'stslist') { - gen qq{ -! for (i=0; src->$_ && src->$_\[i].state; i++); -! GLITE_SECURITY_GSOAP_LIST_CREATE(soap, js, $usuc, struct lbt__jobStatus, i); -! for (j=0; j$_+j,GLITE_SECURITY_GSOAP_LIST_GET(js->$usuc, j)); -}; - } elsif ($ft eq 'timeval') { - gen "\tjs->$usuc = soap_malloc(soap,sizeof *js->$usuc);\n"; - gen "\tjs->$usuc->tvSec = src->$_.tv_sec;\n"; - gen "\tjs->$usuc->tvUsec = src->$_.tv_usec;\n"; - } elsif ($ft eq 'string') { - gen "\tjs->$usuc = soap_strdup(soap,src->$_);\n"; - } else { gen "\tjs->$usuc = src->$_;\n"; } - } -@@@} - - return SOAP_OK; -} - -void edg_wll_SoapToStatus(struct soap *soap,struct lbt__jobStatus const *src,edg_wll_JobStat *dest) -{ - int i; - - memset(dest,0,sizeof *dest); - edg_wll_SoapToJobStatCode(src->state, &(dest->state)); - -@@@{ - selectType $status '_common_'; - for (getFieldsOrdered $status) { - my $f = selectField $status $_; - my $ft = $f->{type}; - my $usuc = $_; - $usuc = $1.uc($2).$3 while ($usuc =~ /([^_]*)_([a-z])(.*)/); - - if ($ft eq 'jobid') { - gen "\tif (src->$usuc) edg_wlc_JobIdParse(src->$usuc,&dest->$_);\n"; - } elsif ($ft eq 'strlist') { - gen "\tfor (i=0; i__size$usuc; i++) soap_unlink(soap,src->$usuc\[i]);\n"; - gen "\tsoap_unlink(soap,src->$usuc);\n"; - gen "\tdest->$_ = realloc(src->$usuc,sizeof(*dest->$_) * (src->__size$usuc + 1));\n"; - gen "\tdest->$_\[src->__size$usuc] = NULL;\n"; - } elsif ($ft eq 'intlist') { -# XXX: only EDG_WLL_NUMBER_OF_STATCODES long lists work - my %fmap = ( children_hist=>'count', stateEnterTimes=>'time'); - gen qq { -! if (src->__size$usuc) { -! dest->$_ = calloc(src->__size$usuc + 1, sizeof *dest->$_); -! dest->$_\[0] = src->__size$usuc + 2; -! for (i=0; i__size$usuc; i++) { -! edg_wll_JobStatCode s; -! edg_wll_SoapToJobStatCode(GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i)->state,&s); -! assert(s>=0); assert(s$_\[s+1] = GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i)->$fmap{$_}; -! } -! } -! else dest->$_ = NULL; -}; - } elsif ($ft eq 'stslist') { - gen qq{ -! if (src->__size$usuc) { -! dest->$_ = calloc(src->__size$usuc + 1,sizeof *dest->$_); -! for (i=0; i__size$usuc; i++) edg_wll_SoapToStatus(soap,GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i),dest->$_ + i); -! } -! else dest->$_ = NULL; -}; - } elsif ($ft eq 'taglist') { - gen qq{ - if (src->__size$usuc) { - dest->$_ = calloc(src->__size$usuc + 1,sizeof *dest->$_); - for (i=0; i__size$usuc; i++) { - soap_unlink(soap,dest->$_\[i].tag = GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i)->tag); - soap_unlink(soap,dest->$_\[i].tag = GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i)->tag); - } - } - else dest->$_ = NULL; -}; - } elsif ($ft eq 'timeval') { - gen "\tdest->$_.tv_sec = src->$usuc->tvSec;\n"; - gen "\tdest->$_.tv_usec = src->$usuc->tvUsec;\n"; - } elsif ($ft eq 'string') { - gen "\tdest->$_ = src->$usuc;\n"; - gen "\tsoap_unlink(soap,src->$usuc);\n"; - } else { - gen "\tdest->$_ = src->$usuc;\n"; -} -} -@@@} -} - -void edg_wll_SoapToJobStatFlags(const struct lbt__jobFlags *in, int *out) -{ - int i; - - assert(out); - *out = 0; - if (in) for ( i = 0; i < in->__sizeflag; i++ ) switch ( in->flag[i] ) - { - case CLASSADS: *out |= EDG_WLL_STAT_CLASSADS; break; - case CHILDREN: *out |= EDG_WLL_STAT_CHILDREN; break; - case CHILDSTAT: *out |= EDG_WLL_STAT_CHILDSTAT; break; - case CHILDHIST_FAST: *out |= EDG_WLL_STAT_CHILDHIST_FAST; break; - case CHILDHIST_THOROUGH: *out |= EDG_WLL_STAT_CHILDHIST_THOROUGH; break; - } -} - -int edg_wll_JobStatFlagsToSoap(struct soap *soap, const int in, struct lbt__jobFlags *out) -{ - int i = 0; - - assert(out); - memset(out, 0, sizeof(*out)); - if ( in & EDG_WLL_STAT_CLASSADS ) out->__sizeflag++; - if ( in & EDG_WLL_STAT_CHILDREN ) out->__sizeflag++; - if ( in & EDG_WLL_STAT_CHILDSTAT ) out->__sizeflag++; - if ( in & EDG_WLL_STAT_CHILDHIST_FAST ) out->__sizeflag++; - if ( in & EDG_WLL_STAT_CHILDHIST_THOROUGH ) out->__sizeflag++; - if ( !out->__sizeflag ) return SOAP_OK; - out->flag = soap_malloc(soap, sizeof(*(out->flag))*out->__sizeflag); - if ( !out->flag ) return SOAP_FAULT; - - if ( in & EDG_WLL_STAT_CLASSADS ) out->flag[i++] = CLASSADS; - if ( in & EDG_WLL_STAT_CHILDREN ) out->flag[i++] = CHILDREN; - if ( in & EDG_WLL_STAT_CHILDSTAT ) out->flag[i++] = CHILDSTAT; - if ( in & EDG_WLL_STAT_CHILDHIST_FAST ) out->flag[i++] = CHILDHIST_FAST; - if ( in & EDG_WLL_STAT_CHILDHIST_THOROUGH ) out->flag[i++] = CHILDHIST_THOROUGH; - - return SOAP_OK; -} - -int edg_wll_SoapToAttr(const enum lbt__queryAttr in, edg_wll_QueryAttr *out) -{ - assert(EDG_WLL_QUERY_ATTR_NETWORK_SERVER + 1 == EDG_WLL_QUERY_ATTR__LAST); - - switch ( in ) - { - case JOBID: *out = EDG_WLL_QUERY_ATTR_JOBID; break; - case OWNER: *out = EDG_WLL_QUERY_ATTR_OWNER; break; - case STATUS: *out = EDG_WLL_QUERY_ATTR_STATUS; break; - case LOCATION: *out = EDG_WLL_QUERY_ATTR_LOCATION; break; - case DESTINATION: *out = EDG_WLL_QUERY_ATTR_DESTINATION; break; - case DONECODE: *out = EDG_WLL_QUERY_ATTR_DONECODE; break; - case USERTAG: *out = EDG_WLL_QUERY_ATTR_USERTAG; break; - case TIME: *out = EDG_WLL_QUERY_ATTR_TIME; break; - case LEVEL: *out = EDG_WLL_QUERY_ATTR_LEVEL; break; - case HOST: *out = EDG_WLL_QUERY_ATTR_HOST; break; - case SOURCE: *out = EDG_WLL_QUERY_ATTR_SOURCE; break; - case INSTANCE: *out = EDG_WLL_QUERY_ATTR_INSTANCE; break; - case EVENTTYPE: *out = EDG_WLL_QUERY_ATTR_EVENT_TYPE; break; - case CHKPTTAG: *out = EDG_WLL_QUERY_ATTR_CHKPT_TAG; break; - case RESUBMITTED: *out = EDG_WLL_QUERY_ATTR_RESUBMITTED; break; - case PARENT: *out = EDG_WLL_QUERY_ATTR_PARENT; break; - case EXITCODE: *out = EDG_WLL_QUERY_ATTR_EXITCODE; break; - case JDLATTR: *out = EDG_WLL_QUERY_ATTR_JDL_ATTR; break; - case STATEENTERTIME: *out = EDG_WLL_QUERY_ATTR_STATEENTERTIME; break; - case LASTUPDATETIME: *out = EDG_WLL_QUERY_ATTR_LASTUPDATETIME; break; - case NETWORKSERVER: *out = EDG_WLL_QUERY_ATTR_NETWORK_SERVER; break; - default: return 0; - } - - return 1; -} - -int edg_wll_AttrToSoap(const edg_wll_QueryAttr in, enum lbt__queryAttr *out) -{ - assert(EDG_WLL_QUERY_ATTR_NETWORK_SERVER + 1 == EDG_WLL_QUERY_ATTR__LAST); - - switch ( in ) - { - case EDG_WLL_QUERY_ATTR_JOBID: *out = JOBID; break; - case EDG_WLL_QUERY_ATTR_OWNER: *out = OWNER; break; - case EDG_WLL_QUERY_ATTR_STATUS: *out = STATUS; break; - case EDG_WLL_QUERY_ATTR_LOCATION: *out = LOCATION; break; - case EDG_WLL_QUERY_ATTR_DESTINATION: *out = DESTINATION; break; - case EDG_WLL_QUERY_ATTR_DONECODE: *out = DONECODE; break; - case EDG_WLL_QUERY_ATTR_USERTAG: *out = USERTAG; break; - case EDG_WLL_QUERY_ATTR_TIME: *out = TIME; break; - case EDG_WLL_QUERY_ATTR_LEVEL: *out = LEVEL; break; - case EDG_WLL_QUERY_ATTR_HOST: *out = HOST; break; - case EDG_WLL_QUERY_ATTR_SOURCE: *out = SOURCE; break; - case EDG_WLL_QUERY_ATTR_INSTANCE: *out = INSTANCE; break; - case EDG_WLL_QUERY_ATTR_EVENT_TYPE: *out = EVENTTYPE; break; - case EDG_WLL_QUERY_ATTR_CHKPT_TAG: *out = CHKPTTAG; break; - case EDG_WLL_QUERY_ATTR_RESUBMITTED: *out = RESUBMITTED; break; - case EDG_WLL_QUERY_ATTR_PARENT: *out = PARENT; break; - case EDG_WLL_QUERY_ATTR_EXITCODE: *out = EXITCODE; break; - case EDG_WLL_QUERY_ATTR_JDL_ATTR: *out = JDLATTR; break; - case EDG_WLL_QUERY_ATTR_STATEENTERTIME: *out = STATEENTERTIME; break; - case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: *out = LASTUPDATETIME; break; - case EDG_WLL_QUERY_ATTR_NETWORK_SERVER: *out = NETWORKSERVER; break; - default: return 0; - } - - return 1; -} - -void edg_wll_SoapToQueryOp(const enum lbt__queryOp in, edg_wll_QueryOp *out) -{ - switch ( in ) - { - case EQUAL: *out = EDG_WLL_QUERY_OP_EQUAL; break; - case UNEQUAL: *out = EDG_WLL_QUERY_OP_UNEQUAL; break; - case LESS: *out = EDG_WLL_QUERY_OP_LESS; break; - case GREATER: *out = EDG_WLL_QUERY_OP_GREATER; break; - case WITHIN: *out = EDG_WLL_QUERY_OP_WITHIN; break; - case CHANGED: *out = EDG_WLL_QUERY_OP_CHANGED; break; - } -} - -void edg_wll_QueryOpToSoap(const edg_wll_QueryOp in, enum lbt__queryOp *out) -{ - switch ( in ) - { - case EDG_WLL_QUERY_OP_EQUAL: *out = EQUAL; break; - case EDG_WLL_QUERY_OP_UNEQUAL: *out = UNEQUAL; break; - case EDG_WLL_QUERY_OP_LESS: *out = LESS; break; - case EDG_WLL_QUERY_OP_GREATER: *out = GREATER; break; - case EDG_WLL_QUERY_OP_WITHIN: *out = WITHIN; break; - case EDG_WLL_QUERY_OP_CHANGED: *out = CHANGED; break; - default: assert(0); - } -} - -int edg_wll_SoapToQueryVal( - const edg_wll_QueryAttr attr, - const struct lbt__queryRecValue *in, - union edg_wll_QueryVal *out) -{ - assert(in); assert(out); - if ( VALUEQR_ISTYPE(in, c) ) { - if ( attr == EDG_WLL_QUERY_ATTR_JOBID || attr == EDG_WLL_QUERY_ATTR_PARENT ) { - if ( glite_jobid_parse(VALUEQR_GET(in, c), (glite_jobid_t *)&(out->j)) ) return -1; - } else { - if ( !(out->c = strdup(VALUEQR_GET(in, c))) ) return -1; - } - } - else if ( VALUEQR_ISTYPE(in, t) ) { - out->t.tv_sec = VALUEQR_GET(in, t)->tvSec; - out->t.tv_usec = VALUEQR_GET(in, t)->tvUsec; - } - else if ( VALUEQR_ISTYPE(in, i) ) out->i = *(VALUEQR_GET(in, i)); - - return 0; -} - -int edg_wll_QueryValToSoap( - struct soap *soap, - const edg_wll_QueryAttr attr, - const union edg_wll_QueryVal *in, - struct lbt__queryRecValue *out) -{ - assert(in); assert(out); - memset(out, 0, sizeof(*out)); - switch ( attr ) { - case EDG_WLL_QUERY_ATTR_USERTAG: - case EDG_WLL_QUERY_ATTR_OWNER: - case EDG_WLL_QUERY_ATTR_LOCATION: - case EDG_WLL_QUERY_ATTR_DESTINATION: - case EDG_WLL_QUERY_ATTR_HOST: - case EDG_WLL_QUERY_ATTR_INSTANCE: - case EDG_WLL_QUERY_ATTR_CHKPT_TAG: - case EDG_WLL_QUERY_ATTR_JDL_ATTR: - VALUEQR_SET(out, c, in->c ? soap_strdup(soap, in->c) : NULL); - if (in->c && !VALUEQR_GET(out, c) ) return SOAP_FAULT; - break; - case EDG_WLL_QUERY_ATTR_JOBID: - case EDG_WLL_QUERY_ATTR_PARENT: { - char *s = edg_wlc_JobIdUnparse(in->j); - VALUEQR_SET(out, c, soap_strdup(soap, s)); - free(s); - if ( !VALUEQR_GET(out, c) ) return SOAP_FAULT; - } - break; - case EDG_WLL_QUERY_ATTR_TIME: - case EDG_WLL_QUERY_ATTR_STATEENTERTIME: - case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: - VALUEQR_SET(out, t, soap_malloc(soap, sizeof(*(VALUEQR_GET(out, t))))); - if ( !VALUEQR_GET(out, t) ) return SOAP_FAULT; - VALUEQR_SETTYPE(out, t); - VALUEQR_GET(out, t)->tvSec = in->t.tv_sec; - VALUEQR_GET(out, t)->tvUsec = in->t.tv_usec; - break; - case EDG_WLL_QUERY_ATTR_STATUS: - case EDG_WLL_QUERY_ATTR_DONECODE: - case EDG_WLL_QUERY_ATTR_LEVEL: - case EDG_WLL_QUERY_ATTR_SOURCE: - case EDG_WLL_QUERY_ATTR_EVENT_TYPE: - case EDG_WLL_QUERY_ATTR_RESUBMITTED: - case EDG_WLL_QUERY_ATTR_EXITCODE: - VALUEQR_SET(out, i, soap_malloc(soap, sizeof(*(VALUEQR_GET(out, i))))); - if ( !VALUEQR_GET(out, i) ) return SOAP_FAULT; - *(VALUEQR_GET(out, i)) = in->i; - break; - default: - return SOAP_FAULT; - } - - return SOAP_OK; -} - -int edg_wll_SoapToQueryRec( - const struct lbt__queryConditions *collection, - const struct lbt__queryRecord *in, - edg_wll_QueryRec *out) -{ - assert(collection); assert(in); assert(out); - memset(out, 0, sizeof(*out)); - if (!edg_wll_SoapToAttr(collection->attr, &out->attr)) return -1; - switch ( out->attr ) - { - case EDG_WLL_QUERY_ATTR_TIME: - edg_wll_SoapToJobStatCode(*(collection->statName), &(out->attr_id.state)); - break; - case EDG_WLL_QUERY_ATTR_USERTAG: - case EDG_WLL_QUERY_ATTR_JDL_ATTR: - out->attr_id.tag = strdup(collection->tagName); - break; - default: - break; - } - edg_wll_SoapToQueryOp(in->op, &(out->op)); - switch ( out->op ) - { - case EDG_WLL_QUERY_OP_WITHIN: - if ( edg_wll_SoapToQueryVal(out->attr, in->value2, &(out->value2)) ) goto err; - default: - if ( edg_wll_SoapToQueryVal(out->attr, in->value1, &(out->value)) ) goto err; - break; - } - - return 0; -err: - edg_wll_QueryRecFree(out); - return -1; -} - -int edg_wll_QueryRecToSoap( - struct soap *soap, - const edg_wll_QueryRec *in, - struct lbt__queryRecord *qr) -{ - assert(in); assert(qr); - memset(qr, 0, sizeof(*qr)); - if ( !in ) goto ret; - edg_wll_QueryOpToSoap(in->op, &(qr->op)); - -#ifdef GLITE_SECURITY_GSOAP_CHOICE_SETNULL - if ((qr->value2 = soap_malloc(soap, sizeof(*(qr->value2)))) == NULL) return SOAP_FAULT; - GLITE_SECURITY_GSOAP_CHOICE_SETNULL(qr->value2, queryRecValue); -#endif - switch ( in->op ) { - case EDG_WLL_QUERY_OP_WITHIN: -#ifndef GLITE_SECURITY_GSOAP_CHOICE_SETNULL - if ( !(qr->value2 = soap_malloc(soap, sizeof(*(qr->value2)))) ) return SOAP_FAULT; -#endif - if ( edg_wll_QueryValToSoap(soap, in->attr, &(in->value2), qr->value2) ) return SOAP_FAULT; - default: - if ( !(qr->value1 = soap_malloc(soap, sizeof(*(qr->value1)))) ) return SOAP_FAULT; - if ( edg_wll_QueryValToSoap(soap, in->attr, &(in->value), qr->value1) ) return SOAP_FAULT; - break; - } - -ret: - return SOAP_OK; -} - -/** - * Translate query conditions from Soap form to query rec structure - * - * \param IN in pointer to soap query condition - * \param OUT out target array of queryRec - */ -int edg_wll_SoapToQueryConds(const struct lbt__queryConditions *in, edg_wll_QueryRec **out) -{ - int i; - edg_wll_QueryRec *qr; - - assert(in); assert(out); - if ( !(qr = calloc(in->__sizerecord+1, sizeof(*qr))) ) goto err; - for ( i = 0; i < in->__sizerecord; i++ ) - if ( edg_wll_SoapToQueryRec(in, GLITE_SECURITY_GSOAP_LIST_GET(in->record, i), qr+i) ) goto err; - *out = qr; - return 0; - -err: - if ( qr ) { - for ( i = 0; qr[i].attr; i++ ) edg_wll_QueryRecFree(qr+i); - free(qr); - } - return -1; -} - -int edg_wll_QueryCondsToSoap( - struct soap *soap, - const edg_wll_QueryRec *in, - struct lbt__queryConditions *qc) -{ - int i; - - - assert(qc); - memset(qc, 0, sizeof(*qc)); - if ( !in ) - goto ret; - - if (!edg_wll_AttrToSoap(in[0].attr, &(qc->attr))) return SOAP_FAULT; - - if ( in->attr == EDG_WLL_QUERY_ATTR_TIME ) { - qc->statName = soap_malloc(soap, sizeof(*(qc->statName))); - if ( !qc->statName ) return SOAP_FAULT; - edg_wll_JobStatCodeToSoap(in->attr_id.state, qc->statName); - } - else if ( in->attr == EDG_WLL_QUERY_ATTR_USERTAG) { - qc->tagName = soap_strdup(soap, in->attr_id.tag); - if ( !qc->tagName ) return SOAP_FAULT; - } - - i = 0; - while ( in[i].attr ) i++; - - if ( !i ) - goto ret; - - GLITE_SECURITY_GSOAP_LIST_CREATE(soap, qc, record, struct lbt__queryRecord, i); - if ( !qc->record ) - return SOAP_FAULT; - - for ( i = 0; in[i].attr; i++ ) - if ( edg_wll_QueryRecToSoap(soap, &in[i], GLITE_SECURITY_GSOAP_LIST_GET(qc->record, i)) ) - return SOAP_FAULT; - -ret: - return SOAP_OK; -} - -/** - * Translate extended query conditions from Soap form to query rec structure - * - * \param IN in array of soap query condition - * \param OUT out target array of queryRec - */ -int edg_wll_SoapToQueryCondsExt(GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) in, int __sizecondition, edg_wll_QueryRec ***out) -{ - int i; - edg_wll_QueryRec **qr; - - assert(out); - if ( !(qr = calloc(__sizecondition + 1, sizeof(*qr))) ) return -1; - for ( i = 0; i < __sizecondition && GLITE_SECURITY_GSOAP_LIST_GET(in, i); i++ ) - if ( edg_wll_SoapToQueryConds(GLITE_SECURITY_GSOAP_LIST_GET(in, i), qr+i) ) goto err; - - *out = qr; - return 0; - -err: - if ( qr ) { - int j; - for ( i = 0; qr[i]; i++ ) - { - for ( j = 0; qr[i][j].attr; j++ ) edg_wll_QueryRecFree(qr[i]); - free(qr[i]); - } - free(qr); - } - return -1; -} - - -/** - * Translate extended query conditions from Soap form to query rec structure - * - * \param IN in target array of queryRec - * \param OUT out_size number of array elements - * \param OUT out array of soap query condition - */ -int edg_wll_QueryCondsExtToSoap( - struct soap *soap, - const edg_wll_QueryRec **in, - int *out_size, - GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) *out) -{ - int i, size; - GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) qc; - assert(in); assert(out); - - size = 0; - while ( in[size] ) size++; - - if ( !size ) - goto ret; - GLITE_SECURITY_GSOAP_LIST_CREATE0(soap, qc, size, struct lbt__queryConditions, size); - if ( !qc ) return SOAP_FAULT; - - for ( i = 0; in[i]; i++ ) - if ( edg_wll_QueryCondsToSoap(soap, in[i], GLITE_SECURITY_GSOAP_LIST_GET(qc, i)) ) - return SOAP_FAULT; - -ret: - *out = qc; - *out_size = size; - return SOAP_OK; -} - - -#define edg_wll_CommonJobsResponseToSoap do { \ - int count, i; \ -\ - assert(out); \ - out->__sizejobs = 0; \ - out->jobs = NULL; \ - out->__sizestates = 0; \ - out->states = NULL; \ -\ - count = 0; \ - if ( jobs ) { \ - for ( i = 0; jobs[i]; i++ ) ; \ - count = i; \ - out->jobs = soap_malloc(soap, sizeof(*(out->jobs))*count); \ - if ( !out->jobs ) return SOAP_FAULT; \ - out->__sizejobs = count; \ - for ( i = 0; jobs[i]; i++ ) { \ - char *s; \ - if ( !(s = edg_wlc_JobIdUnparse(jobs[i])) ) return SOAP_FAULT; \ - if ( !(out->jobs[i] = soap_strdup(soap, s)) ) return SOAP_FAULT; \ - free(s); \ - } \ - } \ - if ( states ) { \ - GLITE_SECURITY_GSOAP_LIST_CREATE(soap, out, states, struct lbt__jobStatus, count); \ - if ( !out->states ) return SOAP_FAULT; \ -\ - for ( i = 0; i < count; i++ ) \ - if ( edg_wll_StatusToSoap(soap, states+i, GLITE_SECURITY_GSOAP_LIST_GET(out->states, i)) ) \ - return SOAP_FAULT; \ - } \ -\ -} while(0) - - -int edg_wll_JobsQueryResToSoap( - struct soap *soap, - const edg_wlc_JobId *jobs, - const edg_wll_JobStat *states, - struct _lbe__QueryJobsResponse *out) -{ - edg_wll_CommonJobsResponseToSoap; - return SOAP_OK; -} - - -int edg_wll_UserJobsResToSoap( - struct soap *soap, - const edg_wlc_JobId *jobs, - const edg_wll_JobStat *states, - struct _lbe__UserJobsResponse *out) -{ - edg_wll_CommonJobsResponseToSoap; - return SOAP_OK; -} - - -static void edg_wll_SoapToSource(enum lbt__eventSource in, edg_wll_Source *out) -{ - assert(EDG_WLL_SOURCE_CREAM_EXECUTOR + 1 == EDG_WLL_SOURCE__LAST); - - switch ( in ) { - case UserInterface: *out = EDG_WLL_SOURCE_USER_INTERFACE; break; - case NetworkServer: *out = EDG_WLL_SOURCE_NETWORK_SERVER; break; - case WorkloadManager: *out = EDG_WLL_SOURCE_WORKLOAD_MANAGER; break; - case BigHelper: *out = EDG_WLL_SOURCE_BIG_HELPER; break; - case JobSubmission: *out = EDG_WLL_SOURCE_JOB_SUBMISSION; break; - case LogMonitor: *out = EDG_WLL_SOURCE_LOG_MONITOR; break; - case LRMS: *out = EDG_WLL_SOURCE_LRMS; break; - case Application: *out = EDG_WLL_SOURCE_APPLICATION; break; - case LBServer: *out = EDG_WLL_SOURCE_LB_SERVER; break; - case CREAMInterface: *out = EDG_WLL_SOURCE_CREAM_INTERFACE; break; - case CREAMExecutor: *out = EDG_WLL_SOURCE_CREAM_EXECUTOR; break; - default: assert(0); break; - } -} - - -/* - * Soap to C and C to Soap enumeration translate functions. - */ - -@@@{ -foreach ('_common_', sort { $event->{order}->{$a} <=> $event->{order}->{$b} } getTypes $event) { - my ($e, $upper_en, $soap_en, $en); - - $e = $_; - if ($e eq '_common_') { - $en = ''; - $upper_en = ''; - $soap_en = ''; - } else { - $en = ucfirst $e; - $upper_en = uc $e; - $soap_en = $en; - $soap_en = $1.ucfirst $2 while $soap_en =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - } - - selectType $event $_; - foreach ($event->getFieldsOrdered) { - my $f = selectField $event $_; - - if ($f->{codes}) { - my ($fn, $soap_fn, $upper_fn, $enum_name, $soap_enum_name, $enum_value_prefix, $func2C_name, $func2S_name); - - $fn = ucfirst $f->{name}; - $upper_fn = uc $f->{name}; - $soap_fn = $fn; - $soap_fn = $1.ucfirst $2 while $soap_fn =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - - $enum_name = $e eq '_common_' && $fn eq 'Level' ? "int": "enum edg_wll_${en}${fn}"; - $enum_value_prefix = $e eq '_common_' ? "EDG_WLL_${upper_fn}_" : "EDG_WLL_${upper_en}_"; - $soap_enum_name = "enum lbt__$soap_en$soap_fn "; - if ($f->{optional}) {$soap_enum_name .= "*";} - - # Soap to C function - $func2C_name = "edg_wll_SoapTo$soap_en$soap_fn"; - gen "\n"; - gen "static void $func2C_name(const ${soap_enum_name}in, $enum_name *out) {\n"; - if ($f->{optional}) { - gen "\tif (in == NULL) {\n"; - gen "\t\t*out = ${enum_value_prefix}UNDEFINED;\n"; - gen "\t\treturn;\n"; - gen "\t}\n"; - gen "\n"; - gen "\tswitch(*in) {\n"; - } else { - gen "\tswitch(in) {\n"; - } - foreach $code (@{$f->{codes}}) { - my ($enum_value, $soap_enum_value, $upper_cn); - - $upper_cn = $code->{name}; - $enum_value = "${enum_value_prefix}${upper_cn}"; - $upper_cn =~ s/_/_USCORE/g; - $soap_enum_value = "lbt__${soap_en}${soap_fn}__${upper_cn}"; - gen "\tcase $soap_enum_value: *out = $enum_value; break;\n" - } - gen "\tdefault: assert(0);\n"; - gen "\t};\n"; - gen "}\n"; - gen "\n"; - - # C to Soap function - my $target; - - $func2S_name = "edg_wll_${soap_en}${soap_fn}ToSoap"; - gen "\n"; - gen "static void $func2S_name(struct soap *soap, const $enum_name in, ${soap_enum_name}*out) {\n"; - if ($f->{optional}) { - gen "\tif (in == ${enum_value_prefix}UNDEFINED) {\n"; - gen "\t\t*out = NULL;\n"; - gen "\t\treturn;\n"; - gen "\t}\n"; - gen "\n"; - gen "\t*out = soap_malloc(soap, sizeof(**out));\n"; - $target = "**out"; - } else { - $target = "*out"; - } - gen "\tswitch(in) {\n"; - foreach $code (@{$f->{codes}}) { - my ($enum_value, $soap_enum_value, $upper_cn); - - $upper_cn = $code->{name}; - $enum_value = "${enum_value_prefix}${upper_cn}"; - $upper_cn =~ s/_/_USCORE/g; - $soap_enum_value = "lbt__${soap_en}${soap_fn}__${upper_cn}"; - gen "\tcase $enum_value: $target = $soap_enum_value; break;\n" - } - if (not $e eq '_common_') { - gen "\tcase EDG_WLL_${upper_en}_UNDEFINED: assert(0);\n"; - } - gen "\tdefault: assert(0);\n"; - gen "\t};\n"; - gen "}\n"; - gen "\n"; - - } # if code - } # fields -} # _common_, types -@@@} - -static void edg_wll_SourceToSoap(edg_wll_Source in, enum lbt__eventSource *out) -{ - assert(EDG_WLL_SOURCE_CREAM_EXECUTOR + 1 == EDG_WLL_SOURCE__LAST); - - switch ( in ) { - case EDG_WLL_SOURCE_USER_INTERFACE: *out = UserInterface; break; - case EDG_WLL_SOURCE_NETWORK_SERVER: *out = NetworkServer; break; - case EDG_WLL_SOURCE_WORKLOAD_MANAGER: *out = WorkloadManager; break; - case EDG_WLL_SOURCE_BIG_HELPER: *out = BigHelper; break; - case EDG_WLL_SOURCE_JOB_SUBMISSION: *out = JobSubmission; break; - case EDG_WLL_SOURCE_LOG_MONITOR: *out = LogMonitor; break; - case EDG_WLL_SOURCE_LRMS: *out = LRMS; break; - case EDG_WLL_SOURCE_APPLICATION: *out = Application; break; - case EDG_WLL_SOURCE_LB_SERVER: *out = LBServer; break; - case EDG_WLL_SOURCE_CREAM_INTERFACE: *out = CREAMInterface; break; - case EDG_WLL_SOURCE_CREAM_EXECUTOR: *out = CREAMExecutor; break; - case EDG_WLL_SOURCE_NONE: - case EDG_WLL_SOURCE__LAST: - default: - assert(0); - } -} - - -/** - * TODO: not tested - * Translate event structure to Soap event. - * - * \param INOUT soap instance to work with - * \param IN event source event - * \param OUT sevent target Soap event - */ -int edg_wll_EventToSoap(struct soap* soap, const edg_wll_Event *event, struct lbt__event *sevent) { - char *s; - - switch (event->any.type) { -@@@{ - my ($soap_en); - - for my $e (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } - $event->getTypes) { - my ($u); - - $u = uc $e; - $soap_en = $e; - while ($soap_en =~ /([[:alpha:]]*)_([[:alpha:]_]*)/) { - $soap_en = $1.ucfirst($2); - }; -gen qq { -! case EDG_WLL_EVENT_$u: -! VALUEEV_SET(sevent, $soap_en, soap_malloc(soap, sizeof(struct lbt__event$soap_en))); -}; - selectType $event '_common_'; - for (getFieldsOrdered $event) { - my ($f); - - $f = selectField $event $_; - eventFieldAssign("\t\t\t", "event", "sevent", $e, $f, 1); - } - - gen "\n"; - - selectType $event $e; - for (getFieldsOrdered $event) { - my ($f); - - $f = selectField $event $_; - eventFieldAssign("\t\t\t", "event", "sevent", $e, $f, 0); - } -gen qq { -! break; -! -}; - } -@@@} - default: - return 0; - } - - return 1; -} - - -/** - * TODO: not tested - * Free Soap event. - * - * \param INOUT soap instance to work with - * \param INOUT sevent released Soap event - */ -void edg_wll_FreeSoapEvent(struct soap *soap, struct lbt__event *sevent) { -@@@{ - my ($soap_en); - - for my $e (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } getTypes $event) { - $soap_en = $e; - $soap_en = $1.ucfirst $2 while $soap_en =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - - gen "\tif (VALUEEV_ISTYPE(sevent, $soap_en)) {\n"; - - selectType $event '_common_'; - for (getFieldsOrdered $event) { - my ($f); - - $f = selectField $event $_; - eventFieldFree("\t\t", "sevent", $e, $f); - } - - selectType $event $e; - for (getFieldsOrdered $event) { - my ($f); - - $f = selectField $event $_; - eventFieldFree("\t\t", "sevent", $e, $f); - } - gen qq "\t\tsoap_dealloc(soap, VALUEEV_GET(sevent, $soap_en));\n"; - gen qq "\t}\n"; -} -@@@} - // XXX: element dealocation belongs to higher layer -#if GSOAP_VERSION <= 20706 - soap_dealloc(soap, sevent); -#endif -} - - -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; - } -} - - -/** - * Translate event array to Soap event array for eventsQueryResponse. - * - * \param INOUT soap instance to work with - * \param IN events source array of the events - * \param OUT out result Soap structure - */ -int edg_wll_EventsQueryResToSoap( - struct soap *soap, - const edg_wll_Event *events, - struct _lbe__QueryEventsResponse *out) -{ - int i; - struct lbt__event *event; - - /* alloc the events array */ - assert(out != NULL); - memset(out, 0, sizeof(*out)); - for (out->__sizeevents = 0; events[out->__sizeevents].any.type != EDG_WLL_EVENT_UNDEF; out->__sizeevents++); - if (!out->__sizeevents) return SOAP_OK; - GLITE_SECURITY_GSOAP_LIST_CREATE(soap, out, events, struct lbt__event, out->__sizeevents); - for (i = 0; i < out->__sizeevents; i++) - memset(GLITE_SECURITY_GSOAP_LIST_GET(out->events, i), 0, sizeof(struct lbt__event)); - if (!out->events) return SOAP_FAULT; - - for (i = 0; i < out->__sizeevents; i++) { - if (!edg_wll_EventToSoap(soap, &events[i], GLITE_SECURITY_GSOAP_LIST_GET(out->events, i))) goto err; - } - - return SOAP_OK; - -err: - event = GLITE_SECURITY_GSOAP_LIST_GET(out->events, 0); - while (event) { - edg_wll_FreeSoapEvent(soap, event); - event++; - } - /* - * XXX: better list destroy here w/o deallocstion in - * edg_wll_FreeSoapEvent - */ - soap_dealloc(soap, out->events); - - return SOAP_FAULT; -} - - -static int edg_wll_SoapToEvent( - struct soap *soap, - struct lbt__event *in, - edg_wll_Event *out) -{ - //XXX: needs flash - -@@@{ - for my $name (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } getTypes $event) - { - my $comment = getTypeComment $event $name; - $name = $1.ucfirst $2 while $name =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - gen "\t\tif (VALUEEV_ISTYPE(in, $name)) {\n"; - my $event_type = uc $name; - gen "\t\t\tout->type = EDG_WLL_EVENT_$event_type;\n"; - - for ('_common_',$name) { - my $type = $_; - selectType $event $type; - for ($event->getFieldsOrdered) { - my $f = selectField $event $_; - my $fn = $f->{name}; - my $ft = $f->{type}; - my $tn = $f->getType; - my $act; - if ($type eq '_common_') { - $act = 'any'; - } else { - $act = lcfirst $name; - if ($act =~ m/^pBS/) { $act = ucfirst $act; } - if ($act =~ m/^cREAM/) { $act = ucfirst $act; } - if ($act =~ m/^condor/) { $act = ucfirst $act; } - } - my $usuc = $fn; - $usuc = $1.uc($2).$3 while ($usuc =~ /([^_]*)_([a-z])(.*)/); - my $fuc = ucfirst($usuc); - - my $src = "VALUEEV_GET(in, $name)->$usuc"; - if ($ft eq 'jobid') { - - gen "\t\t\tif ($src)\n"; - gen "\t\t\t\tedg_wlc_JobIdParse($src,&out->$act.$fn);\n"; - } elsif ($ft eq 'timeval') { - gen "\t\t\tout->$act.$fn.tv_sec = $src->tvSec;\n"; - gen "\t\t\tout->$act.$fn.tv_usec = $src->tvUsec;\n"; - } elsif ($ft eq 'string') { - gen "\t\t\tout->$act.$fn = $src;\n"; - gen "\t\t\tsoap_unlink(soap,$src);\n"; - } elsif ($ft eq 'int') { - if ($f->{codes}) { - if ($type eq '_common_') { - gen "\t\t\tedg_wll_SoapTo$fuc($src,&(out->$act.$fn));\n"; - } - else { - gen "\t\t\tedg_wll_SoapTo$name$fuc($src,&(out->$act.$fn));\n"; - } - } - elsif ($f->{optional}) { - gen "\t\t\tout->$act.$fn = *$src;\n"; - } else { - gen "\t\t\tout->$act.$fn = $src;\n"; - } - } elsif ($tn eq 'port' || $tn eq 'bool' || $tn eq 'float' || $ft eq 'double') { - if ($f->{optional}) { - gen "\t\t\tout->$act.$fn = *$src;\n"; - } else { - gen "\t\t\tout->$act.$fn = $src;\n"; - } - } elsif ($ft eq 'logsrc') { - gen "\t\t\tedg_wll_SoapToSource($src, &(out->$act.$fn));\n"; - } else { - gen "\t\t\tout->$act.$fn = $src;\n"; - } - } - } - gen "\n\t\t\treturn SOAP_OK;\n"; - gen "\t\t}\n"; - } -@@@} - - return 0; -} - - -/** - * Translate Soap event array of eventsQueryResponse to event array. - * - * \param INOUT soap instance to work with - * \param IN in result Soap structure - * \param OUT out source array of the events - */ -int edg_wll_SoapToEventsQueryRes( - struct soap *soap, - struct _lbe__QueryEventsResponse in, - edg_wll_Event **out) -{ - edg_wll_Event *events; - int i; - - - events = calloc(in.__sizeevents + 1, sizeof(*events)); - if (!events) return SOAP_FAULT; - - for (i=0; i < in.__sizeevents; i++) { - if (edg_wll_SoapToEvent(soap, GLITE_SECURITY_GSOAP_LIST_GET(in.events, i), &events[i]) != SOAP_OK) { - free_events(events); - return SOAP_FAULT; - } - } - - *out = events; - return SOAP_OK; -} diff --git a/org.glite.lb.server/src/ws_typeref.h b/org.glite.lb.server/src/ws_typeref.h deleted file mode 100644 index 4c46abf..0000000 --- a/org.glite.lb.server/src/ws_typeref.h +++ /dev/null @@ -1,111 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#ifndef GLITE_LB_WS_TYPEREF_H -#define GLITE_LB_WS_TYPEREF_H - -#ident "$Header" - -#include "glite/lb/jobstat.h" -#include "glite/lb/query_rec.h" -#include "glite/lb/events.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern void edg_wll_JobStatCodeToSoap(edg_wll_JobStatCode, enum lbt__statName *); -extern void edg_wll_SoapToJobStatCode(enum lbt__statName, edg_wll_JobStatCode *); - -extern void edg_wll_StatusToSoap(struct soap *, edg_wll_JobStat const *, struct lbt__jobStatus *); -extern void edg_wll_SoapToStatus(struct soap *, struct lbt__jobStatus const *, edg_wll_JobStat *); - -extern void edg_wll_SoapToJobStatFlags(struct lbt__jobFlags const *, int *); -extern int edg_wll_JobStatFlagsToSoap(struct soap *, const int, struct lbt__jobFlags *); - -extern void edg_wll_SoapToAttr(const enum lbt__queryAttr, edg_wll_QueryAttr *); -extern void edg_wll_AttrToSoap(const edg_wll_QueryAttr, enum lbt__queryAttr *); - -extern void edg_wll_SoapToQueryOp( - const enum lbt__queryOp, - edg_wll_QueryOp *); -extern void edg_wll_QueryOpToSoap( - const edg_wll_QueryOp, - enum lbt__queryOp *); - -extern int edg_wll_SoapToQueryVal( - const edg_wll_QueryAttr, - const struct lbt__queryRecValue *, - union edg_wll_QueryVal *); -extern int edg_wll_QueryValToSoap(struct soap *, - const edg_wll_QueryAttr, - const union edg_wll_QueryVal *, - struct lbt__queryRecValue *); - -extern int edg_wll_SoapToQueryRec( - const struct lbt__queryConditions *collection, - const struct lbt__queryRecord *in, - edg_wll_QueryRec *out); -extern int edg_wll_QueryRecToSoap(struct soap *, - const edg_wll_QueryRec *, - struct lbt__queryRecord *); - - -extern int edg_wll_SoapToQueryConds( - const struct lbt__queryConditions *, - edg_wll_QueryRec **); -extern int edg_wll_QueryCondsToSoap(struct soap *, - const edg_wll_QueryRec *, - struct lbt__queryConditions *); - -extern int edg_wll_SoapToQueryCondsExt( - GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) in, - int __sizecondition, - edg_wll_QueryRec ***); -extern int edg_wll_QueryCondsExtToSoap(struct soap *, - const edg_wll_QueryRec **, - int *, - GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) *); - -extern int edg_wll_JobsQueryResToSoap(struct soap *, - edg_wlc_JobId *, - edg_wll_JobStat *, - struct _lbe__QueryJobsResponse *); - -extern int edg_wll_UserJobsResToSoap( - struct soap *, - glite_jobid_const_t *, - const edg_wll_JobStat *, - struct _lbe__UserJobsResponse *); - -extern int edg_wll_EventsQueryResToSoap(struct soap *, - const edg_wll_Event *, - struct _lbe__QueryEventsResponse *); -extern int edg_wll_SoapToEventsQueryRes( - struct soap *, - struct _lbe__QueryEventsResponse, - edg_wll_Event **); - - -extern int edg_wll_EventToSoap(struct soap*, const edg_wll_Event *, struct lbt__event *); -extern void edg_wll_FreeSoapEvent(struct soap *, struct lbt__event *); - -#ifdef __cplusplus -} -#endif - -#endif /* GLITE_LB_WS_TYPEREF_H */ diff --git a/org.glite.lb.server/test/oneJob.qry b/org.glite.lb.server/test/oneJob.qry deleted file mode 100644 index b46289d..0000000 --- a/org.glite.lb.server/test/oneJob.qry +++ /dev/null @@ -1,32 +0,0 @@ -SELECT e.event,j.userid,j.dg_jobid,e.code,e.prog,e.host,u.cert_subj,e.time_stamp,e.usec,e.level,e.arrived FROM events e,users u,jobs j WHERE e.jobid=j.jobid AND e.userid=u.userid AND e.code != 0 AND (j.jobid='WrCEKje9QTXFiSOZuPMLtw') -0 294de3557d9d00b3d2d8a1e6aab028cf https://lhun.ics.muni.cz:4850/WrCEKje9QTXFiSOZuPMLtw 17 UserInterface lhun.ics.muni.cz anonymous 2003-08-07 11:08:40 432100 8 2003-08-07 11:08:40 -1 294de3557d9d00b3d2d8a1e6aab028cf https://lhun.ics.muni.cz:4850/WrCEKje9QTXFiSOZuPMLtw 2 NetworkServer lhun.ics.muni.cz anonymous 2003-08-07 11:09:05 664600 8 2003-08-07 11:09:05 - -select name,value from short_fields where jobid = 'WrCEKje9QTXFiSOZuPMLtw' and event = 0 -JDL x -JOBTYPE SIMPLE -NS NNNSSSS -NSUBJOBS 0 -PARENT https://lhun.ics.muni.cz:4850/Qt7utj80miXexi7bkxyhnA -SEQCODE (nil) -SRC_INSTANCE (nil) - -select name,value from long_fields where jobid = 'WrCEKje9QTXFiSOZuPMLtw' and event = 0 - -select name,value from short_fields where jobid = 'WrCEKje9QTXFiSOZuPMLtw' and event = 1 -FROM UserInterface -FROM_HOST sending component hostname -FROM_INSTANCE sending component instance -LOCAL_JOBID new jobId (Condor Globus ...) -SEQCODE UI=000002:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000:LBS=000000 -SRC_INSTANCE (nil) - -select name,value from long_fields where jobid = 'WrCEKje9QTXFiSOZuPMLtw' and event = 1 - -SELECT DISTINCT j.dg_jobid,j.userid FROM jobs j WHERE (j.jobid='WrCEKje9QTXFiSOZuPMLtw') -https://lhun.ics.muni.cz:4850/WrCEKje9QTXFiSOZuPMLtw 294de3557d9d00b3d2d8a1e6aab028cf - -SELECT e.event,j.userid,j.dg_jobid,e.code,e.prog,e.host,u.cert_subj,e.time_stamp,e.usec,e.level,e.arrived FROM events e,users u,jobs j WHERE j.dg_jobid = 'https://lhun.ics.muni.cz:4850/WrCEKje9QTXFiSOZuPMLtw' AND e.jobid=j.jobid AND e.userid=u.userid AND e.code != 0 -0 294de3557d9d00b3d2d8a1e6aab028cf https://lhun.ics.muni.cz:4850/WrCEKje9QTXFiSOZuPMLtw 17 UserInterface lhun.ics.muni.cz anonymous 2003-08-07 11:08:40 432100 8 2003-08-07 11:08:40 -1 294de3557d9d00b3d2d8a1e6aab028cf https://lhun.ics.muni.cz:4850/WrCEKje9QTXFiSOZuPMLtw 2 NetworkServer lhun.ics.muni.cz anonymous 2003-08-07 11:09:05 664600 8 2003-08-07 11:09:05 - diff --git a/org.glite.lb.server/test/test_query_events.cpp b/org.glite.lb.server/test/test_query_events.cpp deleted file mode 100644 index ba9e46f..0000000 --- a/org.glite.lb.server/test/test_query_events.cpp +++ /dev/null @@ -1,206 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#define NO_GACL -#include "lb_authz.h" -#include "get_events.h" - -using namespace std; - -static const char *test_dir; - -class QueryEventsTest: public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(QueryEventsTest); - CPPUNIT_TEST(oneJob); - CPPUNIT_TEST_SUITE_END(); - -private: - edg_wll_Context ctx; - - ifstream qry_file; - - vector > > queries; - -public: - void oneJob(); - int ExecStmt(const char *, glite_lbu_Statement *); - - void setUp() { - edg_wll_InitContext(&ctx); - ctx->dbctx = (glite_lbu_DBContext) this; /* XXX */ - ctx->dbcaps = 0; - } - - void tearDown() { - edg_wll_FreeContext(ctx); - } -}; - -void QueryEventsTest::oneJob() -{ - edg_wll_QueryRec job[2]; - const edg_wll_QueryRec *jobs[2] = { job,NULL} ; - edg_wll_Event *events; - int i; - - job[0].attr = EDG_WLL_QUERY_ATTR_JOBID; - job[0].op = EDG_WLL_QUERY_OP_EQUAL ; - glite_jobid_parse("https://lhun.ics.muni.cz:4850/WrCEKje9QTXFiSOZuPMLtw", - (glite_jobid_t *) &job[0].value.j); - job[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - string file(test_dir); - file += "/oneJob.qry"; - qry_file.open(file.c_str()); - - while (!qry_file.eof()) { - string query,line; - vector rows; - - getline(qry_file,query); - cout << "read: " << query < >(query,rows)); - } - - qry_file.close(); - - CPPUNIT_ASSERT(!edg_wll_QueryEventsServer(ctx,1,jobs,NULL,&events)); - glite_jobid_free((glite_jobid_t) job[0].value.j); - for (i = 0; events[i].type; i++) edg_wll_FreeEvent(&events[i]); - free(events); -} - -int QueryEventsTest::ExecStmt(const char *qry, glite_lbu_Statement *stmt_out) -{ - vector > >::iterator stmt = queries.begin(); - - for (; stmt != queries.end(); stmt++) { - const char *q = stmt->first.c_str(); - - /* XXX: there some spaces at the end of qry */ - if (!strncmp(q,qry,strlen(q))) break; - } - - if (stmt == queries.end()) { - cerr << "query not found" << endl; - CPPUNIT_ASSERT(0); - } - vector::iterator *rows = new vector::iterator(stmt->second.begin()); - - *stmt_out = (glite_lbu_Statement) rows; -//cerr << (*rows)->c_str() << endl; -//cerr << stmt->second.size()-1 << endl; - return stmt->second.size()-1; -} - -extern "C" { -int glite_lbu_InitDBContext(glite_lbu_DBContext *ctx, int backend, char *log_category) { return 0; } -void glite_lbu_FreeDBContext(glite_lbu_DBContext ctx) { } -int glite_lbu_DBConnect(glite_lbu_DBContext ctx, const char*str) { return 0; } -void glite_lbu_DBClose(glite_lbu_DBContext ctx) { } - -int glite_lbu_ExecSQL(glite_lbu_DBContext ctx,const char *qry,glite_lbu_Statement *stmt) -{ - cout << "glite_lbu_ExecSQL: " << qry << endl; - - class QueryEventsTest *tst = (class QueryEventsTest *)ctx; - return tst->ExecStmt(qry, stmt); -} - -int glite_lbu_FetchRow(glite_lbu_Statement stmt, unsigned int n, unsigned long int *lengths, char **cols) -{ - vector::iterator *rows = (vector::iterator *) stmt; - char *row,*p,i=0; - - if (**rows == "END") return 0; - row = strdup((*rows)->c_str()); - (*rows)++; - for (p = strtok(row,"\t"); p; p = strtok(NULL,"\t")) - cols[i++] = strdup(p); - free(row); - - return i; -} - -void glite_lbu_FreeStmt(glite_lbu_Statement *) {} - -int debug; - -int glite_lbu_QueryColumns(glite_lbu_Statement stmt, char**cols) { return 0; } -void glite_lbu_TimeToStr(long t, char **s) { *s = NULL; } -time_t glite_lbu_StrToTime(const char *c) { return (time_t)-1; } - -int glite_lbu_Transaction(glite_lbu_DBContext ctx) { return 0; } -int glite_lbu_Commit(glite_lbu_DBContext ctx) { return 0; } -int glite_lbu_Rollback(glite_lbu_DBContext ctx) { return 0; } - -int glite_lbu_bufferedInsertInit(glite_lbu_DBContext ctx, glite_lbu_bufInsert *bi, const char *table_name, long size_limit, long record_limit, const char * columns) { return 0; } -int glite_lbu_bufferedInsert(glite_lbu_bufInsert bi, const char *row) { return 0; } -int glite_lbu_bufferedInsertClose(glite_lbu_bufInsert bi) { return 0; } -int glite_lbu_QueryIndices(glite_lbu_DBContext ctx, const char *table, char ***key_names, char ****column_names) { return 0; } -int glite_lbu_DBError(glite_lbu_DBContext ctx, char **s1, char **s2) { return 0; } - -int edg_wll_JobStatusServer( - edg_wll_Context ctx, - glite_jobid_const_t job, - int flags, - edg_wll_JobStat *stat) -{ - edg_wlc_JobIdDup(job,&stat->jobId); - return 0; -} - -int edg_wll_GetACL(edg_wll_Context ctx, glite_jobid_const_t jobid, edg_wll_Acl *acl) { return 0; } -int edg_wll_CheckACL(edg_wll_Context ctx, edg_wll_Acl acl, int requested_perm) { return 0; } -void edg_wll_FreeAcl(edg_wll_Acl acl) { return; } -} - -CPPUNIT_TEST_SUITE_REGISTRATION(QueryEventsTest); - -int main (int ac,const char *av[]) -{ - CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); - CppUnit::TextUi::TestRunner runner; - - test_dir = ac >= 2 ? av[1] : "../test"; - - runner.addTest(suite); - return runner.run() ? 0 : 1; -} diff --git a/org.glite.lb.server/test/test_soap_conv.cpp b/org.glite.lb.server/test/test_soap_conv.cpp deleted file mode 100644 index e6e727a..0000000 --- a/org.glite.lb.server/test/test_soap_conv.cpp +++ /dev/null @@ -1,340 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -#include "bk_ws_H.h" -#include "ws_typeref.h" - -using namespace std; - -class SoapConvTest: public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(SoapConvTest); - CPPUNIT_TEST(Conditions); - CPPUNIT_TEST(States); - CPPUNIT_TEST_SUITE_END(); - -private: - struct soap *soap; - edg_wll_QueryRec **stdConds; - edg_wll_JobStat stdStat; - - int stdRecCmp(edg_wll_QueryRec &, edg_wll_QueryRec &); - int stdCondsCmp(edg_wll_QueryRec **, edg_wll_QueryRec **); - int soapRecCmp(struct edgwll__QueryRec &, struct edgwll__QueryRec &); - int soapCondsCmp(struct edgwll__QueryConditions &, struct edgwll__QueryConditions &); - -public: - void setUp(); - - void Conditions(); - void States(); -}; - -void SoapConvTest::setUp() -{ - soap = soap_new(); - - stdConds = (edg_wll_QueryRec **)calloc(17, sizeof(edg_wll_QueryRec *)); - - stdConds[0] = (edg_wll_QueryRec *)calloc(4, sizeof(edg_wll_QueryRec)); - stdConds[0][0].attr = EDG_WLL_QUERY_ATTR_STATUS; - stdConds[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - stdConds[0][0].value.i = EDG_WLL_JOB_DONE; - stdConds[0][1].attr = EDG_WLL_QUERY_ATTR_STATUS; - stdConds[0][1].op = EDG_WLL_QUERY_OP_EQUAL; - stdConds[0][1].value.i = EDG_WLL_JOB_RUNNING; - stdConds[0][2].attr = EDG_WLL_QUERY_ATTR_STATUS; - stdConds[0][2].op = EDG_WLL_QUERY_OP_EQUAL; - stdConds[0][2].value.i = EDG_WLL_JOB_CANCELLED; - - stdConds[1] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - stdConds[1][0].attr = EDG_WLL_QUERY_ATTR_OWNER; - stdConds[1][0].op = EDG_WLL_QUERY_OP_EQUAL; - stdConds[1][0].value.c = NULL; - - stdConds[2] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - stdConds[2][0].attr = EDG_WLL_QUERY_ATTR_JOBID; - stdConds[2][0].op = EDG_WLL_QUERY_OP_EQUAL; - edg_wlc_JobIdCreate("my.server.org", 9000, &(stdConds[2][0].value.j)); - - stdConds[3] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - stdConds[3][0].attr = EDG_WLL_QUERY_ATTR_LOCATION; - stdConds[3][0].op = EDG_WLL_QUERY_OP_EQUAL; - stdConds[3][0].value.c = strdup("my_location"); - - stdConds[4] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - stdConds[4][0].attr = EDG_WLL_QUERY_ATTR_DESTINATION; - stdConds[4][0].op = EDG_WLL_QUERY_OP_EQUAL; - stdConds[4][0].value.c = strdup("my_destination"); - - stdConds[5] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - stdConds[5][0].attr = EDG_WLL_QUERY_ATTR_DONECODE; - stdConds[5][0].op = EDG_WLL_QUERY_OP_GREATER; - stdConds[5][0].value.i = 1; - - stdConds[6] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - stdConds[6][0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - stdConds[6][0].op = EDG_WLL_QUERY_OP_EQUAL; - stdConds[6][0].attr_id.tag = strdup("color"); - stdConds[6][0].value.c = strdup("red"); - - stdConds[7] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - stdConds[7][0].attr = EDG_WLL_QUERY_ATTR_TIME; - stdConds[7][0].op = EDG_WLL_QUERY_OP_WITHIN; - stdConds[7][0].value.t = (struct timeval){10, 1}; - stdConds[7][0].value2.t = (struct timeval){20, 1}; - - stdConds[8] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - stdConds[8][0].attr = EDG_WLL_QUERY_ATTR_LEVEL; - stdConds[8][0].op = EDG_WLL_QUERY_OP_WITHIN; - stdConds[8][0].value.i = 10; - stdConds[8][0].value2.i = 20; - - stdConds[9] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - stdConds[9][0].attr = EDG_WLL_QUERY_ATTR_HOST; - stdConds[9][0].op = EDG_WLL_QUERY_OP_EQUAL; - stdConds[9][0].value.c = strdup("any.host"); - - stdConds[10] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - stdConds[10][0].attr = EDG_WLL_QUERY_ATTR_SOURCE; - stdConds[10][0].op = EDG_WLL_QUERY_OP_EQUAL; - stdConds[10][0].value.i = 2; - - stdConds[11] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - stdConds[11][0].attr = EDG_WLL_QUERY_ATTR_INSTANCE; - stdConds[11][0].op = EDG_WLL_QUERY_OP_EQUAL; - stdConds[11][0].value.c = strdup("any.instance"); - - stdConds[12] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - stdConds[12][0].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE; - stdConds[12][0].op = EDG_WLL_QUERY_OP_EQUAL; - stdConds[12][0].value.i = 1; - - stdConds[13] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - stdConds[13][0].attr = EDG_WLL_QUERY_ATTR_RESUBMITTED; - stdConds[13][0].op = EDG_WLL_QUERY_OP_EQUAL; - stdConds[13][0].value.c = strdup("where"); - - stdConds[14] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - stdConds[14][0].attr = EDG_WLL_QUERY_ATTR_PARENT; - stdConds[14][0].op = EDG_WLL_QUERY_OP_EQUAL; - edg_wlc_JobIdCreate("my.server.org", 8000, &(stdConds[14][0].value.j)); - - stdConds[15] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - stdConds[15][0].attr = EDG_WLL_QUERY_ATTR_EXITCODE; - stdConds[15][0].op = EDG_WLL_QUERY_OP_LESS; - stdConds[15][0].value.i = 255; -/* - * XXX: what is that for? - stdConds[13] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - stdConds[13][0].attr = EDG_WLL_QUERY_ATTR_CHKPT_TAG; - stdConds[13][0].op = EDG_WLL_QUERY_OP_EQUAL; - stdConds[13][0].value.i = 1; -*/ -} - -int SoapConvTest::stdCondsCmp(edg_wll_QueryRec **c1, edg_wll_QueryRec **c2) -{ - int i, j; - - - if ( (c1 && !c2) || (!c1 && c2) ) return 1; - if ( c1 ) for ( i = 0; c1[i]; i++ ) { - if ( !c2[i] ) return 2; - for ( j = 0; c1[i][j].attr; j++ ) { - if ( !c2[i][j].attr ) return 3; - if ( stdRecCmp(c1[i][j], c2[i][j]) ) return 4; - } - if ( c2[i][j].attr ) return 3; - } - if ( c2[i] ) return 2; - - return 0; -} - -int SoapConvTest::stdRecCmp(edg_wll_QueryRec &qr1, edg_wll_QueryRec &qr2) -{ - if ( qr1.attr != qr2.attr ) return 1; - if ( qr1.op != qr2.op ) return 1; - switch ( qr1.attr) { - case EDG_WLL_QUERY_ATTR_USERTAG: - if ( strcmp(qr1.attr_id.tag, qr2.attr_id.tag) ) return 1; - case EDG_WLL_QUERY_ATTR_OWNER: - case EDG_WLL_QUERY_ATTR_LOCATION: - case EDG_WLL_QUERY_ATTR_DESTINATION: - case EDG_WLL_QUERY_ATTR_HOST: - case EDG_WLL_QUERY_ATTR_INSTANCE: - if ( (qr1.value.c && !qr2.value.c) || (!qr1.value.c && qr2.value.c) ) return 1; - if ( qr1.value.c && qr2.value.c && strcmp(qr1.value.c, qr2.value.c) ) return 1; - break; - case EDG_WLL_QUERY_ATTR_JOBID: - case EDG_WLL_QUERY_ATTR_PARENT: { - char *s1, *s2; - int rv; - - s1 = edg_wlc_JobIdUnparse(qr1.value.j); - s2 = edg_wlc_JobIdUnparse(qr2.value.j); - if ( !s1 || !s2 ) rv = 1; - else rv = strcmp(s1, s2); - free(s1); free(s2); - return rv; - } - break; - case EDG_WLL_QUERY_ATTR_STATUS: - case EDG_WLL_QUERY_ATTR_DONECODE: - case EDG_WLL_QUERY_ATTR_LEVEL: - case EDG_WLL_QUERY_ATTR_SOURCE: - case EDG_WLL_QUERY_ATTR_EVENT_TYPE: - case EDG_WLL_QUERY_ATTR_RESUBMITTED: - case EDG_WLL_QUERY_ATTR_EXITCODE: - if ( (qr1.value.i != qr2.value.i) - || (qr1.op == EDG_WLL_QUERY_OP_WITHIN && qr1.value2.i != qr2.value2.i) ) - return 1; - break; - case EDG_WLL_QUERY_ATTR_TIME: - if ( (qr1.value.t.tv_sec != qr2.value.t.tv_sec - || qr1.value.t.tv_usec != qr2.value.t.tv_usec) - || (qr1.op == EDG_WLL_QUERY_OP_WITHIN - && (qr1.value2.t.tv_sec != qr2.value2.t.tv_sec - || qr1.value2.t.tv_usec != qr2.value2.t.tv_usec)) ) - return 1; - break; - /* - * XXX: what about EDG_WLL_QUERY_ATTR_CHKPT_TAG ??? - */ - default: - return 1; - } - - return 0; -} - -int SoapConvTest::soapCondsCmp(struct edgwll__QueryConditions &qc1, struct edgwll__QueryConditions &qc2) -{ - int i, j; - - - if ( qc1.__sizecondition != qc2.__sizecondition ) return 1; - if ( (qc1.condition && !qc2.condition) || (!qc1.condition && qc2.condition) ) - for ( i = 0; i < qc1.__sizecondition; i++ ) { - if ( qc1.condition[i]->attr != qc2.condition[i]->attr ) return 2; - if ( qc1.condition[i]->__sizerecords != qc2.condition[i]->__sizerecords ) return 3; - for ( j = 0; j < qc1.condition[i]->__sizerecords; j++ ) - if ( soapRecCmp(*(qc1.condition[i]->records[j]), - *(qc2.condition[i]->records[j])) ) return 4; - } - - return 0; -} - -int SoapConvTest::soapRecCmp(struct edgwll__QueryRec &qr1, struct edgwll__QueryRec &qr2) -{ - if ( qr1.op != qr2.op ) return 1; - if ( (qr1.attrid->tag && !qr2.attrid->tag) - || (!qr1.attrid->tag && qr2.attrid->tag) - || (qr1.attrid->tag && strcmp(qr1.attrid->tag, qr2.attrid->tag)) ) return 2; - if ( (qr1.attrid->state && !qr2.attrid->state) - || (!qr1.attrid->state && qr2.attrid->state) - || (qr1.attrid->state && (qr1.attrid->state != qr2.attrid->state)) ) return 3; - - if ( (qr1.value1 && !qr2.value1) - || (!qr1.value1 && qr2.value1) ) return 3; - if ( qr1.value1 ) { - if ( (qr1.value1->i && !qr2.value1->i) - || (!qr1.value1->i && qr2.value1->i) - || (qr1.value1->i && qr1.value1->i != qr2.value1->i) ) - return 4; - if ( (qr1.value1->c && !qr2.value1->c) - || (!qr1.value1->c && qr2.value1->c) - || (qr1.value1->c && strcmp(qr1.value1->c,qr2.value1->c)) ) - return 4; - if ( (qr1.value1->t && !qr2.value1->t) - || (!qr1.value1->t && qr2.value1->t) - || (qr1.value1->t && memcmp(qr1.value1->t,qr2.value1->t,sizeof(*qr2.value1->t))) ) - return 4; - } - - if ( (qr1.value2 && !qr2.value2) - || (!qr1.value2 && qr2.value2) ) return 3; - if ( qr1.value2 ) { - if ( (qr1.value2->i && !qr2.value2->i) - || (!qr1.value2->i && qr2.value2->i) - || (qr1.value2->i && qr1.value2->i != qr2.value2->i) ) - return 4; - if ( (qr1.value2->c && !qr2.value2->c) - || (!qr1.value2->c && qr2.value2->c) - || (qr1.value2->c && strcmp(qr1.value2->c,qr2.value2->c)) ) - return 4; - if ( (qr1.value2->t && !qr2.value2->t) - || (!qr1.value2->t && qr2.value2->t) - || (qr1.value2->t && memcmp(qr1.value2->t,qr2.value2->t,sizeof(*qr2.value2->t))) ) - return 4; - } - - - return 0; -} - -void SoapConvTest::Conditions() -{ - struct edgwll__QueryConditions *soapConds, *soapConds2; - edg_wll_QueryRec **stdConds2; - int ret; - int size; - void *tmp1; - - ret = edg_wll_QueryCondsExtToSoap(soap, (const edg_wll_QueryRec**)stdConds, &soapConds); - CPPUNIT_ASSERT_MESSAGE("edg_wll_QueryCondsExtToSoap()", ret == SOAP_OK); - ret = edg_wll_SoapToQueryCondsExt(soapConds, &stdConds2, &size, &tmp); - CPPUNIT_ASSERT_MESSAGE("edg_wll_SoapToQueryCondsExt()", !ret); - - CPPUNIT_ASSERT_MESSAGE("Converted std results differs", !stdCondsCmp(stdConds, stdConds2)); - - ret = edg_wll_QueryCondsExtToSoap(soap, (const edg_wll_QueryRec**)stdConds2, &soapConds2); - CPPUNIT_ASSERT_MESSAGE("edg_wll_QueryCondsExtToSoap()", ret == SOAP_OK); - - CPPUNIT_ASSERT_MESSAGE("Converted soap results differs", !soapCondsCmp(*soapConds, *soapConds2)); -} - -void SoapConvTest::States() -{ - struct edgwll__JobStat *soapStat; - edg_wll_JobStat stdStat2; -} - -CPPUNIT_TEST_SUITE_REGISTRATION(SoapConvTest); - -int main (int ac,const char *av[]) -{ - CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); - CppUnit::TextUi::TestRunner runner; - - runner.addTest(suite); - return runner.run() ? 0 : 1; -} diff --git a/org.glite.lb.server/test/test_trans.sh b/org.glite.lb.server/test/test_trans.sh deleted file mode 100644 index aabb5ad..0000000 --- a/org.glite.lb.server/test/test_trans.sh +++ /dev/null @@ -1,206 +0,0 @@ -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Simple script to test United Server Proxy behaviour -# - for internal purposes only -# - test should correspond to tests described at -# http://egee.cesnet.cz/mediawiki/index.php/LB_and_JP_cleanup#unify_lb.proxy_.2B_server - -#!/bin/bash - -QUERY_SOCK=/tmp/lb_proxy_serve.sock - - -cisti() { - echo "DB cleanup..." - - mysql -u lbserver -e "delete from users;" lbserver20trans - mysql -u lbserver -e "delete from status_tags;" lbserver20trans - mysql -u lbserver -e "delete from states;" lbserver20trans - mysql -u lbserver -e "delete from short_fields;" lbserver20trans - mysql -u lbserver -e "delete from jobs;" lbserver20trans - mysql -u lbserver -e "delete from events;" lbserver20trans - mysql -u lbserver -e "delete from server_state;" lbserver20trans - mysql -u lbserver -e "delete from notif_registrations;" lbserver20trans - mysql -u lbserver -e "delete from notif_jobs;" lbserver20trans - mysql -u lbserver -e "delete from long_fields;" lbserver20trans - mysql -u lbserver -e "delete from acls;" lbserver20trans - - echo "done." -} - -registruj() { - - echo "Registering...." - OUT=`org.glite.lb.client/build/job_reg -x -m scientific.civ.zcu.cz:7846 -s application|grep JOBID` - eval $OUT - ID1=$EDG_JOBID - OUT=`org.glite.lb.client/build/job_reg -m scientific.civ.zcu.cz:7846 -s application|grep JOBID` - eval $OUT - ID2=$EDG_JOBID - OUT=`org.glite.lb.client/build/job_reg -x -m skurut68-2.cesnet.cz:9000 -s application|grep JOBID` - eval $OUT - ID3=$EDG_JOBID - echo "done." -} - -registruj_kolekce() { - - echo "Registering...." - OUT=`org.glite.lb.client/build/job_reg -x -C -n 1 -m scientific.civ.zcu.cz:7846 -s application|grep JOBID` - eval $OUT - ID1=$EDG_WL_COLLECTION_JOBID - ID1_SUB=$EDG_WL_SUB_JOBID - OUT=`org.glite.lb.client/build/job_reg -C -n 1 -m scientific.civ.zcu.cz:7846 -s application|grep JOBID` - eval $OUT - ID2=$EDG_WL_COLLECTION_JOBID - ID2_SUB=$EDG_WL_SUB_JOBID - OUT=`org.glite.lb.client/build/job_reg -x -C -n 1 -m skurut68-2.cesnet.cz:9000 -s application|grep JOBID` - eval $OUT - ID3=$EDG_WL_COLLECTION_JOBID - ID3_SUB=$EDG_WL_SUB_JOBID - OUT=`org.glite.lb.client/build/job_reg -x -C -S -n 1 -m scientific.civ.zcu.cz:7846 -s application|grep JOBID` - eval $OUT - ID4=$EDG_WL_COLLECTION_JOBID - ID4_SUB=$EDG_WL_SUB_JOBID - OUT=`org.glite.lb.client/build/job_reg -C -S -n 1 -m scientific.civ.zcu.cz:7846 -s application|grep JOBID` - eval $OUT - ID5=$EDG_WL_COLLECTION_JOBID - ID5_SUB=$EDG_WL_SUB_JOBID - OUT=`org.glite.lb.client/build/job_reg -x -C -S -n 1 -m skurut68-2.cesnet.cz:9000 -s application|grep JOBID` - eval $OUT - ID6=$EDG_WL_COLLECTION_JOBID - ID6_SUB=$EDG_WL_SUB_JOBID - echo "done." - -} - -vypis() { - mysql -u lbserver -e "select dg_jobid,proxy,server from jobs" lbserver20trans -} - -vypis_kolekci() { - mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$1'" lbserver20trans - mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$2'" lbserver20trans|grep http - mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$3'" lbserver20trans|grep http - mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$4'" lbserver20trans|grep http - mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$5'" lbserver20trans|grep http - mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$6'" lbserver20trans|grep http - shift 6 - mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$1'" lbserver20trans|grep http - mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$2'" lbserver20trans|grep http - mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$3'" lbserver20trans|grep http - mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$4'" lbserver20trans|grep http - mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$5'" lbserver20trans|grep http - mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$6'" lbserver20trans|grep http -} - -do_stavu_cleared() { - echo "Transfering jobs to cleared state..." - stage/examples/glite-lb-cleared.sh -x -j $1 2>/dev/null - stage/examples/glite-lb-cleared.sh -j $2 2>/dev/null - stage/examples/glite-lb-cleared.sh -x -j $3 2>/dev/null - echo "done." -} - -check_states() { - echo - echo "State of job $1" - stage/examples/glite-lb-job_status -x $QUERY_SOCK $1 | grep "state : " - stage/examples/glite-lb-job_status $1 |grep "state : " - echo "State of job $2" - stage/examples/glite-lb-job_status -x $QUERY_SOCK $2 | grep "state : " - stage/examples/glite-lb-job_status $2 |grep "state : " - echo "State of job $3" - stage/examples/glite-lb-job_status -x $QUERY_SOCK $3 | grep "state : " - stage/examples/glite-lb-job_status $3 |grep "state : " -} - -test1() { - echo - echo "==================== test 1 =============================" - - cisti; - registruj; - vypis; - echo job1=$ID1 - echo job2=$ID2 - echo job3=$ID3 -} - -test2() { - echo - echo "==================== test 2 =============================" - - cisti; - registruj; - vypis; - echo job1=$ID1 - echo job2=$ID2 - echo job3=$ID3 - - do_stavu_cleared $ID1 $ID2 $ID3 - vypis; -} - -test3() { - echo - echo "==================== test 3 =============================" - - cisti; - registruj; - vypis; - echo job1=$ID1 - echo job2=$ID2 - echo job3=$ID3 - - sleep 2; - stage/bin/glite-lb-purge --cleared 1s --aborted 1s --cancelled 1s --other 1s -l -m scientific.civ.zcu.cz:7846 - vypis; -} - -test4() { - echo - echo "==================== test 4 =============================" - - cisti; - registruj; - vypis; - echo job1=$ID1 - echo job2=$ID2 - echo job3=$ID3 - - check_states $ID1 $ID2 $ID3 -} - -test5() { - echo - echo "==================== test 5 =============================" - - cisti; - registruj_kolekce; - vypis_kolekci $ID1 $ID1_SUB $ID2 $ID2_SUB $ID3 $ID3_SUB $ID4 $ID4_SUB $ID5 $ID5_SUB $ID6 $ID6_SUB -} - - - -#################################################### - -test1; -test2; -test3; -test4; -test5; diff --git a/org.glite.lb.server/test/test_xml.cpp.T b/org.glite.lb.server/test/test_xml.cpp.T deleted file mode 100644 index edd7510..0000000 --- a/org.glite.lb.server/test/test_xml.cpp.T +++ /dev/null @@ -1,238 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include - -#include -#include -#include -#include - - -#include "lb_xml_parse.h" -#include - -class XMLParseTest: public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(XMLParseTest); - CPPUNIT_TEST(protoEventTest); - CPPUNIT_TEST(protoStatusTest); - CPPUNIT_TEST_SUITE_END(); - -public: - void protoEventTest(); - void protoStatusTest(); - - -}; - -static char * compare_events(const edg_wll_Event *e1, const edg_wll_Event *e2) -{ - char *tmp1, *tmp2; - int tmp3; - - if (e1->any.type != e2->any.type) return "type"; -@@@{ - selectType $event '_common_'; - for ($event->getFieldsOrdered) { - my $f = selectField $event $_; - my $fn = getName $f; - my $ft = $f->{type}; - - my $a = "e1->any.$fn"; - my $b = "e2->any.$fn"; - - gen "\tif (!(".eval($main::compare{C}->{$ft}).")) return \"$fn\";\n"; - } - - gen "\tswitch(e1->any.type) {\n"; - for my $t (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } - $event->getTypes) - { - my $tu = uc $t; - my $tl = lcfirst $t; - if ($tl =~ m/^pBS/) { $tl = ucfirst $tl; } - if ($tl =~ m/^cREAM/) { $tl = ucfirst $tl; } - if ($tl =~ m/^condor/) { $tl = ucfirst $tl; } - - selectType $event $t; - gen "\t\tcase EDG_WLL_EVENT\_$tu :\n"; - for ($event->getFieldsOrdered) { - my $f = selectField $event $_; - my $fn = $f->{name}; - my $ft = $f->{type}; - - my $a = "e1->$tl.$fn"; - my $b = "e2->$tl.$fn"; - - gen "\t\t\tif (!(".eval($main::compare{C}->{$ft}).")) return \"$fn\";\n"; - } - gen "\t\tbreak;\n"; - } -@@@} - default: return "default"; - } /* switch */ - return NULL; -} - -static char * compare_states(const edg_wll_JobStat s1, const edg_wll_JobStat s2) -{ - char *tmp1, *tmp2; - int tmp3; -@@@{ - selectType $status '_common_'; - for (getFieldsOrdered $status) { - my $f = selectField $status $_; - my $fn = getName $f; - my $ft = $f->{type}; - - my $a = "s1.$fn"; - my $b = "s2.$fn"; - - if ($ft eq 'intlist') { - gen "\tif ( (s1.$_ != NULL) && (s2.$_ == NULL) || (s1.$_ == NULL) && (s2.$_ != NULL) ) return \"$fn\";\n"; - } - elsif ($ft eq 'strlist') { - } - elsif ($ft eq 'taglist') { - } - elsif ($ft eq 'stslist') { - } - else { - gen "\tif (!(".eval($main::compare{C}->{$ft}).")) return \"$fn\";\n"; - } - } -@@@} - return NULL; -} - -void XMLParseTest::protoEventTest() -{ - edg_wll_Context ctx; - edg_wll_Event *e1, *e2; - char *message, *et, *ed; - - edg_wll_InitContext(&ctx); - e1 = (edg_wll_Event *) calloc(2,sizeof *e1); - e1->any.type = EDG_WLL_EVENT_REGJOB; - - e1->regJob.jdl = strdup("very long job = \"blabla\" \\\\ \n hugh\t;"); - e1->regJob.ns = strdup("ns address"); - e1->regJob.jobtype = EDG_WLL_REGJOB_SIMPLE; - e1->regJob.seed = strdup("1234"); - - gettimeofday(&e1->any.timestamp,NULL); - - e1->any.host = strdup("some.host"); - e1->any.level = 7; - e1->any.priority = 0; - edg_wlc_JobIdParse("https://some.host:1234/x67qr549qc",&e1->any.jobId); - e1->any.seqcode = EDG_WLL_SEQ_BIGHELPER_INITIAL; - e1->any.user = strdup("/O=Grid/CN=This User"); - e1->any.source = EDG_WLL_SOURCE_USER_INTERFACE; - e1->any.src_instance = strdup("UI"); - - if (edg_wll_QueryEventsToXML(ctx, e1, &message)) { - edg_wll_Error(ctx,&et,&ed); - CPPUNIT_ASSERT_MESSAGE(std::string("QueryEventsToXML():") + et + " " + ed, 0); - } - - CPPUNIT_ASSERT_MESSAGE("message: ", message); - - if (edg_wll_ParseQueryEvents(ctx, message, &e2)) { - edg_wll_Error(ctx,&et,&ed); - CPPUNIT_ASSERT_MESSAGE(std::string("ParseQueryEvents():") + et + " " + ed, 0); - } - - if ((et = compare_events(e1,e2))) { - CPPUNIT_ASSERT_MESSAGE(std::string("compare_events():") + et, 0); - } -} - -void XMLParseTest::protoStatusTest() -{ - edg_wll_Context ctx; - edg_wll_JobStat s1, s2; - char *message, *et, *ed; - const struct timeval some_timeval = {14,12}; - - - edg_wll_InitContext(&ctx); - edg_wll_InitStatus(&s1); - - s1.state = EDG_WLL_JOB_SUBMITTED; - edg_wlc_JobIdParse("https://some.host:1234/x67qr549qc",&s1.jobId); - s1.owner = strdup("/O=Grid/CN=This User"); - s1.jobtype = EDG_WLL_STAT_SIMPLE; - s1.seed = strdup("4321"); - s1.condorId = strdup("condorId"); - s1.globusId = strdup("globusId"); - s1.localId = strdup("localId"); - s1.jdl = strdup("jdl"); - s1.matched_jdl = strdup("matched_jdl"); - s1.destination = strdup("destination"); - s1.condor_jdl = strdup("condor_jdl"); - s1.rsl = strdup("rsl"); - s1.reason = strdup("reason"); - s1.location = strdup("location"); - s1.ce_node = strdup("ce_node"); - s1.network_server = strdup("network_server"); - s1.subjob_failed = 1; - s1.done_code = EDG_WLL_STAT_FAILED; - s1.exit_code = 123; - s1.resubmitted = 1; - s1.cancelling = 1; - s1.cancelReason = strdup("cancelReason"); - s1.cpuTime = 10; - s1.stateEnterTime = some_timeval; - s1.lastUpdateTime = some_timeval; - s1.expectUpdate = 20; - s1.expectFrom = strdup("expectFrom"); - s1.acl = strdup("acl"); - - if (edg_wll_JobStatusToXML(ctx, s1, &message)) { - edg_wll_Error(ctx,&et,&ed); - CPPUNIT_ASSERT_MESSAGE(std::string("QueryEventsToXML():") + et + " " + ed, 0); - } - - CPPUNIT_ASSERT_MESSAGE("message: ", message); - - if (edg_wll_ParseJobStat(ctx, message, (long) strlen(message), &s2)) { - edg_wll_Error(ctx,&et,&ed); - CPPUNIT_ASSERT_MESSAGE(std::string("ParseJobStat():") + et + " " + ed, 0); - } - - if ((et = compare_states(s1,s2))) { - CPPUNIT_ASSERT_MESSAGE(std::string("compare_states():") + et, 0); - } - - - -} - -CPPUNIT_TEST_SUITE_REGISTRATION(XMLParseTest); - -int main (int ac,const char *av[]) -{ - CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); - CppUnit::TextUi::TestRunner runner; - - runner.addTest(suite); - return runner.run() ? 0 : 1; -} diff --git a/org.glite.lb.state-machine/LICENSE b/org.glite.lb.state-machine/LICENSE deleted file mode 100644 index 01b973b..0000000 --- a/org.glite.lb.state-machine/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -Copyright (c) 2004 on behalf of the EU EGEE Project: -The European Organization for Nuclear Research (CERN), -Istituto Nazionale di Fisica Nucleare (INFN), Italy -Datamat Spa, Italy -Centre National de la Recherche Scientifique (CNRS), France -CS Systeme d'Information (CSSI), France -Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden -Universiteit van Amsterdam (UvA), Netherlands -University of Helsinki (UH.HIP), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.lb.state-machine/Makefile b/org.glite.lb.state-machine/Makefile deleted file mode 100644 index 2fde846..0000000 --- a/org.glite.lb.state-machine/Makefile +++ /dev/null @@ -1,127 +0,0 @@ -# defaults -top_srcdir=.. -stagedir=. -distdir=. -globalprefix=glite -lbprefix=lb -package=glite-lb-state-machine -version=0.2.0 -PREFIX=/opt/glite - --include Makefile.inc - -VPATH = ../src:../interface - -default all: compile - -CC=gcc -CXX=g++ -AT3=${stagedir}/sbin/glite-lb-at3 - -SUFFIXES = .T - -DEBUG:=-g -O0 -Wall - -CFLAGS:= \ - ${DEBUG} \ - -I${classads_prefix}/include -I${classads_prefix}/include/classad \ - -I${stagedir}/include -I${top_srcdir}/src -I. \ - -I${top_srcdir}/interface - -COMPILE:=libtool --mode=compile ${CC} ${CFLAGS} -LINK:=libtool --mode=link ${CC} -rpath ${stagedir}/${libdir} ${LDFLAGS} -SOLINK:=libtool --mode=link ${CC} -module ${LDFLAGS} -rpath ${stagedir}/${libdir} -LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS} -INSTALL:=libtool --mode=install install -LINKXX:=libtool --mode=link ${CXX} -rpath ${stagedir}/${libdir} ${LDFLAGS} -XSLTPROC:=xsltproc --novalid - -ifneq (${classads_prefix},/usr) - classadslib := -L${classads_prefix}/${libdir} -L${classads_prefix}/lib -endif - -classadslib := ${classadslib} -lclassad - -EXT_LIBS:= -COMMON_LIBS:= -L${stagedir}/${libdir} -lglite_lb_common_${nothrflavour} -lglite_security_gss_${nothrflavour} -PLUGIN_LIBS:= -L${stagedir}/${libdir} -lglite_lb_common_${nothrflavour}\ - ${classadslib} -lstdc++ ${expatlib} -lexpat\ - -PLUGIN_LOBJS:=seqcode_aux.lo process_event.lo process_event_pbs.lo process_event_condor.lo process_event_cream.lo lb_plugin.lo process_event_file_transfer.lo process_event_file_transfer_collection.lo -MACHINE_OBJS:=seqcode_aux.o process_event.o process_event_pbs.o process_event_condor.o process_event_cream.o process_event_file_transfer.o process_event_file_transfer_collection.o - -PLUGIN_LIB=glite_lb_plugin.la -MACHINE_LIB=libglite_lb_statemachine.a - -XSD=lb-job-attrs2.xsd - -default all: compile - -compile: ${MACHINE_LIB} ${PLUGIN_LIB} ${XSD} - -${PLUGIN_LIB}: ${PLUGIN_LOBJS} - ${SOLINK} -o $@ ${PLUGIN_LOBJS} ${PLUGIN_LIBS} - -${MACHINE_LIB}: ${MACHINE_OBJS} - ar crv $@ ${MACHINE_OBJS} - -ranlib $@ - - -doc: - -stage: compile - $(MAKE) install PREFIX=${stagedir} - -install: - -mkdir -p ${PREFIX}/${libdir} ${PREFIX}/interface ${PREFIX}/include/glite/lb - install -m 644 ${MACHINE_LIB} ${PREFIX}/${libdir} - ${INSTALL} -m 755 ${PLUGIN_LIB} ${PREFIX}/${libdir} - install -m 644 ${top_srcdir}/interface/lb-job-attrs.xsd ${PREFIX}/interface - install -m 644 lb-job-attrs2.xsd ${PREFIX}/interface - install -m 644 ${top_srcdir}/interface/lb-job-record.xsd ${PREFIX}/interface - install -m 644 ${top_srcdir}/interface/intjobstat.h ${PREFIX}/include/glite/lb - install -m 644 ${top_srcdir}/interface/process_event.h ${PREFIX}/include/glite/lb - install -m 644 ${top_srcdir}/interface/seqcode_aux.h ${PREFIX}/include/glite/lb - install -m 644 job_attrs.h ${PREFIX}/include/glite/lb - install -m 644 job_attrs2.h ${PREFIX}/include/glite/lb - -clean: - rm -rvf .libs *.o *.lo ${PLUGIN_LIB} ${MACHINE_LIB} - rm -rfv job_attrs.h job_attrs2.h lb-job-attrs2.xsd glite-jpis-config.xml - rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/ - -check: - @echo No tests yet - -%.c: %.c.T - rm -f $@ - ${AT3} $< >$@ || rm -f $@ - chmod -w $@ >/dev/null - -%.cpp: %.cpp.T - rm -f $@ - ${AT3} $< >$@ || rm -f $@ - chmod -w $@ >/dev/null - -%.xsd: %.xsd.T - rm -f $@ - ${AT3} $< >$@ || rm -f $@ - chmod -w $@ >/dev/null - -%.o %.lo: %.c - ${COMPILE} -c $< - -%.lo: %.c - ${COMPILE} -o $@ -c $< - -lb_plugin.lo: lb_plugin.c job_attrs.h job_attrs2.h - ${COMPILE} -DPLUGIN_DEBUG -o $@ -c $< - -job_attrs.h: lb-job-attrs.xsd job_attrs.xsl - ${XSLTPROC} ../src/job_attrs.xsl $< >$@ - -job_attrs2.h: lb-job-attrs2.xsd job_attrs2.xsl - ${XSLTPROC} ../src/job_attrs2.xsl $< >$@ - -glite-jpis-config.xml: lb-job-attrs2.xsd jpis_config.xsl - ${XSLTPROC} ../src/jpis_config.xsl lb-job-attrs2.xsd >$@ diff --git a/org.glite.lb.state-machine/configure b/org.glite.lb.state-machine/configure deleted file mode 100755 index 71ff6f0..0000000 --- a/org.glite.lb.state-machine/configure +++ /dev/null @@ -1,843 +0,0 @@ -#!/usr/bin/perl - -# WARNING: Don't edit this file unless it is the master copy in org.glite.lb -# -# For the purpose of standalone builds of lb/jobid/lbjp-common components -# it is copied on tagging - -# $Header$ -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners/ for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use Getopt::Long; - -my $pwd = `pwd`; chomp $pwd; -my $prefix = $pwd.'/stage'; -my $stagedir; -my $staged; -my $module; -my $thrflavour = 'gcc64dbgpthr'; -my $nothrflavour = 'gcc64dbg'; -my $mode = 'build'; -my $help = 0; -my $listmodules; -my $version; -my $branch; -my $output; -my $lb_tag = ''; -my $lbjp_tag = ''; -my $jp_tag = ''; -my $sec_tag = ''; -my $jobid_tag = ''; -my $libdir = getlibdir(); - -my @nodes = qw/client server logger utils client-java doc ws-test db jpprimary jpindex jpclient harvester/; -my %enable_nodes; -my %disable_nodes; - -my %extern_prefix = ( - cares => '/opt/c-ares', - classads => '/opt/classads', - cppunit => '/usr', - expat => '/usr', - globus => '/opt/globus', - gsoap => '/usr', - mysql => '/usr', - 'mysql-devel' => '', - 'mysql-server' => '', - voms => '/opt/glite', - gridsite => '/opt/glite', - lcas => '/opt/glite', - trustmanager => '/opt/glite', - utiljava => '/opt/glite', - ant => '/usr', - jdk => '/usr', - libtar => '/usr', - axis => '/usr', - log4c => '/usr', - postgresql => '/usr' -); - -my %jar = ( - 'commons-codec' => '/usr/share/java/commons-codec.jar', - 'commons-lang' => '/usr/share/java/commons-lang.jar', -); - - -my %glite_prefix; -my %need_externs; -my %need_externs_type; -my %need_jars; -my %extrafull; -my %extranodmod; -my %deps; -my %deps_type; -my %topbuild; - -my %lbmodules = ( - 'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim glite-LB/], - 'security' => [qw/gss gsoap-plugin/], - 'lbjp-common' => [qw/db log maildir server-bones trio jp-interface/], - 'jobid' => [qw/api-c api-cpp api-java/], - 'jp' => [ qw/client doc index primary server-common ws-interface/ ], - ); - - -my @opts = ( - 'prefix=s' => \$prefix, - 'staged=s' => \$staged, - 'module=s' => \$module, - 'thrflavour=s' => \$thrflavour, - 'nothrflavour=s' => \$nothrflavour, - 'mode=s' => \$mode, - 'listmodules=s' => \$listmodules, - 'version=s' => \$version, - 'branch=s' => \$branch, - 'output=s' => \$output, - 'stage=s' => \$stagedir, - 'lb-tag=s' => \$lb_tag, - 'lbjp-common-tag=s' => \$lbjp_tag, - 'jp-tag=s' => \$jp_tag, - 'security-tag=s' => \$sec_tag, - 'jobid-tag=s' => \$jobid_tag, - 'help' => \$help, - 'libdir=s' => \$libdir, -); - -for (@nodes) { - $enable_nodes{$_} = 0; - $disable_nodes{$_} = 0; - - push @opts,"disable-$_",\$disable_nodes{$_}; - push @opts,"enable-$_",\$enable_nodes{$_}; -} - -push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix; -push @opts,"with-$_=s",\$jar{$_} for keys %jar; - -my @keeparg = @ARGV; - -GetOptions @opts or die "Errors parsing command line\n"; - -$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq ''; -$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq ''; - -if ($help) { usage(); exit 0; } - -if ($listmodules) { - my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}}; - print "@m\n"; - exit 0; -} - -warn "$0: --version, --branch and --output make sense only in --mode=etics\n" - if ($version || $output || $branch) && $mode ne 'etics'; - -my $en; -for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; } - -my $dis; -for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; } - -die "--enable-* and --disable-* are mutually exclusive\n" - if $en && $dis; - -die "--module cannot be used with --enable-* or --disable-*\n" - if $module && ($en || $dis); - -die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}}; - -if ($dis) { - for (@nodes) { - $enable_nodes{$_} = 1 unless $disable_nodes{$_}; - } -} - -if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ; - -for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; } - -$stagedir = $prefix unless $stagedir; - -if ($mode eq 'build') { - print "Writing config.status\n"; - open CONF,">config.status" or die "config.status: $!\n"; - print CONF "$0 @keeparg\n"; - close CONF; -} - - -my @modules; -my %aux; - -if ($module) { -# push @modules,split(/[,.]+/,$module); - push @modules,$module; -} -else { - @modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes)); - - my $n; - - do { - local $"="\n"; - $n = $#modules; - push @modules,(map @{$deps{$_}},@modules); - - undef %aux; @aux{@modules} = (1) x ($#modules+1); - @modules = keys %aux; - } while ($#modules > $n); -} - -@aux{@modules} = (1) x ($#modules+1); -delete $aux{$_} for (split /,/,$staged); -@modules = keys %aux; - -mode_build() if $mode eq 'build'; -mode_checkout() if $mode eq 'checkout'; -mode_etics($module) if $mode eq 'etics'; - -sub mode_build { - print "\nBuilding modules: @modules\n"; - - my @ext = map @{$need_externs{$_}},@modules; - my @myjars = map @{$need_jars{$_}},@modules; - undef %aux; @aux{@ext} = 1; - @ext = keys %aux; - undef %aux; @aux{@myjars} = (1) x ($#myjars+1); - @myjars = keys %aux; - - print "\nRequired externals:\n"; - print "\t$_: $extern_prefix{$_}\n" for @ext; - print "\t$_: $jar{$_}\n" for @myjars; - print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n"; - - mkinc($_) for @modules; - - print "Creating Makefile\n"; - - open MAK,">Makefile" or die "Makefile: $!\n"; - - print MAK "all: @modules\n\nclean:\n"; - - for (@modules) { - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - print MAK "\tcd $full$build && \${MAKE} clean\n" - } - - print MAK "\ndistclean:\n"; - - for (@modules) { - my $full = full($_); - print MAK $topbuild{$_} ? - "\tcd $full$build && \${MAKE} distclean\n" : - "\trm -rf $full$build\n" - } - - print MAK "\n"; - - for (@modules) { - my %ldeps; undef %ldeps; - @ldeps{@{$deps{$_}}} = 1; - for my $x (split /,/,$staged) { delete $ldeps{$x}; } - my @dnames = $module ? () : keys %ldeps; - - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - - print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n"; - } - - close MAK; -} - -sub mode_checkout() { - for (@modules) { - my $module = $_; - my $tag = ""; - if ($lb_tag){ - for (@{$lbmodules{lb}}){ - if ("lb.".$_ eq $module){ - $tag = '-r '.$lb_tag; - } - } - } - if ($lbjp_tag){ - for (@{$lbmodules{'lbjp-common'}}){ - if ("lbjp-common.".$_ eq $module){ - $tag = '-r '.$lbjp_tag; - } - } - } - if ($jp_tag){ - for (@{$lbmodules{'jp'}}){ - if ("jp.".$_ eq $module){ - $tag = '-r '.$jp_tag; - } - } - } - if ($sec_tag){ - for (@{$lbmodules{security}}){ - if ("security.".$_ eq $module){ - $tag = '-r '.$sec_tag; - } - } - } - if ($jobid_tag){ - for (@{$lbmodules{jobid}}){ - if ("jobid.".$_ eq $module){ - $tag = '-r '.$jobid_tag; - } - } - } - #if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){ - # print "found"; - #} - $_ = full($_); - print "\n*** Checking out $_\n"; - system("cvs checkout $tag $_") == 0 or die "cvs checkout $tag $_: $?\n"; - } -} - -BEGIN{ -%need_externs_aux = ( - 'lb.client' => [ qw/cppunit:B classads/ ], - 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava/ ], - 'lb.common' => [ qw/expat cares:B cppunit:B classads/ ], - 'lb.doc' => [], - 'lb.logger' => [ qw/cppunit:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ], - 'lb.state-machine' => [ qw/classads/ ], - 'lb.utils' => [ qw/cppunit:B/ ], - 'lb.ws-interface' => [], - 'lb.ws-test' => [ qw/gsoap:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw// ], - 'lb.yaim' => [ qw/yaim_core:R/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], - 'lbjp-common.db' => [ qw/mysql:B mysql-devel:B postgresql:B/ ], - 'lbjp-common.log' => [ qw/log4c/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw// ], - 'lbjp-common.trio' => [ qw/cppunit:B/ ], - 'lbjp-common.jp-interface' => [ qw/cppunit:B log4c:B/ ], - 'security.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B/ ], - 'security.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap:B/ ], - 'jobid.api-c' => [ qw/cppunit:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], - 'jobid.api-java' => [ qw/ant:B jdk:B/ ], - 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], - 'jp.doc' => [], - 'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ], - 'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ], - 'jp.server-common' => [], - 'jp.ws-interface' => [], -); - -for my $ext (keys %need_externs_aux) { - for (@{$need_externs_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$need_externs{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $need_externs_type{$ext}->{$1} = $type; - } -} - -%need_jars = ( - 'jobid.api-java' => [ qw/commons-codec/ ], - 'lb.client-java' => [ qw/commons-lang/ ], -); - -for my $jar (keys %need_jars) { - for (@{$need_jars{$jar}}) { - $need_externs_type{$jar}->{$_} = 'BR'; # XXX - } -} - -%deps_aux = ( - 'lb.client' => [ qw/ - lb.types:B lb.common - lbjp-common.trio - jobid.api-cpp:B jobid.api-c - security.gss - / ], - 'lb.client-java' => [ qw/ - lb.types:B - lb.ws-interface:B - jobid.api-java - / ], - 'lb.common' => [ qw/ - jobid.api-cpp:B jobid.api-c - lb.types:B lbjp-common.trio security.gss - / ], - 'lb.doc' => [ qw/lb.types:B/ ], - 'lb.logger' => [ qw/ - lbjp-common.trio - lbjp-common.log - jobid.api-c - lb.common - security.gss - / ], - 'lb.server' => [ qw/ - lb.ws-interface lb.types:B lb.common lb.state-machine - lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log - jobid.api-c - security.gsoap-plugin security.gss - / ], - 'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ], - 'lb.utils' => [ qw/ - lbjp-common.jp-interface - jobid.api-c - lbjp-common.trio lbjp-common.maildir - lb.client lb.state-machine - / ], - 'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ], - 'lb.ws-interface' => [ qw/lb.types:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw/ - jobid.api-c lbjp-common.trio lbjp-common.db lb.common lb.client - security.gss lbjp-common.log - / ], - 'lb.yaim' => [ qw// ], - 'lb.glite-LB' => [ qw/ - lb.logger:R lb.server:R lb.utils:R lb.doc:R - lb.ws-test:R lb.harvester:R lb.yaim:R - / ], - 'lbjp-common.db' => [ qw/lbjp-common.trio lbjp-common.log/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw/lbjp-common.log/ ], - 'lbjp-common.trio' => [ qw// ], - 'security.gss' => [ qw// ], - 'security.gsoap-plugin' => [ qw/security.gss/ ], - 'jobid.api-c' => [ qw// ], - 'jobid.api-cpp' => [ qw/jobid.api-c/ ], - 'jobid.api-java' => [ qw// ], - - 'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ], - - 'jp.client' => [ qw/ - jp.ws-interface - lbjp-common.jp-interface lbjp-common.maildir - jobid.api-c - security.gsoap-plugin - / ], - 'jp.doc' => [ qw// ], - 'jp.index' => [ qw/ - jp.server-common jp.ws-interface - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.primary' => [ qw/ - jobid.api-c - jp.server-common jp.ws-interface - lb.state-machine - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.server-common' => [ qw/ - lbjp-common.jp-interface lbjp-common.db - / ], - 'jp.ws-interface' => [ qw// ], -); - -for my $ext (keys %deps_aux) { - for (@{$deps_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$deps{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $deps_type{$ext}->{$1} = $type; - } -} - - -%extrafull = ( gridsite=>'org.gridsite.core'); - -#( java => 'client-java' ); -%extranodmod = ( - db => 'lbjp-common.db', - jpprimary => 'jp.primary', - jpindex => 'jp.index', - jpclient => 'jp.client', -); - -%obsoletes = ( - 'lb.yaim' => [ qq/glite-yaim-lb/ ], -); - -my @t = qw/lb.client-java jobid.api-java lb.types/; -@topbuild{@t} = (1) x ($#t+1); -} - -sub full -{ - my $short = shift; - return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short; -} - -sub mkinc -{ - my %aux; - undef %aux; - my @m=qw/ -lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB -security.gss security.gsoap-plugin -jobid.api-c jobid.api-cpp jobid.api-java -lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface -jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface -/; - @aux{@m} = (1) x ($#m+1); - - my $short = shift; - my $full = full $short; - - unless ($aux{$short}) { - print "Makefile.inc not needed in $full\n"; - return; - } - - my $build = ''; - - unless ($topbuild{$_}) { - $build = '/build'; - unless (-d "$full/build") { - mkdir "$full/build" or die "mkdir $full/build: $!\n"; - } - unlink "$full/build/Makefile"; - symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n"; - } - - open MKINC,">$full$build/Makefile.inc" - or die "$full$build/Makefile.inc: $!\n"; - - print "Creating $full$build/Makefile.inc\n"; - - print MKINC qq{ -PREFIX = $prefix -stagedir = $stagedir -thrflavour = $thrflavour -nothrflavour = $nothrflavour -libdir = $libdir -}; - - for (@{$need_externs{$short}}) { - print MKINC "${_}_prefix = $extern_prefix{$_}\n" - } - - for (@{$need_jars{$short}}) { - print MKINC "${_}_jar = $jar{$_}\n" - } - - my $need_gsoap = 0; - for (@{$need_externs{$short}}) { $need_gsoap = 1 if $_ eq 'gsoap'; } - - print MKINC "gsoap_default_version=".gsoap_version()."\n" if $need_gsoap; - - close MKINC; -} - -my %etics_externs; -my %etics_projects; -BEGIN{ - %etics_externs = ( - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - gridsite=>'org.gridsite.shared', - lcas=>'org.glite.security.lcas', - trustmanager=>'org.glite.security.trustmanager', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - yaim_core=>'org.glite.yaim.core', - ); - %etics_projects = ( - vdt=>[qw/globus globus_essentials/], - 'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/], - ); -}; - -sub mode_etics { - $fmod = shift; - - die "$0: --module required with --etics\n" unless $fmod; - - my ($subsys,$module) = split /\./,$fmod; - - my ($major,$minor,$rev,$age); - - if ($version) { - $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/; - ($major,$minor,$rev,$age) = ($1,$2,$3,$4); - } - else { - open V,"org.glite.$subsys.$module/project/version.properties" - or die "org.glite.$subsys.$module/project/version.properties: $!\n"; - - while ($_ = ) { - chomp; - ($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/; - $age = $1 if /module\.age\s*=\s*([[:digit:]]+)/; - } - close V; - } - - my @copts = (); - my %ge; - @ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1); - - for (@{$need_externs{"$subsys.$module"}}) { - if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; - } - } - - for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - push @copts,"--with-$_ \${$eext.location}/$_*.jar"; - } - - my $conf; - my $conftag; - - if ($branch) { - $conf = "glite-${subsys}-${module}_$branch"; - $conftag = $branch; - $dwpath = ""; } - else { - $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - $conftag = $conf; - $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n"; } -# my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - my $file = $output ? $output : "$conf.ini"; - open C,">$file" or die "$file: $!\n"; - - my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build"; - - my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..'; - - my $package_description = ""; - my $package_summary = ""; - - if (-e "org.glite.$subsys.$module/project/package.description") { - open V, "org.glite.$subsys.$module/project/package.description"; - $package_description = join ("", ); - close V; - chomp $package_description; - $package_description =~ s/\n/\\n/g; - $package_description = "package.description = $package_description"; - } - else { - print STDERR "package.description not found for $subsys.$module!\n"; } - - if (-e "org.glite.$subsys.$module/project/package.summary") { - open V, "org.glite.$subsys.$module/project/package.summary"; - $package_summary = join ("", ); - close V; - chomp $package_summary; - $package_summary =~ s/\n/\\n/g; - $package_summary = "package.summary = $package_summary"; - } - else { - print STDERR "package.summary not found for $subsys.$module!\n"; } - - - print STDERR "Writing $file\n"; - print C qq{ -[Configuration-$conf] -profile = None -moduleName = org.glite.$subsys.$module -displayName = $conf -description = org.glite.$subsys.$module -projectName = org.glite -age = $age -deploymentType = None -tag = $conftag -version = $major.$minor.$rev -$dwpath -[Platform-default:VcsCommand] -displayName = None -description = None -tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName} -branch = None -commit = None -checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName} - -[Platform-default:BuildCommand] -postpublish = None -packaging = None -displayName = None -description = None -doc = None -prepublish = None -publish = None -compile = make -init = None -install = make install -clean = make clean -test = make check -configure = cd $confdir && /usr/bin/perl \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts -checkstyle = None - -[Platform-default:Property] -$buildroot -$package_description -$package_summary -}; - for (@{$obsoletes{"$subsys.$module"}}) { - print C "package.obsoletes = $_\n"; - print C "package.replaces = $_\n"; - } - - print C qq{ -[Platform-default:DynamicDependency] -}; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; - } - } - - my $type = $need_externs_type{"$subsys.$module"}->{$_}; - print C "$proj|$eext = $type\n"; - } - - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "org.glite|org.glite.$_ = $type\n"; - } - - close C; -} - -sub gsoap_version { - local $_; - my $gsoap_version; - open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n"; - - while ($_ = ) { - chomp; - - $gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/; - } - close S; - return $gsoap_version; -} - -sub getlibdir { - if ( -e "/etc/debian_version") { # We are on Debian - $lib64="lib"; - $lib32="lib32"; } - else { # Another distribution - $lib64="lib64"; - $lib32="lib"; } - $libdir=$lib32; - - open INP, "uname -s | "; # Check kernel name - $kname= ; - chomp($kname); - close INP; - - if ( $kname == "Linux") { - $arch = ("x86_64\npowerpc\nppc64\n"); - - open INP, "uname -p | "; # Check processor type - $procname= ; - chomp($procname); - close INP; - - if ($arch =~/^$procname\n/) { - return ($lib64); } - - open INP, "uname -m | "; # Check machine hardware - $machname= ; - chomp($machname); - close INP; - - if ($arch =~/^$machname\n/) { - return ($lib64); } - - # special cases (hyperlink lib64, Debian) - if (-l "/usr/lib64") { - $libdir=$lib32; } - - # if /usr/lib64 doesn't exist at all (AIX) - unless ( -e "/usr/lib64" ) { - $libdir=$lib32; } - } - - if ( $kname == "SunOS") { - if (-e "/usr/lib/64") { - $libdir="lib/64"; } - } - - return $libdir; -} - -sub usage { - my @ext = keys %extern_prefix; - my @myjars, keys %jar; - - print STDERR qq{ -usage: $0 options - -General options (defaults in []): - --prefix=PREFIX destination directory [./stage] - --staged=module,module,... what is already in PREFIX (specify without org.glite.) - --thrflavour=flavour - --nothrflavour=flavour threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg] - --listmodules=subsys list modules of a subsystem - --libdir=libdir typically [lib,lib64] postfix - -Mode of operation: - --mode={checkout|build|etics} what to do [build] - -What to build: - --module=module build this module only (mostly in-Etics operation) - --enable-NODE build this "node" (set of modules) only. Available nodes are - @{$lbmodules{lb}},@{$lbmodules{security}} - --disable-NODE don't build this node - --lb-tag=tag checkout LB modules with specific tag - --jp-tag=tag checkout JP modules with specific tag - --lbjp-common-tag=tag checkout lbjp-common modules with specific tag - --security-tag=tag checkout security modules with specific tag - --jobid-tag=tag checkout jobid modules with specific tag - -Dependencies: - --with-EXTERNAL=PATH where to look for an external. Required externals - (not all for all modules) are: - @ext - --with-JAR=JAR where to look for jars. Required jars are: - @myjars - Summary of what will be used is always printed - -}; - -} diff --git a/org.glite.lb.state-machine/interface/intjobstat.h b/org.glite.lb.state-machine/interface/intjobstat.h deleted file mode 100644 index 3c0a3ac..0000000 --- a/org.glite.lb.state-machine/interface/intjobstat.h +++ /dev/null @@ -1,123 +0,0 @@ -#ifndef GLITE_LB_INTJOBSTAT_H -#define GLITE_LB_INTJOBSTAT_H - -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include "glite/lb/jobstat.h" - -/* - * Internal representation of job state - * (includes edg_wll_JobStat API structure) - */ - -/* convention: revision Y.XX - DESCRIPTION */ -/* where Z.XX is version from indent + 1 (version after commit), Y = Z+1 */ -/* and DESCRIPTION is short hit why version changed */ - -#define INTSTAT_VERSION "revision 2.9 - file transfers" -// ".... MAX LENGTH 32 BYTES !! ...." - -// Internal error codes - -#define RET_FAIL 0 -#define RET_OK 1 -#define RET_FATAL RET_FAIL -#define RET_SOON 2 -#define RET_LATE 3 -#define RET_BADSEQ 4 -#define RET_SUSPECT 5 -#define RET_IGNORE 6 -#define RET_BADBRANCH 7 -#define RET_GOODBRANCH 8 -#define RET_TOOOLD 9 -#define RET_UNREG 10 -#define RET_INTERNAL 100 - - -// shallow resubmission container - holds state of each branch -// (useful when state restore is needed after ReallyRunning event) -// -typedef struct _branch_state { - int branch; - char *destination; - char *ce_node; - char *jdl; - /*!! if adding new field, modify also free_branch_state() */ -} branch_state; - - -typedef struct _intJobStat { - edg_wll_JobStat pub; - int resubmit_type; - char *last_seqcode; - char *last_cancel_seqcode; - char *branch_tag_seqcode; - char *last_branch_seqcode; - char *deep_resubmit_seqcode; - branch_state *branch_states; // branch zero terminated array - - struct timeval last_pbs_event_timestamp; - int pbs_reruning; // true if rerun event arrived - char **tag_seq_codes; - - /*!! if adding new field, modify also destroy_intJobStat_extension() * - *!! update dec/enc_intJobStat and increase INTSTAT_VERSION */ - } intJobStat; - -typedef enum _edg_wll_PBSEventSource { - EDG_WLL_PBS_EVENT_SOURCE_UNDEF = 0, - EDG_WLL_PBS_EVENT_SOURCE_SCHEDULER, - EDG_WLL_PBS_EVENT_SOURCE_SERVER, - EDG_WLL_PBS_EVENT_SOURCE_MOM, - EDG_WLL_PBS_EVENT_SOURCE_ACCOUNTING, - EDG_WLL_PBS_EVENT_SOURCE__LAST -} edg_wll_PBSEventSource; - -typedef enum _edg_wll_CondorEventSource { - EDG_WLL_CONDOR_EVENT_SOURCE_UNDEF = 0, - EDG_WLL_CONDOR_EVENT_SOURCE_COLLECTOR, - EDG_WLL_CONDOR_EVENT_SOURCE_MASTER, - EDG_WLL_CONDOR_EVENT_SOURCE_MATCH, - EDG_WLL_CONDOR_EVENT_SOURCE_NEGOTIATOR, - EDG_WLL_CONDOR_EVENT_SOURCE_SCHED, - EDG_WLL_CONDOR_EVENT_SOURCE_SHADOW, - EDG_WLL_CONDOR_EVENT_SOURCE_STARTER, - EDG_WLL_CONDOR_EVENT_SOURCE_START, - EDG_WLL_CONDOR_EVENT_SOURCE_JOBQUEUE, - EDG_WLL_CONDOR_EVENT_SOURCE__LAST -} edg_wll_CondorEventSource; - -typedef enum _subjobClassCodes { - SUBJOB_CLASS_UNDEF = 0, - SUBJOB_CLASS_RUNNING, - SUBJOB_CLASS_DONE, - SUBJOB_CLASS_ABORTED, - SUBJOB_CLASS_CLEARED, - SUBJOB_CLASS_REST -} subjobClassCodes; - -void destroy_intJobStat(intJobStat *); -void destroy_intJobStat_extension(intJobStat *p); - - -void init_intJobStat(intJobStat *p); - - -#endif /* GLITE_LB_INTJOBSTAT_H */ diff --git a/org.glite.lb.state-machine/interface/lb-job-attrs.xsd b/org.glite.lb.state-machine/interface/lb-job-attrs.xsd deleted file mode 100644 index b2dc3fc..0000000 --- a/org.glite.lb.state-machine/interface/lb-job-attrs.xsd +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Job owner according to LB - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb.state-machine/interface/lb-job-attrs2.xsd.T b/org.glite.lb.state-machine/interface/lb-job-attrs2.xsd.T deleted file mode 100644 index db35696..0000000 --- a/org.glite.lb.state-machine/interface/lb-job-attrs2.xsd.T +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - -@@@LANG: wsdl - - - - - -@@@{ - for my $s ($status->getTypesOrdered) { - my $u = uc $s; - gen qq{ \n}; - } -@@@} - - - -@@@{ -# _code_ -> ...Type - for my $n ($status->getAllFieldsOrdered) { - my $f = selectField $status $n; - if ($f->{codes}) { - my $ln = getName $f; - @ln = split /_/,$ln; - my $un = shift @ln; $un .= ucfirst shift @ln while (@ln); - gen qq{ - - -}; - - for (@{$f->{codes}}) { - my $uc = uc $_->{name}; - gen qq{ \n}; - } - gen qq{ - - -}; - } - } - -@@@} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Job status - - -@@@{ -# elems - for my $n ($status->getAllFieldsOrdered) { - my $f = selectField $status $n; - my $type = getType $f; - my $name = getName $f; - - $type = 'jobtypeType' if $name eq 'jobtype'; - - @ln = split /_/,$name; - my $un = shift @ln; $un .= ucfirst shift @ln while (@ln); - my $c = getComment $f; - - gen qq{ - $c - - -}; - - } -@@@} - - - diff --git a/org.glite.lb.state-machine/interface/lb-job-record.xsd b/org.glite.lb.state-machine/interface/lb-job-record.xsd deleted file mode 100644 index 069a42e..0000000 --- a/org.glite.lb.state-machine/interface/lb-job-record.xsd +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb.state-machine/interface/process_event.h b/org.glite.lb.state-machine/interface/process_event.h deleted file mode 100644 index 552019a..0000000 --- a/org.glite.lb.state-machine/interface/process_event.h +++ /dev/null @@ -1,24 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#ifndef GLITE_LB_PROCESS_EVENT_H -#define GLITE_LB_PROCESS_EVENT_H - -int processEvent(intJobStat *js, edg_wll_Event *e, int ev_seq, int strict, char **errstring); -int add_stringlist(char ***lptr, const char *new_item); - -#endif diff --git a/org.glite.lb.state-machine/interface/seqcode_aux.h b/org.glite.lb.state-machine/interface/seqcode_aux.h deleted file mode 100644 index daeb67c..0000000 --- a/org.glite.lb.state-machine/interface/seqcode_aux.h +++ /dev/null @@ -1,39 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -int component_seqcode(const char *a, edg_wll_Source index); - -char * set_component_seqcode(char *a,edg_wll_Source index,int val); - -int before_deep_resubmission(const char *a, const char *b); - -int same_branch(const char *a, const char *b) ; - -int edg_wll_compare_pbs_seq(const char *a,const char *b); -#define edg_wll_compare_condor_seq edg_wll_compare_pbs_seq - -edg_wll_PBSEventSource get_pbs_event_source(const char *pbs_seq_num) ; - -edg_wll_CondorEventSource get_condor_event_source(const char *condor_seq_num) ; - -int edg_wll_compare_seq(const char *a, const char *b); - -int compare_events_by_seq(const void *a, const void *b); - -int add_taglist(const char *new_item, const char *new_item2, const char *seq_code, intJobStat *js); diff --git a/org.glite.lb.state-machine/project/ChangeLog b/org.glite.lb.state-machine/project/ChangeLog deleted file mode 100644 index 32b4be6..0000000 --- a/org.glite.lb.state-machine/project/ChangeLog +++ /dev/null @@ -1,38 +0,0 @@ -1.0.0-1 -- LB 2.0 release - -1.0.0-2 -- fixed configure to work in etics - -1.0.0-3 -- Added the dummy 'check' rule to the Makefile - -1.0.0-4 -- configure script update (globus flavors added to configure call) - -1.0.0-5 -- use hostname to identify network server rather than IP (RTM compatibility) -- don't crash on null sequence codes - -1.0.0-6 -- updated configure - -1.0.0-7 -- Makefile relies on the libdir variable -- New configure script - -1.0.1-1 -- Recompute state for unknown jobs to allow purging - -1.0.2-1 -- Do not override network server endpoint with data from transfer event - -1.0.2-2 -- install libraries into $libdir - -1.1.0-1 -- Support for logging sandbox transfers as jobs of a specific type -- Support for CREAM jobs - -1.1.1-1 -- JDL status field for CREAM jobs too (for notifications) diff --git a/org.glite.lb.state-machine/project/package.description b/org.glite.lb.state-machine/project/package.description deleted file mode 100644 index 168a71b..0000000 --- a/org.glite.lb.state-machine/project/package.description +++ /dev/null @@ -1 +0,0 @@ -glite-lb-state-machine is the gLite LB state machine (server core, processing LB events to produce job state presented to the user). This package contains the state machine static (linked by server) and dynamic library (LB plugin used by Job Provenance). diff --git a/org.glite.lb.state-machine/project/package.summary b/org.glite.lb.state-machine/project/package.summary deleted file mode 100644 index c9f0240..0000000 --- a/org.glite.lb.state-machine/project/package.summary +++ /dev/null @@ -1 +0,0 @@ -gLite Logging and Bookkeeping state machine diff --git a/org.glite.lb.state-machine/project/version.properties b/org.glite.lb.state-machine/project/version.properties deleted file mode 100644 index feaaa8b..0000000 --- a/org.glite.lb.state-machine/project/version.properties +++ /dev/null @@ -1,3 +0,0 @@ -# $Header$ -module.version=1.1.1 -module.age=1 diff --git a/org.glite.lb.state-machine/src/job_attrs.xsl b/org.glite.lb.state-machine/src/job_attrs.xsl deleted file mode 100644 index 5e6fc89..0000000 --- a/org.glite.lb.state-machine/src/job_attrs.xsl +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - -#ifndef GLITE_LB_JOB_ATTRS_H -#define GLITE_LB_JOB_ATTRS_H - -#define GLITE_JP_LB_NS "http://egee.cesnet.cz/en/Schema/LB/Attributes" -#define GLITE_JP_LB_JDL_NS "http://egee.cesnet.cz/en/Schema/LB/Attributes:JDL" - - -#define GLITE_JP_LB_CLASSAD_NS "http://jdl" - -typedef enum _lb_attrs { - attr_UNDEF, -} lb_attrs; - -static const char *lb_attrNames[] = { - "UNDEFINED", -}; - -#endif /* GLITE_LB_JOB_ATTRS_H */ - - -/** */ -#define GLITE_JP_LB_ GLITE_JP_LB_NS ":" - - - attr_, /** */ - - - GLITE_JP_LB_, - - - diff --git a/org.glite.lb.state-machine/src/job_attrs2.xsl b/org.glite.lb.state-machine/src/job_attrs2.xsl deleted file mode 100644 index 6abca31..0000000 --- a/org.glite.lb.state-machine/src/job_attrs2.xsl +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - -#ifndef GLITE_LB_JOB_ATTRS2_H -#define GLITE_LB_JOB_ATTRS2_H - -#define GLITE_JP_LB_NS "http://egee.cesnet.cz/en/Schema/LB/Attributes" -#define GLITE_JP_LB_JDL_NS "http://egee.cesnet.cz/en/Schema/LB/Attributes:JDL" - - -#define GLITE_JP_LB_CLASSAD_NS "http://jdl" - -#define ATTRS2_OFFSET 100 - -typedef enum _lb_attrs2 { - attr2_UNDEF = ATTRS2_OFFSET, -} lb_attrs2; - -static const char *lb_attrNames2[] = { - "UNDEFINED", -}; - -#endif /* GLITE_LB_JOB_ATTRS2_H */ - - -/** */ -#define GLITE_JP_LB_ GLITE_JP_LB_NS ":" - - - attr2_, /** */ - - - GLITE_JP_LB_, - - - diff --git a/org.glite.lb.state-machine/src/jpis_config.xsl b/org.glite.lb.state-machine/src/jpis_config.xsl deleted file mode 100644 index a375e58..0000000 --- a/org.glite.lb.state-machine/src/jpis_config.xsl +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - -<?xml version="1.0" encoding="UTF-8"?> - -<!-- generated using org.glite.lb.state-machine module --> - -<jpelem:ServerConfiguration - xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" - xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:xsd="http://www.w3.org/2001/XMLSchema" - xmlns:jptype="http://glite.org/wsdl/types/jp" - xmlns:jpsrv="http://glite.org/wsdl/services/jp" - xmlns:jpelem="http://glite.org/wsdl/elements/jp"> - -<!-- List of attributes IS want to receive from PS's --> - <!-- Internal attributes --> - <!-- - <attrs><name>http://egee.cesnet.cz/en/Schema/JP/System:jobId</name></attrs> - <attrs><name>http://egee.cesnet.cz/en/Schema/JP/System:owner</name></attrs> - <attrs><name>http://egee.cesnet.cz/en/Schema/JP/System:regtime</name></attrs> - --> - - -<!-- List of attributes IS will index --> - <!-- default filter --> - <!--<indexedAttrs>http://egee.cesnet.cz/en/Schema/JP/System:owner</indexedAttrs>--> - <!-- internal attribute (index replacement) --> - <!--<indexedAttrs>http://egee.cesnet.cz/en/Schema/JP/System:jobId</indexedAttrs>--> - <indexedAttrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:owner</indexedAttrs> - <indexedAttrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:ceNode</indexedAttrs> - <indexedAttrs>http://egee.cesnet.cz/en/Schema/LB/Attributes:status</indexedAttrs> - -<!-- List of type plugins --> - <plugins></plugins> - -<!-- List of feeds IS wants to receive from PS's--> - <!-- no filter, historic batch and incremental changes --> - <feeds> - <!-- replace this by Job Provenance Primare Storage endpoint --> - <primaryServer>https://localhost:8901</primaryServer> - <!-- List of conditions triggering attrs sending --> - <condition> - <attr>http://egee.cesnet.cz/en/Schema/JP/System:regtime</attr> - <op>GREATER</op> - <value> - <string>0</string> - </value> - </condition> - <history>1</history> - <continuous>1</continuous> - </feeds> -</jpelem:ServerConfiguration> - - - <!-- --> - <attrs> - <name>http://egee.cesnet.cz/en/Schema/LB/Attributes:</name> - <multival>YES</multival> - <queryable>YES</queryable> - </attrs> - - - - diff --git a/org.glite.lb.state-machine/src/lb_plugin.c b/org.glite.lb.state-machine/src/lb_plugin.c deleted file mode 100644 index dbef5c1..0000000 --- a/org.glite.lb.state-machine/src/lb_plugin.c +++ /dev/null @@ -1,1913 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "glite/lbu/trio.h" - -#include "glite/lb/jobstat.h" -#include "glite/lb/events.h" -#include "glite/lb/events_parse.h" -#include "glite/lb/context-int.h" - -#include "intjobstat.h" -#include "seqcode_aux.h" - -#include "glite/jp/types.h" -#include "glite/jp/context.h" -#include "glite/jp/file_plugin.h" -#include "glite/jp/builtin_plugins.h" -#include "glite/jp/backend.h" -#include "glite/jp/attr.h" -#include "glite/jp/known_attr.h" -#include "job_attrs.h" -#include "job_attrs2.h" - -#define INITIAL_NUMBER_EVENTS 100 -#define INITIAL_NUMBER_STATES EDG_WLL_NUMBER_OF_STATCODES - -typedef struct _lb_historyStatus { - edg_wll_JobStatCode state; - struct timeval timestamp; - char *reason; - char *destination; - int done_code; -} lb_historyStatus; - -typedef struct _lb_handle { - edg_wll_Event **events; - edg_wll_JobStat status; - lb_historyStatus **fullStatusHistory, **lastStatusHistory, *finalStatus; - glite_jpps_fplug_data_t* classad_plugin; -} lb_handle; - -typedef struct _rl_buffer_t { - char *buf; - size_t pos, size; - off_t offset; -} rl_buffer_t; - -#define check_strdup(s) ((s) ? strdup(s) : NULL) - -extern int processEvent(intJobStat *, edg_wll_Event *, int, int, char **); -static void edg_wll_SortPEvents(edg_wll_Event **); - -static int lb_query(void *fpctx, void *handle, const char *attr, glite_jp_attrval_t **attrval); -static int lb_open(void *fpctx, void *bhandle, const char *uri, void **handle); -static int lb_close(void *fpctx, void *handle); -static int lb_filecom(void *fpctx, void *handle); -static int lb_status(void *handle); -static int readline( - glite_jp_context_t ctx, - void *handle, - rl_buffer_t *buffer, - char **line -); -char* get_namespace(const char* attr); - -static int lb_StringToAttr(const char *name) { - unsigned int i; - - for (i=1; i= 0 && attr < sizeof(lb_attrNames)/sizeof(lb_attrNames[0])) return strdup(lb_attrNames[attr]); - if (attr >= ATTRS2_OFFSET && attr < ATTRS2_OFFSET + sizeof(lb_attrNames2)/sizeof(lb_attrNames2[0])) return strdup(lb_attrNames2[attr]); - return NULL; -} -*/ - -static int lb_dummy(void *fpctx, void *handle, int oper, ...) { - puts("lb_dummy() - generic call not used; for testing purposes only..."); - return -1; -} - -int init(glite_jp_context_t ctx, glite_jpps_fplug_data_t *data) { - - data->fpctx = ctx; - - data->uris = calloc(2,sizeof *data->uris); - data->uris[0] = strdup(GLITE_JP_FILETYPE_LB); - - data->classes = calloc(2,sizeof *data->classes); - data->classes[0] = strdup("lb"); - - data->namespaces = calloc(4, sizeof *data->namespaces); - data->namespaces[0] = strdup(GLITE_JP_LB_NS); - data->namespaces[1] = strdup(GLITE_JP_LB_JDL_NS); - data->namespaces[2] = strdup(GLITE_JP_LBTAG_NS); - - data->ops.open = lb_open; - data->ops.close = lb_close; - data->ops.filecom = lb_filecom; - data->ops.attr = lb_query; - data->ops.generic = lb_dummy; - -#ifdef PLUGIN_DEBUG - fprintf(stderr,"lb_plugin: init OK\n"); -#endif - return 0; -} - - -void done(glite_jp_context_t ctx, glite_jpps_fplug_data_t *data) { - free(data->uris[0]); - free(data->classes[0]); - free(data->namespaces[0]); - free(data->namespaces[1]); - free(data->namespaces[2]); - free(data->uris); - free(data->classes); - free(data->namespaces); - memset(data, 0, sizeof(*data)); -} - - -static int lb_open(void *fpctx, void *bhandle, const char *uri, void **handle) { - - lb_handle *h; - rl_buffer_t buffer; - glite_jp_context_t ctx = (glite_jp_context_t) fpctx; - char *line; - int retval; - edg_wll_Context context; - int nevents, maxnevents, i; - glite_jp_error_t err; - char *id0 = NULL,*id = NULL; - - glite_jp_clear_error(ctx); - h = calloc(1, sizeof(lb_handle)); - - if ((retval = edg_wll_InitContext(&context)) != 0) return retval; - - // read the file given by bhandle - // parse events into h->events array - memset(&buffer, 0, sizeof(buffer)); - buffer.buf = malloc(BUFSIZ); - maxnevents = INITIAL_NUMBER_EVENTS; - nevents = 0; - h->events = malloc(maxnevents * sizeof(edg_wll_Event *)); - - if ((retval = readline(ctx, bhandle, &buffer, &line)) != 0) { - err.code = retval; - err.desc = "reading LB logline"; - err.source = "lb_plugin.c:read_line()"; - glite_jp_stack_error(ctx,&err); - goto fail; - } - while (line) { -#ifdef PLUGIN_DEBUG - //fprintf(stderr,"lb_plugin opened\n", line); -#endif - - if (line[0]) { - if (nevents >= maxnevents) { - maxnevents <<= 1; - h->events = realloc(h->events, maxnevents * sizeof(edg_wll_Event *)); - } - if ((retval = edg_wll_ParseEvent(context, line, &h->events[nevents])) != 0) { - char *ed; - free(line); - err.code = retval; - edg_wll_Error(context,NULL,&ed); - err.desc = ed; - err.source = "edg_wll_ParseEvent()"; - glite_jp_stack_error(ctx,&err); - free(ed); - goto fail; - } - if (nevents == 0) { - id0 = edg_wlc_JobIdGetUnique(h->events[nevents]->any.jobId ); - } else { - id = edg_wlc_JobIdGetUnique(h->events[nevents]->any.jobId ); - if (strcmp(id0,id) != 0) { - char et[BUFSIZ]; - retval = EINVAL; - err.code = retval; - snprintf(et,sizeof et,"Attempt to process different jobs. Id '%s' (event n.%d) differs from '%s'",id,nevents+1,id0); - et[BUFSIZ-1] = 0; - err.desc = et; - err.source = "lb_plugin.c:edg_wlc_JobIdGetUnique()"; - glite_jp_stack_error(ctx,&err); - goto fail; - } - } - - if (id) free(id); id = NULL; - nevents++; - } - free(line); - - if ((retval = readline(ctx, bhandle, &buffer, &line)) != 0) { - err.code = retval; - err.desc = "reading LB logline"; - err.source = "lb_plugin.c:read_line()"; - glite_jp_stack_error(ctx,&err); - goto fail; - } - } - free(line); - - free(buffer.buf); - edg_wll_FreeContext(context); - - if (nevents >= maxnevents) { - maxnevents <<= 1; - h->events = realloc(h->events, maxnevents * sizeof(edg_wll_Event *)); - } - h->events[nevents] = NULL; - -#ifdef PLUGIN_DEBUG - fprintf(stderr,"lb_plugin: opened %d events\n", nevents); -#endif - - // find classad plugin, if it is loaded - int j; - h->classad_plugin = NULL; - for (i=0; ctx->plugins[i]; i++){ - glite_jpps_fplug_data_t *pd = ctx->plugins[i]; - if (pd->namespaces) - for (j=0; pd->classes[j]; j++) - if (! strcmp(pd->classes[j], "classad")){ - h->classad_plugin = pd; - goto cont; - } - } -cont: - - /* count state and status history of the job given by the loaded events */ - if ((retval = lb_status(h)) != 0) goto fail; - - *handle = (void *)h; - - if (id0) free(id0); - if (id) free(id); - - return 0; - -fail: -#ifdef PLUGIN_DEBUG - fprintf(stderr,"lb_plugin: open ERROR\n"); -#endif - for (i = 0; i < nevents; i++) { - edg_wll_FreeEvent(h->events[i]); - free(h->events[i]); - } - free(h->events); - free(buffer.buf); - if (id0) free(id0); - if (id) free(id); - edg_wll_FreeContext(context); - free(h); - *handle = NULL; - err.code = EIO; - err.desc = NULL; - err.source = __FUNCTION__; - glite_jp_stack_error(ctx,&err); - - return retval; -} - - -static int lb_close(void *fpctx,void *handle) { - - lb_handle *h = (lb_handle *) handle; - int i; - - // Free allocated stuctures - if (h->events) { - i = 0; - while (h->events[i]) { - edg_wll_FreeEvent(h->events[i]); - free(h->events[i]); - i++; - } - free(h->events); - } - - if (h->status.state != EDG_WLL_JOB_UNDEF) - edg_wll_FreeStatus(&h->status); - - if (h->fullStatusHistory) { - i = 0; - while (h->fullStatusHistory[i]) { - free(h->fullStatusHistory[i]->reason); - free(h->fullStatusHistory[i]->destination); - free (h->fullStatusHistory[i]); - i++; - } - free(h->fullStatusHistory); - h->fullStatusHistory = NULL; - h->lastStatusHistory = NULL; - h->finalStatus = NULL; - } - - free(h); - -#ifdef PLUGIN_DEBUG - fprintf(stderr,"lb_plugin: close OK\n"); -#endif - return 0; -} - -static int get_classad_attr(const char* attr, glite_jp_context_t ctx, lb_handle *h, glite_jp_attrval_t **av){ -/* printf("attr = %s\n", attr); */ - glite_jp_error_t err; - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - if (! h->classad_plugin){ - err.code = ENOENT; - err.desc = strdup("Classad plugin has not been loaded."); - return glite_jp_stack_error(ctx,&err); - } - // Get the attribute from JDL - int i = 0; - while (h->events[i]){ - if (h->events[i]->type == EDG_WLL_EVENT_REGJOB - && h->events[i]->regJob.jdl - && h->events[i]->regJob.jdl[0]) - { - void *beh; - if (! h->classad_plugin->ops.open_str(h->classad_plugin->fpctx, h->events[i]->regJob.jdl, "", "", &beh)){ - if (! h->classad_plugin->ops.attr(h->classad_plugin->fpctx, beh, attr, av)) - (*av)[0].timestamp = h->events[i]->any.timestamp.tv_sec; - else{ - h->classad_plugin->ops.close(h->classad_plugin->fpctx, beh); - err.code = ENOENT; - err.desc = strdup("Classad attribute not found."); - return glite_jp_stack_error(ctx,&err); - } - h->classad_plugin->ops.close(h->classad_plugin->fpctx, beh); - } - } - i++; - } - return 0; -} - -static int lb_query(void *fpctx,void *handle, const char *attr,glite_jp_attrval_t **attrval) { - lb_handle *h = (lb_handle *) handle; - glite_jp_context_t ctx = (glite_jp_context_t) fpctx; - glite_jp_error_t err; - glite_jp_attrval_t *av = NULL; - int i, j, n_tags; - char *ns = get_namespace(attr); - char *tag; - int aa = lb_StringToAttr(attr); - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - if ((h->events == NULL) || - (h->status.state == EDG_WLL_JOB_UNDEF) || - (h->fullStatusHistory == NULL) ) { - *attrval = NULL; - err.code = ENOENT; - err.desc = strdup("There is no job information to query."); - free(ns); - return glite_jp_stack_error(ctx,&err); - } - - - if (strcmp(ns, GLITE_JP_LB_JDL_NS) == 0) { - if (get_classad_attr(attr, ctx, h, &av)){ - *attrval = NULL; - err.code = ENOENT; - err.desc = strdup("Cannot get attribute from classad."); - free(ns); - return glite_jp_stack_error(ctx,&err); - } - } else if (strcmp(ns, GLITE_JP_LBTAG_NS) == 0) { -/* XXX: probably obsoleted by GLITE_JP_LB_userTags below */ - tag = strrchr(attr, ':'); - if (h->events && tag) { - tag++; - i = 0; - n_tags = 0; - - while (h->events[i]) { - if ((h->events[i]->type == EDG_WLL_EVENT_USERTAG) && - (strcasecmp(h->events[i]->userTag.name, tag) == 0) ) { -/* XXX: LB tag names are case-insensitive */ - av = realloc(av, (n_tags+2) * sizeof(glite_jp_attrval_t)); - memset(&av[n_tags], 0, 2 * sizeof(glite_jp_attrval_t)); - - av[n_tags].name = strdup(attr); - av[n_tags].value = check_strdup(h->events[i]->userTag.value); - av[n_tags].timestamp = - h->events[i]->any.timestamp.tv_sec; - av[n_tags].size = -1; - - n_tags++; - } - i++; - } - } - } else if (strcmp(ns, GLITE_JP_LB_NS) == 0) { - - switch (aa) { - - case attr2_status : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = edg_wll_StatToString(h->status.state); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_jobId : - case attr_jobId : - if (h->status.jobId) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = edg_wlc_JobIdUnparse(h->status.jobId); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_owner : - case attr_user : - if (h->status.owner) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.owner); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_jobtype : - case attr_jobType : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - switch (h->status.jobtype) { - case EDG_WLL_STAT_SIMPLE: - av[0].value = strdup("SIMPLE"); break; - case EDG_WLL_STAT_DAG: - av[0].value = strdup("DAG"); break; - case EDG_WLL_STAT_COLLECTION: - av[0].value = strdup("COLLECTION"); break; - case EDG_WLL_STAT_PBS: - av[0].value = strdup("PBS"); break; - case EDG_WLL_STAT_CONDOR: - av[0].value = strdup("CONDOR"); break; - default: - av[0].value = strdup("UNKNOWN"); break; - } - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_parentJob : - case attr_parent : - if (h->status.parent_job) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = edg_wlc_JobIdUnparse(h->status.parent_job); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_seed : - if (h->status.seed) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.seed); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_childrenNum : - case attr_nsubjobs : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.children_num); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_children : - case attr_subjobs : - if ((h->status.children_num > 0) && (h->status.children)) { - char *val = NULL, *old_val; - - old_val = strdup ("\n"); - for (i=0; h->status.children[i]; i++) { - trio_asprintf(&val,"%s%|Xs\n", - old_val, h->status.children[i]); - if (old_val) free(old_val); - old_val = val; val = NULL; - } - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = check_strdup(old_val); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_childrenHist : - if ((h->status.children_num > 0) && (h->status.children_hist)) { - char *val = NULL, *old_val; - - old_val = strdup ("\n"); - for (i=1; i<=h->status.children_hist[0]; i++) { - trio_asprintf(&val,"%s%d\n", - old_val, edg_wll_StatToString(i-1), h->status.children_hist[i]); - if (old_val) free(old_val); - old_val = val; val = NULL; - } - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = check_strdup(old_val); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_childrenStates : - { - int i,j; - char *val, *old_val, *s_str, *t_str, *r_str; - struct tm *t; - - val = s_str = t_str = r_str = NULL; - old_val = strdup("\n"); - t = calloc(1, sizeof(*t)); - - if (h->status.children_states) { - for (i=0; h->status.children_states[i].state; i++) { - - s_str = edg_wll_StatToString(h->status.children_states[i].state); - for (j = 0; s_str[j]; j++) s_str[j] = toupper(s_str[j]); - if (gmtime_r(&h->status.children_states[i].stateEnterTime.tv_sec,t) != NULL) { - /* dateTime format: yyyy-mm-ddThh:mm:ss.uuuuuu */ - trio_asprintf(&t_str,"timestamp=\"%04d-%02d-%02dT%02d:%02d:%02d.%06d\" ", - 1900+t->tm_year, 1+t->tm_mon, t->tm_mday, - t->tm_hour, t->tm_min, t->tm_sec, - h->status.children_states[i].stateEnterTime.tv_usec); - } - if (h->status.children_states[i].reason) { - trio_asprintf(&r_str,"reason=\"%|Xs\" ",h->status.children_states[i].reason); - } - trio_asprintf(&val,"%s\n", - old_val, s_str ? s_str : "", t_str ? t_str : "", r_str ? r_str : ""); - if (s_str) free(s_str); s_str = NULL; - if (t_str) free(t_str); t_str = NULL; - if (r_str) free(r_str); r_str = NULL; - if (old_val) free(old_val); - old_val = val; val = NULL; - i++; - } - val = old_val; old_val = NULL; - } - if (val) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(val); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - free(val); - } - free(t); - } - break; - - case attr2_condorId : - if (h->status.condorId) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.condorId); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_globusId : - if (h->status.globusId) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.globusId); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_localId : - if (h->status.localId) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.localId); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - - case attr2_jdl : - case attr_JDL : - if (h->status.jdl) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.jdl); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - - case attr2_matchedJdl : - if (h->status.matched_jdl) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.matched_jdl); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_destination : - case attr_CE : - if (h->status.destination) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.destination); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_condorJdl : - if (h->status.condor_jdl) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.condor_jdl); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_rsl : - if (h->status.rsl) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.rsl); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_reason : - if (h->status.reason) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.reason); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_location : - if (h->status.location) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.location); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_ceNode : - case attr_host : - if (h->status.ce_node) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.ce_node); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_networkServer : - case attr_RB : - if (h->status.network_server) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.network_server); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_subjobFailed : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.subjob_failed); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_doneCode : - case attr_finalDoneStatus : - if (h->finalStatus && h->finalStatus->state == EDG_WLL_JOB_DONE) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - // trio_asprintf(&av[0].value,"%d",h->status.done_code); - switch (h->status.done_code) { - case EDG_WLL_STAT_OK : - av[0].value = strdup("OK"); break; - case EDG_WLL_STAT_FAILED : - av[0].value = strdup("FAILED"); break; - case EDG_WLL_STAT_CANCELLED : - av[0].value = strdup("CANCELLED"); break; - default : - break; - } - av[0].timestamp = h->finalStatus->timestamp.tv_sec; - } - else { - *attrval = NULL; - err.code = EINVAL; - err.desc = strdup("Final status is not Done"); - free(ns); - return glite_jp_stack_error(ctx,&err); - } - break; - - case attr2_exitCode : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.exit_code); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_resubmitted : - case attr_retryCount : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.resubmitted); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_cancelling : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.cancelling); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_cancelReason : - if (h->status.cancelReason) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.cancelReason); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_cpuTime : - case attr_CPUTime : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.cpuTime); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_userTags : - if (h->status.user_tags) { - char *val = NULL, *old_val; - - old_val = strdup ("\n"); - i = 0; - while (h->status.user_tags[i].tag) { - trio_asprintf(&val,"%s\n%|Xs\n%|Xs\n\n", - old_val, h->status.user_tags[i].tag, h->status.user_tags[i].value); - if (old_val) free(old_val); - old_val = val; val = NULL; - i++; - } - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = check_strdup(old_val); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_stateEnterTime : - case attr_finalStatusDate : - { - struct tm *t = NULL; - if ( (h->finalStatus) && - ((t = gmtime(&h->finalStatus->timestamp.tv_sec)) != NULL) ) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - /* dateTime format: yyyy-mm-ddThh:mm:ss.uuuuuu */ - trio_asprintf(&av[0].value,"%04d-%02d-%02dT%02d:%02d:%02d.%06d", - 1900+t->tm_year, 1+t->tm_mon, t->tm_mday, - t->tm_hour, t->tm_min, t->tm_sec, - h->finalStatus->timestamp.tv_usec); - av[0].size = -1; - av[0].timestamp = h->finalStatus->timestamp.tv_sec; - } else if ((t = gmtime(&h->status.lastUpdateTime.tv_sec)) != NULL) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - /* dateTime format: yyyy-mm-ddThh:mm:ss.uuuuuu */ - trio_asprintf(&av[0].value,"%04d-%02d-%02dT%02d:%02d:%02d.%06d", - 1900+t->tm_year, 1+t->tm_mon, t->tm_mday, - t->tm_hour, t->tm_min, t->tm_sec, - h->status.lastUpdateTime.tv_usec); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - } - break; - - case attr2_lastUpdateTime : - { - struct tm *t = NULL; - if ((t = gmtime(&h->status.lastUpdateTime.tv_sec)) != NULL) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - /* dateTime format: yyyy-mm-ddThh:mm:ss.uuuuuu */ - trio_asprintf(&av[0].value,"%04d-%02d-%02dT%02d:%02d:%02d.%06d", - 1900+t->tm_year, 1+t->tm_mon, t->tm_mday, - t->tm_hour, t->tm_min, t->tm_sec, - h->status.lastUpdateTime.tv_usec); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - } - break; - - - case attr2_stateEnterTimes : - if (h->status.stateEnterTimes) { - char *val = NULL, *old_val; - struct tm *t = NULL; - t = calloc(1, sizeof(*t)); - - old_val = strdup ("\n"); - for (i=1; i<=h->status.stateEnterTimes[0]; i++) { - time_t st = h->status.stateEnterTimes[i]; - - if ((st != 0) && (t = gmtime_r(&st,t)) != NULL) { - /* dateTime format: yyyy-mm-ddThh:mm:ss */ - trio_asprintf(&val,"%s%04d-%02d-%02dT%02d:%02d:%02d\n", - old_val, edg_wll_StatToString(i-1), - 1900+t->tm_year, 1+t->tm_mon, t->tm_mday, - t->tm_hour, t->tm_min, t->tm_sec); - if (old_val) free(old_val); - old_val = val; val = NULL; - } - } - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = check_strdup(old_val); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - free(t); - } - break; - - case attr2_expectUpdate : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.expectUpdate); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_expectFrom : - if (h->status.expectFrom) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.expectFrom); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_acl : - if (h->status.acl) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.acl); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_payloadRunning : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.payload_running); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_possibleDestinations : - if (h->status.possible_destinations) { - char *val = NULL, *old_val; - - old_val = strdup (""); - i = 0; - while (h->status.possible_destinations[i]) { - trio_asprintf(&val,"%s%|Xs\n", - old_val, h->status.possible_destinations[i]); - if (old_val) free(old_val); - old_val = val; val = NULL; - i++; - } - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = check_strdup(old_val); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_possibleCeNodes : - if (h->status.possible_ce_nodes) { - char *val = NULL, *old_val; - - old_val = strdup (""); - i = 0; - while (h->status.possible_ce_nodes[i]) { - trio_asprintf(&val,"%s%|Xs\n", - old_val, h->status.possible_ce_nodes[i]); - if (old_val) free(old_val); - old_val = val; val = NULL; - i++; - } - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = check_strdup(old_val); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_suspended : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.suspended); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_suspendReason : - if (h->status.suspend_reason) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.suspend_reason); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_failureReasons : - if (h->status.failure_reasons) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.failure_reasons); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_removeFromProxy : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.remove_from_proxy); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - /* PBS: */ - - case attr2_pbsState : - if (h->status.pbs_state) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.pbs_state); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_pbsQueue : - if (h->status.pbs_queue) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.pbs_queue); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_pbsOwner : - if (h->status.pbs_owner) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.pbs_owner); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_pbsName : - if (h->status.pbs_name) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.pbs_name); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_pbsReason : - if (h->status.pbs_reason) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.pbs_reason); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_pbsScheduler : - if (h->status.pbs_scheduler) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.pbs_scheduler); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_pbsDestHost : - if (h->status.pbs_dest_host) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.pbs_dest_host); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_pbsPid : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.pbs_pid); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_pbsResourceUsage : - if (h->status.pbs_resource_usage) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.pbs_resource_usage); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_pbsExitStatus : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.pbs_exit_status); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_pbsErrorDesc : - if (h->status.pbs_error_desc) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.pbs_error_desc); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - /* Condor: */ - case attr2_condorStatus : - if (h->status.condor_status) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.condor_status); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_condorUniverse : - if (h->status.condor_universe) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.condor_universe); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_condorOwner : - if (h->status.condor_owner) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.condor_owner); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_condorPreempting : - if (h->status.condor_preempting) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.condor_preempting); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_condorShadowPid : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.condor_shadow_pid); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_condorShadowExitStatus : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.condor_shadow_exit_status); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_condorStarterPid : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.condor_starter_pid); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_condorStarterExitStatus : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.condor_starter_exit_status); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_condorJobPid : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.condor_job_pid); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - case attr2_condorJobExitStatus : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - trio_asprintf(&av[0].value,"%d", h->status.condor_job_exit_status); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - break; - - - case attr2_condorDestHost : - if (h->status.condor_dest_host) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.condor_dest_host); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_condorReason : - if (h->status.condor_reason) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.condor_reason); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr2_condorErrorDesc : - if (h->status.condor_error_desc) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.condor_error_desc); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - /* Others : */ - - case attr_finalStatus : - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - if (h->finalStatus) { - av[0].value = edg_wll_StatToString(h->finalStatus->state); - av[0].timestamp = h->finalStatus->timestamp.tv_sec; - } else { - av[0].value = edg_wll_StatToString(h->status.state); - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - av[0].size = -1; - break; - - case attr_finalStatusReason : - if (h->finalStatus && h->finalStatus->reason) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->finalStatus->reason); - av[0].size = -1; - av[0].timestamp = h->finalStatus->timestamp.tv_sec; - } else if (h->status.reason) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.reason); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr_LRMSDoneStatus : - i = 0; - j = -1; - while (h->events[i]) { - if ( (h->events[i]->type == EDG_WLL_EVENT_DONE) && - (h->events[i]->any.source == EDG_WLL_SOURCE_LRMS) ) - j = i; - i++; - } - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].size = -1; - if ( j != -1) { - av[0].value = edg_wll_DoneStatus_codeToString(h->events[j]->done.status_code); - av[0].timestamp = h->events[j]->any.timestamp.tv_sec; - } else { - av[0].value = edg_wll_DoneStatus_codeToString(h->status.done_code); - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } - break; - - case attr_LRMSStatusReason : - i = 0; - j = -1; - while (h->events[i]) { - if ( (h->events[i]->type == EDG_WLL_EVENT_DONE) && - (h->events[i]->any.source == EDG_WLL_SOURCE_LRMS) ) - j = i; - i++; - } - if ( ( j != -1) && (h->events[j]->done.reason) ) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->events[j]->done.reason); - av[0].size = -1; - av[0].timestamp = h->events[j]->any.timestamp.tv_sec; - } - break; - - case attr_lastStatusHistory : - { - int i,j; - char *val, *old_val, *s_str, *t_str, *r_str; - struct tm *t; - - val = s_str = t_str = r_str = NULL; - old_val = strdup("\n"); - t = calloc(1, sizeof(*t)); - /* first record is Submitted - hopefully in fullStatusHistory[0] */ - if ((h->fullStatusHistory[0] && - (h->fullStatusHistory[0]->state == EDG_WLL_JOB_SUBMITTED)) ) { - - s_str = edg_wll_StatToString(h->fullStatusHistory[0]->state); - for (j = 0; s_str[j]; j++) s_str[j] = toupper(s_str[j]); - if (gmtime_r(&h->fullStatusHistory[0]->timestamp.tv_sec,t) != NULL) { - /* dateTime format: yyyy-mm-ddThh:mm:ss.uuuuuu */ - trio_asprintf(&t_str,"timestamp=\"%04d-%02d-%02dT%02d:%02d:%02d.%06d\" ", - 1900+t->tm_year, 1+t->tm_mon, t->tm_mday, - t->tm_hour, t->tm_min, t->tm_sec, - h->fullStatusHistory[0]->timestamp.tv_usec); - } - if (h->fullStatusHistory[0]->reason) { - trio_asprintf(&r_str,"reason=\"%|Xs\" ",h->fullStatusHistory[0]->reason); - } - trio_asprintf(&val,"%s\n", - old_val, s_str ? s_str : "", t_str ? t_str : "", r_str ? r_str : ""); - if (s_str) free(s_str); - if (t_str) free(t_str); - if (r_str) free(t_str); - if (old_val) free(old_val); - old_val = val; val = NULL; - } - /* and the rest is from last Waiting to the end - i.e. all lastStatusHistory[] */ - if (h->lastStatusHistory) { - i = 0; - while (h->lastStatusHistory[i]) { - s_str = edg_wll_StatToString(h->lastStatusHistory[i]->state); - for (j = 0; s_str[j]; j++) s_str[j] = toupper(s_str[j]); - if (gmtime_r(&h->lastStatusHistory[i]->timestamp.tv_sec,t) != NULL) { - /* dateTime format: yyyy-mm-ddThh:mm:ss.uuuuuu */ - trio_asprintf(&t_str,"timestamp=\"%04d-%02d-%02dT%02d:%02d:%02d.%06d\" ", - 1900+t->tm_year, 1+t->tm_mon, t->tm_mday, - t->tm_hour, t->tm_min, t->tm_sec, - h->lastStatusHistory[i]->timestamp.tv_usec); - } - if (h->lastStatusHistory[i]->reason) { - trio_asprintf(&r_str,"reason=\"%|Xs\" ",h->lastStatusHistory[i]->reason); - } - trio_asprintf(&val,"%s\n", - old_val, s_str ? s_str : "", t_str ? t_str : "", r_str ? r_str : ""); - if (s_str) free(s_str); s_str = NULL; - if (t_str) free(t_str); t_str = NULL; - if (r_str) free(r_str); r_str = NULL; - if (old_val) free(old_val); - old_val = val; val = NULL; - i++; - } - } - val = old_val; old_val = NULL; - if (val) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(val); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - free(val); - } - } - break; - - case attr_fullStatusHistory : - { - int i,j; - char *val, *old_val, *s_str, *t_str, *r_str; - struct tm *t; - - val = s_str = t_str = r_str = NULL; - old_val = strdup("\n"); - t = calloc(1, sizeof(*t)); - i = 0; - while (h->fullStatusHistory[i]) { - int state; - - s_str = edg_wll_StatToString(state = h->fullStatusHistory[i]->state); - for (j = 0; s_str[j]; j++) s_str[j] = toupper(s_str[j]); - if (gmtime_r(&h->fullStatusHistory[i]->timestamp.tv_sec,t) != NULL) { - /* dateTime format: yyyy-mm-ddThh:mm:ss:uuuuuu */ - trio_asprintf(&t_str,"timestamp=\"%04d-%02d-%02dT%02d:%02d:%02d.%06d\" ", - 1900+t->tm_year, 1+t->tm_mon, t->tm_mday, - t->tm_hour, t->tm_min, t->tm_sec, - h->fullStatusHistory[i]->timestamp.tv_usec); - } - if (h->fullStatusHistory[i]->reason) { - trio_asprintf(&r_str,"reason=\"%|Xs\" ",h->fullStatusHistory[i]->reason); - } - - if (h->fullStatusHistory[i]->destination && - state >= EDG_WLL_JOB_READY && - state <= EDG_WLL_JOB_DONE - ) { - char *aux; - trio_asprintf(&aux,"%s destination=\"%|Xs\"", - r_str ? r_str : "", - h->fullStatusHistory[i]->destination); - r_str = aux; - } - - if (state == EDG_WLL_JOB_DONE) { - char *aux; - trio_asprintf(&aux,"%s doneCode=\"%d\"", - r_str ? r_str : "", - h->fullStatusHistory[i]->done_code); - r_str = aux; - } - - trio_asprintf(&val,"%s\n", - old_val, s_str ? s_str : "", t_str ? t_str : "", r_str ? r_str : ""); - if (s_str) free(s_str); s_str = NULL; - if (t_str) free(t_str); t_str = NULL; - if (r_str) free(r_str); r_str = NULL; - if (old_val) free(old_val); - old_val = val; val = NULL; - i++; - } - val = old_val; old_val = NULL; - if (val) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(val); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - free(val); - } - } - break; - - - case attr_VO : - if (get_classad_attr(":VirtualOrganisation", ctx, h, &av)){ - *attrval = NULL; - err.code = ENOENT; - err.desc = strdup("Cannot get attribute from classad."); - free(ns); - return glite_jp_stack_error(ctx,&err); - } - break; - - case attr_eNodes : - if (get_classad_attr(":max_nodes_running", ctx, h, &av)){ - *attrval = NULL; - err.code = ENOENT; - err.desc = strdup("Cannot get attribute from classad."); - free(ns); - return glite_jp_stack_error(ctx,&err); - } - break; - - case attr_eProc : - if (get_classad_attr(":NodeNumber", ctx, h, &av)){ - *attrval = NULL; - err.code = ENOENT; - err.desc = strdup("Cannot get attribute from classad."); - free(ns); - return glite_jp_stack_error(ctx,&err); - } - break; - - case attr_UIHost : - i = 0; - while (h->events[i]) { - if (h->events[i]->type == EDG_WLL_EVENT_REGJOB) { - if (h->events[i]->any.host) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->events[i]->any.host); - av[0].size = -1; - av[0].timestamp = h->events[i]->any.timestamp.tv_sec; - } - break; - } - i++; - } - break; - - case attr_aTag : /* have to be retrieved from JDL, but probably obsolete and not needed at all */ - case attr_rQType : /* have to be retrieved from JDL, but probably obsolete and not needed at all */ - case attr_eDuration : /* have to be retrieved from JDL, but probably obsolete and not needed at all */ - case attr_NProc : /* currently LB hasn't got the info */ - case attr_additionalReason : /* what is it? */ - { - char et[BUFSIZ]; - *attrval = NULL; - err.code = ENOSYS; - snprintf(et,sizeof et,"Attribute '%s' not implemented yet.",attr); - et[BUFSIZ-1] = 0; - err.desc = et; - free(ns); - return glite_jp_stack_error(ctx,&err); - } - break; - - case attr_UNDEF : - case attr2_UNDEF : - default: - { - char et[BUFSIZ]; - *attrval = NULL; - err.code = ENOSYS; - snprintf(et,sizeof et,"Unknown attribute '%s' (in the '%s' namespace).",attr,ns); - et[BUFSIZ-1] = 0; - err.desc = et; - free(ns); - return glite_jp_stack_error(ctx,&err); - } - - break; - } /* switch */ - - } else { - char et[BUFSIZ]; - *attrval = NULL; - err.code = EINVAL; - snprintf(et,sizeof et,"No such attribute '%s' or namespace '%s'.",attr,ns); - et[BUFSIZ-1] = 0; - err.desc = et; - free(ns); - return glite_jp_stack_error(ctx,&err); - } - - free(ns); - - if (av && av[0].value) { - for (i=0; av[i].name; i++) av[i].origin = GLITE_JP_ATTR_ORIG_FILE; - *attrval = av; - return 0; - } else { - char et[BUFSIZ]; - *attrval = NULL; - err.code = ENOENT; - snprintf(et,sizeof et,"Value unknown for attribute '%s'.",attr); - et[BUFSIZ-1] = 0; - err.desc = et; - if (av) glite_jp_attrval_free(av,1); // XXX: probably not needed - return glite_jp_stack_error(ctx,&err); - } -} - -static int lb_filecom(void *fpctx, void *handle){ - glite_jp_context_t ctx = (glite_jp_context_t) fpctx; - lb_handle *h = (lb_handle *) handle; - glite_jp_attrval_t attr[2]; - memset(attr, 0, 2 * sizeof(glite_jp_attrval_t)); - - if (h->events) { - int i = 0; - while (h->events[i]) { - if (h->events[i]->type == EDG_WLL_EVENT_USERTAG && - strchr(h->events[i]->userTag.name,':')) - { - //printf("%s, %s\n", edg_wlc_JobIdUnparse(h->status.jobId), h->status.jobId); - attr[0].name = h->events[i]->userTag.name; - attr[0].value = h->events[i]->userTag.value; - attr[0].binary = 0; - attr[0].origin = GLITE_JP_ATTR_ORIG_USER; - attr[0].timestamp = time(NULL); - attr[0].origin_detail = NULL; /* XXX */ - attr[1].name = NULL; - glite_jppsbe_append_tags(ctx, edg_wlc_JobIdUnparse(h->status.jobId), attr); - } - i++; - } - } - - return 0; -} - -static int lb_status(void *handle) { - - lb_handle *h = (lb_handle *) handle; - intJobStat *js; - int maxnstates, nstates, i, be_strict = 0, retval; - char *errstring; - edg_wll_JobStatCode old_state = EDG_WLL_JOB_UNDEF; - - js = calloc(1, sizeof(intJobStat)); - init_intJobStat(js); - - edg_wll_SortPEvents(h->events); - - maxnstates = INITIAL_NUMBER_STATES; - nstates = 0; - h->fullStatusHistory = calloc(maxnstates, sizeof(lb_historyStatus *)); - h->lastStatusHistory = NULL; - h->finalStatus = NULL; - i = 0; - while (h->events[i]) - { - /* realloc the fullStatusHistory if needed */ - if (nstates >= maxnstates) { - maxnstates <<= 1; - h->fullStatusHistory = realloc(h->fullStatusHistory, maxnstates * sizeof(lb_historyStatus *)); - } - - /* job owner and jobId not filled from events normally */ - if (h->events[i]->any.type == EDG_WLL_EVENT_REGJOB) { - js->pub.owner = check_strdup(h->events[i]->any.user); - if (edg_wlc_JobIdDup(h->events[i]->any.jobId,&js->pub.jobId)) { - goto err; - } - } - /* Process Event and update the state */ - if (processEvent(js, h->events[i], 0, be_strict, &errstring) == RET_FATAL) { - goto err; - } - - /* if the state has changed, update the status history */ - if (js->pub.state != old_state) { - h->fullStatusHistory[nstates] = calloc(1,sizeof(lb_historyStatus)); - h->fullStatusHistory[nstates]->state = js->pub.state; - h->fullStatusHistory[nstates]->timestamp.tv_sec = js->pub.stateEnterTime.tv_sec; - h->fullStatusHistory[nstates]->timestamp.tv_usec = js->pub.stateEnterTime.tv_usec; - h->fullStatusHistory[nstates]->reason = check_strdup(js->pub.reason); - /* lastStatusHistory starts from the last WAITING state */ - if (js->pub.state == EDG_WLL_JOB_WAITING) { - h->lastStatusHistory = &(h->fullStatusHistory[nstates]); - } - /* finalStatus is the one preceeding the CLEARED state */ - if ( (js->pub.state == EDG_WLL_JOB_CLEARED) && (nstates > 0) ) { - h->finalStatus = h->fullStatusHistory[nstates-1]; - } - - h->fullStatusHistory[nstates]->destination = check_strdup(js->pub.destination); - h->fullStatusHistory[nstates]->done_code = js->pub.done_code; - - old_state = js->pub.state; - nstates++; - } - - i++; - } - h->fullStatusHistory[nstates] = NULL; - /* if there is no CLEARED state, finalStatus is just the last status - and if there is no such thing, leave h->finalStatus NULL and for the attribute - try to read something from the h->status */ - if ( (h->finalStatus == NULL) && (nstates > 0) ) { - h->finalStatus = h->fullStatusHistory[nstates-1]; - } - - /* fill in also subjobs */ - if (js->pub.children_num > 0) { - edg_wll_Context context; - edg_wlc_JobId *subjobs; - - if ((retval = edg_wll_InitContext(&context)) != 0) return retval; - subjobs = calloc(js->pub.children_num, sizeof (*subjobs)); - if ((retval = edg_wll_GenerateSubjobIds(context, - js->pub.jobId, js->pub.children_num, js->pub.seed, &subjobs) ) != 0 ) { - goto err; - } - js->pub.children = calloc(js->pub.children_num + 1, sizeof (*js->pub.children)); - for (i=0; ipub.children_num; i++) { - js->pub.children[i] = edg_wlc_JobIdUnparse(subjobs[i]); - } - edg_wll_FreeContext(context); - free(subjobs); - } - - memcpy(&h->status, &js->pub, sizeof(edg_wll_JobStat)); - - // not very clean, but working - memset(&js->pub, 0, sizeof(edg_wll_JobStat)); - destroy_intJobStat(js); - free(js); - - return 0; - -err: - destroy_intJobStat(js); - free(js); - return -1; -} - - -/* - * realloc the line to double size if needed - * - * \return 0 if failed, did nothing - * \return 1 if success - */ -/*int check_realloc_line(char **line, size_t *maxlen, size_t len) { - void *tmp; - - if (len > *maxlen) { - *maxlen <<= 1; - tmp = realloc(*line, *maxlen); - if (!tmp) return 0; - *line = tmp; - } - - return 1; -} -*/ - -/* - * read next line from stream - * - * \return error code - */ -/*static int read_line(glite_jp_context_t ctx, void *handle, lb_buffer_t *buffer, char **line) { - - size_t maxlen, len, i; - ssize_t nbytes; - int retval, z, end; - - maxlen = BUFSIZ; - i = 0; - len = 0; - *line = malloc(maxlen); - end = 0; - - do { - // read next portion - if (buffer->pos >= buffer->size) { - buffer->pos = 0; - buffer->size = 0; - if ((retval = glite_jppsbe_pread(ctx, handle, buffer->buf, BUFSIZ, buffer->offset, &nbytes)) == 0) { - if (nbytes < 0) { - retval = EINVAL; - goto fail; - } else { - if (nbytes) { - buffer->size = (size_t)nbytes; - buffer->offset += nbytes; - } else end = 1; - } - } else goto fail; - } - - // we have buffer->size - buffer->pos bytes - i = buffer->pos; - do { - if (i >= buffer->size) z = '\0'; - else { - z = buffer->buf[i]; - if (z == '\n') z = '\0'; - } - len++; - - if (!check_realloc_line(line, &maxlen, len)) { - retval = ENOMEM; - goto fail; - } - (*line)[len - 1] = z; - i++; - } while (z && i < buffer->size); - buffer->pos = i; - } while (len && (*line)[len - 1] != '\0'); - - if ((!len || !(*line)[0]) && end) { - free(*line); - *line = NULL; - } - - return 0; - -fail: - free(*line); - *line = NULL; - return retval; -} -*/ - - -static int compare_pevents_by_seq(const void *a, const void *b) -{ - const edg_wll_Event **e = (const edg_wll_Event **) a; - const edg_wll_Event **f = (const edg_wll_Event **) b; - return compare_events_by_seq(*e,*f); -} - - -static void edg_wll_SortPEvents(edg_wll_Event **e) -{ - edg_wll_Event **p; - int n; - - if (!e) return; - p = e; - for (n=0; *p; n++) { - p++; - } - qsort(e,n,sizeof(*e),compare_pevents_by_seq); -} - -int check_realloc_line(char **line, size_t *maxlen, size_t len) { - void *tmp; - - if (len > *maxlen) { - *maxlen <<= 1; - tmp = realloc(*line, *maxlen); - if (!tmp) return 0; - *line = tmp; - } - - return 1; -} - -int readline( - glite_jp_context_t ctx, - void *handle, - rl_buffer_t *buffer, - char **line -) -{ - size_t maxlen, len, i; - ssize_t nbytes; - int retval, z, end; - - maxlen = BUFSIZ; - i = 0; - len = 0; - *line = malloc(maxlen); - end = 0; - - do { - /* read next portion */ - if (buffer->pos >= buffer->size) { - buffer->pos = 0; - buffer->size = 0; - if ((retval = glite_jppsbe_pread(ctx, handle, buffer->buf, BUFSIZ, buffer->offset, &nbytes)) == 0) { - if (nbytes < 0) { - retval = EINVAL; - goto fail; - } else { - if (nbytes) { - buffer->size = (size_t)nbytes; - buffer->offset += nbytes; - } else end = 1; - } - } else goto fail; - } - - /* we have buffer->size - buffer->pos bytes */ - i = buffer->pos; - do { - if (i >= buffer->size) z = '\0'; - else { - z = buffer->buf[i]; - if (z == '\n') z = '\0'; - } - len++; - - if (!check_realloc_line(line, &maxlen, len)) { - retval = ENOMEM; - goto fail; - } - (*line)[len - 1] = z; - i++; - } while (z && i < buffer->size); - buffer->pos = i; - } while (len && (*line)[len - 1] != '\0'); - - if ((!len || !(*line)[0]) && end) { - free(*line); - *line = NULL; - } - - return 0; - -fail: - free(*line); - *line = NULL; - return retval; -} - -char* get_namespace(const char* attr){ - char* namespace = strdup(attr); - char* colon = strrchr(namespace, ':'); - if (colon) - namespace[strrchr(namespace, ':') - namespace] = 0; - else - namespace[0] = 0; - return namespace; -} - diff --git a/org.glite.lb.state-machine/src/process_event.c b/org.glite.lb.state-machine/src/process_event.c deleted file mode 100644 index 20fcb21..0000000 --- a/org.glite.lb.state-machine/src/process_event.c +++ /dev/null @@ -1,1113 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include - -#include "glite/lb/context-int.h" - -#include "glite/lbu/trio.h" - -#include "intjobstat.h" -#include "seqcode_aux.h" -#include "process_event.h" - - -/* TBD: share in whole logging or workload */ -#ifdef __GNUC__ -#define UNUSED_VAR __attribute__((unused)) -#else -#define UNUSED_VAR -#endif - -static int processEvent_glite(intJobStat *js, edg_wll_Event *e, int ev_seq, int strict, char **errstring); -int processEvent_PBS(intJobStat *js, edg_wll_Event *e, int ev_seq, int strict, char **errstring); -int processEvent_Condor(intJobStat *js, edg_wll_Event *e, int ev_seq, int strict, char **errstring); -int processEvent_Cream(intJobStat *js, edg_wll_Event *e, int ev_seq, int strict, char **errstring); -int processEvent_FileTransfer(intJobStat *js, edg_wll_Event *e, int ev_seq, int strict, char **errstring); -int processEvent_FileTransferCollection(intJobStat *js, edg_wll_Event *e, int ev_seq, int strict, char **errstring); - -int add_stringlist(char ***lptr, const char *new_item); - -int processEvent(intJobStat *js, edg_wll_Event *e, int ev_seq, int strict, char **errstring) -{ - if (js->pub.jobtype == -1 && e->type == EDG_WLL_EVENT_REGJOB) - switch (e->regJob.jobtype) { - case EDG_WLL_REGJOB_SIMPLE: - js->pub.jobtype = EDG_WLL_STAT_SIMPLE; - break; - case EDG_WLL_REGJOB_DAG: - case EDG_WLL_REGJOB_PARTITIONABLE: - case EDG_WLL_REGJOB_PARTITIONED: - js->pub.jobtype = EDG_WLL_STAT_DAG; - break; - case EDG_WLL_REGJOB_COLLECTION: - js->pub.jobtype = EDG_WLL_STAT_COLLECTION; - break; - case EDG_WLL_REGJOB_PBS: - js->pub.jobtype = EDG_WLL_STAT_PBS; - break; - case EDG_WLL_REGJOB_CONDOR: - js->pub.jobtype = EDG_WLL_STAT_CONDOR; - break; - case EDG_WLL_REGJOB_CREAM: - js->pub.jobtype = EDG_WLL_STAT_CREAM; - break; - case EDG_WLL_REGJOB_FILE_TRANSFER: - js->pub.jobtype = EDG_WLL_STAT_FILE_TRANSFER; - break; - case EDG_WLL_REGJOB_FILE_TRANSFER_COLLECTION: - js->pub.jobtype = EDG_WLL_STAT_FILE_TRANSFER_COLLECTION; - break; - default: - trio_asprintf(errstring,"unknown job type %d in registration",e->regJob.jobtype); - return RET_FAIL; - } - - switch (js->pub.jobtype) { - case EDG_WLL_STAT_SIMPLE: - case EDG_WLL_STAT_DAG: - case EDG_WLL_STAT_COLLECTION: - return processEvent_glite(js,e,ev_seq,strict,errstring); - case EDG_WLL_STAT_PBS: - return processEvent_PBS(js,e,ev_seq,strict,errstring); - case EDG_WLL_STAT_CONDOR: - return processEvent_Condor(js,e,ev_seq,strict,errstring); - case EDG_WLL_STAT_CREAM: - return processEvent_Cream(js,e,ev_seq,strict,errstring); - case EDG_WLL_STAT_FILE_TRANSFER: - return processEvent_FileTransfer(js,e,ev_seq,strict,errstring); - case EDG_WLL_STAT_FILE_TRANSFER_COLLECTION: - return processEvent_FileTransferCollection(js,e,ev_seq,strict,errstring); - case -1: return RET_UNREG; - default: - trio_asprintf(errstring,"undefined job type %d",js->pub.jobtype); - return RET_FAIL; - } -} - -#define rep(a,b) { free(a); a = (b == NULL) ? NULL : strdup(b); } -#define rep_null(a) { free(a); a = NULL; } -#define rep_cond(a,b) { if (b) { free(a); a = strdup(b); } } - -static void free_stringlist(char ***lptr) -{ - char **itptr; - int i; - - if (*lptr) { - for (i = 0, itptr = *lptr; itptr[i] != NULL; i++) - free(itptr[i]); - free(itptr); - *lptr = NULL; - } -} - - - -static void update_branch_state(char *b, char *d, char *c, char *j, branch_state **bs) -{ - int i = 0, branch; - - - if (!b) - return; - else - branch = component_seqcode(b, EDG_WLL_SOURCE_WORKLOAD_MANAGER); - - if (*bs != NULL) { - while ((*bs)[i].branch) { - if (branch == (*bs)[i].branch) { - if (d) rep((*bs)[i].destination, d); - if (c) rep((*bs)[i].ce_node, c); - if (j) rep((*bs)[i].jdl, j); - - return; - } - i++; - } - } - - *bs = (branch_state *) realloc(*bs, (i+2)*sizeof(branch_state)); - memset(&((*bs)[i]), 0, 2*sizeof(branch_state)); - - (*bs)[i].branch = branch; - rep((*bs)[i].destination, d); - rep((*bs)[i].ce_node, c); - rep((*bs)[i].jdl, j); -} - - -static void free_branch_state(branch_state **bs) -{ - int i = 0; - - if (*bs == NULL) return; - - while ((*bs)[i].branch) { - free((*bs)[i].destination); - free((*bs)[i].ce_node); - free((*bs)[i].jdl); - i++; - } - free(*bs); - *bs = NULL; -} - -static int compare_branch_states(const void *a, const void *b) -{ - branch_state *c = (branch_state *) a; - branch_state *d = (branch_state *) b; - - if (c->branch < d->branch) return -1; - if (c->branch == d->branch) return 0; - /* avoid warning: if (c->branch > d->branch) */ return 1; -} - -static void load_branch_state(intJobStat *js) -{ - int i, j, branch; - - - if ( (!js->branch_tag_seqcode) || (!js->branch_states) ) return; - - branch = component_seqcode(js->branch_tag_seqcode, EDG_WLL_SOURCE_WORKLOAD_MANAGER); - - // count elements - i = 0; - while (js->branch_states[i].branch) i++; - - // sort them - qsort(js->branch_states, (size_t) i, sizeof(branch_state), - compare_branch_states); - - // find row corresponding to ReallyRunning WM seq.code (aka branch) - i = 0; - while (js->branch_states[i].branch) { - if (js->branch_states[i].branch == branch) break; - i++; - } - - // copy this and two before branches data to final state - // (each field - dest,ce,jdl - comes from different event) - // (and these events have most likely different WM seq.codes) - // (even belonging into one logical branch) - // (the newer the more important - so i-th element is copied as last) - // (and may overwrite data from previous elements) - for (j = i - 2; j <= i; j++) { - if (j >= 0) { - if (js->branch_states[j].destination) - rep(js->pub.destination, js->branch_states[j].destination); - if (js->branch_states[j].ce_node) - rep(js->pub.ce_node, js->branch_states[j].ce_node); - if (js->branch_states[j].jdl) - rep(js->pub.matched_jdl, js->branch_states[j].jdl); - } - } -} - -// clear branches (deep resub. or abort) -static void reset_branch(intJobStat *js, edg_wll_Event *e) -{ - js->resubmit_type = EDG_WLL_RESUBMISSION_WILLRESUB; - free_stringlist(&js->pub.possible_destinations); - free_stringlist(&js->pub.possible_ce_nodes); - free_branch_state(&js->branch_states); - js->pub.payload_running = 0; - rep_null(js->branch_tag_seqcode); - rep(js->deep_resubmit_seqcode, e->any.seqcode); -} - -static char* location_string(const char *source, const char *host, const char *instance) -{ - char *ret; - trio_asprintf(&ret, "%s/%s/%s", source, host, instance); - return ret; -} - -/* is seq. number of 'es' before WMS higher then 'js' */ -static int after_enter_wm(const char *es,const char *js) -{ - return ((component_seqcode(es,EDG_WLL_SOURCE_NETWORK_SERVER) > - component_seqcode(js,EDG_WLL_SOURCE_NETWORK_SERVER)) - || - (component_seqcode(es,EDG_WLL_SOURCE_USER_INTERFACE) > - component_seqcode(js,EDG_WLL_SOURCE_USER_INTERFACE))); -} - - -static int badEvent(intJobStat *js UNUSED_VAR, edg_wll_Event *e, int ev_seq UNUSED_VAR) -{ - char *str; - - str = edg_wll_EventToString(e->any.type); - fprintf(stderr, "edg_wll_JobStatus: bad event: type %d (%s)\n", - e->any.type, (str == NULL) ? "unknown" : str); - free(str); - return RET_FATAL; -} - - -// (?) || (0 && 1) => true if (res == RET_OK) -#define USABLE(res,strict) ((res) == RET_OK || ( (res) == RET_SOON && !strict)) - -// (?) || (1 && 1) => always true -#define USABLE_DATA(res,strict) ((res) == RET_OK || ( (res) != RET_FATAL && !strict)) - -#define USABLE_BRANCH(fine_res) ((fine_res) != RET_TOOOLD && (fine_res) != RET_BADBRANCH) -#define LRMS_STATE(state) ((state) == EDG_WLL_JOB_RUNNING || (state) == EDG_WLL_JOB_DONE) -#define PARSABLE_SEQCODE(code) ((code) && component_seqcode((code),0) >= 0) - -static int processEvent_glite(intJobStat *js, edg_wll_Event *e, int ev_seq, int strict, char **errstring) -{ - edg_wll_JobStatCode old_state = js->pub.state; - edg_wll_JobStatCode new_state = EDG_WLL_JOB_UNKNOWN; - int res = RET_OK, - fine_res = RET_OK; - - int lm_favour_lrms = 0; - int ignore_seq_code = 0; - - // Aborted may not be terminal state for collection in some cases - // i.e. if some Done/failed subjob is resubmitted - if ( (old_state == EDG_WLL_JOB_ABORTED && e->any.type != EDG_WLL_EVENT_COLLECTIONSTATE) || - old_state == EDG_WLL_JOB_CANCELLED || - old_state == EDG_WLL_JOB_CLEARED) { - res = RET_LATE; - } - -/* new event coming from NS or UI => forget about any resubmission loops */ - if (e->type != EDG_WLL_EVENT_CANCEL && - js->last_seqcode && - after_enter_wm(e->any.seqcode,js->last_seqcode)) - { - rep_null(js->branch_tag_seqcode); - rep_null(js->deep_resubmit_seqcode); - rep_null(js->last_branch_seqcode); - } - - if (js->deep_resubmit_seqcode && - before_deep_resubmission(e->any.seqcode, js->deep_resubmit_seqcode)) { - res = RET_LATE; - fine_res = RET_TOOOLD; - } - else if (js->branch_tag_seqcode) { // ReallyRunning ev. arrived - if (same_branch(e->any.seqcode, js->branch_tag_seqcode)) { - if ((js->last_branch_seqcode != NULL) && - edg_wll_compare_seq(e->any.seqcode, js->last_branch_seqcode) < 0) { - res = RET_LATE; - } - fine_res = RET_GOODBRANCH; - } - else { - res = RET_LATE; - fine_res = RET_BADBRANCH; - } - } - else if ((js->last_seqcode != NULL) && - edg_wll_compare_seq(e->any.seqcode, js->last_seqcode) < 0) { - res = RET_LATE; - } - - - switch (e->any.type) { - case EDG_WLL_EVENT_TRANSFER: - if (e->transfer.result == EDG_WLL_TRANSFER_OK) { - switch (e->transfer.source) { - case EDG_WLL_SOURCE_USER_INTERFACE: - new_state = EDG_WLL_JOB_WAITING; break; - case EDG_WLL_SOURCE_JOB_SUBMISSION: - /* if (LRMS_STATE(old_state)) res = RET_LATE; */ - new_state = EDG_WLL_JOB_READY; break; - case EDG_WLL_SOURCE_LOG_MONITOR: - if (LRMS_STATE(old_state)) { - js->pub.stateEnterTimes[1 + EDG_WLL_JOB_SCHEDULED] = - e->any.timestamp.tv_sec; - res = RET_LATE; - } - new_state = EDG_WLL_JOB_SCHEDULED; - lm_favour_lrms = 1; - break; - default: - goto bad_event; break; - } - } else if (e->transfer.result == EDG_WLL_TRANSFER_FAIL) { - /* transfer failed */ - switch (e->transfer.source) { - case EDG_WLL_SOURCE_USER_INTERFACE: - new_state = EDG_WLL_JOB_SUBMITTED; break; - case EDG_WLL_SOURCE_JOB_SUBMISSION: - if (LRMS_STATE(old_state)) res = RET_LATE; - new_state = EDG_WLL_JOB_READY; break; - case EDG_WLL_SOURCE_LOG_MONITOR: - if (LRMS_STATE(old_state)) res = RET_LATE; - new_state = EDG_WLL_JOB_READY; break; - default: - goto bad_event; break; - } - } else { - /* e->transfer.result == EDG_WLL_TRANSFER_START */ - res = RET_IGNORE; - } - if (USABLE(res, strict)) { - js->pub.state = new_state; - rep(js->pub.reason, e->transfer.reason); - - free(js->pub.location); - if (e->transfer.result == EDG_WLL_TRANSFER_OK) { - js->pub.location = location_string( - edg_wll_SourceToString(e->transfer.destination), - e->transfer.dest_host, - e->transfer.dest_instance); - } else { - js->pub.location = location_string( - edg_wll_SourceToString(e->transfer.source), - e->transfer.host, - e->transfer.src_instance); - } - } - if (USABLE_DATA(res, strict)) { - switch (e->transfer.source) { - case EDG_WLL_SOURCE_USER_INTERFACE: - if (!js->pub.jdl) { - rep(js->pub.jdl, e->transfer.job); - } - break; - case EDG_WLL_SOURCE_JOB_SUBMISSION: - rep(js->pub.condor_jdl, e->transfer.job); break; - case EDG_WLL_SOURCE_LOG_MONITOR: - rep(js->pub.rsl, e->transfer.job); break; - default: - goto bad_event; break; - - } - } - break; - case EDG_WLL_EVENT_ACCEPTED: - switch (e->accepted.source) { - case EDG_WLL_SOURCE_NETWORK_SERVER: - new_state = EDG_WLL_JOB_WAITING; break; - case EDG_WLL_SOURCE_LOG_MONITOR: - if (LRMS_STATE(old_state)) res = RET_LATE; - new_state = EDG_WLL_JOB_READY; - lm_favour_lrms = 1; - break; - case EDG_WLL_SOURCE_LRMS: - new_state = EDG_WLL_JOB_SCHEDULED; break; - default: - goto bad_event; break; - } - if (USABLE(res, strict)) { - js->pub.state = new_state; - free(js->pub.location); - js->pub.location = location_string( - edg_wll_SourceToString(e->accepted.source), - e->accepted.host, - e->accepted.src_instance); - } - if (USABLE_DATA(res, strict)) { - switch (e->accepted.source) { - case EDG_WLL_SOURCE_NETWORK_SERVER: - rep(js->pub.ui_host, e->accepted.from_host); - break; /* no WM id */ - case EDG_WLL_SOURCE_LOG_MONITOR: - rep(js->pub.condorId, e->accepted.local_jobid); break; - case EDG_WLL_SOURCE_LRMS: - /* XXX localId */ - rep(js->pub.globusId, e->accepted.local_jobid); break; - default: - goto bad_event; break; - } - } - break; - case EDG_WLL_EVENT_REFUSED: - switch (e->refused.source) { - case EDG_WLL_SOURCE_NETWORK_SERVER: - new_state = EDG_WLL_JOB_SUBMITTED; break; - case EDG_WLL_SOURCE_LOG_MONITOR: - new_state = EDG_WLL_JOB_READY; break; - case EDG_WLL_SOURCE_LRMS: - new_state = EDG_WLL_JOB_READY; break; - default: - goto bad_event; break; - } - if (USABLE(res, strict)) { - js->pub.state = new_state; - rep(js->pub.reason, e->refused.reason); - - free(js->pub.location); - js->pub.location = location_string( - edg_wll_SourceToString(e->refused.from), - e->refused.from_host, - e->refused.from_instance); - } - break; - case EDG_WLL_EVENT_ENQUEUED: - if (e->enQueued.result == EDG_WLL_ENQUEUED_OK) { - switch (e->enQueued.source) { - case EDG_WLL_SOURCE_NETWORK_SERVER: - new_state = EDG_WLL_JOB_WAITING; break; - case EDG_WLL_SOURCE_WORKLOAD_MANAGER: - if (LRMS_STATE(old_state)) res = RET_LATE; - update_branch_state(e->any.seqcode, NULL, - NULL, e->enQueued.job, &js->branch_states); - new_state = EDG_WLL_JOB_READY; break; - case EDG_WLL_SOURCE_LOG_MONITOR: - new_state = EDG_WLL_JOB_WAITING; break; - default: - goto bad_event; break; - } - } else if (e->enQueued.result == EDG_WLL_ENQUEUED_FAIL) { - switch (e->enQueued.source) { - case EDG_WLL_SOURCE_NETWORK_SERVER: - new_state = EDG_WLL_JOB_WAITING; break; - case EDG_WLL_SOURCE_WORKLOAD_MANAGER: - new_state = EDG_WLL_JOB_WAITING; break; - case EDG_WLL_SOURCE_LOG_MONITOR: - new_state = old_state; break; - default: - goto bad_event; break; - } - } else { - /* e->enQueued.result == EDG_WLL_ENQUEUED_START */ - res = RET_IGNORE; - } - if (USABLE(res, strict)) { - js->pub.state = new_state; - rep(js->pub.reason, e->enQueued.reason); - - free(js->pub.location); - if (e->enQueued.result == EDG_WLL_ENQUEUED_OK) { - js->pub.location = location_string( - e->enQueued.queue, - e->enQueued.host, - e->enQueued.src_instance); - if (e->enQueued.source == EDG_WLL_SOURCE_LOG_MONITOR) - js->pub.resubmitted = 1; - } else { - js->pub.location = location_string( - edg_wll_SourceToString(e->enQueued.source), - e->enQueued.host, - e->enQueued.src_instance); - } - } - if (USABLE_DATA(res, strict)) { - switch (e->enQueued.source) { - case EDG_WLL_SOURCE_NETWORK_SERVER: - if (!js->pub.jdl || e->enQueued.result == EDG_WLL_ENQUEUED_OK) { - rep(js->pub.jdl, e->enQueued.job); - } - break; - case EDG_WLL_SOURCE_WORKLOAD_MANAGER: - if (USABLE_BRANCH(res)) { - rep(js->pub.matched_jdl, e->enQueued.job); - } - break; - case EDG_WLL_SOURCE_LOG_MONITOR: - /* no interim JDL here */ - break; - default: - goto bad_event; break; - } - } - break; - case EDG_WLL_EVENT_DEQUEUED: - switch (e->deQueued.source) { - case EDG_WLL_SOURCE_WORKLOAD_MANAGER: - new_state = EDG_WLL_JOB_WAITING; break; - case EDG_WLL_SOURCE_JOB_SUBMISSION: - if (LRMS_STATE(old_state)) res = RET_LATE; - new_state = EDG_WLL_JOB_READY; break; - default: - goto bad_event; break; - } - if (USABLE(res, strict)) { - js->pub.state = new_state; - free(js->pub.location); - js->pub.location = location_string( - edg_wll_SourceToString(e->deQueued.source), - e->deQueued.host, - e->deQueued.src_instance); - } - if (USABLE_DATA(res, strict)) { - /* no WM/JSS local jobid */ - } - break; - case EDG_WLL_EVENT_HELPERCALL: - if (USABLE(res, strict)) { - js->pub.state = EDG_WLL_JOB_WAITING; - free(js->pub.location); - js->pub.location = location_string( - e->helperCall.helper_name, - e->helperCall.host, - e->helperCall.src_instance); - /* roles and params used only for debugging */ - } - break; - case EDG_WLL_EVENT_HELPERRETURN: - if (USABLE(res, strict)) { - js->pub.state = EDG_WLL_JOB_WAITING; - free(js->pub.location); - js->pub.location = location_string( - edg_wll_SourceToString(EDG_WLL_SOURCE_WORKLOAD_MANAGER), - e->helperReturn.host, - e->helperReturn.src_instance); - /* roles and retvals used only for debugging */ - } - break; - case EDG_WLL_EVENT_RUNNING: - if (USABLE(res, strict)) { - js->pub.state = EDG_WLL_JOB_RUNNING; - js->pub.jw_status = EDG_WLL_STAT_WRAPPER_RUNNING; - free(js->pub.location); - js->pub.location = location_string( - edg_wll_SourceToString(EDG_WLL_SOURCE_LRMS), - "worknode", - e->running.node); - } - if (USABLE_DATA(res, strict)) { - if (USABLE_BRANCH(fine_res)) { - rep(js->pub.ce_node, e->running.node); - } - /* why? if (e->any.source == EDG_WLL_SOURCE_LOG_MONITOR) { */ - if (e->running.node) { - update_branch_state(e->any.seqcode, NULL, - e->running.node, NULL, &js->branch_states); - add_stringlist(&js->pub.possible_ce_nodes, - e->running.node); - } - /* } */ - } - break; - case EDG_WLL_EVENT_REALLYRUNNING: - /* consistence check -- should not receive two contradicting ReallyRunning's within single - deep resub cycle */ - if (fine_res == RET_BADBRANCH) { - syslog(LOG_ERR,"ReallyRunning on bad branch %s", - e->any.source == EDG_WLL_SOURCE_LOG_MONITOR ? e->reallyRunning.wn_seq : e->any.seqcode); - break; - } - /* select the branch unless TOOOLD, i.e. before deep resubmission */ - if (!(res == RET_LATE && fine_res == RET_TOOOLD)) { - if (e->any.source == EDG_WLL_SOURCE_LRMS) { - rep(js->branch_tag_seqcode, e->any.seqcode); - if (res == RET_OK) { - rep(js->last_branch_seqcode, e->any.seqcode); - js->pub.state = EDG_WLL_JOB_RUNNING; - } - } - if (e->any.source == EDG_WLL_SOURCE_LOG_MONITOR) { - if (!js->branch_tag_seqcode) { - if (PARSABLE_SEQCODE(e->reallyRunning.wn_seq)) { - rep(js->branch_tag_seqcode, e->reallyRunning.wn_seq); - } else - goto bad_event; - } - if (!js->last_branch_seqcode) { - if (PARSABLE_SEQCODE(e->reallyRunning.wn_seq)) { - if (res == RET_OK) { - rep(js->last_branch_seqcode, e->reallyRunning.wn_seq); - js->pub.state = EDG_WLL_JOB_RUNNING; - } - } else - goto bad_event; - } - } - - /* XXX: best effort -- if we are lucky, ReallyRunning is on the last shallow cycle, - so we take in account events processed so far */ - if (res == RET_LATE && !js->last_branch_seqcode) { - if (same_branch(js->last_seqcode,js->branch_tag_seqcode)) - rep(js->last_branch_seqcode,js->last_seqcode); - } - - js->pub.jw_status = EDG_WLL_STAT_PAYLOAD_RUNNING; - js->pub.payload_running = 1; - load_branch_state(js); - } -#if 0 - if (USABLE_DATA(res, strict)) { - js->pub.state = EDG_WLL_JOB_RUNNING; - free(js->pub.location); - js->pub.location = location_string( - edg_wll_SourceToString(EDG_WLL_SOURCE_LRMS), - "worknode", - e->running.node); - js->pub.payload_running = 1; - if (e->any.source == EDG_WLL_SOURCE_LRMS) { - rep(js->branch_tag_seqcode, e->any.seqcode); - rep(js->last_branch_seqcode, e->any.seqcode); - } - if (e->any.source == EDG_WLL_SOURCE_LOG_MONITOR) { - if (!js->branch_tag_seqcode) { - if (PARSABLE_SEQCODE(e->reallyRunning.wn_seq)) { - rep(js->branch_tag_seqcode, e->reallyRunning.wn_seq); - } else - goto bad_event; - } - if (!js->last_branch_seqcode) { - if (PARSABLE_SEQCODE(e->reallyRunning.wn_seq)) { - rep(js->last_branch_seqcode, e->reallyRunning.wn_seq); - } else - goto bad_event; - } - } - load_branch_state(js); - } -#endif - break; - case EDG_WLL_EVENT_SUSPEND: - if (USABLE(res, strict)) { - if (js->pub.state == EDG_WLL_JOB_RUNNING) { - js->pub.suspended = 1; - rep(js->pub.suspend_reason, e->suspend.reason); - } - } - break; - case EDG_WLL_EVENT_RESUME: - if (USABLE(res, strict)) { - if (js->pub.state == EDG_WLL_JOB_RUNNING) { - js->pub.suspended = 0; - rep(js->pub.suspend_reason, e->resume.reason); - } - } - break; - case EDG_WLL_EVENT_RESUBMISSION: - if (USABLE(res, strict)) { - if (e->resubmission.result == EDG_WLL_RESUBMISSION_WONTRESUB) { - rep(js->pub.reason, e->resubmission.reason); - } - } - if (USABLE_DATA(res, strict)) { - if (e->resubmission.result == EDG_WLL_RESUBMISSION_WONTRESUB) { - js->resubmit_type = EDG_WLL_RESUBMISSION_WONTRESUB; - } - else - if (e->resubmission.result == EDG_WLL_RESUBMISSION_WILLRESUB && - e->any.source == EDG_WLL_SOURCE_WORKLOAD_MANAGER) { - reset_branch(js, e); - } - else - if (e->resubmission.result == EDG_WLL_RESUBMISSION_SHALLOW) { - js->resubmit_type = EDG_WLL_RESUBMISSION_SHALLOW; - // deep resubmit stays forever deadline for events - // rep(js->deep_resubmit_seqcode, NULL); - } - } - break; - case EDG_WLL_EVENT_DONE: - if (e->any.source == EDG_WLL_SOURCE_LRMS) { - /* Done from JobWrapper is not sufficient for transition - * to DONE state according its current definition */ - if (USABLE(res, strict)) { - js->pub.jw_status = EDG_WLL_STAT_DONE; - js->pub.payload_running = 0; - } - break; - } - if (USABLE(res, strict)) { - js->pub.state = EDG_WLL_JOB_DONE; - js->pub.jw_status = EDG_WLL_STAT_DONE; - rep(js->pub.reason, e->done.reason); - if (fine_res == RET_GOODBRANCH) { - js->pub.payload_running = 0; - } - switch (e->done.status_code) { - case EDG_WLL_DONE_CANCELLED: - js->pub.state = EDG_WLL_JOB_CANCELLED; - case EDG_WLL_DONE_OK: - rep(js->pub.location, "none"); - break; - case EDG_WLL_DONE_FAILED: - if (js->pub.failure_reasons) { - char *glued_reasons; - - asprintf(&glued_reasons,"%s\n%s [%s]", - js->pub.failure_reasons, e->done.reason, js->pub.destination); - rep(js->pub.failure_reasons, glued_reasons) - } - else { - asprintf(&(js->pub.failure_reasons),"%s [%s]", - e->done.reason, js->pub.destination); - } - // fall through - default: - free(js->pub.location); - js->pub.location = location_string( - edg_wll_SourceToString(e->done.source), - e->done.host, - e->done.src_instance); - } - } - if (USABLE_DATA(res, strict)) { - switch (e->done.status_code) { - case EDG_WLL_DONE_OK: - js->pub.exit_code = e->done.exit_code; - js->pub.done_code = EDG_WLL_STAT_OK; break; - case EDG_WLL_DONE_CANCELLED: - js->pub.exit_code = 0; - js->pub.done_code = EDG_WLL_STAT_CANCELLED; break; - case EDG_WLL_DONE_FAILED: - if (!USABLE(res, strict)) { - // record reason, destination could have changed already - if (js->pub.failure_reasons) { - char *glued_reasons; - - asprintf(&glued_reasons,"%s\n%s [delayed event, destination unreliable]", - js->pub.failure_reasons, e->done.reason); - rep(js->pub.failure_reasons, glued_reasons) - } - else { - asprintf(&(js->pub.failure_reasons),"%s [delayed event, destination unreliable]", - e->done.reason); - } - } - js->pub.exit_code = 0; - js->pub.done_code = EDG_WLL_STAT_FAILED; break; - default: - goto bad_event; break; - } - } - break; - case EDG_WLL_EVENT_CANCEL: - if (fine_res != RET_BADBRANCH) { - if (js->last_cancel_seqcode != NULL && - edg_wll_compare_seq(e->any.seqcode, js->last_cancel_seqcode) < 0) { - res = RET_LATE; - } - } - else { - res = RET_LATE; - } - if (USABLE(res, strict)) { - switch (e->cancel.status_code) { - case EDG_WLL_CANCEL_REQ: - js->pub.cancelling = 1; break; - case EDG_WLL_CANCEL_DONE: - js->pub.state = EDG_WLL_JOB_CANCELLED; - js->pub.remove_from_proxy = 1; - rep(js->pub.reason, e->cancel.reason); - rep(js->last_seqcode, e->any.seqcode); - rep(js->pub.location, "none"); - /* fall though */ - case EDG_WLL_CANCEL_ABORT: - js->pub.cancelling = 0; break; - default: - /* do nothing */ - break; - - } - } - if (USABLE_DATA(res, strict)) { - rep(js->pub.cancelReason, e->cancel.reason); - } - break; - case EDG_WLL_EVENT_ABORT: - // XXX: accept Abort from WM in every case - // setting res make USABLE macro true (awful !!) - if (e->any.source == EDG_WLL_SOURCE_WORKLOAD_MANAGER) res = RET_OK; - if (USABLE(res, strict)) { - js->pub.state = EDG_WLL_JOB_ABORTED; - js->pub.remove_from_proxy = 1; - rep(js->pub.reason, e->abort.reason); - rep(js->pub.location, "none"); - - reset_branch(js, e); - } - break; - - case EDG_WLL_EVENT_CLEAR: - if (USABLE(res, strict)) { - js->pub.state = EDG_WLL_JOB_CLEARED; - js->pub.remove_from_proxy = 1; - rep(js->pub.location, "none"); - switch (e->clear.reason) { - case EDG_WLL_CLEAR_USER: - rep(js->pub.reason, "user retrieved output sandbox"); - break; - case EDG_WLL_CLEAR_TIMEOUT: - rep(js->pub.reason, "timed out, resource purge forced"); - break; - case EDG_WLL_CLEAR_NOOUTPUT: - rep(js->pub.reason, "no output was generated"); - break; - default: - goto bad_event; break; - - } - } - if (USABLE_DATA(res, strict)) { - switch (e->clear.reason) { - case EDG_WLL_CLEAR_USER: - js->pub.sandbox_retrieved = EDG_WLL_STAT_USER; - break; - case EDG_WLL_CLEAR_TIMEOUT: - js->pub.sandbox_retrieved = EDG_WLL_STAT_TIMEOUT; - break; - case EDG_WLL_CLEAR_NOOUTPUT: - js->pub.sandbox_retrieved = EDG_WLL_STAT_NOOUTPUT; - break; - default: - goto bad_event; break; - - } - - } - break; - case EDG_WLL_EVENT_PURGE: - /* ignore, meta-information only */ - break; - case EDG_WLL_EVENT_MATCH: - if (USABLE(res, strict)) { - js->pub.state = EDG_WLL_JOB_WAITING; - js->pub.location = location_string( - edg_wll_SourceToString(EDG_WLL_SOURCE_WORKLOAD_MANAGER), - e->match.host, - e->match.src_instance); - } - if (USABLE_DATA(res, strict)) { - if (USABLE_BRANCH(fine_res)) { - rep(js->pub.destination, e->match.dest_id); - } - if (e->match.dest_id) { - update_branch_state(e->any.seqcode, e->match.dest_id, - NULL, NULL, &js->branch_states); - add_stringlist(&js->pub.possible_destinations, - e->match.dest_id); - } - } - break; - case EDG_WLL_EVENT_PENDING: - if (USABLE(res, strict)) { - js->pub.state = EDG_WLL_JOB_WAITING; - rep(js->pub.reason, e->pending.reason); - js->pub.location = location_string( - edg_wll_SourceToString(EDG_WLL_SOURCE_WORKLOAD_MANAGER), - e->match.host, - e->match.src_instance); - } - break; - case EDG_WLL_EVENT_REGJOB: - if (USABLE(res, strict)) { - js->pub.state = EDG_WLL_JOB_SUBMITTED; - } - if (USABLE_DATA(res, strict)) { - rep_cond(js->pub.jdl, e->regJob.jdl); - edg_wlc_JobIdFree(js->pub.parent_job); - edg_wlc_JobIdDup(e->regJob.parent, - &js->pub.parent_job); - rep(js->pub.network_server, e->regJob.ns); - js->pub.children_num = e->regJob.nsubjobs; - switch (e->regJob.jobtype) { - case EDG_WLL_REGJOB_DAG: - case EDG_WLL_REGJOB_PARTITIONED: - js->pub.jobtype = EDG_WLL_STAT_DAG; - js->pub.children_hist[EDG_WLL_JOB_UNKNOWN+1] = js->pub.children_num; - break; - case EDG_WLL_REGJOB_COLLECTION: - js->pub.jobtype = EDG_WLL_STAT_COLLECTION; - js->pub.children_hist[EDG_WLL_JOB_UNKNOWN+1] = js->pub.children_num; - break; - default: - break; - } - rep(js->pub.seed, e->regJob.seed); - } - break; - case EDG_WLL_EVENT_USERTAG: - if (USABLE_DATA(res, strict)) { - if (e->userTag.name != NULL && e->userTag.value != NULL) { - add_taglist(e->userTag.name, e->userTag.value, e->any.seqcode, js); - } else { - goto bad_event; - } - } - break; - case EDG_WLL_EVENT_LISTENER: - /* ignore, listener port is not part of job status */ - case EDG_WLL_EVENT_CURDESCR: - case EDG_WLL_EVENT_CHKPT: - /* these three event are probably dead relics */ - case EDG_WLL_EVENT_RESOURCEUSAGE: - /* ignore, not reflected in job status */ - break; - case EDG_WLL_EVENT_CHANGEACL: - /* ignore, only for event log */ - /* seq. code of this event should not influence future state computeation */ - ignore_seq_code = 1; - break; - case EDG_WLL_EVENT_COLLECTIONSTATE: - new_state = edg_wll_StringToStat(e->collectionState.state); - if (USABLE(res, strict)) { - js->pub.state = new_state; - if (new_state == EDG_WLL_JOB_DONE) - js->pub.done_code = e->collectionState.done_code; - } - break; - case EDG_WLL_EVENT_SANDBOX: - if (USABLE_DATA(res, strict)) { - if ((e->sandbox.sandbox_type == EDG_WLL_SANDBOX_INPUT) && e->sandbox.transfer_job) { - edg_wlc_JobIdFree(js->pub.isb_transfer); - edg_wlc_JobIdParse(e->sandbox.transfer_job,&js->pub.isb_transfer); - } - - if ((e->sandbox.sandbox_type == EDG_WLL_SANDBOX_OUTPUT) && e->sandbox.transfer_job) { - edg_wlc_JobIdFree(js->pub.osb_transfer); - edg_wlc_JobIdParse(e->sandbox.transfer_job,&js->pub.osb_transfer); - } - } - break; - - default: - goto bad_event; - break; - } - - if (USABLE(res,strict)) { - js->pub.lastUpdateTime = e->any.timestamp; - if (old_state != js->pub.state) { - js->pub.stateEnterTime = js->pub.lastUpdateTime; - js->pub.stateEnterTimes[1 + js->pub.state] - = (int)js->pub.lastUpdateTime.tv_sec; - - /* in case of resubmit switch JW status back to unknown */ - if (js->pub.state == EDG_WLL_JOB_WAITING || - js->pub.state == EDG_WLL_JOB_READY || - js->pub.state == EDG_WLL_JOB_SCHEDULED) { - js->pub.jw_status = EDG_WLL_STAT_UNKNOWN; - } - } - if (e->any.type == EDG_WLL_EVENT_CANCEL) { - rep(js->last_cancel_seqcode, e->any.seqcode); - } else { - -/* the first set of LM events (Accept, Transfer/XX -> LRMS) - should not should shift the state (to Ready, Scheduled) but NOT to - update js->last_seqcode completely, in order not to block following - LRMS events which are likely to arrive later but should still affect - job state (as there may be no more LM events due to the Condor bug). - However, don't ignore the incoming seqcode completely, to catch up - with possibly delayed WM/JSS events */ - - if (lm_favour_lrms) { - free(js->last_seqcode); - js->last_seqcode = set_component_seqcode(e->any.seqcode,EDG_WLL_SOURCE_LOG_MONITOR,0); - } - else if (!ignore_seq_code) { - rep(js->last_seqcode, e->any.seqcode); - } - } - - if (js->pub.state != EDG_WLL_JOB_RUNNING) { - js->pub.suspended = 0; - rep_null(js->pub.suspend_reason); - } - - if (fine_res == RET_GOODBRANCH) { - rep(js->last_branch_seqcode, e->any.seqcode); - } - } - - if (USABLE_DATA(res,strict)) { - if (e->any.source == EDG_WLL_SOURCE_NETWORK_SERVER && - js->pub.network_server == NULL) { - char *inst; - inst = e->any.src_instance; - trio_asprintf(&js->pub.network_server, "%s%s%s", - e->any.host, - inst != NULL ? ":" : " ", - inst != NULL ? inst : ""); - } - } - - return res; - -bad_event: - badEvent(js,e,ev_seq); - return RET_SUSPECT; -} - -int add_stringlist(char ***lptr, const char *new_item) -{ - char **itptr; - int i; - - if (*lptr == NULL) { - itptr = (char **) malloc(2*sizeof(char *)); - itptr[0] = strdup(new_item); - itptr[1] = NULL; - *lptr = itptr; - return 1; - } else { - for (i = 0, itptr = *lptr; itptr[i] != NULL; i++); - itptr = (char **) realloc(*lptr, (i+2)*sizeof(char *)); - if (itptr != NULL) { - itptr[i] = strdup(new_item); - itptr[i+1] = NULL; - *lptr = itptr; - return 1; - } else { - return 0; - } - } -} - -void destroy_intJobStat_extension(intJobStat *p) -{ - if (p->last_seqcode) free(p->last_seqcode); - if (p->last_cancel_seqcode) free(p->last_cancel_seqcode); - if (p->branch_tag_seqcode) free(p->branch_tag_seqcode); - if (p->last_branch_seqcode) free(p->last_branch_seqcode); - if (p->deep_resubmit_seqcode) free(p->deep_resubmit_seqcode); - free_branch_state(&p->branch_states); - if (p->tag_seq_codes) { - int i; - - for (i=0; p->tag_seq_codes[i]; i++) free(p->tag_seq_codes[i]); - free(p->tag_seq_codes); - } - - memset(p,0,sizeof(*p)); -} - -void destroy_intJobStat(intJobStat *p) -{ - edg_wll_FreeStatus(&p->pub); - destroy_intJobStat_extension(p); - memset(p, 0, sizeof(intJobStat)); -} - -void init_intJobStat(intJobStat *p) -{ - memset(p, 0, sizeof(intJobStat)); - edg_wll_InitStatus(&(p->pub)); - p->pub.jobtype = -1 /* why? EDG_WLL_STAT_SIMPLE */; - p->pub.children_hist = (int*) calloc(1+EDG_WLL_NUMBER_OF_STATCODES, sizeof(int)); - p->pub.children_hist[0] = EDG_WLL_NUMBER_OF_STATCODES; - p->pub.stateEnterTimes = (int*) calloc(1+EDG_WLL_NUMBER_OF_STATCODES, sizeof(int)); - p->pub.stateEnterTimes[0] = EDG_WLL_NUMBER_OF_STATCODES; - /* TBD: generate */ -} - diff --git a/org.glite.lb.state-machine/src/process_event_condor.c b/org.glite.lb.state-machine/src/process_event_condor.c deleted file mode 100644 index 9d520aa..0000000 --- a/org.glite.lb.state-machine/src/process_event_condor.c +++ /dev/null @@ -1,224 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include - -#include "glite/lb/context-int.h" - -#include "intjobstat.h" -#include "seqcode_aux.h" - -/* TBD: share in whole logging or workload */ -#ifdef __GNUC__ -#define UNUSED_VAR __attribute__((unused)) -#else -#define UNUSED_VAR -#endif - -// XXX: maybe not needed any more -// if not, remove also last_condor_event_timestamp from intJobStat -static int compare_timestamps(struct timeval a, struct timeval b) -{ - if ( (a.tv_sec > b.tv_sec) || - ((a.tv_sec == b.tv_sec) && (a.tv_usec > b.tv_usec)) ) return 1; - if ( (a.tv_sec < b.tv_sec) || - ((a.tv_sec == b.tv_sec) && (a.tv_usec < b.tv_usec)) ) return -1; - return 0; -} - - -// XXX move this defines into some common place to be reusable -#define USABLE(res) ((res) == RET_OK) -#define USABLE_DATA(res) (1) -#define rep(a,b) { free(a); a = (b == NULL) ? NULL : strdup(b); } -#define rep_cond(a,b) { if (b) { free(a); a = strdup(b); } } - -int processEvent_Condor(intJobStat *js, edg_wll_Event *e, int ev_seq, int strict, char **errstring) -{ - edg_wll_JobStatCode old_state = js->pub.state; - int res = RET_OK; - - - if ((js->last_seqcode != NULL) && - (edg_wll_compare_condor_seq(js->last_seqcode, e->any.seqcode) > 0) ) { - res = RET_LATE; - } - - switch (e->any.type) { - case EDG_WLL_EVENT_REGJOB: - if (USABLE(res)) { - js->pub.state = EDG_WLL_JOB_SUBMITTED; - rep(js->pub.condor_status, "Idle"); - } - if (USABLE_DATA(res)) { - rep(js->pub.jdl, e->regJob.jdl); - } - break; - case EDG_WLL_EVENT_CONDORMATCH: - if (USABLE(res)) { - js->pub.state = EDG_WLL_JOB_READY; - rep(js->pub.condor_status, "Idle"); - } - if (USABLE_DATA(res)) { - rep_cond(js->pub.condor_dest_host,e->CondorMatch.dest_host); - } - break; - case EDG_WLL_EVENT_CONDORREJECT: - if (USABLE(res)) { - js->pub.state = EDG_WLL_JOB_ABORTED; - rep(js->pub.condor_status, "Unexpanded"); - } - if (USABLE_DATA(res)) { - switch(e->CondorReject.status_code) { - case EDG_WLL_CONDORREJECT_NOMATCH: - rep(js->pub.condor_reason,"No match found."); - break; - case EDG_WLL_CONDORREJECT_OTHER: - default: - break; - } - } - break; - case EDG_WLL_EVENT_CONDORSHADOWSTARTED: - if (USABLE(res)) { - js->pub.state = EDG_WLL_JOB_READY; - rep(js->pub.condor_status, "Idle"); - } - if (USABLE_DATA(res)) { - switch (get_condor_event_source(e->any.seqcode)) { - case EDG_WLL_CONDOR_EVENT_SOURCE_SCHED: - js->pub.condor_shadow_pid = e->CondorShadowStarted.shadow_pid; - break; - default: - break; - } - } - break; - case EDG_WLL_EVENT_CONDORSHADOWEXITED: - if (USABLE(res)) { - js->pub.state = EDG_WLL_JOB_DONE; - rep(js->pub.condor_status, "Completed"); - } - if (USABLE_DATA(res)) { - switch (get_condor_event_source(e->any.seqcode)) { - case EDG_WLL_CONDOR_EVENT_SOURCE_SHADOW: - js->pub.condor_shadow_exit_status = e->CondorShadowExited.shadow_exit_status; - break; - default: - break; - } - } - break; - case EDG_WLL_EVENT_CONDORSTARTERSTARTED: - if (USABLE(res)) { - switch (get_condor_event_source(e->any.seqcode)) { - case EDG_WLL_CONDOR_EVENT_SOURCE_START: - js->pub.state = EDG_WLL_JOB_SCHEDULED; - rep(js->pub.condor_status, "Idle"); - break; - case EDG_WLL_CONDOR_EVENT_SOURCE_STARTER: - js->pub.state = EDG_WLL_JOB_RUNNING; - rep(js->pub.condor_status, "Running"); - break; - default: - break; - } - } - if (USABLE_DATA(res)) { - switch (get_condor_event_source(e->any.seqcode)) { - case EDG_WLL_CONDOR_EVENT_SOURCE_STARTER: - rep(js->pub.condor_universe, e->CondorStarterStarted.universe); - js->pub.condor_starter_pid = e->CondorStarterStarted.starter_pid; - break; - default: - break; - } - } - break; - case EDG_WLL_EVENT_CONDORSTARTEREXITED: - if (USABLE(res)) { - js->pub.state = EDG_WLL_JOB_DONE; - rep(js->pub.condor_status, "Completed"); - } - if (USABLE_DATA(res)) { - switch (get_condor_event_source(e->any.seqcode)) { - case EDG_WLL_CONDOR_EVENT_SOURCE_START: - js->pub.condor_starter_pid = e->CondorStarterExited.starter_pid; - js->pub.condor_starter_exit_status = e->CondorStarterExited.starter_exit_status; - break; - case EDG_WLL_CONDOR_EVENT_SOURCE_STARTER: - js->pub.condor_starter_pid = e->CondorStarterExited.starter_pid; - js->pub.condor_job_pid = e->CondorStarterExited.job_pid; - js->pub.condor_job_exit_status = e->CondorStarterExited.job_exit_status; - break; - default: - break; - } - } - break; - case EDG_WLL_EVENT_CONDORRESOURCEUSAGE: - if (USABLE(res)) { - } - if (USABLE_DATA(res)) { - } - break; - case EDG_WLL_EVENT_CONDORERROR: - if (USABLE(res)) { - } - if (USABLE_DATA(res)) { - } - break; - - default: - break; - } - -/* XXX : just debug output - remove */ - - printf("processEvent_Condor(): %s (%s), state: %s --> %s\n ", - edg_wll_EventToString(e->any.type), - (res == RET_LATE) ? "RET_LATE" : "RET_OK", - edg_wll_StatToString(old_state), - edg_wll_StatToString(js->pub.state) ); - printf("\t%s\n",e->any.seqcode); - printf("\t(last=%s)\n",js->last_seqcode); - -/*----------------------------------*/ - - if (USABLE(res)) { - rep(js->last_seqcode, e->any.seqcode); - - js->pub.lastUpdateTime = e->any.timestamp; - if (old_state != js->pub.state) { - js->pub.stateEnterTime = js->pub.lastUpdateTime; - js->pub.stateEnterTimes[1 + js->pub.state] - = (int)js->pub.lastUpdateTime.tv_sec; - } - } - if (! js->pub.location) js->pub.location = strdup("this is CONDOR"); - - - return RET_OK; -} - diff --git a/org.glite.lb.state-machine/src/process_event_cream.c b/org.glite.lb.state-machine/src/process_event_cream.c deleted file mode 100644 index 253c055..0000000 --- a/org.glite.lb.state-machine/src/process_event_cream.c +++ /dev/null @@ -1,272 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include - -#include "glite/lb/context-int.h" - -#include "glite/lbu/trio.h" - -#include "intjobstat.h" -#include "seqcode_aux.h" - -/* TBD: share in whole logging or workload */ -#ifdef __GNUC__ -#define UNUSED_VAR __attribute__((unused)) -#else -#define UNUSED_VAR -#endif - -/* XXX lookup table */ -static char *cream_states[EDG_WLL_NUMBER_OF_CREAM_STATES]; - -// XXX move this defines into some common place to be reusable -#define USABLE(res) ((res) == RET_OK) -#define USABLE_DATA(res) (1) -#define rep(a,b) { free(a); a = (b == NULL) ? NULL : strdup(b); } -#define rep_cond(a,b) { if (b) { free(a); a = strdup(b); } } - -int processEvent_Cream(intJobStat *js, edg_wll_Event *e, int ev_seq, int strict, char **errstring) -{ - edg_wll_JobStatCode old_state = js->pub.state; - int res = RET_OK; - - if (!cream_states[0]) { - int i; - for (i=0; ilast_seqcode != NULL) && - (edg_wll_compare_pbs_seq(js->last_seqcode, e->any.seqcode) > 0) ) { - res = RET_LATE; - } -*/ - switch (e->any.type) { - case EDG_WLL_EVENT_REGJOB: - if (USABLE(res)) { - js->pub.state = EDG_WLL_JOB_SUBMITTED; - js->pub.cream_state = EDG_WLL_STAT_REGISTERED; - } - if (USABLE_DATA(res)) { - rep_cond(js->pub.cream_owner, js->pub.owner); - rep_cond(js->pub.jdl, e->regJob.jdl); - rep_cond(js->pub.cream_jdl, e->regJob.jdl); - rep_cond(js->pub.cream_endpoint, e->regJob.ns); - rep_cond(js->pub.destination, e->regJob.ns); - rep_cond(js->pub.network_server, e->regJob.ns); - } - break; - case EDG_WLL_EVENT_CREAMSTART: - // nothing to be done - break; - case EDG_WLL_EVENT_CREAMPURGE: - // no state transition - break; - case EDG_WLL_EVENT_CREAMACCEPTED: - if (USABLE(res)){ - rep(js->pub.cream_id, e->CREAMAccepted.local_jobid); - rep(js->pub.globusId, e->CREAMAccepted.local_jobid); - } - break; - case EDG_WLL_EVENT_CREAMSTORE: - if (USABLE(res)) { - switch (e->CREAMStore.command) { - case EDG_WLL_CREAMSTORE_CMDSTART: - if (e->CREAMStore.result == EDG_WLL_CREAMSTORE_OK) { - js->pub.state = EDG_WLL_JOB_WAITING; - js->pub.cream_state = EDG_WLL_STAT_PENDING; - } - break; - case EDG_WLL_CREAMSTORE_CMDSUSPEND: - if (e->CREAMStore.result == EDG_WLL_CREAMSTORE_OK) { - js->pub.suspended = 1; - } - break; - case EDG_WLL_CREAMSTORE_CMDRESUME: - if (e->CREAMStore.result == EDG_WLL_CREAMSTORE_OK) { - js->pub.suspended = 0; - } - break; - default: - break; - } - rep_cond(js->pub.cream_reason, e->CREAMStore.reason); - rep_cond(js->pub.reason, e->CREAMStore.reason); - } - if (USABLE_DATA(res)) { - } - break; - case EDG_WLL_EVENT_CREAMCALL: - if (e->any.source == EDG_WLL_SOURCE_CREAM_EXECUTOR && - e->CREAMCall.callee == EDG_WLL_SOURCE_LRMS && - e->CREAMCall.command == EDG_WLL_CREAMCALL_CMDSTART && - e->CREAMCall.result == EDG_WLL_CREAMCALL_OK) - { - if (USABLE(res)) { - // BLAH -> LRMS - js->pub.state = EDG_WLL_JOB_SCHEDULED; - js->pub.cream_state = EDG_WLL_STAT_IDLE; - rep_cond(js->pub.cream_reason, e->CREAMCall.reason); - rep_cond(js->pub.reason, e->CREAMCall.reason); - } - - if (USABLE_DATA(res)) { - rep(js->pub.cream_reason, e->CREAMCall.reason); - rep(js->pub.reason, e->CREAMCall.reason); - } - } - if (e->CREAMCall.command == EDG_WLL_CREAMCALL_CMDCANCEL && - e->CREAMCall.result == EDG_WLL_CREAMCALL_OK) - { - if (USABLE(res)){ - js->pub.cream_cancelling = 1; - js->pub.cancelling = 1; - } - rep_cond(js->pub.cream_reason, e->CREAMCall.reason); - rep_cond(js->pub.reason, e->CREAMCall.reason); - } - break; - case EDG_WLL_EVENT_CREAMCANCEL: - if (USABLE(res)) { - if (e->CREAMCancel.status_code == EDG_WLL_CANCEL_DONE) { - js->pub.state = EDG_WLL_JOB_CANCELLED; - js->pub.cream_state = EDG_WLL_STAT_ABORTED; - } - } - if (USABLE_DATA(res)) { - rep(js->pub.cream_reason, e->CREAMCancel.reason); - rep(js->pub.reason, e->CREAMCancel.reason); - } - break; - case EDG_WLL_EVENT_CREAMABORT: - if (USABLE(res)) { - js->pub.state = EDG_WLL_JOB_ABORTED; - js->pub.cream_state = EDG_WLL_STAT_ABORTED; - } - if (USABLE_DATA(res)) { - rep(js->pub.cream_reason, e->CREAMAbort.reason); - rep(js->pub.reason, e->CREAMAbort.reason); - } - break; - - case EDG_WLL_EVENT_CREAMSTATUS: - if (USABLE(res) && e->CREAMStatus.result == EDG_WLL_CREAMSTATUS_DONE) - { - switch (js->pub.cream_state = edg_wll_StringToCreamStat(e->CREAMStatus.new_state)) - { - /* XXX: should not arrive */ - case EDG_WLL_STAT_REGISTERED: - case EDG_WLL_NUMBER_OF_CREAM_STATES: - break; - - case EDG_WLL_STAT_PENDING: js->pub.state = EDG_WLL_JOB_WAITING; break; - case EDG_WLL_STAT_IDLE: js->pub.state = EDG_WLL_JOB_SCHEDULED; break; - case EDG_WLL_STAT_RUNNING: - js->pub.state = EDG_WLL_JOB_RUNNING; - js->pub.jw_status = EDG_WLL_STAT_WRAPPER_RUNNING; - break; - case EDG_WLL_STAT_REALLY_RUNNING: - js->pub.state = EDG_WLL_JOB_RUNNING; - js->pub.jw_status = EDG_WLL_STAT_PAYLOAD_RUNNING; - break; - case EDG_WLL_STAT_HELD: /* TODO */ break; - case EDG_WLL_STAT_DONE_OK: - js->pub.state = EDG_WLL_JOB_DONE; - js->pub.done_code = EDG_WLL_STAT_OK; - js->pub.cream_done_code = EDG_WLL_STAT_OK; - break; - case EDG_WLL_STAT_DONE_FAILED: - js->pub.state = EDG_WLL_JOB_DONE; - js->pub.done_code = EDG_WLL_STAT_FAILED; - js->pub.cream_done_code = EDG_WLL_STAT_FAILED; - break; - case EDG_WLL_STAT_ABORTED: js->pub.state = EDG_WLL_JOB_ABORTED; break; - } - if (e->CREAMStatus.exit_code && strcmp(e->CREAMStatus.exit_code, "N/A")) - { - js->pub.cream_exit_code = atoi(e->CREAMStatus.exit_code); - js->pub.exit_code = atoi(e->CREAMStatus.exit_code); - } - if (e->CREAMStatus.worker_node){ /*XXX should never be false */ - if (js->pub.cream_node) - free(js->pub.cream_node); - js->pub.cream_node = strdup(e->CREAMStatus.worker_node); - if (js->pub.ce_node) - free(js->pub.ce_node); - js->pub.ce_node = strdup(e->CREAMStatus.worker_node); - } - if (e->CREAMStatus.LRMS_jobid){ /*XXX should never be false */ - if (js->pub.cream_lrms_id) - free(js->pub.cream_lrms_id); - js->pub.cream_lrms_id = strdup(e->CREAMStatus.LRMS_jobid); - if (js->pub.localId) - free(js->pub.localId); - js->pub.localId = strdup(e->CREAMStatus.LRMS_jobid); - } - if (e->CREAMStatus.failure_reason){ - if (js->pub.cream_failure_reason) - free(js->pub.cream_failure_reason); - js->pub.cream_failure_reason = strdup(e->CREAMStatus.failure_reason); - if (js->pub.failure_reasons){ - char *glued_reasons; - asprintf(&glued_reasons,"%s\n", e->CREAMStatus.failure_reason); - rep(js->pub.failure_reasons, glued_reasons); - } - else - asprintf(&(js->pub.failure_reasons),"%s", e->CREAMStatus.failure_reason); - } - } - break; - - case EDG_WLL_EVENT_USERTAG: - if (USABLE_DATA(res)) { - if (e->userTag.name != NULL && e->userTag.value != NULL) { - add_taglist(e->userTag.name, e->userTag.value, e->any.seqcode, js); - } - } - break; - - default: - break; - } - - if (USABLE(res)) { - rep(js->last_seqcode, e->any.seqcode); - - js->pub.lastUpdateTime = e->any.timestamp; - if (old_state != js->pub.state) { - js->pub.stateEnterTime = js->pub.lastUpdateTime; - js->pub.stateEnterTimes[1 + js->pub.state] - = (int)js->pub.lastUpdateTime.tv_sec; - } - } - if (! js->pub.location) js->pub.location = strdup("this is CREAM"); - - - return RET_OK; -} - diff --git a/org.glite.lb.state-machine/src/process_event_file_transfer.c b/org.glite.lb.state-machine/src/process_event_file_transfer.c deleted file mode 100644 index bb3d813..0000000 --- a/org.glite.lb.state-machine/src/process_event_file_transfer.c +++ /dev/null @@ -1,151 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include - -#include "glite/lb/context-int.h" - -#include "glite/lbu/trio.h" - -#include "intjobstat.h" -#include "seqcode_aux.h" - -/* TBD: share in whole logging or workload */ -#ifdef __GNUC__ -#define UNUSED_VAR __attribute__((unused)) -#else -#define UNUSED_VAR -#endif - -static int compare_timestamps(struct timeval a, struct timeval b) -{ - if ( (a.tv_sec > b.tv_sec) || - ((a.tv_sec == b.tv_sec) && (a.tv_usec > b.tv_usec)) ) return 1; - if ( (a.tv_sec < b.tv_sec) || - ((a.tv_sec == b.tv_sec) && (a.tv_usec < b.tv_usec)) ) return -1; - return 0; -} - - -// XXX move this defines into some common place to be reusable -#define USABLE(res) ((res) == RET_OK) -#define USABLE_DATA(res) (1) -#define rep(a,b) { free(a); a = (b == NULL) ? NULL : strdup(b); } -#define rep_cond(a,b) { if (b) { free(a); a = strdup(b); } } - -int processEvent_FileTransfer(intJobStat *js, edg_wll_Event *e, int ev_seq, int strict, char **errstring) -{ - edg_wll_JobStatCode old_state = js->pub.state; - int res = RET_OK; - - -/* not used in FT - if ((js->last_seqcode != NULL) && - (edg_wll_compare_pbs_seq(js->last_seqcode, e->any.seqcode) > 0) ) { - res = RET_LATE; - } -*/ - switch (e->any.type) { - case EDG_WLL_EVENT_REGJOB: - if (USABLE(res)) { - js->pub.state = EDG_WLL_JOB_SUBMITTED; - } - if (USABLE_DATA(res)) { - ; - } - break; - case EDG_WLL_EVENT_FILETRANSFERREGISTER: - if (USABLE(res)) { - ; - } - if (USABLE_DATA(res)) { - rep(js->pub.ft_src, e->fileTransferRegister.src); - rep(js->pub.ft_dest, e->fileTransferRegister.dest); - } - break; - case EDG_WLL_EVENT_FILETRANSFER: - if (USABLE(res)) { - switch (e->fileTransfer.result) { - case EDG_WLL_FILETRANSFER_START: - js->pub.state = EDG_WLL_JOB_RUNNING; - break; - case EDG_WLL_FILETRANSFER_OK: - js->pub.state = EDG_WLL_JOB_DONE; - js->pub.done_code = EDG_WLL_STAT_OK; - break; - case EDG_WLL_FILETRANSFER_FAIL: - js->pub.state = EDG_WLL_JOB_DONE; - js->pub.done_code = EDG_WLL_STAT_FAILED; - rep(js->pub.failure_reasons, e->fileTransfer.reason); - break; - default: - break; - } - } - if (USABLE_DATA(res)) { - ; - } - break; - case EDG_WLL_EVENT_ABORT: - if (USABLE(res)) { - js->pub.state = EDG_WLL_JOB_ABORTED; - js->pub.remove_from_proxy = 1; - rep(js->pub.reason, e->abort.reason); - rep(js->pub.location, "none"); - } - break; - case EDG_WLL_EVENT_SANDBOX: - if (USABLE_DATA(res)) { - if (e->sandbox.sandbox_type == EDG_WLL_SANDBOX_INPUT) - js->pub.ft_sandbox_type = EDG_WLL_STAT_INPUT; - - if (e->sandbox.sandbox_type == EDG_WLL_SANDBOX_OUTPUT) - js->pub.ft_sandbox_type = EDG_WLL_STAT_OUTPUT; - - if (e->sandbox.compute_job) { - edg_wlc_JobIdFree(js->pub.ft_compute_job); - edg_wlc_JobIdParse(e->sandbox.compute_job,&js->pub.ft_compute_job); - } - } - break; - default: - break; - } - - if (USABLE(res)) { - rep(js->last_seqcode, e->any.seqcode); - - js->pub.lastUpdateTime = e->any.timestamp; - if (old_state != js->pub.state) { - js->pub.stateEnterTime = js->pub.lastUpdateTime; - js->pub.stateEnterTimes[1 + js->pub.state] - = (int)js->pub.lastUpdateTime.tv_sec; - } - } - if (! js->pub.location) js->pub.location = strdup("this is FILE TRANSFER"); - - - return RET_OK; -} - diff --git a/org.glite.lb.state-machine/src/process_event_file_transfer_collection.c b/org.glite.lb.state-machine/src/process_event_file_transfer_collection.c deleted file mode 100644 index e5bb78f..0000000 --- a/org.glite.lb.state-machine/src/process_event_file_transfer_collection.c +++ /dev/null @@ -1,97 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include - -#include "glite/lb/context-int.h" - -#include "glite/lbu/trio.h" - -#include "intjobstat.h" -#include "seqcode_aux.h" - -/* TBD: share in whole logging or workload */ -#ifdef __GNUC__ -#define UNUSED_VAR __attribute__((unused)) -#else -#define UNUSED_VAR -#endif - -static int compare_timestamps(struct timeval a, struct timeval b) -{ - if ( (a.tv_sec > b.tv_sec) || - ((a.tv_sec == b.tv_sec) && (a.tv_usec > b.tv_usec)) ) return 1; - if ( (a.tv_sec < b.tv_sec) || - ((a.tv_sec == b.tv_sec) && (a.tv_usec < b.tv_usec)) ) return -1; - return 0; -} - - -// XXX move this defines into some common place to be reusable -#define USABLE(res) ((res) == RET_OK) -#define USABLE_DATA(res) (1) -#define rep(a,b) { free(a); a = (b == NULL) ? NULL : strdup(b); } -#define rep_cond(a,b) { if (b) { free(a); a = strdup(b); } } - -int processEvent_FileTransferCollection(intJobStat *js, edg_wll_Event *e, int ev_seq, int strict, char **errstring) -{ - edg_wll_JobStatCode old_state = js->pub.state; - int res = RET_OK; - - -/* not used in FTC - if ((js->last_seqcode != NULL) && - (edg_wll_compare_pbs_seq(js->last_seqcode, e->any.seqcode) > 0) ) { - res = RET_LATE; - } -*/ - switch (e->any.type) { - case EDG_WLL_EVENT_REGJOB: - if (USABLE(res)) { - js->pub.state = EDG_WLL_JOB_SUBMITTED; - } - if (USABLE_DATA(res)) { - ; - } - break; - default: - break; - } - - if (USABLE(res)) { - rep(js->last_seqcode, e->any.seqcode); - - js->pub.lastUpdateTime = e->any.timestamp; - if (old_state != js->pub.state) { - js->pub.stateEnterTime = js->pub.lastUpdateTime; - js->pub.stateEnterTimes[1 + js->pub.state] - = (int)js->pub.lastUpdateTime.tv_sec; - } - } - if (! js->pub.location) js->pub.location = strdup("this is FILE TRANSFER"); - - - return RET_OK; -} - diff --git a/org.glite.lb.state-machine/src/process_event_pbs.c b/org.glite.lb.state-machine/src/process_event_pbs.c deleted file mode 100644 index 89e1465..0000000 --- a/org.glite.lb.state-machine/src/process_event_pbs.c +++ /dev/null @@ -1,254 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include - -#include "glite/lb/context-int.h" - -#include "glite/lbu/trio.h" - -#include "intjobstat.h" -#include "seqcode_aux.h" - -/* TBD: share in whole logging or workload */ -#ifdef __GNUC__ -#define UNUSED_VAR __attribute__((unused)) -#else -#define UNUSED_VAR -#endif - -// XXX: maybe not needed any more -// if not, remove also last_pbs_event_timestamp from intJobStat -static int compare_timestamps(struct timeval a, struct timeval b) -{ - if ( (a.tv_sec > b.tv_sec) || - ((a.tv_sec == b.tv_sec) && (a.tv_usec > b.tv_usec)) ) return 1; - if ( (a.tv_sec < b.tv_sec) || - ((a.tv_sec == b.tv_sec) && (a.tv_usec < b.tv_usec)) ) return -1; - return 0; -} - - -// XXX move this defines into some common place to be reusable -#define USABLE(res) ((res) == RET_OK) -#define USABLE_DATA(res) (1) -#define rep(a,b) { free(a); a = (b == NULL) ? NULL : strdup(b); } -#define rep_cond(a,b) { if (b) { free(a); a = strdup(b); } } - -int processEvent_PBS(intJobStat *js, edg_wll_Event *e, int ev_seq, int strict, char **errstring) -{ - edg_wll_JobStatCode old_state = js->pub.state; - int res = RET_OK; - - - if ((js->last_seqcode != NULL) && - (edg_wll_compare_pbs_seq(js->last_seqcode, e->any.seqcode) > 0) ) { - res = RET_LATE; - } - - switch (e->any.type) { - case EDG_WLL_EVENT_REGJOB: - if (USABLE(res)) { - js->pub.state = EDG_WLL_JOB_SUBMITTED; - rep(js->pub.pbs_state, "Q"); - } - if (USABLE_DATA(res)) { - } - break; - case EDG_WLL_EVENT_PBSQUEUED: - if (USABLE(res)) { - js->pub.state = EDG_WLL_JOB_WAITING; - rep(js->pub.pbs_state, "Q"); - } - if (USABLE_DATA(res)) { - if (!js->pub.pbs_queue) - js->pub.pbs_queue = strdup(e->PBSQueued.queue); - assert(!strcmp(js->pub.pbs_queue, e->PBSQueued.queue)); - rep_cond(js->pub.pbs_owner,e->PBSQueued.owner); - rep_cond(js->pub.pbs_name,e->PBSQueued.name); - } - break; - case EDG_WLL_EVENT_PBSMATCH: - if (USABLE(res)) { - js->pub.state = EDG_WLL_JOB_READY; - rep(js->pub.pbs_state, "Q"); - } - if (USABLE_DATA(res)) { - rep_cond(js->pub.pbs_dest_host,e->PBSMatch.dest_host); - } - break; - case EDG_WLL_EVENT_PBSPENDING: - if (USABLE(res)) { - js->pub.state = EDG_WLL_JOB_WAITING; - rep(js->pub.pbs_state, "Q"); - js->pbs_reruning = 0; // reset possible reruning flag - } - if (USABLE_DATA(res)) { - rep_cond(js->pub.pbs_reason,e->PBSPending.reason); - } - break; - case EDG_WLL_EVENT_PBSRUN: - if (USABLE(res)) { - switch (get_pbs_event_source(e->any.seqcode)) { - case EDG_WLL_PBS_EVENT_SOURCE_SERVER: - js->pub.state = EDG_WLL_JOB_SCHEDULED; - rep(js->pub.pbs_state, "Q"); - break; - case EDG_WLL_PBS_EVENT_SOURCE_MOM: - js->pub.state = EDG_WLL_JOB_RUNNING; - rep(js->pub.pbs_state, "R"); - break; - default: - assert(0); // running event from strange source - break; - } - } - if (USABLE_DATA(res)) { - rep_cond(js->pub.pbs_scheduler, e->PBSRun.scheduler); - rep_cond(js->pub.pbs_dest_host, e->PBSRun.dest_host); - js->pub.pbs_pid = e->PBSRun.pid; - } - break; - case EDG_WLL_EVENT_PBSRERUN: - if (USABLE(res)) { - switch (get_pbs_event_source(e->any.seqcode)) { - case EDG_WLL_PBS_EVENT_SOURCE_SERVER: - js->pub.state = EDG_WLL_JOB_WAITING; - rep(js->pub.pbs_state, "Q"); - break; - case EDG_WLL_PBS_EVENT_SOURCE_MOM: - js->pub.state = EDG_WLL_JOB_WAITING; - rep(js->pub.pbs_state, "E"); - js->pbs_reruning = 1; - break; - default: - assert(0); // running event from strande source - break; - } - } - if (USABLE_DATA(res)) { - } - break; - case EDG_WLL_EVENT_PBSDONE: - if (USABLE(res)) { - switch (get_pbs_event_source(e->any.seqcode)) { - case EDG_WLL_PBS_EVENT_SOURCE_SERVER: - js->pub.state = EDG_WLL_JOB_DONE; - js->pub.done_code = EDG_WLL_STAT_OK; - rep(js->pub.pbs_state, "C"); - break; - case EDG_WLL_PBS_EVENT_SOURCE_MOM: - if (!js->pbs_reruning) { - js->pub.state = EDG_WLL_JOB_DONE; - js->pub.done_code = EDG_WLL_STAT_OK; - rep(js->pub.pbs_state, "C"); - } - break; - default: - assert(0); //done event from strange source - break; - } - } - if (USABLE_DATA(res)) { - js->pub.pbs_exit_status = e->PBSDone.exit_status; - } - break; - case EDG_WLL_EVENT_PBSRESOURCEUSAGE: - if (USABLE(res)) { - // signalize state done, done_code uknown - js->pub.state = EDG_WLL_JOB_DONE; - rep(js->pub.pbs_state, "C"); - } - if (USABLE_DATA(res)) { - char *new_resource_usage; - - trio_asprintf(&new_resource_usage,"%s%s\t%s = %f [%s]", - (js->pub.pbs_resource_usage) ? js->pub.pbs_resource_usage : "", - (js->pub.pbs_resource_usage) ? "\n": "", - e->PBSResourceUsage.name, - e->PBSResourceUsage.quantity, - e->PBSResourceUsage.unit); - - if (js->pub.pbs_resource_usage) free(js->pub.pbs_resource_usage); - js->pub.pbs_resource_usage = new_resource_usage; - } - break; - case EDG_WLL_EVENT_PBSERROR: - if (USABLE(res)) { - js->pub.state = EDG_WLL_JOB_DONE; - js->pub.done_code = EDG_WLL_STAT_FAILED; - rep(js->pub.pbs_state, "C"); - } - if (USABLE_DATA(res)) { - char *new_error_desc; - - trio_asprintf(&new_error_desc,"%s%s\t%s", - (js->pub.pbs_error_desc) ? js->pub.pbs_error_desc : "", - (js->pub.pbs_error_desc) ? "\n" : "", - e->PBSError.error_desc); - - if (js->pub.pbs_error_desc) free(js->pub.pbs_error_desc); - js->pub.pbs_error_desc = new_error_desc; - } - break; - case EDG_WLL_EVENT_USERTAG: - if (USABLE_DATA(res)) { - if (e->userTag.name != NULL && e->userTag.value != NULL) { - add_taglist(e->userTag.name, e->userTag.value, e->any.seqcode, js); - } - } - break; - - default: - break; - } - -/* XXX : just debug output - remove */ - - /*printf("processEvent_PBS(): %s (%s), state: %s --> %s\n ", - edg_wll_EventToString(e->any.type), - (res == RET_LATE) ? "RET_LATE" : "RET_OK", - edg_wll_StatToString(old_state), - edg_wll_StatToString(js->pub.state) ); - printf("\t%s\n",e->any.seqcode); - printf("\t(last=%s)\n",js->last_seqcode);*/ - -/*----------------------------------*/ - - if (USABLE(res)) { - rep(js->last_seqcode, e->any.seqcode); - - js->pub.lastUpdateTime = e->any.timestamp; - if (old_state != js->pub.state) { - js->pub.stateEnterTime = js->pub.lastUpdateTime; - js->pub.stateEnterTimes[1 + js->pub.state] - = (int)js->pub.lastUpdateTime.tv_sec; - } - } - if (! js->pub.location) js->pub.location = strdup("this is PBS"); - - - return RET_OK; -} - diff --git a/org.glite.lb.state-machine/src/seqcode_aux.c b/org.glite.lb.state-machine/src/seqcode_aux.c deleted file mode 100644 index b19d2ec..0000000 --- a/org.glite.lb.state-machine/src/seqcode_aux.c +++ /dev/null @@ -1,348 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include - -#include "glite/lbu/trio.h" -#include "glite/lb/context-int.h" - -#include "intjobstat.h" -#include "seqcode_aux.h" - - -/* -#include -#include -#include -#include -#include -#include -#include -#include - -#include "glite/jobid/cjobid.h" -#include "glite/lbu/trio.h" -#include "glite/lbu/db.h" -#include "glite/lb/context-int.h" - -#include "store.h" -#include "index.h" -#include "jobstat.h" -#include "get_events.h" -*/ - -int component_seqcode(const char *a, edg_wll_Source index) -{ - unsigned int c[EDG_WLL_SEQ_FORMAT_NUMBER+1]; - int res; - char sc[EDG_WLL_SEQ_SIZE]; - - if (!strstr(a, "LBS")) snprintf(sc,EDG_WLL_SEQ_SIZE,"%s:LBS=000000",a); - else snprintf(sc,EDG_WLL_SEQ_SIZE,"%s",a); - - res = sscanf(sc, EDG_WLL_SEQ_FORMAT_SCANF, - &c[EDG_WLL_SOURCE_USER_INTERFACE], - &c[EDG_WLL_SOURCE_NETWORK_SERVER], - &c[EDG_WLL_SOURCE_WORKLOAD_MANAGER], - &c[EDG_WLL_SOURCE_BIG_HELPER], - &c[EDG_WLL_SOURCE_JOB_SUBMISSION], - &c[EDG_WLL_SOURCE_LOG_MONITOR], - &c[EDG_WLL_SOURCE_LRMS], - &c[EDG_WLL_SOURCE_APPLICATION], - &c[EDG_WLL_SOURCE_LB_SERVER]); - if (res != EDG_WLL_SEQ_FORMAT_NUMBER) { -/* FIXME: syslog(LOG_ERR, "unparsable sequence code %s\n", sc); */ - fprintf(stderr, "unparsable sequence code %s\n", sc); - return -1; - } - - return(c[index]); -} - -char * set_component_seqcode(char *a,edg_wll_Source index,int val) -{ - unsigned int c[EDG_WLL_SEQ_FORMAT_NUMBER+1]; - int res; - char *ret; - char sc[EDG_WLL_SEQ_SIZE]; - - if (!strstr(a, "LBS")) snprintf(sc,EDG_WLL_SEQ_SIZE,"%s:LBS=000000",a); - else snprintf(sc,EDG_WLL_SEQ_SIZE,"%s",a); - - res = sscanf(sc, EDG_WLL_SEQ_FORMAT_SCANF, - &c[EDG_WLL_SOURCE_USER_INTERFACE], - &c[EDG_WLL_SOURCE_NETWORK_SERVER], - &c[EDG_WLL_SOURCE_WORKLOAD_MANAGER], - &c[EDG_WLL_SOURCE_BIG_HELPER], - &c[EDG_WLL_SOURCE_JOB_SUBMISSION], - &c[EDG_WLL_SOURCE_LOG_MONITOR], - &c[EDG_WLL_SOURCE_LRMS], - &c[EDG_WLL_SOURCE_APPLICATION], - &c[EDG_WLL_SOURCE_LB_SERVER]); - if (res != EDG_WLL_SEQ_FORMAT_NUMBER) { -/* FIXME: syslog(LOG_ERR, "unparsable sequence code %s\n", sc); */ - fprintf(stderr, "unparsable sequence code %s\n", sc); - return NULL; - } - - c[index] = val; - trio_asprintf(&ret, EDG_WLL_SEQ_FORMAT_PRINTF, - c[EDG_WLL_SOURCE_USER_INTERFACE], - c[EDG_WLL_SOURCE_NETWORK_SERVER], - c[EDG_WLL_SOURCE_WORKLOAD_MANAGER], - c[EDG_WLL_SOURCE_BIG_HELPER], - c[EDG_WLL_SOURCE_JOB_SUBMISSION], - c[EDG_WLL_SOURCE_LOG_MONITOR], - c[EDG_WLL_SOURCE_LRMS], - c[EDG_WLL_SOURCE_APPLICATION], - c[EDG_WLL_SOURCE_LB_SERVER]); - return ret; -} - -int before_deep_resubmission(const char *a, const char *b) -{ - if (component_seqcode(a, EDG_WLL_SOURCE_WORKLOAD_MANAGER) < - component_seqcode(b, EDG_WLL_SOURCE_WORKLOAD_MANAGER) ) - return(1); - else - return(0); - -} - -int same_branch(const char *a, const char *b) -{ - if (component_seqcode(a, EDG_WLL_SOURCE_WORKLOAD_MANAGER) == - component_seqcode(b, EDG_WLL_SOURCE_WORKLOAD_MANAGER) ) - return(1); - else - return(0); -} - -int edg_wll_compare_pbs_seq(const char *a,const char *b) -{ - char timestamp_a[14], pos_a[10], src_a; - char timestamp_b[14], pos_b[10], src_b; - int ev_code_a, ev_code_b; - int res; - - res = sscanf(a,"TIMESTAMP=%14s:POS=%10s:EV.CODE=%3d:SRC=%c", timestamp_a, pos_a, &ev_code_a, &src_a); - - if (res != 4) { -/* FIXME: syslog(LOG_ERR, "unparsable sequence code %s\n", a); */ - fprintf(stderr, "unparsable sequence code %s\n", a); - return -1; - } - - res = sscanf(b,"TIMESTAMP=%14s:POS=%10s:EV.CODE=%3d:SRC=%c", timestamp_b, pos_b, &ev_code_b, &src_b); - - if (res != 4) { -/* FIXME: syslog(LOG_ERR, "unparsable sequence code %s\n", b); */ - fprintf(stderr, "unparsable sequence code %s\n", b); - return -1; - } - - /* wild card for PBSJobReg - this event should always come as firt one */ - /* bacause it hold job.type, which is necessary for further event processing */ - if (ev_code_a == EDG_WLL_EVENT_REGJOB) return -1; - if (ev_code_b == EDG_WLL_EVENT_REGJOB) return 1; - - /* sort event w.t.r. to timestamps */ - if ((res = strcmp(timestamp_a,timestamp_b)) != 0) { - return res; - } - else { - /* if timestamps equal, sort if w.t.r. to file position */ - /* if you both events come from the same log file */ - if (src_a == src_b) { - /* zero mean in fact duplicate events in log */ - return strcmp(pos_a,pos_b); - } - /* if the events come from diffrent log files */ - /* it is possible to prioritize some src log file */ - else { - /* prioritize events from pbs_mom */ - if (src_a == 'm') return 1; - if (src_b == 'm') return -1; - - /* then prioritize events from pbs_server */ - if (src_a == 's') return 1; - if (src_b == 's') return -1; - - /* other priorities comes here... */ - } - } - - return 0; -} - -edg_wll_PBSEventSource get_pbs_event_source(const char *pbs_seq_num) { - switch (pbs_seq_num[EDG_WLL_SEQ_PBS_SIZE - 2]) { - case 'c': return(EDG_WLL_PBS_EVENT_SOURCE_SCHEDULER); - case 's': return(EDG_WLL_PBS_EVENT_SOURCE_SERVER); - case 'm': return(EDG_WLL_PBS_EVENT_SOURCE_MOM); - case 'a': return(EDG_WLL_PBS_EVENT_SOURCE_ACCOUNTING); - default: return(EDG_WLL_PBS_EVENT_SOURCE_UNDEF); - } -} - -edg_wll_CondorEventSource get_condor_event_source(const char *condor_seq_num) { - switch (condor_seq_num[EDG_WLL_SEQ_CONDOR_SIZE - 2]) { - case 'L': return(EDG_WLL_CONDOR_EVENT_SOURCE_COLLECTOR); - case 'M': return(EDG_WLL_CONDOR_EVENT_SOURCE_MASTER); - case 'm': return(EDG_WLL_CONDOR_EVENT_SOURCE_MATCH); - case 'N': return(EDG_WLL_CONDOR_EVENT_SOURCE_NEGOTIATOR); - case 'C': return(EDG_WLL_CONDOR_EVENT_SOURCE_SCHED); - case 'H': return(EDG_WLL_CONDOR_EVENT_SOURCE_SHADOW); - case 's': return(EDG_WLL_CONDOR_EVENT_SOURCE_STARTER); - case 'S': return(EDG_WLL_CONDOR_EVENT_SOURCE_START); - case 'j': return(EDG_WLL_CONDOR_EVENT_SOURCE_JOBQUEUE); - default: return(EDG_WLL_CONDOR_EVENT_SOURCE_UNDEF); - } -} - -int edg_wll_compare_seq(const char *a, const char *b) -{ - unsigned int c[EDG_WLL_SEQ_FORMAT_NUMBER+1]; - unsigned int d[EDG_WLL_SEQ_FORMAT_NUMBER+1]; - int res, i; - char sca[EDG_WLL_SEQ_SIZE], scb[EDG_WLL_SEQ_SIZE]; - - - if ( (strstr(a,"TIMESTAMP=") == a) && (strstr(b,"TIMESTAMP=") == b) ) - return edg_wll_compare_pbs_seq(a,b); - - if (!strstr(a, "LBS")) snprintf(sca,EDG_WLL_SEQ_SIZE,"%s:LBS=000000",a); - else snprintf(sca,EDG_WLL_SEQ_SIZE,"%s",a); - if (!strstr(b, "LBS")) snprintf(scb,EDG_WLL_SEQ_SIZE,"%s:LBS=000000",b); - else snprintf(scb,EDG_WLL_SEQ_SIZE,"%s",b); - - res = sscanf(sca, EDG_WLL_SEQ_FORMAT_SCANF, - &c[EDG_WLL_SOURCE_USER_INTERFACE], - &c[EDG_WLL_SOURCE_NETWORK_SERVER], - &c[EDG_WLL_SOURCE_WORKLOAD_MANAGER], - &c[EDG_WLL_SOURCE_BIG_HELPER], - &c[EDG_WLL_SOURCE_JOB_SUBMISSION], - &c[EDG_WLL_SOURCE_LOG_MONITOR], - &c[EDG_WLL_SOURCE_LRMS], - &c[EDG_WLL_SOURCE_APPLICATION], - &c[EDG_WLL_SOURCE_LB_SERVER]); - if (res != EDG_WLL_SEQ_FORMAT_NUMBER) { -/* FIXME: syslog(LOG_ERR, "unparsable sequence code %s\n", sca); */ - fprintf(stderr, "unparsable sequence code %s\n", sca); - return -1; - } - - res = sscanf(scb, EDG_WLL_SEQ_FORMAT_SCANF, - &d[EDG_WLL_SOURCE_USER_INTERFACE], - &d[EDG_WLL_SOURCE_NETWORK_SERVER], - &d[EDG_WLL_SOURCE_WORKLOAD_MANAGER], - &d[EDG_WLL_SOURCE_BIG_HELPER], - &d[EDG_WLL_SOURCE_JOB_SUBMISSION], - &d[EDG_WLL_SOURCE_LOG_MONITOR], - &d[EDG_WLL_SOURCE_LRMS], - &d[EDG_WLL_SOURCE_APPLICATION], - &d[EDG_WLL_SOURCE_LB_SERVER]); - if (res != EDG_WLL_SEQ_FORMAT_NUMBER) { -/* FIXME: syslog(LOG_ERR, "unparsable sequence code %s\n", scb); */ - fprintf(stderr, "unparsable sequence code %s\n", scb); - return 1; - } - - for (i = EDG_WLL_SOURCE_USER_INTERFACE ; i <= EDG_WLL_SEQ_FORMAT_NUMBER; i++) { - if (c[i] < d[i]) return -1; - if (c[i] > d[i]) return 1; - } - - return 0; -} - - -int compare_events_by_seq(const void *a, const void *b) -{ - const edg_wll_Event *e = (edg_wll_Event *) a; - const edg_wll_Event *f = (edg_wll_Event *) b; - int ret; - - - ret = edg_wll_compare_seq(e->any.seqcode, f->any.seqcode); - if (ret) return ret; - - if (e->any.timestamp.tv_sec < f->any.timestamp.tv_sec) return -1; - if (e->any.timestamp.tv_sec > f->any.timestamp.tv_sec) return 1; - if (e->any.timestamp.tv_usec < f->any.timestamp.tv_usec) return -1; - if (e->any.timestamp.tv_usec > f->any.timestamp.tv_usec) return 1; - return 0; -} - - - -int add_taglist(const char *new_item, const char *new_item2, const char *seq_code, intJobStat *js) -{ - edg_wll_TagValue *itptr; - int i; - - if (js->pub.user_tags == NULL) { - itptr = (edg_wll_TagValue *) calloc(2,sizeof(edg_wll_TagValue)); - itptr[0].tag = strdup(new_item); - itptr[0].value = strdup(new_item2); - js->pub.user_tags = itptr; - - js->tag_seq_codes = (char **) calloc(2,sizeof(char *)); - js->tag_seq_codes[0] = strdup(seq_code); - - return 1; - } else { - for (i = 0, itptr = js->pub.user_tags; itptr[i].tag != NULL; i++) { - if ( !strcasecmp(itptr[i].tag, new_item)) { - if (edg_wll_compare_seq(seq_code,js->tag_seq_codes[i]) == 1) { - free(itptr[i].value); - itptr[i].value = strdup(new_item2); - - free(js->tag_seq_codes[i]); - js->tag_seq_codes[i] = strdup(seq_code); - - return 1; - } - else return 1; - } - } - - itptr = (edg_wll_TagValue *) realloc(js->pub.user_tags, (i+2)*sizeof(edg_wll_TagValue)); - js->tag_seq_codes = (char **) realloc(js->tag_seq_codes, (i+2) * sizeof(char *)); - - if (itptr != NULL && js->tag_seq_codes != NULL) { - itptr[i].tag = strdup(new_item); - itptr[i].value = strdup(new_item2); - itptr[i+1].tag = NULL; - itptr[i+1].value = NULL; - js->pub.user_tags = itptr; - - js->tag_seq_codes[i] = strdup(seq_code); - js->tag_seq_codes[i+1] = NULL; - - return 1; - } else { - return 0; - } - } -} - diff --git a/org.glite.lb.types/Makefile b/org.glite.lb.types/Makefile deleted file mode 100644 index fefb195..0000000 --- a/org.glite.lb.types/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -stagedir=../stage - --include Makefile.inc - - -PM=StructField.pm MultiStruct.pm -T=events.T status.T types.T -SCRIPTS=at3 check_version.pl - -default: compile - -compile: at3 - -at3: at3.in - #XXX: sed "s?%PREFIX%?${stagedir}?" at3.in >$@ - cp at3.in $@ - -stage: compile - $(MAKE) install PREFIX=${stagedir} - -install: compile - mkdir -p ${PREFIX}/share/perl/gLite/LB ${PREFIX}/share/lb/at3 ${PREFIX}/sbin - install -m 644 ${PM} ${PREFIX}/share/perl/gLite/LB - install -m 644 ${T} ${PREFIX}/share/lb/at3 - for p in ${SCRIPTS} ; do \ - install -m 755 "$$p" "${PREFIX}/sbin/glite-lb-$$p"; \ - done - -clean: - rm -vf at3 - rm -rvf log.xml project/glite-lb-types.spec rpmbuild/ RPMS/ tgz/ - -check: diff --git a/org.glite.lb.types/MultiStruct.pm b/org.glite.lb.types/MultiStruct.pm deleted file mode 100644 index 0f6efb3..0000000 --- a/org.glite.lb.types/MultiStruct.pm +++ /dev/null @@ -1,213 +0,0 @@ -package MultiStruct; - -use gLite::LB::StructField; - -sub new { - shift; - my $self = {}; - $self->{comments} = {}; # typ->comment - $self->{fields} = {}; # typ->{ name->StructField, ... } - $self->{order} = {}; - $self->{flesh} = {}; - - bless $self; -} - -sub selectType { - my $self = shift; - my $type = shift; - $self->{type} = $type; - 1; -} - -sub addType { - my $self = shift; - my $type = shift; - my $comment = shift; - $self->selectType($type); - $self->{comments}->{$type} = $comment; - $self->{fields}->{$type} = {}; - 1; -} - -sub selectField { - my $self = shift; - $self->{field} = shift; - $self->getField; -} - -sub addField { - my $self = shift; - my $field = shift; - - - die "unselected type" unless $self->{type}; - $self->{fields}->{$self->{type}}->{$field->{name}} = $field; - $self->selectField($field->{name}); - - my $f = $self->{field}; - my $t = $self->{type}; - push @{$field->{refs}},"$t:$f"; - 1; -} - -sub getField { - my $self = shift; - my $f = $self->{fields}->{$self->{type}}->{$self->{field}}; - return $f ? $f : $self->{fields}->{_common_}->{$self->{field}}; -} - -sub load { - my $self = shift; - my $fh = shift; - local $_; - my $flesh = 'common'; - - while ($_ = <$fh>) { - - chomp; - s/#.*$//; - next if /^\s*$/; - - if (/^\@type\s+(\S+)\s*(.*$)$/) { - $self->addType($1,$2); - $self->{order}->{$1} = $.; - $self->{flesh}->{$1} = $flesh; - next; - } - - if (/^\@flesh\s+(\S+)\s*(.*$)$/) { - $flesh = $1; - next; - } - - s/^\s*//; - my ($ftype,$fname,$comment) = split /\s+/,$_,3; - if ($ftype eq '_code_') { - my $f = $self->getField(); - addCode $f $fname,$comment; - } - elsif ($ftype eq '_alias_') { - my $f = $self->getField(); - addAlias $f $fname,$comment; - } - elsif ($ftype eq '_special_') { - my $f = $self->getField(); - addSpecial $f $fname; - } - elsif ($ftype eq '_null_') { - my $f = $self->getField(); - setNull $f $fname; - } - elsif ($ftype eq '_optional_') { - my $f = $self->getField(); - $f->{optional} = 1; - } - elsif ($ftype eq '_index_') { - my $f = $self->getField(); - $f->{index} = 1; - } - elsif ($ftype eq '_ref_') { - my ($rt,$rf) = split /:/,$fname; - $self->addField(my $f = $self->{fields}->{$rt}->{$rf}); - } - elsif ($ftype eq '_pad_') { - my $f = $self->getField(); - $f->{pad} = $fname; - } - else { - my $f = new StructField $fname,$ftype,$comment,$.; - $f->{ptype} = $self->{type}; - $self->addField($f); - } - } -} - -sub getTypes { - my $self = shift; - my @out; - local $_; - - for (keys %{$self->{fields}}) { - push @out,$_ unless $_ eq '_common_'; - } - @out; -} - -sub getTypesOrdered { - my $self = shift; - my @names = getTypes $self; - - sort { - my $oa = $self->{order}->{$a}; - my $ob = $self->{order}->{$b}; - $oa <=> $ob; - } @names; -} - -sub getTypeComment { - my $self = shift; - my $type = shift || $self->{type}; - $self->{comments}->{$type}; -} - -sub getFieldComment { - my $self = shift; - my $fname = shift; - $self->{fields}->{$self->{type}}->{$fname}->{comment}; -} - -sub getFields { - my $self = shift; - keys %{$self->{fields}->{$self->{type}}}; -} - -sub getFieldsOrdered { - my $self = shift; - my @names = $self->getFields; - sort { - my $oa = $self->selectField($a)->{order}; - my $ob = $self->selectField($b)->{order}; - $oa <=> $ob; - } @names; -} - -sub getFieldOccurence { - my $self = shift; - my $fname = shift; - my @out; - local $_; - - for (keys %{$self->{fields}}) { - push @out,$_ if $self->{fields}->{$_}->{$fname}; - } - @out; -} - -sub getAllFields { - my $self = shift; - my %out; - local $_; - - for my $t (values %{$self->{fields}}) { - $out{$_->{name}} = 1 for (values %$t); - } - keys %out; -} - -sub getAllFieldsOrdered { - my $self = shift; - my @names = getAllFields $self; - - sort { - my @occ = $self->getFieldOccurence($a); - $self->selectType($occ[0]); - my $oa = $self->selectField($a)->{order}; - @occ = $self->getFieldOccurence($b); - $self->selectType($occ[0]); - my $ob = $self->selectField($b)->{order}; - $oa <=> $ob; - } @names; -} - -1; diff --git a/org.glite.lb.types/StructField.pm b/org.glite.lb.types/StructField.pm deleted file mode 100644 index 95d33b8..0000000 --- a/org.glite.lb.types/StructField.pm +++ /dev/null @@ -1,116 +0,0 @@ -package StructField; - -$lang = 'C'; -1; - -sub new { - shift; - my $self = {}; - $self->{name} = shift; - $self->{type} = shift; - $self->{comment} = shift; - $self->{order} = shift; - $self->{null} = $main::DefaultNullValue{$self->{type}}; - bless $self; -} - -sub addCode { - my $self = shift; - my $code = shift; - my $comment = shift; - push @{$self->{codes}},{name=>$code,comment=>$comment}; - 1; -} - -sub addSpecial { - my $self = shift; - my $special = shift; - $self->{special} = $special; - 1; -} - -sub addAlias { - my $self = shift; - my $name = shift; - my $lang = shift; - $self->{aliases}->{$lang} = $name; - 1; -} - -sub hasAlias { - my $self = shift; - my $lang = shift; - return $self->{aliases}->{$lang} ? 1 : 0; -} - -sub getName { - my $self = shift; - my $lang = shift || $lang; - $self->{aliases}->{$lang} || $self->{name}; -# return $self->{aliases}->{$lang} ? $self->{aliases}->{$lang} : $self->{name}; -} - -sub getComment { - my $self = shift; - $self->{comment}; -} - -sub getDefaultNullValue { - my $self = shift; - $self->{null}; -} - -sub toString { - my $self = shift; - my $src = shift; - my $dst = shift; - - eval $main::toString{$lang}->{$self->{type}}; -} - -sub fromString { - my $self = shift; - my $src = shift; - my $dst = shift; - - eval $main::fromString{$lang}->{$self->{type}}; -} - -sub isNULL { - my $self = shift; - my $a = shift; - my $b = $self->{null}; - - eval $main::compare{$lang}->{$self->{type}}; -} - -sub isnotNULL { - my $self = shift; - my $src = shift; - - '!('.$self->isNULL($src).')'; -} - -sub compare { - my $self = shift; - my $a = shift; - my $b = shift; - eval $main::compare{$lang}->{$self->{type}}; -} - -sub toFormatString { - my $self = shift; - - eval $main::toFormatString{$lang}->{$self->{type}}; -} - -sub setNull { - my $self = shift; - $self->{null} = shift; -} - -sub getType { - my $self = shift; - - eval $main::types{$lang}->{$self->{type}}; -} diff --git a/org.glite.lb.types/at3.in b/org.glite.lb.types/at3.in deleted file mode 100755 index 2d5a866..0000000 --- a/org.glite.lb.types/at3.in +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners/ for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use File::Basename; - -my $lines = $ENV{AT3_LINES}; - -my $prefix; -use File::Basename; - -BEGIN{ $prefix = dirname($0)."/.."; } - -use lib "$prefix/share/perl"; -use gLite::LB::MultiStruct; -require "$prefix/share/lb/at3/types.T"; - -my $eventsn = "$prefix/share/lb/at3/events.T"; -my $statusn = "$prefix/share/lb/at3/status.T"; - -my $indent = ''; - -$event = new MultiStruct; -$status = new MultiStruct; - -sub gen { - local $_ = shift; - - s/^\n!//; - s/\n!/\n/g; - print $_; -} - - -open EVENTS,$eventsn or die "$eventsn: $!\n"; -$event->load(\*EVENTS); -close EVENTS; - -open STATUS,$statusn or die "$statusn: $!\n"; -$status->load(\*STATUS); -close STATUS; - -my $code; -my $startcode; -while (<>) { - chomp; - if (/^\@\@\@LANG: (\S+)$/) { - $StructField::lang = $1; - next; - } - - if ($code) { - if (/^\@\@\@}$/) { - $code .= "1;\n"; - print "#line $startcode \"$ARGV\"\n/* begin */\n" if $lines; - eval $code or die "eval: $@ at $ARGV:$.\n"; - my $nxtline = $.+1; - print "/* end */\n#line $nxtline \"$ARGV\"\n" if $lines; - undef $code; - } - else { $code .= $_."\n"; } - } - else { - if (/^\@\@\@{$/) { - $startcode = $.; - $code = "\n"; - } - elsif (/^\@\@\@AUTO$/) { - print qq{ - !! Automatically generated file - !! Do not edit, your changes will be discarded upon build - !! Change the corresponding template file $ARGV - -}; - print "#line $. \"$ARGV\"\n" if $lines; - } - else { - print "$_\n"; - } - } -} - -# print $event_common{prog}->copy('bla','hu'); diff --git a/org.glite.lb.types/check_version.pl b/org.glite.lb.types/check_version.pl deleted file mode 100755 index 9ba3229..0000000 --- a/org.glite.lb.types/check_version.pl +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/perl -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# check_version script to be used to compare common and client module versions -# Usage: -# - set environment variables VERSION and VERSION_AHEAD of the module -# - run against ${stagedir}/include/glite/lb/common_version.h -# Example: -# ./check_version.pl common_version.h - -my $version = $ENV{VERSION}; -if ($version =~ /(\d+)\.\d+\.\d+/) { - $version = $1; -} else { - print "error: wrong version format ($version)\n"; - exit 1; -} - -my $ahead = $ENV{VERSION_AHEAD}; -if ($ahead =~ /(\-?\d+)/) { - $ahead = $1; -} else { - print "error: wrong version_ahead format ($ahead)\n"; - exit 1; -} - -my $iface; - -while (<>) { - /#define GLITE_LB_COMMON_VERSION "(\d+)\.\d+\.\d+"/; - $iface = $1; -} - -if ($iface + $ahead != $version) { - print "error: Major version of the common ($iface and $ahead ahead) DOES NOT match implementation ($version)\n" ; - exit 1; -} diff --git a/org.glite.lb.types/configure b/org.glite.lb.types/configure deleted file mode 100755 index c82ed75..0000000 --- a/org.glite.lb.types/configure +++ /dev/null @@ -1,843 +0,0 @@ -#!/usr/bin/perl - -# WARNING: Don't edit this file unless it is the master copy in org.glite.lb -# -# For the purpose of standalone builds of lb/jobid/lbjp-common components -# it is copied on tagging - -# $Header$ -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners/ for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use Getopt::Long; - -my $pwd = `pwd`; chomp $pwd; -my $prefix = $pwd.'/stage'; -my $stagedir; -my $staged; -my $module; -my $thrflavour = 'gcc64dbgpthr'; -my $nothrflavour = 'gcc64dbg'; -my $mode = 'build'; -my $help = 0; -my $listmodules; -my $version; -my $branch; -my $output; -my $lb_tag = ''; -my $lbjp_tag = ''; -my $jp_tag = ''; -my $sec_tag = ''; -my $jobid_tag = ''; -my $libdir = getlibdir(); - -my @nodes = qw/client server logger utils client-java doc ws-test db jpprimary jpindex jpclient harvester/; -my %enable_nodes; -my %disable_nodes; - -my %extern_prefix = ( - cares => '/opt/c-ares', - classads => '/opt/classads', - cppunit => '/usr', - expat => '/usr', - globus => '/opt/globus', - gsoap => '/usr', - mysql => '/usr', - 'mysql-devel' => '', - 'mysql-server' => '', - voms => '/opt/glite', - gridsite => '/opt/glite', - lcas => '/opt/glite', - trustmanager => '/opt/glite', - utiljava => '/opt/glite', - ant => '/usr', - jdk => '/usr', - libtar => '/usr', - axis => '/usr', - log4c => '/usr', - postgresql => '/usr' -); - -my %jar = ( - 'commons-codec' => '/usr/share/java/commons-codec.jar', - 'commons-lang' => '/usr/share/java/commons-lang.jar', -); - - -my %glite_prefix; -my %need_externs; -my %need_externs_type; -my %need_jars; -my %extrafull; -my %extranodmod; -my %deps; -my %deps_type; -my %topbuild; - -my %lbmodules = ( - 'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim glite-LB/], - 'security' => [qw/gss gsoap-plugin/], - 'lbjp-common' => [qw/db log maildir server-bones trio jp-interface/], - 'jobid' => [qw/api-c api-cpp api-java/], - 'jp' => [ qw/client doc index primary server-common ws-interface/ ], - ); - - -my @opts = ( - 'prefix=s' => \$prefix, - 'staged=s' => \$staged, - 'module=s' => \$module, - 'thrflavour=s' => \$thrflavour, - 'nothrflavour=s' => \$nothrflavour, - 'mode=s' => \$mode, - 'listmodules=s' => \$listmodules, - 'version=s' => \$version, - 'branch=s' => \$branch, - 'output=s' => \$output, - 'stage=s' => \$stagedir, - 'lb-tag=s' => \$lb_tag, - 'lbjp-common-tag=s' => \$lbjp_tag, - 'jp-tag=s' => \$jp_tag, - 'security-tag=s' => \$sec_tag, - 'jobid-tag=s' => \$jobid_tag, - 'help' => \$help, - 'libdir=s' => \$libdir, -); - -for (@nodes) { - $enable_nodes{$_} = 0; - $disable_nodes{$_} = 0; - - push @opts,"disable-$_",\$disable_nodes{$_}; - push @opts,"enable-$_",\$enable_nodes{$_}; -} - -push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix; -push @opts,"with-$_=s",\$jar{$_} for keys %jar; - -my @keeparg = @ARGV; - -GetOptions @opts or die "Errors parsing command line\n"; - -$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq ''; -$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq ''; - -if ($help) { usage(); exit 0; } - -if ($listmodules) { - my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}}; - print "@m\n"; - exit 0; -} - -warn "$0: --version, --branch and --output make sense only in --mode=etics\n" - if ($version || $output || $branch) && $mode ne 'etics'; - -my $en; -for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; } - -my $dis; -for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; } - -die "--enable-* and --disable-* are mutually exclusive\n" - if $en && $dis; - -die "--module cannot be used with --enable-* or --disable-*\n" - if $module && ($en || $dis); - -die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}}; - -if ($dis) { - for (@nodes) { - $enable_nodes{$_} = 1 unless $disable_nodes{$_}; - } -} - -if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ; - -for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; } - -$stagedir = $prefix unless $stagedir; - -if ($mode eq 'build') { - print "Writing config.status\n"; - open CONF,">config.status" or die "config.status: $!\n"; - print CONF "$0 @keeparg\n"; - close CONF; -} - - -my @modules; -my %aux; - -if ($module) { -# push @modules,split(/[,.]+/,$module); - push @modules,$module; -} -else { - @modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes)); - - my $n; - - do { - local $"="\n"; - $n = $#modules; - push @modules,(map @{$deps{$_}},@modules); - - undef %aux; @aux{@modules} = (1) x ($#modules+1); - @modules = keys %aux; - } while ($#modules > $n); -} - -@aux{@modules} = (1) x ($#modules+1); -delete $aux{$_} for (split /,/,$staged); -@modules = keys %aux; - -mode_build() if $mode eq 'build'; -mode_checkout() if $mode eq 'checkout'; -mode_etics($module) if $mode eq 'etics'; - -sub mode_build { - print "\nBuilding modules: @modules\n"; - - my @ext = map @{$need_externs{$_}},@modules; - my @myjars = map @{$need_jars{$_}},@modules; - undef %aux; @aux{@ext} = 1; - @ext = keys %aux; - undef %aux; @aux{@myjars} = (1) x ($#myjars+1); - @myjars = keys %aux; - - print "\nRequired externals:\n"; - print "\t$_: $extern_prefix{$_}\n" for @ext; - print "\t$_: $jar{$_}\n" for @myjars; - print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n"; - - mkinc($_) for @modules; - - print "Creating Makefile\n"; - - open MAK,">Makefile" or die "Makefile: $!\n"; - - print MAK "all: @modules\n\nclean:\n"; - - for (@modules) { - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - print MAK "\tcd $full$build && \${MAKE} clean\n" - } - - print MAK "\ndistclean:\n"; - - for (@modules) { - my $full = full($_); - print MAK $topbuild{$_} ? - "\tcd $full$build && \${MAKE} distclean\n" : - "\trm -rf $full$build\n" - } - - print MAK "\n"; - - for (@modules) { - my %ldeps; undef %ldeps; - @ldeps{@{$deps{$_}}} = 1; - for my $x (split /,/,$staged) { delete $ldeps{$x}; } - my @dnames = $module ? () : keys %ldeps; - - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - - print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n"; - } - - close MAK; -} - -sub mode_checkout() { - for (@modules) { - my $module = $_; - my $tag = ""; - if ($lb_tag){ - for (@{$lbmodules{lb}}){ - if ("lb.".$_ eq $module){ - $tag = '-r '.$lb_tag; - } - } - } - if ($lbjp_tag){ - for (@{$lbmodules{'lbjp-common'}}){ - if ("lbjp-common.".$_ eq $module){ - $tag = '-r '.$lbjp_tag; - } - } - } - if ($jp_tag){ - for (@{$lbmodules{'jp'}}){ - if ("jp.".$_ eq $module){ - $tag = '-r '.$jp_tag; - } - } - } - if ($sec_tag){ - for (@{$lbmodules{security}}){ - if ("security.".$_ eq $module){ - $tag = '-r '.$sec_tag; - } - } - } - if ($jobid_tag){ - for (@{$lbmodules{jobid}}){ - if ("jobid.".$_ eq $module){ - $tag = '-r '.$jobid_tag; - } - } - } - #if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){ - # print "found"; - #} - $_ = full($_); - print "\n*** Checking out $_\n"; - system("cvs checkout $tag $_") == 0 or die "cvs checkout $tag $_: $?\n"; - } -} - -BEGIN{ -%need_externs_aux = ( - 'lb.client' => [ qw/cppunit:B classads/ ], - 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava/ ], - 'lb.common' => [ qw/expat cares:B cppunit:B classads/ ], - 'lb.doc' => [], - 'lb.logger' => [ qw/cppunit:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ], - 'lb.state-machine' => [ qw/classads/ ], - 'lb.utils' => [ qw/cppunit:B/ ], - 'lb.ws-interface' => [], - 'lb.ws-test' => [ qw/gsoap:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw// ], - 'lb.yaim' => [ qw/yaim_core:R/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], - 'lbjp-common.db' => [ qw/mysql:B mysql-devel:B postgresql:B cppunit:B log4c:B/ ], - 'lbjp-common.log' => [ qw/log4c/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw// ], - 'lbjp-common.trio' => [ qw/cppunit:B/ ], - 'lbjp-common.jp-interface' => [ qw/cppunit:B log4c:B/ ], - 'security.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B/ ], - 'security.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap:B/ ], - 'jobid.api-c' => [ qw/cppunit:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], - 'jobid.api-java' => [ qw/ant:B jdk:B/ ], - 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], - 'jp.doc' => [], - 'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ], - 'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ], - 'jp.server-common' => [], - 'jp.ws-interface' => [], -); - -for my $ext (keys %need_externs_aux) { - for (@{$need_externs_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$need_externs{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $need_externs_type{$ext}->{$1} = $type; - } -} - -%need_jars = ( - 'jobid.api-java' => [ qw/commons-codec/ ], - 'lb.client-java' => [ qw/commons-lang/ ], -); - -for my $jar (keys %need_jars) { - for (@{$need_jars{$jar}}) { - $need_externs_type{$jar}->{$_} = 'BR'; # XXX - } -} - -%deps_aux = ( - 'lb.client' => [ qw/ - lb.types:B lb.common - lbjp-common.trio - jobid.api-cpp:B jobid.api-c - security.gss - / ], - 'lb.client-java' => [ qw/ - lb.types:B - lb.ws-interface:B - jobid.api-java - / ], - 'lb.common' => [ qw/ - jobid.api-cpp:B jobid.api-c - lb.types:B lbjp-common.trio security.gss - / ], - 'lb.doc' => [ qw/lb.types:B/ ], - 'lb.logger' => [ qw/ - lbjp-common.trio - lbjp-common.log - jobid.api-c - lb.common - security.gss - / ], - 'lb.server' => [ qw/ - lb.ws-interface lb.types:B lb.common lb.state-machine - lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log - jobid.api-c - security.gsoap-plugin security.gss - / ], - 'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ], - 'lb.utils' => [ qw/ - lbjp-common.jp-interface - jobid.api-c - lbjp-common.trio lbjp-common.maildir - lb.client lb.state-machine - / ], - 'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ], - 'lb.ws-interface' => [ qw/lb.types:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw/ - jobid.api-c lbjp-common.trio lbjp-common.db lb.common lb.client - security.gss lbjp-common.log - / ], - 'lb.yaim' => [ qw// ], - 'lb.glite-LB' => [ qw/ - lb.logger:R lb.server:R lb.utils:R lb.doc:R - lb.ws-test:R lb.harvester:R lb.yaim:R lb.client-java:R - / ], - 'lbjp-common.db' => [ qw/lbjp-common.trio lbjp-common.log/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw/lbjp-common.log/ ], - 'lbjp-common.trio' => [ qw// ], - 'security.gss' => [ qw// ], - 'security.gsoap-plugin' => [ qw/security.gss/ ], - 'jobid.api-c' => [ qw// ], - 'jobid.api-cpp' => [ qw/jobid.api-c/ ], - 'jobid.api-java' => [ qw// ], - - 'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ], - - 'jp.client' => [ qw/ - jp.ws-interface - lbjp-common.jp-interface lbjp-common.maildir - jobid.api-c - security.gsoap-plugin - / ], - 'jp.doc' => [ qw// ], - 'jp.index' => [ qw/ - jp.server-common jp.ws-interface - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.primary' => [ qw/ - jobid.api-c - jp.server-common jp.ws-interface - lb.state-machine - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.server-common' => [ qw/ - lbjp-common.jp-interface lbjp-common.db - / ], - 'jp.ws-interface' => [ qw// ], -); - -for my $ext (keys %deps_aux) { - for (@{$deps_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$deps{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $deps_type{$ext}->{$1} = $type; - } -} - - -%extrafull = ( gridsite=>'org.gridsite.core'); - -#( java => 'client-java' ); -%extranodmod = ( - db => 'lbjp-common.db', - jpprimary => 'jp.primary', - jpindex => 'jp.index', - jpclient => 'jp.client', -); - -%obsoletes = ( - 'lb.yaim' => [ qq/glite-yaim-lb/ ], -); - -my @t = qw/lb.client-java jobid.api-java lb.types/; -@topbuild{@t} = (1) x ($#t+1); -} - -sub full -{ - my $short = shift; - return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short; -} - -sub mkinc -{ - my %aux; - undef %aux; - my @m=qw/ -lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB -security.gss security.gsoap-plugin -jobid.api-c jobid.api-cpp jobid.api-java -lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface -jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface -/; - @aux{@m} = (1) x ($#m+1); - - my $short = shift; - my $full = full $short; - - unless ($aux{$short}) { - print "Makefile.inc not needed in $full\n"; - return; - } - - my $build = ''; - - unless ($topbuild{$_}) { - $build = '/build'; - unless (-d "$full/build") { - mkdir "$full/build" or die "mkdir $full/build: $!\n"; - } - unlink "$full/build/Makefile"; - symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n"; - } - - open MKINC,">$full$build/Makefile.inc" - or die "$full$build/Makefile.inc: $!\n"; - - print "Creating $full$build/Makefile.inc\n"; - - print MKINC qq{ -PREFIX = $prefix -stagedir = $stagedir -thrflavour = $thrflavour -nothrflavour = $nothrflavour -libdir = $libdir -}; - - for (@{$need_externs{$short}}) { - print MKINC "${_}_prefix = $extern_prefix{$_}\n" - } - - for (@{$need_jars{$short}}) { - print MKINC "${_}_jar = $jar{$_}\n" - } - - my $need_gsoap = 0; - for (@{$need_externs{$short}}) { $need_gsoap = 1 if $_ eq 'gsoap'; } - - print MKINC "gsoap_default_version=".gsoap_version()."\n" if $need_gsoap; - - close MKINC; -} - -my %etics_externs; -my %etics_projects; -BEGIN{ - %etics_externs = ( - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - gridsite=>'org.gridsite.shared', - lcas=>'org.glite.security.lcas', - trustmanager=>'org.glite.security.trustmanager', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - yaim_core=>'org.glite.yaim.core', - ); - %etics_projects = ( - vdt=>[qw/globus globus_essentials/], - 'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/], - ); -}; - -sub mode_etics { - $fmod = shift; - - die "$0: --module required with --etics\n" unless $fmod; - - my ($subsys,$module) = split /\./,$fmod; - - my ($major,$minor,$rev,$age); - - if ($version) { - $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/; - ($major,$minor,$rev,$age) = ($1,$2,$3,$4); - } - else { - open V,"org.glite.$subsys.$module/project/version.properties" - or die "org.glite.$subsys.$module/project/version.properties: $!\n"; - - while ($_ = ) { - chomp; - ($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/; - $age = $1 if /module\.age\s*=\s*([[:digit:]]+)/; - } - close V; - } - - my @copts = (); - my %ge; - @ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1); - - for (@{$need_externs{"$subsys.$module"}}) { - if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; - } - } - - for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - push @copts,"--with-$_ \${$eext.location}/$_*.jar"; - } - - my $conf; - my $conftag; - - if ($branch) { - $conf = "glite-${subsys}-${module}_$branch"; - $conftag = $branch; - $dwpath = ""; } - else { - $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - $conftag = $conf; - $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n"; } -# my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - my $file = $output ? $output : "$conf.ini"; - open C,">$file" or die "$file: $!\n"; - - my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build"; - - my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..'; - - my $package_description = ""; - my $package_summary = ""; - - if (-e "org.glite.$subsys.$module/project/package.description") { - open V, "org.glite.$subsys.$module/project/package.description"; - $package_description = join ("", ); - close V; - chomp $package_description; - $package_description =~ s/\n/\\n/g; - $package_description = "package.description = $package_description"; - } - else { - print STDERR "package.description not found for $subsys.$module!\n"; } - - if (-e "org.glite.$subsys.$module/project/package.summary") { - open V, "org.glite.$subsys.$module/project/package.summary"; - $package_summary = join ("", ); - close V; - chomp $package_summary; - $package_summary =~ s/\n/\\n/g; - $package_summary = "package.summary = $package_summary"; - } - else { - print STDERR "package.summary not found for $subsys.$module!\n"; } - - - print STDERR "Writing $file\n"; - print C qq{ -[Configuration-$conf] -profile = None -moduleName = org.glite.$subsys.$module -displayName = $conf -description = org.glite.$subsys.$module -projectName = org.glite -age = $age -deploymentType = None -tag = $conftag -version = $major.$minor.$rev -$dwpath -[Platform-default:VcsCommand] -displayName = None -description = None -tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName} -branch = None -commit = None -checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName} - -[Platform-default:BuildCommand] -postpublish = None -packaging = None -displayName = None -description = None -doc = None -prepublish = None -publish = None -compile = make -init = None -install = make install -clean = make clean -test = make check -configure = cd $confdir && /usr/bin/perl \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts -checkstyle = None - -[Platform-default:Property] -$buildroot -$package_description -$package_summary -}; - for (@{$obsoletes{"$subsys.$module"}}) { - print C "package.obsoletes = $_\n"; - print C "package.replaces = $_\n"; - } - - print C qq{ -[Platform-default:DynamicDependency] -}; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; - } - } - - my $type = $need_externs_type{"$subsys.$module"}->{$_}; - print C "$proj|$eext = $type\n"; - } - - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "org.glite|org.glite.$_ = $type\n"; - } - - close C; -} - -sub gsoap_version { - local $_; - my $gsoap_version; - open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n"; - - while ($_ = ) { - chomp; - - $gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/; - } - close S; - return $gsoap_version; -} - -sub getlibdir { - if ( -e "/etc/debian_version") { # We are on Debian - $lib64="lib"; - $lib32="lib32"; } - else { # Another distribution - $lib64="lib64"; - $lib32="lib"; } - $libdir=$lib32; - - open INP, "uname -s | "; # Check kernel name - $kname= ; - chomp($kname); - close INP; - - if ( $kname == "Linux") { - $arch = ("x86_64\npowerpc\nppc64\n"); - - open INP, "uname -p | "; # Check processor type - $procname= ; - chomp($procname); - close INP; - - if ($arch =~/^$procname\n/) { - return ($lib64); } - - open INP, "uname -m | "; # Check machine hardware - $machname= ; - chomp($machname); - close INP; - - if ($arch =~/^$machname\n/) { - return ($lib64); } - - # special cases (hyperlink lib64, Debian) - if (-l "/usr/lib64") { - $libdir=$lib32; } - - # if /usr/lib64 doesn't exist at all (AIX) - unless ( -e "/usr/lib64" ) { - $libdir=$lib32; } - } - - if ( $kname == "SunOS") { - if (-e "/usr/lib/64") { - $libdir="lib/64"; } - } - - return $libdir; -} - -sub usage { - my @ext = keys %extern_prefix; - my @myjars, keys %jar; - - print STDERR qq{ -usage: $0 options - -General options (defaults in []): - --prefix=PREFIX destination directory [./stage] - --staged=module,module,... what is already in PREFIX (specify without org.glite.) - --thrflavour=flavour - --nothrflavour=flavour threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg] - --listmodules=subsys list modules of a subsystem - --libdir=libdir typically [lib,lib64] postfix - -Mode of operation: - --mode={checkout|build|etics} what to do [build] - -What to build: - --module=module build this module only (mostly in-Etics operation) - --enable-NODE build this "node" (set of modules) only. Available nodes are - @{$lbmodules{lb}},@{$lbmodules{security}} - --disable-NODE don't build this node - --lb-tag=tag checkout LB modules with specific tag - --jp-tag=tag checkout JP modules with specific tag - --lbjp-common-tag=tag checkout lbjp-common modules with specific tag - --security-tag=tag checkout security modules with specific tag - --jobid-tag=tag checkout jobid modules with specific tag - -Dependencies: - --with-EXTERNAL=PATH where to look for an external. Required externals - (not all for all modules) are: - @ext - --with-JAR=JAR where to look for jars. Required jars are: - @myjars - Summary of what will be used is always printed - -}; - -} diff --git a/org.glite.lb.types/events.T b/org.glite.lb.types/events.T deleted file mode 100644 index 1188b8e..0000000 --- a/org.glite.lb.types/events.T +++ /dev/null @@ -1,466 +0,0 @@ -@type _common_ - timeval timestamp Time the event was generated. - _alias_ date ULM - 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. - _alias_ host ULM - int level Logging level (in the range from DEBUG to EMERGENCY). - _alias_ lvl ULM - _code_ EMERGENCY emergency - _code_ ALERT alert - _code_ ERROR error - _code_ WARNING warning - _code_ AUTH authentication - _code_ SECURITY security - _code_ USAGE usage - _code_ SYSTEM system - _code_ IMPORTANT important - _code_ DEBUG debug - int priority Message priority (yet 0 for asynchronous and 1 for synchronous transfers). - _null_ -1 - 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_ - -@flesh gLite - -@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'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 Job id as assigned by the receiving software component. - _optional_ - -@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 job id as assigned by the receiving component. - _optional_ - -@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 Description of the reason why the job was refused. - _optional_ - -@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. - _optional_ - 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. - _optional_ - -@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. - _optional_ - -@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. - _optional_ - 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. - _optional_ - 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 Job wrapper 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 or SHALLOW). - _code_ WILLRESUB The job will be resubmitted (deep resubmission). - _code_ WONTRESUB The job will not be resubmitted. - _code_ SHALLOW Shallow resubmission (user payload has not started yet) - string reason Reason why the job will or will not be resubmitted. - _optional_ - string tag Value of the attribute on which the decision to resubmit the job was based. - _optional_ - -@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. - _code_ KILLED The job was killed (in Job Wrapper). - string reason Detailed description why the job was terminated. - _optional_ - 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 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. - _optional_ - -@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 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 Match Matching CE found. - string dest_id Identification of the queue on the CE that the job could be send to. - -@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 of the job being registered. - _optional_ - string ns NetworkServer/CE endpoint etc. handling the newly registered job. - jobid parent Grid job id of the parent job registering this new one. - _optional_ - - 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). - _code_ COLLECTION The job is collection (containing static set of subjobs). - _code_ PBS PBS job - _code_ CONDOR Condor job - _code_ CREAM CREAM job - _code_ FILE_TRANSFER_COLLECTION File transfer collection - _code_ FILE_TRANSFER File transfer - - int nsubjobs Number of subjobs this job plans to spawn. - _optional_ - string seed Seed for subjob id generation. - _optional_ - string wms_dn DN of WMS handling the job - _optional_ - -@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 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 the current job transformation (output of the helper). - -@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 Certificate or VOMS parameter. - int user_id_type Type of information given in user_id. - _null_ -1 - _code_ DN Certificate subject name - _code_ GROUP VO group (must be specified as "vo":"group") - _code_ FQAN Standard Full Qualified Attribute Name (FQAN) - int permission ACL permission to change. - _null_ 0 - _code_ READ Get job information - int permission_type Type of permission requested. - _null_ -1 - _code_ ALLOW Grant the permission specified - _code_ DENY Deny the permission specified - int operation Operation requested to perform with ACL. - _null_ -1 - _code_ ADD Add the record to the ACL - _code_ REMOVE Remove the record from the ACL - - -@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. - int expires When the notification expires - string jobstat Status of the job (the notification content). - string dest_url Destination URL (preferred over host and port). - - -@type ResourceUsage Resource (CPU, memory etc.) consumption. - string resource Resource's name. - double quantity Resources's quantity (how much). - string unit Units (sec, kB, etc.). - -@type ReallyRunning User payload started. - string wn_seq Sequence code on the worker node. - _optional_ - -@type Suspend Job execution (queuing) was suspended. - int status_code Classification of the attempt to suspend 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 system. - _code_ ABORT The request was refused by whole system. - string reason Reason for the suspend. - _optional_ - -@type Resume Job execution (queuing) was resumed. - int status_code Classification of the attempt to resume 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 system. - _code_ ABORT The request was refused by whole system. - string reason Reason for the resume. - _optional_ - -@type CollectionState State of the collection. - string state New collection state. - int done_code In case of (state == Done) contains done code - _optional_ - _null_ -1 - string histogram User readable histogram; useful for debugging. - jobid child JobId of subjob, which triggered the state change. - string child_event Event which triggered the state change. - -@flesh PBS - -@type PBSQueued Job enqued - string queue Queue name - string owner Job owner - string name Job name - -@type PBSMatch Scheduler created exec host - string dest_host Aka exec host - -@type PBSPending Scheduler is not able to find exec host, or some error occured - string reason Reasons of job pendation or errors - -@type PBSRun Job attempted to be run by the logging component - string scheduler Scheduler ID - _optional_ - string dest_host Where to run the job - _optional_ - int pid Actual process ID - _optional_ - -@type PBSRerun Job rerun requested - -@type PBSDone Job terminated - int exit_status Exit status - _optional_ Bypass need of 'null value' - -@type PBSDequeued Job dequeued - -@type PBSResourceUsage Resources requested/consumed - int usage Type of record - _code_ REQUESTED Requested value - _code_ USED Consumed quantity - string name Name of resource - double quantity The quantity - _optional_ Bypass need of 'null value' - string unit Units (sec, kB, etc.) - -@type PBSError Any error occured - string error_desc Error reason - -@flesh Condor - -@type CondorMatch Job MATCHed - string owner Owner - string dest_host Matched host - string preempting Preempting - _optional_ - -@type CondorReject Job REJECTed - string owner Owner - int status_code Reason code for the rejection of the job - _code_ NOMATCH No match found - _code_ OTHER Other reason - -@type CondorShadowStarted Condor Shadow Started - string shadow_host Shadow host - port shadow_port Shadow port - int shadow_pid PID of shadow process - string shadow_status Shadow status - _optional_ - -@type CondorShadowExited Condor Shadow Exited - int shadow_pid PID of shadow process - int shadow_exit_status Exit status of shadow process - _null_ -1 - -@type CondorStarterStarted Condor Starter Started - int starter_pid PID of starter process - _optional_ - string universe Condor Universe - _optional_ - -@type CondorStarterExited Condor Starter Exited - int starter_pid PID of starter process - _optional_ - int starter_exit_status Exit status of starter process - _null_ -1 - _optional_ - int job_pid PID of running job - _optional_ - int job_exit_status Job exit status - _null_ -1 - _optional_ - -@type CondorResourceUsage Resources requested/consumed - int usage Type of record - _code_ REQUESTED Requested value - _code_ USED Consumed quantity - string name Name of resource - double quantity The quantity - _optional_ Bypass need of 'null value' - string unit Units (sec, kB, etc.) - -@type CondorError Any Error occured - string error_desc Error reason - - -@flesh CREAM - -@type CREAMStart Start processing registered job - -@type CREAMPurge Purge request (by user) - -@type CREAMAccepted Accepting job (successful counterpart to Transfer). - string local_jobid New job id as assigned by the receiving component. - _optional_ - - -@type CREAMStore - int command Command to store - _code_ CMDSTART Start registered job - _code_ CMDCANCEL Cancel job - _code_ CMDPURGE Purge request - _code_ CMDSUSPEND Suspend running job - _code_ CMDRESUME Resume suspended job - string cmdid Id of the command in store - _optional_ - int result store phase/result - _code_ START start - _code_ OK ok - _code_ FAILED failed - string reason failure_reason - _optional_ - -@type CREAMCall Processing command and calling BLAH or LRMS - logsrc callee Called component - _ref_ CREAMStore:command - string cmdid Id of the command, as stored previously - _optional_ - string destid Destination ID - _optional_ - int result Result code of the CREAM call (START, OK, REFUSED or FAIL) - _code_ START start - _code_ OK ok - _code_ FAILED failed - string reason Reason for the possible CREAM call failure - _optional_ - -@type CREAMRunning - string node Node where CREAM job is running - _optional_ - -@type CREAMReallyRunning - -@type CREAMDone - int status_code Status code of the CREAM Done - _code_ OK ok - _code_ FAILED failed - _code_ CANCELLED cancelled - _code_ KILLED killed - string reason Reason for the status - _optional_ - string exit_code Exit code - _optional_ - -@type CREAMCancel - int status_code Status code of CREAM Cancel - _code_ REQ req - _code_ REFUSE refuse - _code_ DONE done - _code_ ABORT abort - string reason Reason for cancelling the job - _optional_ - -@type CREAMAbort - string reason Reason for aborting the job - -@type CREAMStatus - string old_state Old status - _optional_ - string new_state New status - timeval orig_timestamp Original timestamp of the job state change - _optional_ - int result Result of the job state change - _code_ ARRIVED arrived - _code_ DONE done - string descr More detailed description - _optional_ - string exit_code Exit code - _optional_ - string failure_reason Reason for the failure - _optional_ - string worker_node Worker node - _optional_ - string LRMS_jobid jobId from the LRMS - _optional_ - -@flesh Transfer - -@type FileTransferRegister register file transfer - string src Source of file transfer. - string dest Destination of file transfer. - - -@type FileTransfer transfer job logs progress - int result Result code of the file transfer attemp. - _code_ START The sending component has started or is about to start the file transfer. - _code_ OK The file was transfered successfully. - _code_ FAIL The file transfer failed (see reason) - string reason The reason of file transfer failure. - _optional_ - -@type Sandbox event for logging relationship between (compute) job and (file) transfer job - int sandbox_type Type of sandbox. - _code_ INPUT input - _code_ OUTPUT output - string transfer_job Jobid of transfer job (collection) containing set of file transfers (subjobs). - _optional_ - string compute_job Jobid of (compute) job the sandbox belongs. Exclusive with transfer_job. - _optional_ diff --git a/org.glite.lb.types/project/ChangeLog b/org.glite.lb.types/project/ChangeLog deleted file mode 100644 index 690da5f..0000000 --- a/org.glite.lb.types/project/ChangeLog +++ /dev/null @@ -1,22 +0,0 @@ -1.0.0-1 -- LB 2.0 release - -1.0.0-2 -- fixed configure to work in etics - -1.0.0-3 -- Fixed cvs tag inconsistencies - -1.0.0-4 -- configure script update (globus flavors added to configure call) - -1.0.0-5 -- Installation rules improved - treat stage as prefix. - -1.1.0-1 -- Support for logging sandbox transfers as jobs of a specific type -- Support for CREAM jobs -- Type comments made complete - -1.0.2-1 -- Fix build with binary version of this module diff --git a/org.glite.lb.types/project/package.description b/org.glite.lb.types/project/package.description deleted file mode 100644 index d52ac95..0000000 --- a/org.glite.lb.types/project/package.description +++ /dev/null @@ -1 +0,0 @@ -Auxiliary build-time component defining LB event types and job status fields. diff --git a/org.glite.lb.types/project/package.summary b/org.glite.lb.types/project/package.summary deleted file mode 100644 index d52ac95..0000000 --- a/org.glite.lb.types/project/package.summary +++ /dev/null @@ -1 +0,0 @@ -Auxiliary build-time component defining LB event types and job status fields. diff --git a/org.glite.lb.types/project/version.properties b/org.glite.lb.types/project/version.properties deleted file mode 100644 index 556297d..0000000 --- a/org.glite.lb.types/project/version.properties +++ /dev/null @@ -1,3 +0,0 @@ -# $Header$ -module.version=1.1.0 -module.age=1 diff --git a/org.glite.lb.types/status.T b/org.glite.lb.types/status.T deleted file mode 100644 index 4e2b302..0000000 --- a/org.glite.lb.types/status.T +++ /dev/null @@ -1,190 +0,0 @@ -@type _common_ -jobid jobId Id of the job -string owner Job owner -_index_ - -int jobtype Type of job - _null_ -1 - _code_ SIMPLE simple job - _code_ DAG composite job - _code_ _PARTITIONABLE_UNUSED placholder for unused code - _code_ _PARTITIONED_UNUSED placholder for unused code - _code_ COLLECTION parent of collection of jobs - _code_ PBS PBS job - _code_ CONDOR Condor job - _code_ CREAM CREAM job - _code_ FILE_TRANSFER_COLLECTION job containing all file transfers (i.e. sandbox) - _code_ FILE_TRANSFER subjob holding one file transfer -jobid parent_job parent job of subjob - -string seed string used for generation of subjob IDs -int children_num number of subjobs -strlist children list of subjob IDs - _special_ XMLstructured -intlist children_hist summary (histogram) of children job states - _special_ XMLstructured -stslist children_states full status information of the children - _special_ XMLstructured - -string condorId Id within Condor-G -string globusId Globus allocated Id -string localId Id within LRMS - -string jdl User submitted job description -string matched_jdl Full job description after matchmaking -string destination ID of CE where the job is being sent -_index_ -string condor_jdl ClassAd passed to Condor-G for last job execution -string rsl Job RSL sent to Globus - -string reason Reason of being in this status, if any - -string location Where the job is being processed -_index_ -string ce_node Worker node where the job is executed -string network_server Network server handling the job -_index_ - -bool subjob_failed Subjob failed (the parent job will fail too) -int done_code Return code - _null_ -1 - _code_ OK Finished correctly - _code_ FAILED Execution failed - _code_ CANCELLED Cancelled by user -int exit_code Unix exit code -bool resubmitted The job was resubmitted - -bool cancelling Cancellation request in progress -string cancelReason Reason of cancel - -int cpuTime Consumed CPU time - _null_ -1 - -taglist user_tags List of pairs (user_tag, user_value) - _special_ XMLstructured - -timeval stateEnterTime When entered this status -_index_ -timeval lastUpdateTime Last known event of the job -_index_ - -intlist stateEnterTimes When all previous states were entered - _special_ XMLstructured - -bool expectUpdate Some logged information has not arrived yet -string expectFrom Sources of the missing information -string acl ACL of the job - -bool payload_running User payload started -strlist possible_destinations Possible job destinations - _special_ XMLstructured -strlist possible_ce_nodes CE nodes matching to possible_destinations - _special_ XMLstructured - -bool suspended Job is suspended -string suspend_reason Reason for the suspend - -string failure_reasons Concatenated job failure reasons, possibly from deeper middleware layers -bool remove_from_proxy Job reached final status and may be removed from proxy -string ui_host Hostname or address of UI used to submit the job -strlist user_fqans FQAN used to register the job - _special_ XMLstructured -int sandbox_retrieved Flag is set on incomming Clear event - _code_ NOTYET Sandbox was not retrieved yet. - _code_ USER User retrieved output sandbox. - _code_ TIMEOUT Timed out, resource forced purge of the sandbox. - _code_ NOOUTPUT No output was generated. -int jw_status Status of Job wrapper - _code_ UNKNOWN Status of JW unknown - _code_ WRAPPER_RUNNING Wrapper started - _code_ PAYLOAD_RUNNING Payload running - _code_ DONE JW finished -cclassad jdl_classad Unparsed JDL classad - -jobid isb_transfer Input sandbox corresponding to the job -jobid osb_transfer Output sandbox corresponding to the job - -_pad_ 55 - -string pbs_state Job state which would probably return PBS qstat (Q/R/C/....) -string pbs_queue Name of queue in which is job queued -string pbs_owner Owner of job -string pbs_name Name of job -string pbs_reason Glued reasons/errors leading to pending events -string pbs_scheduler Name of pbs scheduler -string pbs_dest_host Hostname of node where job is running -int pbs_pid PID of running job -string pbs_resource_usage Glued resource usage -int pbs_exit_status Job exit status -string pbs_error_desc Glued error descriptions from error events - -_pad_ 20 - -string condor_status Condor job status -string condor_universe Condor job Universe (in job ClassAds) -string condor_owner Job owner -string condor_preempting Job preempting -int condor_shadow_pid PID of Shadow -int condor_shadow_exit_status Condor shadow exit status (see h/exit.h) -int condor_starter_pid PID of Starter -int condor_starter_exit_status Condor starter exit status -int condor_job_pid PID of running job -int condor_job_exit_status Job exit status -string condor_dest_host Hostname of node where job is running -string condor_reason Glued reasons/errors leading to pending events -string condor_error_desc Glued error descriptions from error events - -_pad_ 25 - -int cream_state CREAM job state - _null_ -1 - _code_ REGISTERED registered - _code_ PENDING pending - _code_ IDLE idle - _code_ RUNNING running - _code_ REALLY-RUNNING really-running - _code_ HELD held - _code_ DONE-OK done-ok - _code_ DONE-FAILED done-failed - _code_ ABORTED aborted - -string cream_id CREAM local job id -string cream_owner Job owner -string cream_endpoint Address of the CREAM service -string cream_jdl JDL passed to the CREAM -string cream_reason Reason of the state or command -string cream_failure_reason Reason of any failure -string cream_lrms_id LRMS local id -string cream_node Worker node where the job is executed -int cream_done_code Job done code, uses done_code enum - _null_ -1 -int cream_exit_code Job exit code - _null_ -1 -bool cream_cancelling Cancellation request in process -int cream_cpu_time Consumed CPU time -int cream_jw_status Users jw_status enum - -_pad_ 30 - -jobid ft_compute_job Compute job corresponding to file transfer -int ft_sandbox_type Type of sandbox - _null_ -1 - _code_ INPUT input - _code_ OUTPUT output -string ft_src File transfer source -string ft_dest File transfer destination - -_pad_ 20 - -@type Submitted Entered by the user to the User Interface or registered by Job Partitioner. -@type Waiting Accepted by WMS, waiting for resource allocation. -@type Ready Matching resources found. -@type Scheduled Accepted by LRMS queue. -@type Running Executable is running. -@type Done Execution finished, output is available. -@type Cleared Output transfered back to user and freed. -@type Aborted Aborted by system (at any stage). -@type Cancelled Cancelled by user. -@type Unknown Status cannot be determined. -@type Purged Job has been purged from bookkeeping server (for LB-RGMA interface). - diff --git a/org.glite.lb.types/types.T b/org.glite.lb.types/types.T deleted file mode 100644 index cfb1629..0000000 --- a/org.glite.lb.types/types.T +++ /dev/null @@ -1,171 +0,0 @@ -%types = ( - C=>{ - bool=>'"int"', - string=>'"char *"', - strlist=>'"char **"', - intlist=>'"int *"', - taglist=>'"edg_wll_TagValue *"', - stslist=>'"struct _edg_wll_JobStat *"', - timeval=>'"struct timeval"', - jobid=>'"glite_jobid_t"', - notifid=>'"edg_wll_NotifId"', - logsrc=>'"edg_wll_Source"', - port=>'"uint16_t"', -# level=>'"enum edg_wll_Level"', - int=>'"int"', - float=>'"float"', - double=>'"double"', - cclassad=>'"void *"', - }, - 'C++'=>{ - string=>'"std::string"', - timeval=>'"struct timeval"', - jobid=>'"glite::jobid::JobId"', - bool=>'"int"', - intlist=>'"std::vector"', - strlist=>'"std::vector"', - taglist=>'"std::vector>"', - stslist=>'"std::vector"', - logsrc=>'"int"', - port=>'"int"', - int=>'"int"', - float=>'"float"', - double=>'"double"', - cclassad=>'"void *"', - }, - 'wsdl'=>{ - bool=>'"xsd:boolean"', - string=>'"xsd:string"', - int=>'"xsd:int"', - jobid=>'"xsd:string"', - jobstat=>'"jobStatus"', - usertag=>'"tagValue"', - timeval=>'"timeval"', - logsrc=>'"eventSource"', - notifid=>'"xsd:string"', - port=>'"xsd:int"', - float=>'"xsd:float"', - double=>'"xsd:double"', - strlist=>'"stringSequenceType"', - intlist=>'"intSequenceType"', - stslist=>'"statusSequenceType"', - taglist=>'"tagSequenceType"', - cclassad=>'"xsd:string"', - }, - 'java'=>{ - bool=>'"bool"', - string=>'"String"', - int=>'"int"', - jobid=>'"Jobid"', - notifid=>'"Jobid"', - port=>'"int"', - float=>'"float"', - double=>'"double"', - logsrc=>'"Sources"', - timeval=>'"Timeval"', - } -); - -%baseTypes = ( - intlist=>'int', - floatlist=>'float', - doublelist=>'double', - strlist=>'string', - stslist=>'jobstat', - taglist=>'usertag' -); - -%toString = ( - C=>{ - int=>'qq{asprintf(&$dst,"%d",$src);}', - float=>'qq{asprintf(&$dst,"%f",$src);}', - double=>'qq{asprintf(&$dst,"%f",$src);}', - port=>'qq{asprintf(&$dst,"%d",(int) $src);}', - bool=>'qq{asprintf(&$dst,"%d",$src);}', - string=>'qq{$dst = $src?strdup($src):NULL;}', - timeval=>'qq{edg_wll_ULMTimevalToDate(($src).tv_sec,($src).tv_usec,$dst);}', - jobid=>'qq{$dst = edg_wlc_JobIdUnparse($src);}', - notifid=>'qq{$dst = edg_wll_NotifIdUnparse($src);}', -# level=>'qq{$dst = edg_wll_LevelToString($src);}', - logsrc=>'qq{$dst = edg_wll_SourceToString($src);}', - logsrc=>'qq{$dst = edg_wll_StringToSource($src);}', - cclassad=>'qq{$dst = NULL;}', -# strlist, intlist, stslist are used only in consumer API, they don't need toString method - } -); - -%ULMasString = ( - logsrc=>1 -); - -%fromString = ( - C=>{ - int=>'qq{$dst = atoi($src);}', - float=>'qq{$dst = strtof($src,NULL);}', - double=>'qq{$dst = strtod($src,NULL);}', - port=>'qq{$dst = (uint16_t) atoi($src);}', - bool=>'qq{$dst = atoi($src);}', - string=>'qq{$dst = strdup($src);}', - timeval=>'qq{edg_wll_ULMDateToTimeval($src,&$dst);}', - jobid=>'qq{edg_wlc_JobIdParse($src,&$dst);}', - notifid=>'qq{edg_wll_NotifIdParse($src,&$dst);}', -# level=>'qq{$dst = edg_wll_StringToLevel($src);}', - logsrc=>'qq{$dst = edg_wll_StringToSource($src);}', -# strlist, intlist, stslist are used only in consumer API, they don't need fromString method - } -); - -%DefaultNullValue = ( - int=>0, - float=>0.0, - double=>0.0, - port=>0, -# level=>'EDG_WLL_LEVEL_UNDEFINED', - bool=>0, - string=>'NULL', - jobid=>'NULL', - notifid=>'NULL', - logsrc=>'EDG_WLL_SOURCE_NONE', - timeval=>'null_timeval', - strlist=>'NULL', - intlist=>'NULL', - taglist=>'NULL', - stslist=>'NULL', - cclassad=>'NULL', -); - -%compare = ( - C=>{ - int=>'"($a == $b)"', - float=>'"($a == $b)"', - double=>'"($a == $b)"', - port=>'"($a == $b)"', -# level=>'"($a == $b)"', - bool=>'"(($a || !$b) && ($b || !$a))"', - string=>'if ($b eq \'NULL\') { qq{(($a) == NULL)}; } - else { qq{(($a) == NULL && ($b) == NULL) || (($a)&&($b)&& !strcmp($a,$b))}; } ', - jobid=>'if ($b eq \'NULL\') { qq{(($a) == NULL) }; } - else { qq{(($a) == NULL && ($b) == NULL) || (($a)&&($b)&& !(tmp1=glite_jobid_unparse($a),tmp2=glite_jobid_unparse($b),tmp3=strcmp(tmp1,tmp2),free(tmp1),free(tmp2),tmp3))}; }', - notifid=>'if ($b eq \'NULL\') { qq{(($a) == NULL) }; } - else { qq{(($a) == NULL && ($b) == NULL) || (($a)&&($b)&& !(tmp1=edg_wll_NotifIdUnparse($a),tmp2=edg_wll_NotifIdUnparse($b),tmp3=strcmp(tmp1,tmp2),free(tmp1),free(tmp2),tmp3))}; }', - logsrc=>'"($a) == ($b)"', - timeval=>'"($a).tv_sec == ($b).tv_sec && ($a).tv_usec == ($b).tv_usec"', - cclassad=>'"($a == $b)"', - } -); - -%toFormatString = ( - C=>{ - int=>'"%d"', - float=>'"%f"', - double=>'"%f"', - port=>'"%d"', - bool=>'"%d"', -# level=>'"%s"', - string=>'"%|Us"', - jobid=>'"%s"', - notifid=>'"%s"', - logsrc=>'"%s"', - timeval=>'"%s"', - } -); diff --git a/org.glite.lb.utils/.cvsignore b/org.glite.lb.utils/.cvsignore deleted file mode 100755 index 1df717b..0000000 --- a/org.glite.lb.utils/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -.project -.cdtproject \ No newline at end of file diff --git a/org.glite.lb.utils/LICENSE b/org.glite.lb.utils/LICENSE deleted file mode 100755 index 01b973b..0000000 --- a/org.glite.lb.utils/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -Copyright (c) 2004 on behalf of the EU EGEE Project: -The European Organization for Nuclear Research (CERN), -Istituto Nazionale di Fisica Nucleare (INFN), Italy -Datamat Spa, Italy -Centre National de la Recherche Scientifique (CNRS), France -CS Systeme d'Information (CSSI), France -Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden -Universiteit van Amsterdam (UvA), Netherlands -University of Helsinki (UH.HIP), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.lb.utils/Makefile b/org.glite.lb.utils/Makefile deleted file mode 100644 index a8cd8c8..0000000 --- a/org.glite.lb.utils/Makefile +++ /dev/null @@ -1,123 +0,0 @@ -# defaults -top_srcdir=.. -stagedir=. -globalprefix=glite -lbprefix=lb -package=glite-lb-utils -version=0.0.0 -PREFIX=/opt/glite - -nothrflavour=gcc32 -thrflavour=gcc32pthr -expat_prefix=/opt/expat -gsoap_prefix=/opt/gsoap - --include Makefile.inc --include ../project/version.properties - -version=${module.version} - -VPATH=${top_srcdir}/src:${top_srcdir}/doc - -CC=gcc -AT3=${stagedir}/sbin/glite-lb-at3 - -SUFFIXES = .T - -DEBUG:=-g -O0 -Wall - -CFLAGS:= \ - ${WS_CFLAGS} ${DEBUG} \ - -DVERSION=\"${version}\" \ - -I${stagedir}/include -I${top_srcdir}/src -I. \ - -I${top_srcdir}/interface \ - -I${expat_prefix}/include \ - -I${gsoap_prefix}/include -I${gsoap_prefix}/ \ - ${COVERAGE_FLAGS} \ - -D_GNU_SOURCE -LDFLAGS:=-L${stagedir}/${libdir} - -COMPILE:=libtool --mode=compile ${CC} ${CFLAGS} -LINK:=libtool --mode=link ${CC} -rpath ${stagedir}/${libdir} ${LDFLAGS} -SOLINK:=libtool --mode=link ${CC} -module ${LDFLAGS} -rpath ${stagedir}/${libdir} -LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS} -INSTALL:=libtool --mode=install install -LINKXX:=libtool --mode=link ${CXX} -rpath ${stagedir}/${libdir} ${LDFLAGS} -XSLTPROC:=xsltproc --novalid - -ifneq (${expat_prefix},/usr) - expatlib := -L${expat_prefix}/${libdir} -L${expat_prefix}/lib -endif - -EXT_LIBS:= \ - ${expatlib} -lexpat -COMMON_LIB:=-lglite_lb_common_${nothrflavour} -CLIENT_LIB:=-lglite_lb_client_${nothrflavour} -PLUS_LIB:=-lglite_lb_clientpp_${nothrflavour} -JP_LIBS:=-lglite_jp_common_${nothrflavour} - -UTILS:=mon purge dump load dump_exporter -ALLUTILS:=${UTILS} state_history statistics -STATISTICS_OBJS:=statistics.o process_attrs.o process_attrs2.o - -MAN_GZ:=glite-lb-mon.1.gz -MAN8_GZ:=glite-lb-purge.8.gz -MAN = $(MAN_GZ:.gz=) -MAN8 = $(MAN8_GZ:.gz=) - -default: all - -compile all: ${ALLUTILS} ${MAN_GZ} ${MAN8_GZ} - -${UTILS}: %: %.o - ${LINK} -o $@ $< ${COMMON_LIB} ${CLIENT_LIB} ${EXT_LIBS} -lglite_lbu_maildir - -statistics: ${STATISTICS_OBJS} - ${LINK} -rdynamic -o $@ ${STATISTICS_OBJS} ${COMMON_LIB} ${JP_LIBS} ${EXT_LIBS} - -state_history: state_history.o - ${LINK} -o $@ state_history.o -lglite_lb_statemachine ${PLUS_LIB} - -check: compile - -doc: ${MAN_GZ} ${MAN8_GZ} - -${MAN_GZ}: ${MAN} - cp $? . - gzip -f $(notdir $?) -${MAN8_GZ}: ${MAN8} - cp $? . - gzip -f $(notdir $?) - -stage: compile - $(MAKE) install PREFIX=${stagedir} DOSTAGE=yes - -install: - -mkdir -p ${PREFIX}/bin - -mkdir -p ${PREFIX}/${libdir} - -mkdir -p ${PREFIX}/share/doc/${package}-${version} - -mkdir -p ${PREFIX}/share/man/man1 - -mkdir -p ${PREFIX}/share/man/man8 - ${INSTALL} -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version} - ( cd ${top_srcdir}/project && ${INSTALL} -m 644 ChangeLog package.description package.summary ${PREFIX}/share/doc/${package}-${version} ) - ${INSTALL} -m 644 ${top_srcdir}/doc/README* ${PREFIX}/share/doc/${package}-${version} - ${INSTALL} -m 644 ${MAN_GZ} ${PREFIX}/share/man/man1 - ${INSTALL} -m 644 ${MAN8_GZ} ${PREFIX}/share/man/man8 - ${INSTALL} -m 755 ${top_srcdir}/src/glite-lb-bkpurge-offline.sh ${PREFIX}/bin/glite-lb-bkpurge-offline - - for p in ${ALLUTILS} ; do \ - ${INSTALL} -m 755 "$$p" "${PREFIX}/bin/glite-lb-$$p"; \ - done - -clean: - rm -rfv ${ALLUTILS} ${MAN_GZ} ${MAN8_GZ} *.{lo,o} .libs/ - rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/ - -%.o: %.c - ${COMPILE} -c $< - -%.c: %.c.T - rm -f $@ - ${AT3} $< >$@ || rm -f $@ - chmod -w $@ >/dev/null - diff --git a/org.glite.lb.utils/build.xml b/org.glite.lb.utils/build.xml deleted file mode 100644 index 3e7e842..0000000 --- a/org.glite.lb.utils/build.xml +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb.utils/configure b/org.glite.lb.utils/configure deleted file mode 100755 index 8f92219..0000000 --- a/org.glite.lb.utils/configure +++ /dev/null @@ -1,833 +0,0 @@ -#!/usr/bin/perl - -# WARNING: Don't edit this file unless it is the master copy in org.glite.lb -# -# For the purpose of standalone builds of lb/jobid/lbjp-common components -# it is copied on tagging - -# $Header$ -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners/ for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use Getopt::Long; - -my $pwd = `pwd`; chomp $pwd; -my $prefix = $pwd.'/stage'; -my $stagedir; -my $staged; -my $module; -my $thrflavour = 'gcc64dbgpthr'; -my $nothrflavour = 'gcc64dbg'; -my $mode = 'build'; -my $help = 0; -my $listmodules; -my $version; -my $branch; -my $output; -my $lb_tag = ''; -my $lbjp_tag = ''; -my $jp_tag = ''; -my $sec_tag = ''; -my $jobid_tag = ''; -my $libdir = getlibdir(); - -my @nodes = qw/client server logger utils client-java doc ws-test db jpprimary jpindex jpclient harvester/; -my %enable_nodes; -my %disable_nodes; - -my %extern_prefix = ( - cares => '/opt/c-ares', - classads => '/opt/classads', - cppunit => '/usr', - expat => '/usr', - globus => '/opt/globus', - gsoap => '/usr', - mysql => '/usr', - 'mysql-devel' => '', - 'mysql-server' => '', - voms => '/opt/glite', - gridsite => '/opt/glite', - lcas => '/opt/glite', - trustmanager => '/opt/glite', - utiljava => '/opt/glite', - ant => '/usr', - jdk => '/usr', - libtar => '/usr', - axis => '/usr', - log4c => '/usr', - postgresql => '/usr' -); - -my %jar = ( - 'commons-codec' => '/usr/share/java/commons-codec.jar', - 'commons-lang' => '/usr/share/java/commons-lang.jar', -); - - -my %glite_prefix; -my %need_externs; -my %need_externs_type; -my %need_jars; -my %extrafull; -my %extranodmod; -my %deps; -my %deps_type; -my %topbuild; - -my %lbmodules = ( - 'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim glite-LB/], - 'security' => [qw/gss gsoap-plugin/], - 'lbjp-common' => [qw/db log maildir server-bones trio jp-interface/], - 'jobid' => [qw/api-c api-cpp api-java/], - 'jp' => [ qw/client doc index primary server-common ws-interface/ ], - ); - - -my @opts = ( - 'prefix=s' => \$prefix, - 'staged=s' => \$staged, - 'module=s' => \$module, - 'thrflavour=s' => \$thrflavour, - 'nothrflavour=s' => \$nothrflavour, - 'mode=s' => \$mode, - 'listmodules=s' => \$listmodules, - 'version=s' => \$version, - 'branch=s' => \$branch, - 'output=s' => \$output, - 'stage=s' => \$stagedir, - 'lb-tag=s' => \$lb_tag, - 'lbjp-common-tag=s' => \$lbjp_tag, - 'jp-tag=s' => \$jp_tag, - 'security-tag=s' => \$sec_tag, - 'jobid-tag=s' => \$jobid_tag, - 'help' => \$help, - 'libdir=s' => \$libdir, -); - -for (@nodes) { - $enable_nodes{$_} = 0; - $disable_nodes{$_} = 0; - - push @opts,"disable-$_",\$disable_nodes{$_}; - push @opts,"enable-$_",\$enable_nodes{$_}; -} - -push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix; -push @opts,"with-$_=s",\$jar{$_} for keys %jar; - -my @keeparg = @ARGV; - -GetOptions @opts or die "Errors parsing command line\n"; - -$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq ''; -$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq ''; - -if ($help) { usage(); exit 0; } - -if ($listmodules) { - my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}}; - print "@m\n"; - exit 0; -} - -warn "$0: --version, --branch and --output make sense only in --mode=etics\n" - if ($version || $output || $branch) && $mode ne 'etics'; - -my $en; -for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; } - -my $dis; -for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; } - -die "--enable-* and --disable-* are mutually exclusive\n" - if $en && $dis; - -die "--module cannot be used with --enable-* or --disable-*\n" - if $module && ($en || $dis); - -die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}}; - -if ($dis) { - for (@nodes) { - $enable_nodes{$_} = 1 unless $disable_nodes{$_}; - } -} - -if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ; - -for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; } - -$stagedir = $prefix unless $stagedir; - -if ($mode eq 'build') { - print "Writing config.status\n"; - open CONF,">config.status" or die "config.status: $!\n"; - print CONF "$0 @keeparg\n"; - close CONF; -} - - -my @modules; -my %aux; - -if ($module) { -# push @modules,split(/[,.]+/,$module); - push @modules,$module; -} -else { - @modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes)); - - my $n; - - do { - local $"="\n"; - $n = $#modules; - push @modules,(map @{$deps{$_}},@modules); - - undef %aux; @aux{@modules} = (1) x ($#modules+1); - @modules = keys %aux; - } while ($#modules > $n); -} - -@aux{@modules} = (1) x ($#modules+1); -delete $aux{$_} for (split /,/,$staged); -@modules = keys %aux; - -mode_build() if $mode eq 'build'; -mode_checkout() if $mode eq 'checkout'; -mode_etics($module) if $mode eq 'etics'; - -sub mode_build { - print "\nBuilding modules: @modules\n"; - - my @ext = map @{$need_externs{$_}},@modules; - my @myjars = map @{$need_jars{$_}},@modules; - undef %aux; @aux{@ext} = 1; - @ext = keys %aux; - undef %aux; @aux{@myjars} = (1) x ($#myjars+1); - @myjars = keys %aux; - - print "\nRequired externals:\n"; - print "\t$_: $extern_prefix{$_}\n" for @ext; - print "\t$_: $jar{$_}\n" for @myjars; - print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n"; - - mkinc($_) for @modules; - - print "Creating Makefile\n"; - - open MAK,">Makefile" or die "Makefile: $!\n"; - - print MAK "all: @modules\n\nclean:\n"; - - for (@modules) { - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - print MAK "\tcd $full$build && \${MAKE} clean\n" - } - - print MAK "\ndistclean:\n"; - - for (@modules) { - my $full = full($_); - print MAK $topbuild{$_} ? - "\tcd $full$build && \${MAKE} distclean\n" : - "\trm -rf $full$build\n" - } - - print MAK "\n"; - - for (@modules) { - my %ldeps; undef %ldeps; - @ldeps{@{$deps{$_}}} = 1; - for my $x (split /,/,$staged) { delete $ldeps{$x}; } - my @dnames = $module ? () : keys %ldeps; - - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - - print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n"; - } - - close MAK; -} - -sub mode_checkout() { - for (@modules) { - my $module = $_; - my $tag = ""; - if ($lb_tag){ - for (@{$lbmodules{lb}}){ - if ("lb.".$_ eq $module){ - $tag = '-r '.$lb_tag; - } - } - } - if ($lbjp_tag){ - for (@{$lbmodules{'lbjp-common'}}){ - if ("lbjp-common.".$_ eq $module){ - $tag = '-r '.$lbjp_tag; - } - } - } - if ($jp_tag){ - for (@{$lbmodules{'jp'}}){ - if ("jp.".$_ eq $module){ - $tag = '-r '.$jp_tag; - } - } - } - if ($sec_tag){ - for (@{$lbmodules{security}}){ - if ("security.".$_ eq $module){ - $tag = '-r '.$sec_tag; - } - } - } - if ($jobid_tag){ - for (@{$lbmodules{jobid}}){ - if ("jobid.".$_ eq $module){ - $tag = '-r '.$jobid_tag; - } - } - } - #if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){ - # print "found"; - #} - $_ = full($_); - print "\n*** Checking out $_\n"; - system("cvs checkout $tag $_") == 0 or die "cvs checkout $tag $_: $?\n"; - } -} - -BEGIN{ -%need_externs_aux = ( - 'lb.client' => [ qw/cppunit:B classads/ ], - 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava/ ], - 'lb.common' => [ qw/expat cares:B cppunit:B classads/ ], - 'lb.doc' => [], - 'lb.logger' => [ qw/cppunit:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ], - 'lb.state-machine' => [ qw/classads/ ], - 'lb.utils' => [ qw/cppunit:B/ ], - 'lb.ws-interface' => [], - 'lb.ws-test' => [ qw/gsoap:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw/postgresql:R/ ], - 'lb.yaim' => [ qw/glite-yaim-core:R/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], - 'lbjp-common.db' => [ qw/mysql:B mysql-devel:B postgresql:B/ ], - 'lbjp-common.log' => [ qw/log4c/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw// ], - 'lbjp-common.trio' => [ qw/cppunit:B/ ], - 'lbjp-common.jp-interface' => [ qw/cppunit:B log4c:B/ ], - 'security.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B/ ], - 'security.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap:B/ ], - 'jobid.api-c' => [ qw/cppunit:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], - 'jobid.api-java' => [ qw/ant:B jdk:B/ ], - 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], - 'jp.doc' => [], - 'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ], - 'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ], - 'jp.server-common' => [], - 'jp.ws-interface' => [], -); - -for my $ext (keys %need_externs_aux) { - for (@{$need_externs_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$need_externs{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $need_externs_type{$ext}->{$1} = $type; - } -} - -%need_jars = ( - 'jobid.api-java' => [ qw/commons-codec/ ], - 'lb.client-java' => [ qw/commons-lang/ ], -); - -for my $jar (keys %need_jars) { - for (@{$need_jars{$jar}}) { - $need_externs_type{$jar}->{$_} = 'BR'; # XXX - } -} - -%deps_aux = ( - 'lb.client' => [ qw/ - lb.types:B lb.common - lbjp-common.trio - jobid.api-cpp:B jobid.api-c - security.gss - / ], - 'lb.client-java' => [ qw/ - lb.types:B - lb.ws-interface:B - jobid.api-java - / ], - 'lb.common' => [ qw/ - jobid.api-cpp:B jobid.api-c - lb.types:B lbjp-common.trio security.gss - / ], - 'lb.doc' => [ qw/lb.types:B/ ], - 'lb.logger' => [ qw/ - lbjp-common.trio - lbjp-common.log - jobid.api-c - lb.common - security.gss - / ], - 'lb.server' => [ qw/ - lb.ws-interface lb.types:B lb.common lb.state-machine - lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log - jobid.api-c - security.gsoap-plugin security.gss - / ], - 'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ], - 'lb.utils' => [ qw/ - lbjp-common.jp-interface - jobid.api-c - lbjp-common.trio lbjp-common.maildir - lb.client lb.state-machine - / ], - 'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ], - 'lb.ws-interface' => [ qw/lb.types:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw/ - jobid.api-c lbjp-common.trio lbjp-common.db lb.common lb.client - security.gss lbjp-common.log - / ], - 'lb.yaim' => [ qw// ], - 'lb.glite-LB' => [ qw/ - lb.logger:R lb.server:R lb.utils:R lb.doc:R - lb.ws-test:R lb.harvester:R lb.yaim:R - / ], - 'lbjp-common.db' => [ qw/lbjp-common.trio lbjp-common.log/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw/lbjp-common.log/ ], - 'lbjp-common.trio' => [ qw// ], - 'security.gss' => [ qw// ], - 'security.gsoap-plugin' => [ qw/security.gss/ ], - 'jobid.api-c' => [ qw// ], - 'jobid.api-cpp' => [ qw/jobid.api-c/ ], - 'jobid.api-java' => [ qw// ], - - 'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ], - - 'jp.client' => [ qw/ - jp.ws-interface - lbjp-common.jp-interface lbjp-common.maildir - jobid.api-c - security.gsoap-plugin - / ], - 'jp.doc' => [ qw// ], - 'jp.index' => [ qw/ - jp.server-common jp.ws-interface - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.primary' => [ qw/ - jobid.api-c - jp.server-common jp.ws-interface - lb.state-machine - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.server-common' => [ qw/ - lbjp-common.jp-interface lbjp-common.db - / ], - 'jp.ws-interface' => [ qw// ], -); - -for my $ext (keys %deps_aux) { - for (@{$deps_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$deps{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $deps_type{$ext}->{$1} = $type; - } -} - - -%extrafull = ( gridsite=>'org.gridsite.core'); - -#( java => 'client-java' ); -%extranodmod = ( - db => 'lbjp-common.db', - jpprimary => 'jp.primary', - jpindex => 'jp.index', - jpclient => 'jp.client', -); - -my @t = qw/lb.client-java jobid.api-java lb.types/; -@topbuild{@t} = (1) x ($#t+1); -} - -sub full -{ - my $short = shift; - return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short; -} - -sub mkinc -{ - my %aux; - undef %aux; - my @m=qw/ -lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim -security.gss security.gsoap-plugin -jobid.api-c jobid.api-cpp jobid.api-java -lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface -jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface -/; - @aux{@m} = (1) x ($#m+1); - - my $short = shift; - my $full = full $short; - - unless ($aux{$short}) { - print "Makefile.inc not needed in $full\n"; - return; - } - - my $build = ''; - - unless ($topbuild{$_}) { - $build = '/build'; - unless (-d "$full/build") { - mkdir "$full/build" or die "mkdir $full/build: $!\n"; - } - unlink "$full/build/Makefile"; - symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n"; - } - - open MKINC,">$full$build/Makefile.inc" - or die "$full$build/Makefile.inc: $!\n"; - - print "Creating $full$build/Makefile.inc\n"; - - print MKINC qq{ -PREFIX = $prefix -stagedir = $stagedir -thrflavour = $thrflavour -nothrflavour = $nothrflavour -libdir = $libdir -}; - - for (@{$need_externs{$short}}) { - print MKINC "${_}_prefix = $extern_prefix{$_}\n" - } - - for (@{$need_jars{$short}}) { - print MKINC "${_}_jar = $jar{$_}\n" - } - - my $need_gsoap = 0; - for (@{$need_externs{$short}}) { $need_gsoap = 1 if $_ eq 'gsoap'; } - - print MKINC "gsoap_default_version=".gsoap_version()."\n" if $need_gsoap; - - close MKINC; -} - -my %etics_externs; -my %etics_projects; -BEGIN{ - %etics_externs = ( - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - gridsite=>'org.gridsite.shared', - lcas=>'org.glite.security.lcas', - trustmanager=>'org.glite.security.trustmanager', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - ); - %etics_projects = ( - vdt=>[qw/globus globus_essentials/], - 'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema/], - ); -}; - -sub mode_etics { - $fmod = shift; - - die "$0: --module required with --etics\n" unless $fmod; - - my ($subsys,$module) = split /\./,$fmod; - - my ($major,$minor,$rev,$age); - - if ($version) { - $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/; - ($major,$minor,$rev,$age) = ($1,$2,$3,$4); - } - else { - open V,"org.glite.$subsys.$module/project/version.properties" - or die "org.glite.$subsys.$module/project/version.properties: $!\n"; - - while ($_ = ) { - chomp; - ($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/; - $age = $1 if /module\.age\s*=\s*([[:digit:]]+)/; - } - close V; - } - - my @copts = (); - my %ge; - @ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1); - - for (@{$need_externs{"$subsys.$module"}}) { - if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; - } - } - - for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - push @copts,"--with-$_ \${$eext.location}/$_*.jar"; - } - - my $conf; - my $conftag; - - if ($branch) { - $conf = "glite-${subsys}-${module}_$branch"; - $conftag = $branch; - $dwpath = ""; } - else { - $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - $conftag = $conf; - $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n"; } -# my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - my $file = $output ? $output : "$conf.ini"; - open C,">$file" or die "$file: $!\n"; - - my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build"; - - my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..'; - - my $package_description = ""; - my $package_summary = ""; - - if (-e "org.glite.$subsys.$module/project/package.description") { - open V, "org.glite.$subsys.$module/project/package.description"; - $package_description = join ("", ); - close V; - chomp $package_description; - $package_description =~ s/\n/\\n/g; - $package_description = "package.description = $package_description"; - } - else { - print STDERR "package.description not found for $subsys.$module!\n"; } - - if (-e "org.glite.$subsys.$module/project/package.summary") { - open V, "org.glite.$subsys.$module/project/package.summary"; - $package_summary = join ("", ); - close V; - chomp $package_summary; - $package_summary =~ s/\n/\\n/g; - $package_summary = "package.summary = $package_summary"; - } - else { - print STDERR "package.summary not found for $subsys.$module!\n"; } - - - print STDERR "Writing $file\n"; - print C qq{ -[Configuration-$conf] -profile = None -moduleName = org.glite.$subsys.$module -displayName = $conf -description = org.glite.$subsys.$module -projectName = org.glite -age = $age -deploymentType = None -tag = $conftag -version = $major.$minor.$rev -$dwpath -[Platform-default:VcsCommand] -displayName = None -description = None -tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName} -branch = None -commit = None -checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName} - -[Platform-default:BuildCommand] -postpublish = None -packaging = None -displayName = None -description = None -doc = None -prepublish = None -publish = None -compile = make -init = None -install = make install -clean = make clean -test = make check -configure = cd $confdir && \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts -checkstyle = None - -[Platform-default:Property] -$buildroot -$package_description -$package_summary - -[Platform-default:DynamicDependency] - -}; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; - } - } - - my $type = $need_externs_type{"$subsys.$module"}->{$_}; - print C "$proj|$eext = $type\n"; - } - - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "org.glite|org.glite.$_ = $type\n"; - } - - close C; -} - -sub gsoap_version { - local $_; - my $gsoap_version; - open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n"; - - while ($_ = ) { - chomp; - - $gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/; - } - close S; - return $gsoap_version; -} - -sub getlibdir { - if ( -e "/etc/debian_version") { # We are on Debian - $lib64="lib"; - $lib32="lib32"; } - else { # Another distribution - $lib64="lib64"; - $lib32="lib"; } - $libdir=$lib32; - - open INP, "uname -s | "; # Check kernel name - $kname= ; - chomp($kname); - close INP; - - if ( $kname == "Linux") { - $arch = ("x86_64\npowerpc\nppc64\n"); - - open INP, "uname -p | "; # Check processor type - $procname= ; - chomp($procname); - close INP; - - if ($arch =~/^$procname\n/) { - return ($lib64); } - - open INP, "uname -m | "; # Check machine hardware - $machname= ; - chomp($machname); - close INP; - - if ($arch =~/^$machname\n/) { - return ($lib64); } - - # special cases (hyperlink lib64, Debian) - if (-l "/usr/lib64") { - $libdir=$lib32; } - - # if /usr/lib64 doesn't exist at all (AIX) - unless ( -e "/usr/lib64" ) { - $libdir=$lib32; } - } - - if ( $kname == "SunOS") { - if (-e "/usr/lib/64") { - $libdir="lib/64"; } - } - - return $libdir; -} - -sub usage { - my @ext = keys %extern_prefix; - my @myjars, keys %jar; - - print STDERR qq{ -usage: $0 options - -General options (defaults in []): - --prefix=PREFIX destination directory [./stage] - --staged=module,module,... what is already in PREFIX (specify without org.glite.) - --thrflavour=flavour - --nothrflavour=flavour threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg] - --listmodules=subsys list modules of a subsystem - --libdir=libdir typically [lib,lib64] postfix - -Mode of operation: - --mode={checkout|build|etics} what to do [build] - -What to build: - --module=module build this module only (mostly in-Etics operation) - --enable-NODE build this "node" (set of modules) only. Available nodes are - @{$lbmodules{lb}},@{$lbmodules{security}} - --disable-NODE don't build this node - --lb-tag=tag checkout LB modules with specific tag - --jp-tag=tag checkout JP modules with specific tag - --lbjp-common-tag=tag checkout lbjp-common modules with specific tag - --security-tag=tag checkout security modules with specific tag - --jobid-tag=tag checkout jobid modules with specific tag - -Dependencies: - --with-EXTERNAL=PATH where to look for an external. Required externals - (not all for all modules) are: - @ext - --with-JAR=JAR where to look for jars. Required jars are: - @myjars - Summary of what will be used is always printed - -}; - -} diff --git a/org.glite.lb.utils/doc/README.LB-monitoring b/org.glite.lb.utils/doc/README.LB-monitoring deleted file mode 100644 index a1900bc..0000000 --- a/org.glite.lb.utils/doc/README.LB-monitoring +++ /dev/null @@ -1,34 +0,0 @@ -LB monitoring tools -=================== - -GLITE-LB-MON ------------- -NAME - glite-lb-mon - program for monitoring the number of jobs on the LB server and their several statistics - - -SYNOPSIS - glite-lb-mon [-t time] - -DESCRIPTION - glite-lb-mon is a low-level program for monitoring the the number of jobs on the LB server and their several statistics. - Values like minimum, average and maximum time spent in the system are calulated for jobs that entered the final state - (Aborted, Cleared, Cancelled) in specific time (default last hour). Also number of jobs that entered the system during - this time is calculated. - -OPTIONS - -t time, --time=time - querying time in seconds from now to the past [deault 3600] - -ENVIRONMENT - EDG_WL_QUERY_SERVER - set this environment variable to specify the LB server address to query - -FILES - A special bkindex configuration needed. The following time indices must be defined: - - [ type = "time"; name = "submitted" ], - [ type = "time"; name = "cleared" ], - [ type = "time"; name = "aborted" ], - [ type = "time"; name = "cancelled" ], - diff --git a/org.glite.lb.utils/doc/README.LB-statistics b/org.glite.lb.utils/doc/README.LB-statistics deleted file mode 100644 index 5025459..0000000 --- a/org.glite.lb.utils/doc/README.LB-statistics +++ /dev/null @@ -1,41 +0,0 @@ -LB statistics tools -=================== - -GLITE-LB-STATISTICS -------------------- - -General idea: - -- LB server produces dump files (during each purge on regular basis) -see LB server startup script; option -D / --dump-prefix of glite-lb-bkserverd - -- these dumps are exported for the purposes of JP also on regular basis, -see LB/JP deplyment module; option -s/ --store of glite-lb-lb_dump_exporter - -- it depends on the LB server policy if dumps in this directory are used for -the statistics purposes or all files are hardlinked for example to a different -directory - -- general idea is such that data are available for statistics server that downloads -and removes dumps after download! Dump files are then processed on the statistics -server. - - -What needs to be done on the LB server: - -- bkserver + lb_dump_exporter running - -- gridftp running (allowing statistics server to download and remove files from -a given directory - - -What needs to be done on the statistics server: - -- download and remove files from the LB server -see glite-lb-statistics-gsi.sh (shell script in the examples directory) - -- process dump files using the glite-lb-statistics tool -see glite-lb-statistics.sh (shell script in the examples directory) - -all scripts are supposed to be run from a crontab. - diff --git a/org.glite.lb.utils/doc/glite-lb-mon.1 b/org.glite.lb.utils/doc/glite-lb-mon.1 deleted file mode 100644 index 8b6ea3f..0000000 --- a/org.glite.lb.utils/doc/glite-lb-mon.1 +++ /dev/null @@ -1,51 +0,0 @@ -.TH GLITE-LB-MON 1 "Mar 2006" "EU EGEE Project" "Logging & Bookkeeping Utils" - -.SH NAME -glite-lb-mon - program for monitoring the number of jobs on the LB server and their several statistics - -.SH SYNOPSIS -.B glite-lb-mon -.B [-t time -h] -.br - -.SH DESCRIPTION -.B glite-lb-mon -is a low-level program for monitoring the the number of jobs on the LB server and their several statistics. -Values like minimum, average and maximum time spent in the system are calulated for jobs that entered -the final state (Aborted, Cleared, Cancelled) in specific time (default last hour). Also number of jobs -that entered the system during this time is calculated. - -.SH OPTIONS -.TP -.B \-t time, \-\-time=time -Querying time in seconds from now to the past [deault 3600]. - -.TP -.B \-h, \-\-help -Display help and exit. - -.SH ENVIRONMENT -.TP -.B EDG_WL_QUERY_SERVER -set this environment variable to specify the LB server address to query - -.SH FILES -A special bkindex configuration needed. The following time indices must be defined: - -.nf - [ type = "time"; name = "submitted" ], - [ type = "time"; name = "cleared" ], - [ type = "time"; name = "aborted" ], - [ type = "time"; name = "cancelled" ], -.fi - - -.SH REPORTING BUGS -Please, report all bugs to EU EGEE Bug Tracking System located at https://savannah.cern.ch/bugs/?func=additem&group=jra1mdw - -.SH SEE ALSO -.BR glite-lb-bkindex (8), -.BR glite-lb-mon (1) - -.SH AUTHOR -EU EGEE JRA1, CESNET group. diff --git a/org.glite.lb.utils/doc/glite-lb-purge.8 b/org.glite.lb.utils/doc/glite-lb-purge.8 deleted file mode 100644 index 4482ba0..0000000 --- a/org.glite.lb.utils/doc/glite-lb-purge.8 +++ /dev/null @@ -1,103 +0,0 @@ -.TH GLITE-LB-PURGE 8 "April 2008" "EGEE Project" "Logging&Bookkeeping" - - -.SH NAME -glite-lb-purge - utility for removing inactive jobs from the L&B database - - -.SH SYNOPSIS -.B glite-lb-purge -.RI [ options ] -.br - - -.SH DESCRIPTION -.B glite-lb-purge -is utility for removing inactive jobs from the L&B database. By default, it removes jobs that reached CLEARED, ABORTED and CANCELLED state and also OTHER jobs that are in another state and are inactive for specific (rather long) time. It is a command line frontend to server internal purge. It is used by administrators of bkserver and it is not supposed to be used at the user level. - -.B glite-lb-purge -may be run periodically in order to avoid database overflow, however the periodic purges are done by server itself, so check the configuration of the server first. - - -.SH OPTIONS -.IP "-m, --server \fIbkserver\fR" -L&B server machine name. If not specified, the environment variable EDG_WL_QUERY_SERVER is beeing checked. - -.IP "-a, --aborted \fiNNN[smhd]\fR" -Purge ABORTED jobs older than NNN seconds/minutes/hours/days (only one number and one letter allowed). If the time is not specified, the default timeout is determined by the server. - -.IP "-c, --cleared \fiNNN[smhd]\fR" -Purge CLEARED jobs older than given time. - -.IP "-n, --cancelled \fiNNN[smhd]\fR" -Purge CANCELLED jobs older than given time. - -.IP "-e, --done \fiNNN[smhd]\fR" -Purge DONE jobs older than given time. - -.IP "-o, --other \fiNNN[smhd]\fR" -Purge OTHER (i.e. job in other state than ABORTED, CLEARED or CANCELLED) jobs older than given time. - -.IP "-r, --dry-run" -Do not really purge. - -.IP "-j, --jobs \fIfilename\fR" -Input file with jobIds of jobs to purge. - -.IP "-l, --return-list" -Return list of jobid matching the purge/dump criteria. - -.IP "-s, --server-dump" -Dump jobs at the server into a file (see bkserverd). - -.IP "-i, --client-dump" -Receive stream of dumped jobs (NOT implemented yet!). - -.IP "-h, --help" -Display help. - -.IP "-v, --version" -Display version. - -.IP "-d, --debug" -Print diagnostics on the \fIstderr\fR. - -.IP "-x, --proxy" -Purge L&B proxy. - -.IP "-X, --sock \fIpath\fR" -Purge L&B proxy using given socket path. - -.IP "-t, --target-runtime \fiNNN[smhd]\fR" -Throttle purge to the estimated target runtime. - -.IP "-b, --background \fiN\fR" -Purge on the background. Default 1 when throttled purging. - - -.\".SH EXAMPLES -.\"To appear :o( - - -.SH FILES -No configuration files needed. - - -.SH ENVIRONMENT -.TP -.B EDG_WL_QUERY_SERVER -If -.RB $ EDG_WL_QUERY_SERVER -is set, its value is used as the bkserver address. - - -.SH REPORTING BUGS -Please, report all bugs to EGEE Bug Tracking System located at https://savannah.cern.ch - - -.SH SEE ALSO -\fBglite-lb-bkindex\fP(8), \fBglite-lb-bkserverd\fP(8), \fBglite-lb-interlogd\fP(8), \fBglite-lb-logd\fP(8), \fBglite-lb-logevent\fP(1), \fBglite-lb-dump\fP(8), \fBglite-lb-load\fP(8) - - -.SH AUTHOR -EU EGEE, JRA1. diff --git a/org.glite.lb.utils/examples/glite-lb-index.conf b/org.glite.lb.utils/examples/glite-lb-index.conf deleted file mode 100644 index 4676ee1..0000000 --- a/org.glite.lb.utils/examples/glite-lb-index.conf +++ /dev/null @@ -1,11 +0,0 @@ -[ - JobIndices = { - [ type = "system"; name = "owner" ], - [ type = "system"; name = "location" ], - [ type = "system"; name = "destination" ], - [ type = "time"; name = "submitted" ], - [ type = "time"; name = "cleared" ], - [ type = "time"; name = "aborted" ], - [ type = "time"; name = "cancelled" ], - } -] diff --git a/org.glite.lb.utils/examples/glite-lb-statistics-gsi.sh b/org.glite.lb.utils/examples/glite-lb-statistics-gsi.sh deleted file mode 100755 index 0255526..0000000 --- a/org.glite.lb.utils/examples/glite-lb-statistics-gsi.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# -# an example script for getting LB dumps by gsiftp -# and removing them at by glite-gridftp-rm -# - -GLITE_LOCATION=${GLITE_LOCATION:-/opt/glite} -GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-${GLITE_LOCATION}/var} -GLITE_LB_DUMPDIR=${GLITE_LB_DUMPDIR:-${GLITE_LOCATION_VAR}/dump} - -GSIFTP_SERVER=scientific.civ.zcu.cz -GSIFTP_PORT=8911 -GLITE_LB_SERVER=${GSIFTP_SERVER}:${GSIFTP_PORT} -GLITE_LB_EXPORT_DUMPDIR=/home/glite/LB/export - -X509_USER_KEY=~/.cert/usercert.pem -X509_USER_CERT=~/.cert/userkey.pem - -progname=`basename $0` - -function syslog () { - if [ ! -z "$*" ]; then - echo `date +'%b %d %H:%M:%S'` `hostname` $progname: $* - fi -} - -if [ ! -d ${GLITE_LB_DUMPDIR} ]; then - syslog "Creating directory ${GLITE_LB_DUMPDIR}" - mkdir -vp ${GLITE_LB_DUMPDIR} || exit 1 -fi - -syslog "getting new dumps to ${GLITE_LB_DUMPDIR}" -globus-url-copy gsiftp://${GLITE_LB_SERVER}/${GLITE_LB_EXPORT_DUMPDIR}/ file://${GLITE_LB_DUMPDIR}/ - -syslog "NOT removing dumps on the server" -# glite-gridftp-rm ... - -syslog "done" diff --git a/org.glite.lb.utils/examples/glite-lb-statistics-rsync.sh b/org.glite.lb.utils/examples/glite-lb-statistics-rsync.sh deleted file mode 100755 index 2cd15a2..0000000 --- a/org.glite.lb.utils/examples/glite-lb-statistics-rsync.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# -# an example script for getting LB dumps by rsync -# (it does not remove files on the LB server!) -# - -GLITE_LOCATION=${GLITE_LOCATION:-/opt/glite} -GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-${GLITE_LOCATION}/var} -GLITE_LB_DUMPDIR=${GLITE_LB_DUMPDIR:-${GLITE_LOCATION_VAR}/dump} - -GLITE_LB_SERVER=scientific.civ.zcu.cz -GLITE_LB_EXPORT_DUMPDIR=/home/glite/LB/export - -progname=`basename $0` - -function syslog () { - if [ ! -z "$*" ]; then - echo `date +'%b %d %H:%M:%S'` `hostname` $progname: $* - fi -} - -if [ ! -d ${GLITE_LB_DUMPDIR} ]; then - syslog "Creating directory ${GLITE_LB_DUMPDIR}" - mkdir -vp ${GLITE_LB_DUMPDIR} || exit 1 -fi - -syslog "getting new dumps to ${GLITE_LB_DUMPDIR}" -rsync -rlptoDuv ${GLITE_LB_SERVER}:${GLITE_LB_EXPORT_DUMPDIR}/ ${GLITE_LB_DUMPDIR}/ - -syslog "done" diff --git a/org.glite.lb.utils/examples/glite-lb-statistics-sftp.sh b/org.glite.lb.utils/examples/glite-lb-statistics-sftp.sh deleted file mode 100755 index 7604983..0000000 --- a/org.glite.lb.utils/examples/glite-lb-statistics-sftp.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/sh -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# -# an example script for getting LB dumps using sftp -# (it does not remove files on the LB server!) -# - -GLITE_LOCATION=${GLITE_LOCATION:-/opt/glite} -GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-${GLITE_LOCATION}/var} -GLITE_LB_DUMPDIR=${GLITE_LB_DUMPDIR:-${GLITE_LOCATION_VAR}/dump} - -GLITE_LB_SFTPBATCH=/tmp/glite-lb-statistics-sftp-batch - -GLITE_LB_SERVER=scientific.civ.zcu.cz -GLITE_LB_EXPORT_DUMPDIR=/home/glite/LB/export - -progname=`basename $0` - -function syslog () { - if [ ! -z "$*" ]; then - echo `date +'%b %d %H:%M:%S'` `hostname` $progname: $* - fi -} - -if [ ! -d ${GLITE_LB_DUMPDIR} ]; then - syslog "Creating directory ${GLITE_LB_DUMPDIR}" - mkdir -vp ${GLITE_LB_DUMPDIR} || exit 1 -fi - -if [ -f ${GLITE_LB_SFTPBATCH} ]; then - syslog "WARNING: File ${GLITE_LB_SFTPBATCH} already exists, will be overwritten" -fi - -syslog "writing ${GLITE_LB_SFTPBATCH}" -echo "lcd ${GLITE_LB_DUMPDIR} -cd ${GLITE_LB_EXPORT_DUMPDIR} -get -P *" > ${GLITE_LB_SFTPBATCH} || exit 1 - -syslog "getting new dumps to ${GLITE_LB_DUMPDIR}" -sftp -b ${GLITE_LB_SFTPBATCH} ${GLITE_LB_SERVER} - -syslog "done" diff --git a/org.glite.lb.utils/examples/glite-lb-statistics.sh b/org.glite.lb.utils/examples/glite-lb-statistics.sh deleted file mode 100755 index a340522..0000000 --- a/org.glite.lb.utils/examples/glite-lb-statistics.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/sh -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# -# an example script for processing LB dumps for the statistics purposes -# suitable for running from crontab -# - -GLITE_LOCATION=${GLITE_LOCATION:-/opt/glite} -GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-${GLITE_LOCATION}/var} -GLITE_LB_DUMPDIR=${GLITE_LB_DUMPDIR:-${GLITE_LOCATION_VAR}/dump} -GLITE_LB_STATISTICS=${GLITE_LOCATION}/bin/glite-lb-statistics - -progname=`basename $0` - -function syslog () { - if [ ! -z "$*" ]; then - echo `date +'%b %d %H:%M:%S'` `hostname` $progname: $* - fi -} - -if [ ! -d ${GLITE_LB_DUMPDIR} ]; then - syslog "Creating directory ${GLITE_LB_DUMPDIR}" - mkdir -vp ${GLITE_LB_DUMPDIR} || exit 1 -fi - -if [ ! -f ${GLITE_LB_STATISTICS} ]; then - syslog "Program ${GLITE_LB_STATISTICS} is missing" - exit 1 -fi - -syslog "processing new dumps in ${GLITE_LB_DUMPDIR}" -for file in ${GLITE_LB_DUMPDIR}/*[^xml,log] ; do - if [ ! -s $file.xml ]; then - if [ -s $file ]; then - ${GLITE_LB_STATISTICS} -v -f $file > $file.xml 2> $file.log - syslog "processed $file" - let num++ - else - syslog `rm -v -f $file*` - fi -# else -# syslog "file $file.xml already exists" - fi -done - -if [ -z $num ]; then - syslog "processed no files" -else - syslog "processed $num files" -fi diff --git a/org.glite.lb.utils/project/ChangeLog b/org.glite.lb.utils/project/ChangeLog deleted file mode 100644 index 7aaad2f..0000000 --- a/org.glite.lb.utils/project/ChangeLog +++ /dev/null @@ -1,25 +0,0 @@ -2.0.0-1 -- LB 2.0 release - -2.0.0-2 -- fixed configure to work in etics - -2.0.0-3 -- configure script update (globus flavors added to configure call) - -2.0.1-1 -- purging client - 'other' jobs selection updated. - -2.0.2-1 -- glite-lb-bkpurge-offline.sh deletes from events_flesh as well - -2.0.3-1 -- Man page update -- Support for background purge funcionality - -2.0.3-2 -- install libraries into $libdir - -2.0.4-1 -- man page update - diff --git a/org.glite.lb.utils/project/build.number b/org.glite.lb.utils/project/build.number deleted file mode 100644 index 073124b..0000000 --- a/org.glite.lb.utils/project/build.number +++ /dev/null @@ -1,2 +0,0 @@ -#Fri Aug 18 12:33:06 CEST 2006 -module.build=0090 diff --git a/org.glite.lb.utils/project/build.properties b/org.glite.lb.utils/project/build.properties deleted file mode 100755 index e69de29..0000000 diff --git a/org.glite.lb.utils/project/configure.properties.xml b/org.glite.lb.utils/project/configure.properties.xml deleted file mode 100644 index 68882d7..0000000 --- a/org.glite.lb.utils/project/configure.properties.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - -top_srcdir=.. -builddir=build -stagedir=${stage.abs.dir} -distdir=${dist.dir} -globalprefix=${global.prefix} -lbprefix=${subsystem.prefix} -package=${module.package.name} -PREFIX=${install.dir} -version=${module.version} -glite_location=${with.glite.location} -globus_prefix=${with.globus.prefix} -expat_prefix=${with.expat.prefix} -mysql_prefix=${with.mysql.prefix} -mysql_version=${ext.mysql.version} -gsoap_prefix=${with.gsoap.prefix} -gsoap_version=${ext.gsoap.version} -cppunit_prefix=${with.cppunit.prefix} -thrflavour=${with.globus.thr.flavor} -nothrflavour=${with.globus.nothr.flavor} - - - diff --git a/org.glite.lb.utils/project/package.description b/org.glite.lb.utils/project/package.description deleted file mode 100644 index 44b33e2..0000000 --- a/org.glite.lb.utils/project/package.description +++ /dev/null @@ -1 +0,0 @@ -glite-lb-utils are gLite LB utilities used for dumping (glite-lb-dump) and purging (glite-lb-purge) data from LB server, for loading (glite-lb-load) data to server, for real time monitoring (glite-lb-mon) and post-mortem statistics (glite-lb-statistics). diff --git a/org.glite.lb.utils/project/package.summary b/org.glite.lb.utils/project/package.summary deleted file mode 100644 index c2476fd..0000000 --- a/org.glite.lb.utils/project/package.summary +++ /dev/null @@ -1 +0,0 @@ -gLite Logging and Bookkeeping auxiliary utilities diff --git a/org.glite.lb.utils/project/properties.xml b/org.glite.lb.utils/project/properties.xml deleted file mode 100644 index 65541d5..0000000 --- a/org.glite.lb.utils/project/properties.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb.utils/project/tar_exclude b/org.glite.lb.utils/project/tar_exclude deleted file mode 100644 index b3133e4..0000000 --- a/org.glite.lb.utils/project/tar_exclude +++ /dev/null @@ -1,10 +0,0 @@ -tar_exclude -CVS -build.xml -build -build.properties -properties.xml -configure-options.xml -.cvsignore -.project -.cdtproject diff --git a/org.glite.lb.utils/project/version.properties b/org.glite.lb.utils/project/version.properties deleted file mode 100755 index 6cf7a4c..0000000 --- a/org.glite.lb.utils/project/version.properties +++ /dev/null @@ -1,3 +0,0 @@ -# $Header$ -module.version=2.0.4 -module.age=1 diff --git a/org.glite.lb.utils/src/dump.c b/org.glite.lb.utils/src/dump.c deleted file mode 100644 index 783a3c5..0000000 --- a/org.glite.lb.utils/src/dump.c +++ /dev/null @@ -1,241 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - - -#include -#include -#include -#include -#include -#include - -#define CLIENT_SBIN_PROG - -#include "glite/lb/context-int.h" -#include "glite/lb/ulm_parse.h" -#include "glite/lb/xml_parse.h" -#include "glite/lb/mini_http.h" -#include "glite/lb/consumer.h" - -#define dprintf(x) { if (debug) printf x; } - -static const char rcsid[] = "@(#)$Id$"; - -static int debug=0; - -static int edg_wll_DumpEvents( - edg_wll_Context ctx, - const edg_wll_DumpRequest *request, - edg_wll_DumpResult *result); -static void printerr(edg_wll_Context ctx); - -static struct option opts[] = { - { "from", required_argument, NULL, 'f'}, - { "to", required_argument, NULL, 't'}, - { "help", no_argument, NULL, 'h' }, - { "version", no_argument, NULL, 'v' }, - { "debug", no_argument, NULL, 'd' }, - { "server", required_argument, NULL, 'm' }, - { NULL, no_argument, NULL, 0 } -}; - -static void usage(char *me) -{ - fprintf(stderr,"usage: %s [option]\n" - " -f, --from YYYYMMDDHHmmss beginning of the time interval for events to be dumped\n" - " -t, --to YYYYMMDDHHmmss end of the time interval for events to be dumped\n" - " -h, --help display this help\n" - " -v, --version display version\n" - " -d, --debug diagnostic output\n" - " -m, --server L&B server machine name\n", - me); -} - -int main(int argc,char *argv[]) -{ - edg_wll_DumpRequest *request; - edg_wll_DumpResult *result; - char *server = NULL; - char date[ULM_DATE_STRING_LENGTH+1]; - - char *me; - int opt; - edg_wll_Context ctx; - - /* initialize request to server defaults */ - request = (edg_wll_DumpRequest *) calloc(1,sizeof(edg_wll_DumpRequest)); - request->from = EDG_WLL_DUMP_LAST_END; - request->to = EDG_WLL_DUMP_NOW; - - /* initialize result */ - result = (edg_wll_DumpResult *) calloc(1,sizeof(edg_wll_DumpResult)); - - me = strrchr(argv[0],'/'); - if (me) me++; else me=argv[0]; - - /* get arguments */ - while ((opt = getopt_long(argc,argv,"f:t:m:dvh",opts,NULL)) != EOF) { - - switch (opt) { - - case 'f': request->from = (time_t) edg_wll_ULMDateToDouble(optarg); break; - case 't': request->to = (time_t) edg_wll_ULMDateToDouble(optarg); break; - case 'm': server = optarg; break; - case 'd': debug = 1; break; - case 'v': fprintf(stdout,"%s:\t%s\n",me,rcsid); exit(0); - case 'h': - case '?': usage(me); return 1; - } - } - - /* check request */ - if (debug) { - printf("Dump request:\n"); - if (request->from < 0) { - printf("- from: %ld.\n",(long) request->from); - } else { - if (edg_wll_ULMTimevalToDate(request->from,0,date) != 0) { - fprintf(stderr,"Error parsing 'from' argument.\n"); - goto main_end; - } - printf("- from: %ld (i.e. %s).\n",(long) request->from,date); - } - if (request->to < 0) { - printf("- to: %ld.\n",(long) request->to); - } else { - if (edg_wll_ULMTimevalToDate(request->to,0,date) != 0) { - fprintf(stderr,"Error parsing 'to' argument.\n"); - goto main_end; - } - printf("- to: %ld (i.e. %s).\n",(long) request->to,date); - } - } - - /* initialize context */ - edg_wll_InitContext(&ctx); - if ( server ) - { - char *p = strchr(server, ':'); - if ( p ) - { - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, atoi(p+1)); - *p = 0; - } - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER, server); - } - - /* that is the DumpEvents */ - dprintf(("Running the edg_wll_DumpEvents...\n")); - if (edg_wll_DumpEvents(ctx, request, result) != 0) { - fprintf(stderr,"Error running the edg_wll_DumpEvents().\n"); - printerr(ctx); - switch ( edg_wll_Error(ctx, NULL, NULL) ) - { - case ENOENT: - case EPERM: - case EINVAL: - break; - default: - goto main_end; - } - } - - /* examine the result */ - dprintf(("Examining the result of edg_wll_DumpEvents...\n")); - printf("Dump result:\n"); - if (result->server_file) { - printf("- The jobs were dumped to the file '%s' at the server.\n",result->server_file); - } else { - printf("- The jobs were not dumped.\n"); - } - if (edg_wll_ULMTimevalToDate(result->from,0,date) != 0) { - fprintf(stderr,"Error parsing 'from' argument.\n"); - goto main_end; - } - printf("- from: %ld (i.e. %s).\n",(long) result->from,date); - if (edg_wll_ULMTimevalToDate(result->to,0,date) != 0) { - fprintf(stderr,"Error parsing 'to' argument.\n"); - goto main_end; - } - printf("- to: %ld (i.e. %s).\n",(long) result->to,date); - -main_end: - dprintf(("End.\n")); - if (request) free(request); - if (result) free(result); - edg_wll_FreeContext(ctx); - return 0; -} - - -static void printerr(edg_wll_Context ctx) -{ - char *errt,*errd; - - edg_wll_Error(ctx,&errt,&errd); - fprintf(stderr,"%s (%s)\n",errt,errd); -} - - -static const char* const request_headers[] = { - "Cache-Control: no-cache", - "Accept: application/x-dglb", - "User-Agent: edg_wll_Api/" PROTO_VERSION "/" COMP_PROTO, - "Content-Type: application/x-dglb", - NULL -}; - -/** Dump events in a given time interval - */ - -static int edg_wll_DumpEvents( - edg_wll_Context ctx, - const edg_wll_DumpRequest *request, - edg_wll_DumpResult *result) -{ - int error; - char *send_mess, - *response = NULL, - *recv_mess = NULL; - - edg_wll_DumpRequestToXML(ctx, request, &send_mess); - - ctx->p_tmp_timeout = ctx->p_query_timeout; - if (ctx->p_tmp_timeout.tv_sec < 600) ctx->p_tmp_timeout.tv_sec = 600; - - if (set_server_name_and_port(ctx, NULL)) - goto edg_wll_dumpevents_end; - - error = edg_wll_http_send_recv(ctx, - "POST /dumpRequest HTTP/1.1", request_headers, send_mess, - &response, NULL, &recv_mess); - if ( error != 0 ) - goto edg_wll_dumpevents_end; - - if (http_check_status(ctx, response)) - goto edg_wll_dumpevents_end; - - edg_wll_ParseDumpResult(ctx, recv_mess, result); - -edg_wll_dumpevents_end: - if (response) free(response); - if (recv_mess) free(recv_mess); - if (send_mess) free(send_mess); - return edg_wll_Error(ctx,NULL,NULL); -} diff --git a/org.glite.lb.utils/src/dump_exporter.c b/org.glite.lb.utils/src/dump_exporter.c deleted file mode 100644 index 45a8c92..0000000 --- a/org.glite.lb.utils/src/dump_exporter.c +++ /dev/null @@ -1,407 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "glite/lbu/maildir.h" -#include "glite/lb/context.h" -#include "glite/lb/events.h" -#include "glite/lb/events_parse.h" - - -#define DUMP_FILE_STORE_PREFIX "/tmp" -#define LB_MAILDIR_PATH "/tmp/dumpinfo_lbmd" - -#define KEYNAME_JOBID "jobid " -#define KEYNAME_FILE "file " -#define KEYNAME_JPPS "jpps " -#define REALLOC_CHUNK 10000 - -typedef struct _buffer_t { - char *str; - char *eol; - int sz; - int use; -} buffer_t; - -typedef struct _dump_storage_t { - char *job; - char *fname; - int fhnd; -} dump_storage_t; - -/* hold actual number of records in dump_storage_t structure st (defined below) */ -int number_of_st = 0; - -static const char *optstr = "d:s:j:m:hx"; - -static struct option opts[] = { - { "help", 0, NULL, 'h'}, - { "dump", 0, NULL, 'd'}, - { "store", 0, NULL, 's'}, - { "jpps", 0, NULL, 'j'}, - { "lbmaildir", 0, NULL, 'm'}, - { "mixed", 0, NULL, 'x'}, - { NULL, 0, NULL, 0} -}; - -void usage(char *me) -{ - fprintf(stderr, "usage: %s [option]\n" - "\t-h, --help Shows this screen.\n" - "\t-d, --dump Dump file location.\n" - "\t-s, --store New dump files storage.\n" - "\t-j, --jpps Target JPPS.\n" - "\t-m, --lbmaildir LB maildir path.\n" - "\t-x, --mixed Suppose events in dump file unsorted by jobid (slower).\n" - , me); -} - - -static int read_line(int, buffer_t *, char **); -static dump_storage_t *dump_storage_find_sorted(dump_storage_t *, char *); -static dump_storage_t *dump_storage_find_unsorted(dump_storage_t *, char *); -static dump_storage_t *dump_storage_add(dump_storage_t **, char *, char *, int); -static void dump_storage_free(dump_storage_t *); - -typedef dump_storage_t *(*find_function)(); - -int main(int argc, char **argv) -{ - edg_wll_Context ctx; - edg_wll_Event *ev = NULL; - find_function dump_storage_find = dump_storage_find_sorted; - dump_storage_t *dstorage = NULL, - *last_st = NULL, - *st; - buffer_t buf; - char *store_pref = DUMP_FILE_STORE_PREFIX, - *lb_maildir = LB_MAILDIR_PATH, - *jpps = NULL, - *name, - *fname, - *ln; - int fhnd, - opt, ret, - msg_format_sz; - - - name = strrchr(argv[0], '/'); - if ( name ) name++; else name = argv[0]; - - fname = NULL; - while ( (opt = getopt_long(argc, argv, optstr, opts, NULL)) != EOF ) - switch ( opt ) { - case 'd': fname = optarg; break; - case 's': store_pref = optarg; break; - case 'j': jpps = optarg; break; - case 'm': lb_maildir = optarg; break; - case 'x': dump_storage_find = dump_storage_find_unsorted; break; - case 'h': usage(name); return 0; - case '?': usage(name); return 1; - } - - msg_format_sz = sizeof(KEYNAME_JOBID) + 1 + - sizeof(KEYNAME_FILE) + 1 + - (jpps? sizeof(KEYNAME_JPPS) + 1: 0); - - if ( fname ) { - if ( (fhnd = open(fname, O_RDONLY)) < 0 ) { - perror("Opening input file"); - exit(1); - } - } else fhnd = 0; - - if ( glite_lbu_MaildirInit(lb_maildir) ) { - perror(lbm_errdesc); - exit(1); - } - - -#ifndef cleanup -# define cleanup(r) { ret = (r); goto cleanup_lbl; } -#endif - - ret = 0; - memset(&buf, 0, sizeof(buf)); - edg_wll_InitContext(&ctx); - while ( 1 ) { - int rl_ret, - written, - lnsz, ct; - char *jobid, - *unique; - - if ( (rl_ret = read_line(fhnd, &buf, &ln)) < 0 ) { - perror("reading input file"); - cleanup(1); - } - if ( !ln ) break; - - if (*ln == 0) continue; - - if ( edg_wll_ParseEvent(ctx, ln, &ev) != 0 ) { - cleanup(1); - } - if ( !(jobid = edg_wlc_JobIdUnparse(ev->any.jobId)) ) { - perror("Can't unparse jobid from event"); - cleanup(1); - } - if ( !(unique = edg_wlc_JobIdGetUnique(ev->any.jobId)) ) { - perror("Can't unparse jobid from event"); - cleanup(1); - } - - if ( !(st = dump_storage_find(dstorage, jobid)) ) { - int fd, i; - char fname[PATH_MAX]; - struct timeval tv; - - i = 0; - while ( 1 ) { - if ( ++i > 10 ) { - errno = ECANCELED; - perror("Can't create dump file - max tries limit reached "); - cleanup(1); - } - gettimeofday(&tv, NULL); - snprintf(fname, PATH_MAX, "%s/%s.%ld_%ld", store_pref, unique, tv.tv_sec, tv.tv_usec); - if ( (fd = open(fname, O_CREAT|O_EXCL|O_RDWR, 00640)) < 0 ) { - if ( errno == EEXIST ) { usleep(1000); continue; } - perror(fname); - cleanup(1); - } - break; - } - if (last_st) { - close(last_st->fhnd); - last_st->fhnd = 0; - } - - if ( !(st = dump_storage_add(&dstorage, jobid, fname, fd)) ) { - perror("Can't record dump informations"); - cleanup(1); - } - } - else { - if (strcmp(last_st->fname,st->fname)) { - /* new jobid data */ - // this is only fallback code, because data in lb dump - // are clustered by jobids, hence files are created by - // open() above - close(last_st->fhnd); - last_st->fhnd = 0; - - if ( (st->fhnd = open(st->fname, O_APPEND|O_RDWR)) < 0 ) { - perror(st->fname); - cleanup(1); - } - } - } - free(jobid); - free(unique); - last_st = st; - - lnsz = strlen(ln); - ln[lnsz++] = '\n'; - written = 0; - while ( written < lnsz ) { - if ( (ct = write(st->fhnd, ln+written, lnsz-written)) < 0 ) { - if ( errno == EINTR ) { errno = 0; continue; } - perror(fname); - cleanup(1); - } - written += lnsz; - } - - - if ( !rl_ret ) break; - edg_wll_FreeEvent(ev); ev = NULL; - } - - /* store info in lb_maildir */ - for ( st = dstorage; st && st->job; st++ ) { - char *msg; - if ( !(msg = malloc(msg_format_sz + strlen(st->fname) + strlen(st->job))) ) { - perror("allocating message"); - cleanup(1); - } - if ( jpps ) - /* XXX: used to be 5x %s here, God knows why ... */ - sprintf(msg, "%s%s\n%s%s%s%s", - KEYNAME_JOBID, st->job, KEYNAME_FILE, st->fname, KEYNAME_JPPS, jpps); - else - sprintf(msg, "%s%s\n%s%s", - KEYNAME_JOBID, st->job, KEYNAME_FILE, st->fname); - if ( glite_lbu_MaildirStoreMsg(lb_maildir, "localhost", msg) < 0 ) { - perror(lbm_errdesc); - exit(1); - } - free(msg); - } - -cleanup_lbl: - if (ret) { - char *et, *ed; - - if (edg_wll_Error(ctx,&et,&ed)) { - fprintf(stderr,"\nError during dump processing! Terminating.\n%s: %s\n",et,ed); - free(et); - free(ed); - } - } - edg_wll_FreeContext(ctx); - if ( ev ) edg_wll_FreeEvent(ev); - for ( st = dstorage; st && st->job; st++ ) if ( st->fhnd > 0 ) close(st->fhnd); - dump_storage_free(dstorage); - close(fhnd); - free(buf.str); - - return (ret); -} - - -/* Suppose that dumps in purged dump file are sorted by jobid */ -static dump_storage_t *dump_storage_find_sorted(dump_storage_t *st, char *job) -{ - if (st && (st+number_of_st-1)->job) { - if ( !strcmp(job, (st+number_of_st-1)->job) ) return (st+number_of_st-1); - } - - return NULL; -} - - -/* Suppose that dumps in purged dump file are NOT sorted by jobid - * - * look thru list from the last element to the first - * last element is most likely corresponding to the job we are looking for - */ -static dump_storage_t *dump_storage_find_unsorted(dump_storage_t *st, char *job) -{ - int i; - - st = st + (number_of_st -1); // point to the last element - - for (i=number_of_st; i > 0; i--) { - if (!st || !st->job) return NULL; - if ( !strcmp(job, st->job) ) return st; - st--; - } - return NULL; -} - -static dump_storage_t *dump_storage_add(dump_storage_t **st, char *job, char *fname, int fhnd) -{ - dump_storage_t *tmp; - - if ( !(number_of_st % REALLOC_CHUNK) ) { - *st = realloc(*st, (REALLOC_CHUNK + number_of_st+2)*sizeof(*tmp)); - } - if ( !(*st) ) return NULL; - - tmp = *st + number_of_st; - - if ( !(tmp->job = strdup(job)) ) return NULL; - if ( !(tmp->fname = strdup(fname)) ) { free(tmp->job); (tmp)->job = NULL; return NULL; } - tmp->fhnd = fhnd; - number_of_st++; - (tmp+1)->job = NULL; - - return tmp; -} - -static void dump_storage_free(dump_storage_t *st) -{ - dump_storage_t *tmp; - for ( tmp = st; tmp && tmp->job; tmp++ ) { - free(tmp->job); - free(tmp->fname); - } - free(st); -} - -/* Reads line from file and returns pointer to that. - * Returned string is not mem allocated. It only points to the buffer! - * - * Buffer must be given - it is handled (allocated etc.) fully in the - * function. It has to be freed outside. - * - * returns: -1 on error - * 0 eof ('ln' could points to the last line in file) - * 1 line successfuly read - */ -static int read_line(int fhnd, buffer_t *buf, char **ln) -{ - int ct, toread; - - - if ( buf->eol ) { - int tmp = buf->eol - buf->str + 1; - - if ( tmp < buf->use ) { - char *aux; - if ( (aux = memchr(buf->eol+1, '\n', buf->use-tmp)) ) { - *ln = buf->eol+1; - *aux = 0; - buf->eol = aux; - return 1; - } - } - memmove(buf->str, buf->eol+1, buf->use - tmp); - buf->eol = NULL; - buf->use -= tmp; - } - - do { - if ( buf->use == buf->sz ) { - char *tmp = realloc(buf->str, buf->sz+BUFSIZ); - if ( !tmp ) return -1; - buf->str = tmp; - buf->sz += BUFSIZ; - } - - toread = buf->sz - buf->use; - if ( (ct = read(fhnd, buf->str+buf->use, toread)) < 0 ) { - if ( errno == EINTR ) continue; - return -1; - } - if ( ct == 0 ) break; - buf->eol = memchr(buf->str+buf->use, '\n', ct); - buf->use += ct; - } while ( ct == toread && !buf->eol ); - - *ln = buf->use? buf->str: NULL; - if ( buf->eol ) { - *buf->eol = 0; - return 1; - } - - return 0; -} diff --git a/org.glite.lb.utils/src/glite-lb-bkpurge-offline.sh b/org.glite.lb.utils/src/glite-lb-bkpurge-offline.sh deleted file mode 100644 index 6b9bf2a..0000000 --- a/org.glite.lb.utils/src/glite-lb-bkpurge-offline.sh +++ /dev/null @@ -1,190 +0,0 @@ -#!/bin/bash -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -cat <&2 $0 probably already running! -fi - -if killall -0 glite-lb-bkserverd 2>/dev/null || killall -0 glite-lb-proxy 2>/dev/null -then -echo >&2 glite-lb-bkserverd or glite-lb-proxy running! -fi - -echo -echo -n "Continue (y/n)?"; read r -if [ "$r" = "y" ] -then echo Working... -else echo Aborting.; exit 1; -fi - - -getsecs() { - echo $(($(echo "$1" | sed -e 's/s$//' \ - -e 's/m$/*60/' \ - -e 's/h$/*3600/' \ - -e 's/d$/*86400/') )) -} - -now=$(date "+%s") - -tclause="" -add_tclause() { - case "$1" in - 6|7|8|9) spart="states.status=$1";; - o) spart="(states.status<6 OR states.status>9)";; - esac - if [ -z "$tclause" ]; then concat=""; else concat=" OR ";fi - tclause="$tclause$concat($spart AND states.jobid = es.jobid and states.seq = es.event AND es.arrived $tempfile1 - -ds="DELETE$quick FROM jobs,states,e,short_fields,long_fields,status_tags" -ds="$ds USING states" -ds="$ds LEFT JOIN events AS e ON (e.jobid = states.jobid)" -ds="$ds LEFT JOIN jobs ON (jobs.jobid = states.jobid)" -ds="$ds LEFT JOIN short_fields ON (short_fields.jobid = e.jobid AND short_fields.event=e.event)" -ds="$ds LEFT JOIN long_fields ON (long_fields.jobid = e.jobid AND long_fields.event=e.event)" -ds="$ds LEFT JOIN events_flesh ON (events_flesh.jobid = e.jobid AND events_flesh.event=e.event)" -ds="$ds LEFT JOIN status_tags ON (status_tags.jobid = states.jobid)" - -#wc -l $tempfile1 /dev/null;echo -n "???";read n -( - cnt=0 - echo "SET autocommit=0;" - echo "BEGIN;" - while read jobid - do - echo "UPDATE acls,jobs SET acls.refcnt=acls.refcnt-1 " \ - "WHERE jobs.jobid='$jobid' AND jobs.aclid=acls.aclid;" - echo "$ds WHERE states.jobid='$jobid';" - if [ $(($cnt % 10)) = 9 ] - then - echo "COMMIT;" - echo "BEGIN;" - fi - cnt=$((cnt+1)) - done - echo "DELETE FROM acls WHERE refcnt=0;" - echo "COMMIT;" -) < $tempfile1 | $mysqlcmd -rm $tempfile1 -fi - -if [ "$thorough" = 1 ] -then - ( - for table in acls jobs status_tags events \ - short_fields states long_fields events_flesh - do - echo "OPTIMIZE TABLE $table;" - done - ) | $mysqlcmd -fi - -# TODO: acls/singleshot, grey_jobs, notif_jobs, notif_registrations, users diff --git a/org.glite.lb.utils/src/load.c b/org.glite.lb.utils/src/load.c deleted file mode 100644 index 1431d2f..0000000 --- a/org.glite.lb.utils/src/load.c +++ /dev/null @@ -1,221 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - - -#include -#include -#include -#include -#include -#include - -#define CLIENT_SBIN_PROG - -#include "glite/lb/context-int.h" -#include "glite/lb/ulm_parse.h" -#include "glite/lb/xml_parse.h" -#include "glite/lb/mini_http.h" -#include "glite/lb/consumer.h" - -#define dprintf(x) { if (debug) printf x; } - -static const char rcsid[] = "@(#)$Id$"; - -static int debug=0; - -static int edg_wll_LoadEvents( - edg_wll_Context ctx, - const edg_wll_LoadRequest *request, - edg_wll_LoadResult *result); -static void printerr(edg_wll_Context ctx); - -static struct option opts[] = { - { "file", required_argument, NULL, 'f'}, - { "help", no_argument, NULL, 'h' }, - { "version", no_argument, NULL, 'v' }, - { "debug", no_argument, NULL, 'd' }, - { "server", required_argument, NULL, 'm' }, - { NULL, no_argument, NULL, 0 } -}; - -static void usage(char *me) -{ - fprintf(stderr,"usage: %s [option]\n" - " -m, --server L&B server machine name\n" - " -f, --file filename file with dumped data to be loaded\n" - " -h, --help display this help\n" - " -v, --version display version\n" - " -d, --debug diagnostic output\n", - me); -} - -int main(int argc,char *argv[]) -{ - edg_wll_LoadRequest *request; - edg_wll_LoadResult *result; - char *server = NULL; - char date[ULM_DATE_STRING_LENGTH+1]; - - char *me; - int opt; - edg_wll_Context ctx; - - /* initialize request to server defaults */ - request = (edg_wll_LoadRequest *) calloc(1,sizeof(edg_wll_LoadRequest)); - request->server_file = NULL; - - /* initialize result */ - result = (edg_wll_LoadResult *) calloc(1,sizeof(edg_wll_LoadResult)); - - me = strrchr(argv[0],'/'); - if (me) me++; else me=argv[0]; - - /* get arguments */ - while ((opt = getopt_long(argc,argv,"f:t:m:dvh",opts,NULL)) != EOF) { - - switch (opt) { - - case 'f': request->server_file = optarg; break; - case 'm': server = optarg; break; - case 'd': debug = 1; break; - case 'v': fprintf(stdout,"%s:\t%s\n",me,rcsid); exit(0); - case 'h': - case '?': usage(me); return 1; - } - } - - /* initialize context */ - edg_wll_InitContext(&ctx); - if ( server ) - { - char *p = strchr(server, ':'); - if ( p ) - { - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, atoi(p+1)); - *p = 0; - } - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER, server); - } - - /* check request */ - if (debug) { - printf("Load request:\n"); - if (request->server_file) { - printf("- server_file: %s.\n",request->server_file); - } else { - printf("- server_file: not specified.\n"); - } - } - - /* that is the LoadEvents */ - dprintf(("Running the edg_wll_LoadEvents...\n")); - if (edg_wll_LoadEvents(ctx, request, result) != 0) { - fprintf(stderr,"Error running the edg_wll_LoadEvents().\n"); - printerr(ctx); - if ( !result->server_file ) - goto main_end; - } - - /* examine the result */ - dprintf(("Examining the result of edg_wll_LoadEvents...\n")); - printf("Load result:\n"); - if (result->server_file) - printf("- Unloaded events were stored into the server file '%s'.\n", result->server_file); - if (edg_wll_ULMTimevalToDate(result->from,0,date) != 0) { - fprintf(stderr,"Error parsing 'from' argument.\n"); - goto main_end; - } - printf("- from: %ld (i.e. %s).\n",result->from,date); - if (edg_wll_ULMTimevalToDate(result->to,0,date) != 0) { - fprintf(stderr,"Error parsing 'to' argument.\n"); - goto main_end; - } - printf("- to: %ld (i.e. %s).\n",result->to,date); - -main_end: - dprintf(("End.\n")); - if (request) free(request); - if (result) - { - if (result->server_file) - free(result->server_file); - free(result); - } - edg_wll_FreeContext(ctx); - return 0; -} - - -static void printerr(edg_wll_Context ctx) -{ - char *errt,*errd; - - edg_wll_Error(ctx,&errt,&errd); - fprintf(stderr,"%s (%s)\n",errt,errd); -} - - -static const char* const request_headers[] = { - "Cache-Control: no-cache", - "Accept: application/x-dglb", - "User-Agent: edg_wll_Api/" PROTO_VERSION "/" COMP_PROTO, - "Content-Type: application/x-dglb", - NULL -}; - -/** Load events from a given file into the database - * \retval EPERM operation not permitted - * \retval ENOENT file not found - */ - -static int edg_wll_LoadEvents( - edg_wll_Context ctx, - const edg_wll_LoadRequest *request, - edg_wll_LoadResult *result) -{ - int error; - char *send_mess, - *response = NULL, - *recv_mess = NULL; - - edg_wll_LoadRequestToXML(ctx, request, &send_mess); - - ctx->p_tmp_timeout = ctx->p_query_timeout; - if (ctx->p_tmp_timeout.tv_sec < 600) ctx->p_tmp_timeout.tv_sec = 600; - - if (set_server_name_and_port(ctx, NULL)) - goto edg_wll_loadevents_end; - - error = edg_wll_http_send_recv(ctx, - "POST /loadRequest HTTP/1.1", request_headers, send_mess, - &response, NULL, &recv_mess); - if ( error != 0 ) - goto edg_wll_loadevents_end; - - if (http_check_status(ctx, response)) - goto edg_wll_loadevents_end; - - edg_wll_ParseLoadResult(ctx, recv_mess, result); - -edg_wll_loadevents_end: - if (response) free(response); - if (recv_mess) free(recv_mess); - if (send_mess) free(send_mess); - return edg_wll_Error(ctx,NULL,NULL); -} diff --git a/org.glite.lb.utils/src/mon.c b/org.glite.lb.utils/src/mon.c deleted file mode 100644 index 2a569f2..0000000 --- a/org.glite.lb.utils/src/mon.c +++ /dev/null @@ -1,188 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -#include -#include -#include -#include -#include -#include -#include - -#include "glite/lb/consumer.h" - -#define DEFAULT_QUERY_TIME 3600 - -static void usage(char *); -static int query_all(edg_wll_Context, int, struct timeval, edg_wll_JobStat **); -static void dgerr(edg_wll_Context,char *); - -static char *myname = NULL; -static int debug = 0, verbose = 0, seconds = DEFAULT_QUERY_TIME, lbproxy = 0; -static const char rcsid[] = "@(#)$Id$"; - -static struct option const long_options[] = { - { "help", no_argument, 0, 'h' }, - { "version", no_argument, 0, 'V' }, - { "verbose", no_argument, 0, 'v' }, - { "debug", no_argument, 0, 'd' }, - { "time", required_argument, 0, 't' }, - { "lbproxy", required_argument, 0, 'x' }, - { NULL, 0, NULL, 0} -}; - -int main(int argc,char *argv[]) { - edg_wll_Context ctx; - edg_wll_JobStat *statesOut = NULL; - struct timeval time_now; - int state[4] = { EDG_WLL_JOB_CLEARED, EDG_WLL_JOB_ABORTED, EDG_WLL_JOB_CANCELLED, EDG_WLL_JOB_SUBMITTED }; - - int i, j, result, opt; - result = opt = 0; - - myname = argv[0]; - fprintf(stdout,"\n"); - /* get arguments */ - while ((opt = getopt_long(argc,argv, - "h" /* help */ - "V" /* version */ - "v" /* verbose */ - "d" /* debug */ - "t:" /* time [in seconds] */ - "x", /* lbproxy */ - long_options, (int *) 0)) != EOF) { - - switch (opt) { - case 'V': fprintf(stdout,"%s:\t%s\n",argv[0],rcsid); exit(0); - case 'v': verbose = 1; break; - case 'd': debug = 1; break; - case 'x': lbproxy = 1; break; - case 't': seconds = atoi(optarg); break; - case 'h': - default: - usage(argv[0]); exit(0); - } - } - gettimeofday(&time_now,0); - - if ( edg_wll_InitContext(&ctx) ) { - fprintf(stderr,"%s: cannot initialize edg_wll_Context\n ",myname); - exit(1); - } - - for ( j = 0; j < sizeof(state)/sizeof(state[0]); j++) { - char *status = edg_wll_StatToString(state[j]); - int min,avg,max,nJobs; - - avg = max = nJobs = 0; - min = INT_MAX; - - fprintf(stdout,"Jobs that entered state %s in the last %d seconds: \n",status,seconds); - - if ( (result = query_all(ctx, state[j], time_now, &statesOut)) ) { - dgerr(ctx, "edg_wll_QueryJobs"); - } else { - if ( statesOut ) { - for (i=0; statesOut[i].state; i++) { - int val = statesOut[0].stateEnterTime.tv_sec - - statesOut[0].stateEnterTimes[1+EDG_WLL_JOB_SUBMITTED]; - - avg += val; - if (val < min) min = val; - if (val > max) max = val; - - edg_wll_FreeStatus(&statesOut[i]); - } - nJobs = i; - free(statesOut); - } - if (nJobs > 0) avg = avg / nJobs; - if (min == INT_MAX) min = 0; - - fprintf(stdout,"number of jobs: %d\n",nJobs); - if (state[j] != EDG_WLL_JOB_SUBMITTED) { - fprintf(stdout,"minimum time spent in the system: %d seconds\n",min); - fprintf(stdout,"average time spent in the system: %d seconds\n",avg); - fprintf(stdout,"maximum time spent in the system: %d seconds\n",max); - } - fprintf(stdout,"\n\n"); - } - - if (status) free(status); - - } - edg_wll_FreeContext(ctx); - - - return result; -} - -static void -usage(char *name) { - fprintf(stdout, "Usage: %s [-x] [-t time]\n" - "-h, --help display this help and exit\n" - "-t, --time querying time in seconds from now to the past [deault %d]\n", - name, DEFAULT_QUERY_TIME); -} - -static int -query_all(edg_wll_Context ctx, int query_status, struct timeval query_time, edg_wll_JobStat **statesOut) { - edg_wll_QueryRec jc[3]; - int ret; - - memset(jc, 0, sizeof jc); - - /* jobs in the state 'query_status' within last hour */ - jc[0].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.i = query_status; - jc[1].attr = EDG_WLL_QUERY_ATTR_TIME; - jc[1].attr_id.state = query_status; - jc[1].op = EDG_WLL_QUERY_OP_WITHIN; - jc[1].value.t.tv_sec = query_time.tv_sec - seconds; - jc[1].value.t.tv_usec = query_time.tv_usec; - jc[1].value2.t.tv_sec = query_time.tv_sec; - jc[1].value2.t.tv_usec = query_time.tv_usec; - jc[2].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - if ( (ret = edg_wll_QueryJobs(ctx, jc, 0, NULL, statesOut)) ) { - if ( ret == E2BIG ) { - int r; - if ( edg_wll_GetParam(ctx, EDG_WLL_PARAM_QUERY_RESULTS, &r) ) return ret; - if ( r != EDG_WLL_QUERYRES_LIMITED ) return ret; - - fprintf(stderr," edg_wll_QueryJobs() Warning: only limited result returned!\n"); - return 0; - } else return ret; - } - - return ret; -} - -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); - if(etxt) free(etxt); - if(edsc) free(edsc); -} diff --git a/org.glite.lb.utils/src/notif-keeper.sh b/org.glite.lb.utils/src/notif-keeper.sh deleted file mode 100755 index 08e42d9..0000000 --- a/org.glite.lb.utils/src/notif-keeper.sh +++ /dev/null @@ -1,112 +0,0 @@ -#! /bin/bash -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -GLITE_LOCATION=${GLITE_LOCATION:-"/opt/glite"} -NOTIFY=${GLITE_LB_NOTIFY:-"$GLITE_LOCATION/bin/glite-lb-notify"} -FILE='/var/tmp/msg-notif.txt' -SERVER="$1" -TTL=${2:-"7200"} -STAT="stat -c %Y" -#STAT="stat -f %m" - - -function load() { - out="`cat \"$FILE\"`" - nid=`echo "$out" | grep '^notification ID:' | cut -f3 -d' '` - val=`echo "$out" | grep '^valid' | sed 's/[^(]*(\([^)]*\)).*/\1/'` - ori=`$STAT "$FILE"` - - if [ -z "$nid" -o -z "$val" ]; then - val=-1 - return 1 - fi -} - -function save_ttl() { - mv "$FILE" "$FILE.1" - cat "$FILE" | grep -v '^valid' > "$FILE" -} - - -# -- set up -- - -if [ -z "$SERVER" ]; then - echo "Usage: $0 LB_SERVER [ TTL NEW_NOTIF_ARGUMRNTS... ]" - echo - echo "Environment:" - echo " DROP: drop the notification" - echo " DEBUG: show progress" - exit 1 -fi -shift -shift - -if [ -n "$GLITE_HOST_CERT" -a -n "$GLITE_HOST_KEY" ] ;then - X509_USER_CERT="$GLITE_HOST_CERT" - X509_USER_KEY="$GLITE_HOST_KEY" -else - echo "WARNING: host certificate not specified" -fi - -export GLITE_WMS_NOTIF_SERVER="$SERVER" -export X509_USER_CERT -export X509_USER_KEY - -now=`date '+%s'` -val=-1 -ori=$now - -# -- load previous/create new -- - -if [ -s "$FILE" ]; then load; fi -if [ -z "$nid" -o $val -le $now ]; then - $NOTIFY new -t $TTL "$@" > "$FILE" - load - if [ $? != 0 ]; then - echo "Can't create notification" - exit 1 - fi - [ -z "$DEBUG" ] || echo "`date '+%Y-%m-%d %H:%M:%S'`: notification '$nid' created" -fi - -# -- refresh -- - -let ref="($ori+$val)/2" -if [ $ref -le $now ]; then - $NOTIFY refresh -t $TTL $nid > "$FILE"-new - if grep '^valid' "$FILE"-new >/dev/null 2>&1; then - mv "$FILE" "$FILE".1 - grep '^notification ID:' "$FILE".1 > "$FILE" - cat "$FILE"-new >> "$FILE" - rm -f "$FILE"-new - [ -z "$DEBUG" ] || echo "`date '+%Y-%m-%d %H:%M:%S'`: notification '$nid' refreshed" - else - echo "Can't refresh notification '$nid'" - # next attempt in half of the remaining time - touch "$FILE" - exit 1 - fi -fi - -# -- drop -- - -if [ ! -z "$DROP" ]; then - $NOTIFY drop $nid - rm -f "$FILE" - [ -z "$DEBUG" ] || echo "`date '+%Y-%m-%d %H:%M:%S'`: notification '$nid' dropped" -fi diff --git a/org.glite.lb.utils/src/process_attrs.c b/org.glite.lb.utils/src/process_attrs.c deleted file mode 100644 index 44df3d3..0000000 --- a/org.glite.lb.utils/src/process_attrs.c +++ /dev/null @@ -1,237 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include - -#include "glite/lbu/trio.h" - -#include "glite/jp/types.h" -#include "glite/jp/context.h" -#include "glite/jp/file_plugin.h" -#include "glite/jp/attr.h" -#include "glite/lb/job_attrs.h" - -/* - * free the array of JP attr - */ -static void free_attrs(glite_jp_attrval_t *av) { - glite_jp_attrval_t *item; - - item = av; - while (item->name) { - glite_jp_attrval_free(item++, 0); - } - free(av); -} - -/* - * process attributes - */ -void process_attrs(glite_jp_context_t jpctx, glite_jpps_fplug_data_t plugin_data, void *data_handle, FILE *outfile) { - - glite_jp_attrval_t *attrval; - - /*
    */ - trio_fprintf(outfile,"\n\n"); - trio_fprintf(outfile,"value); - free_attrs(attrval); - } else { - trio_fprintf(outfile,"jobid=\"default\"\n"); - } - trio_fprintf(outfile,">\n"); - /*
    */ - - /* */ - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_user, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_parent, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_VO, &attrval); - if (attrval) { - trio_fprintf(stdout,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_aTag, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_rQType, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_eDuration, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_eNodes, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_eProc, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_RB, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_CE, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_host, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_UIHost, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_CPUTime, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_NProc, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_finalStatus, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_finalDoneStatus, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_finalStatusDate, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_finalStatusReason, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_LRMSDoneStatus, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_LRMSStatusReason, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_retryCount, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_additionalReason, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_jobType, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_nsubjobs, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_subjobs, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_lastStatusHistory, &attrval); - if (attrval) { - trio_fprintf(outfile,"%s\n",attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_fullStatusHistory, &attrval); - if (attrval) { - trio_fprintf(outfile,"%s\n",attrval->value); - free_attrs(attrval); - } - - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_JDL, &attrval); - if (attrval) { - trio_fprintf(outfile,"%|Xs\n", attrval->value); - free_attrs(attrval); - } - - /* */ - - trio_fprintf(outfile,"\n\n"); -} diff --git a/org.glite.lb.utils/src/process_attrs2.c.T b/org.glite.lb.utils/src/process_attrs2.c.T deleted file mode 100644 index 993c4bf..0000000 --- a/org.glite.lb.utils/src/process_attrs2.c.T +++ /dev/null @@ -1,102 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* -@@@AUTO -*/ -@@@LANG: C - -#include -#include -#include - -#include "glite/lbu/trio.h" - -#include "glite/jp/types.h" -#include "glite/jp/context.h" -#include "glite/jp/file_plugin.h" -#include "glite/jp/attr.h" -#include "glite/lb/job_attrs2.h" - -/* - * free the array of JP attr - */ -static void free_attrs(glite_jp_attrval_t *av) { - glite_jp_attrval_t *item; - - item = av; - while (item->name) { - glite_jp_attrval_free(item++, 0); - } - free(av); -} - -/* - * process attributes - */ -void process_attrs2(glite_jp_context_t jpctx, glite_jpps_fplug_data_t plugin_data, void *data_handle, FILE *outfile) { - - glite_jp_attrval_t *attrval; - - /*
    */ - fprintf(outfile,"\n\n"); - fprintf(outfile,"value); - free_attrs(attrval); - } else { - fprintf(outfile,"jobid=\"default\"\n"); - } - fprintf(outfile,">\n"); - /*
    */ - - /* */ -@@@{ -# elems - for my $n ($status->getAllFieldsOrdered) { - my $f = selectField $status $n; -# my $type = getType $f; - my $type = $f->{type}; - my $name = getName $f; - -# $type = 'jobtypeType' if $name eq 'jobtype'; - - @ln = split /_/,$name; - my $un = shift @ln; $un .= ucfirst shift @ln while (@ln); - my $c = getComment $f; - my $strformat = "%s"; - if ($type eq 'string') { $strformat = "%|Xs"; } - - gen qq{ - /** $c */ - plugin_data.ops.attr(jpctx, data_handle, GLITE_JP_LB_$un, &attrval); - if (attrval) { - trio_fprintf(outfile,"<$un>$strformat\\n", attrval->value); - free_attrs(attrval); - } -}; - - } -@@@} - fprintf(outfile,"\n\n"); - - /* */ -} diff --git a/org.glite.lb.utils/src/purge.c b/org.glite.lb.utils/src/purge.c deleted file mode 100644 index db3b1c1..0000000 --- a/org.glite.lb.utils/src/purge.c +++ /dev/null @@ -1,464 +0,0 @@ -#ident "$Header$" -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - - -#include -#include -#include -#include -#include -#include - -#define CLIENT_SBIN_PROG - -#include "glite/lb/context-int.h" -#include "glite/lb/xml_parse.h" -#include "glite/lb/mini_http.h" -#include "glite/lb/query_rec.h" -#include "glite/lb/consumer.h" -#include "glite/lb/connection.h" - -#define dprintf(x) { if (debug) printf x; } - -#define free_jobs(jobs) { \ - if (jobs) { \ - int i; \ - for ( i = 0; jobs[i]; i++ ) \ - free(jobs[i]); \ - free(jobs); \ - } \ -} - -static const char rcsid[] = "@(#)$Id$"; - -static int debug=0; -static char *file; - -static int edg_wll_Purge( - edg_wll_Context ctx, - edg_wll_PurgeRequest *request, - edg_wll_PurgeResult *result); -static int read_jobIds(const char *file, char ***jobs_out); -static int get_timeout(const char *arg, int *timeout); -static void printerr(edg_wll_Context ctx); - -static struct option opts[] = { - { "aborted", required_argument, NULL, 'a'}, - { "cleared", required_argument, NULL, 'c'}, - { "cancelled", required_argument, NULL, 'n'}, - { "done", required_argument, NULL, 'e'}, - { "other", required_argument, NULL, 'o'}, - { "dry-run", no_argument, NULL, 'r'}, - { "jobs", required_argument, NULL, 'j'}, - { "return-list", no_argument, NULL, 'l'}, - { "server-dump", no_argument, NULL, 's'}, - { "client-dump", no_argument, NULL, 'i'}, - { "help", no_argument, NULL, 'h' }, - { "version", no_argument, NULL, 'v' }, - { "debug", no_argument, NULL, 'd' }, - { "server", required_argument, NULL, 'm' }, - { "proxy", no_argument, NULL, 'x' }, - { "sock", required_argument, NULL, 'X' }, - {"target-runtime", required_argument, NULL, 't'}, - {"background", required_argument, NULL, 'b'}, - { NULL, no_argument, NULL, 0 } -}; - -static void usage(char *me) -{ - fprintf(stderr,"usage: %s [option]\n" - " -a, --aborted NNN[smhd] purge ABORTED jobs older than NNN secs/mins/hours/days\n" - " -c, --cleared NNN[smhd] purge CLEARED jobs older than given time\n" - " -n, --cancelled NNN[smhd] purge CANCELLED jobs older than given time\n" - " -e, --done NNN[smhd] purge DONE jobs older than given time\n" - " -o, --other NNN[smhd] purge OTHER jobs older than given time\n" - " -r, --dry-run do not really purge\n" - " -j, --jobs input file with jobIds of jobs to purge\n" - " -l, --return-list return list of jobid matching the purge/dump criteria\n" - " -s, --server-dump dump jobs into any server file\n" - " -i, --client-dump receive stream of dumped jobs\n" - " -h, --help display this help\n" - " -v, --version display version\n" - " -d, --debug diagnostic output\n" - " -m, --server L&B server machine name\n" - " -x, --proxy purge L&B proxy\n" - " -X, --sock purge L&B proxy using default socket path\n" - " -t, --target-runtime NNN[smhd] throttle purge to the estimated target runtime\n" - " -b, --background purge on the background\n", - me); -} - -int main(int argc,char *argv[]) -{ - edg_wll_PurgeRequest *request; - edg_wll_PurgeResult *result; - int i, timeout, background; - char *server = NULL; - - char *me; - int opt; - edg_wll_Context ctx; - - /* initialize request to server defaults */ - request = (edg_wll_PurgeRequest *) calloc(1,sizeof(edg_wll_PurgeRequest)); - request->jobs = NULL; - for (i=0; i < EDG_WLL_NUMBER_OF_STATCODES; i++) { - request->timeout[i]=-1; - } - request->flags = EDG_WLL_PURGE_REALLY_PURGE; - - /* initialize result */ - result = (edg_wll_PurgeResult *) calloc(1,sizeof(edg_wll_PurgeResult)); - - me = strrchr(argv[0],'/'); - if (me) me++; else me=argv[0]; - - /* initialize context */ - edg_wll_InitContext(&ctx); - - /* get arguments */ - while ((opt = getopt_long(argc,argv,"a:c:n:e:o:j:m:rlsidhvxX:t:b:",opts,NULL)) != EOF) { - timeout=-1; - background=-1; - - switch (opt) { - - case 'a': - if ((get_timeout(optarg,&timeout) != 0 )) { - printf("Wrong usage of timeout argument.\n"); - usage(me); - return 1; - } - if (timeout >= 0) { - request->timeout[EDG_WLL_JOB_ABORTED]=timeout; - } - break; - - case 'c': - if (get_timeout(optarg,&timeout) != 0 ) { - printf("Wrong usage of timeout argument.\n"); - usage(me); - return 1; - } - if (timeout >= 0) { - request->timeout[EDG_WLL_JOB_CLEARED]=timeout; - } - break; - - case 'n': - if (get_timeout(optarg,&timeout) != 0 ) { - printf("Wrong usage of timeout argument.\n"); - usage(me); - return 1; - } - if (timeout >= 0) { - request->timeout[EDG_WLL_JOB_CANCELLED]=timeout; - } - break; - case 'e': - if (get_timeout(optarg,&timeout) != 0 ) { - printf("Wrong usage of timeout argument.\n"); - usage(me); - return 1; - } - if (timeout >= 0) { - request->timeout[EDG_WLL_JOB_DONE]=timeout; - } - break; - - case 'o': - if (get_timeout(optarg,&timeout) != 0 ) { - printf("Wrong usage of timeout argument.\n"); - usage(me); - return 1; - } - if (timeout >= 0) - for (i = 0 ; itimeout[i]= timeout; - } - break; - - case 'm': server = optarg; break; - case 'j': file = optarg; break; - case 'r': request->flags &= (~EDG_WLL_PURGE_REALLY_PURGE); break; - case 'l': request->flags |= EDG_WLL_PURGE_LIST_JOBS; break; - case 's': request->flags |= EDG_WLL_PURGE_SERVER_DUMP; break; - case 'i': request->flags |= EDG_WLL_PURGE_CLIENT_DUMP; break; - case 'd': debug = 1; break; - case 'v': fprintf(stdout,"%s:\t%s\n",me,rcsid); exit(0); - case 'x': ctx->isProxy = 1; break; - case 'X': - ctx->isProxy = 1; - edg_wll_SetParam(ctx, EDG_WLL_PARAM_LBPROXY_SERVE_SOCK, optarg); - break; - case 't': - if ((get_timeout(optarg,&timeout) != 0 )) { - printf("Wrong usage of timeout argument.\n"); - usage(me); - return 1; - } - if (timeout >= 0) { - request->target_runtime=timeout; - } - break; - case 'b': - background = atoi(optarg); - break; - case 'h': - case '?': usage(me); return 1; - } - - if ((background == -1 && request->target_runtime) || background > 0) - request->flags |= EDG_WLL_PURGE_BACKGROUND; - } - - /* read the jobIds from file, if wanted */ - if (file) { - char **jobs=NULL; - dprintf(("Reading jobIds form file \'%s\'...",file)); - if (read_jobIds(file,&jobs) != 0) { - dprintf(("no.\n")); - fprintf(stderr,"Unable to read jobIds from file \'%s\'\n",file); - goto main_end; - } else { - dprintf(("yes.\n")); - } - request->jobs = jobs; - } - - /* check request */ - if (debug) { - printf("Purge request:\n"); - printf("- flags: %d\n",request->flags); - printf("- %d timeouts:\n",EDG_WLL_NUMBER_OF_STATCODES); - for (i=0; i < EDG_WLL_NUMBER_OF_STATCODES; i++) { - char *stat=edg_wll_StatToString(i); - printf("\t%s: %ld\n",stat,request->timeout[i]); - if (stat) free(stat); - } - printf("- list of jobs:\n"); - if (!request->jobs) { - printf("Not specified.\n"); - } else { - for ( i = 0; request->jobs[i]; i++ ) - printf("%s\n", request->jobs[i]); - } - printf("- target runtime: %ld\n", request->target_runtime); - } - - if ( server ) - { - char *p = strchr(server, ':'); - if ( p ) - { - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, atoi(p+1)); - *p = 0; - } - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER, server); - } - - /* that is the Purge */ - dprintf(("Running the edg_wll_Purge...\n")); - if (edg_wll_Purge(ctx, request, result) != 0) { - fprintf(stderr,"Error running the edg_wll_Purge().\n"); - printerr(ctx); - switch ( edg_wll_Error(ctx, NULL, NULL) ) - { - case ENOENT: - case EPERM: - case EINVAL: - break; - default: - goto main_end; - } - } - - /* examine the result */ - dprintf(("Examining the result of edg_wll_Purge...\n")); - if (result->server_file) { - printf("Server dump: %s\n",result->server_file); - } else { - printf("The jobs were not dumped.\n"); - } - if (request->flags & EDG_WLL_PURGE_LIST_JOBS) { - printf("The following jobs %s purged:\n", - request->flags & EDG_WLL_PURGE_REALLY_PURGE ? "were" : "would be"); - if (!result->jobs) printf("None.\n"); - else { - int i; - for ( i = 0; result->jobs[i]; i++ ) - printf("%s\n",result->jobs[i]); - } - } - -main_end: - dprintf(("End.\n")); - if (request) - { - free_jobs(request->jobs); - free(request); - } - if (result) free(result); - edg_wll_FreeContext(ctx); - return 0; -} - - -static void printerr(edg_wll_Context ctx) -{ - char *errt,*errd; - - edg_wll_Error(ctx,&errt,&errd); - fprintf(stderr,"%s (%s)\n",errt,errd); -} - - -static int read_jobIds(const char *file, char ***jobs_out) -{ - FILE *jobIds = fopen(file,"r"); - char buf[256]; - char **jobs; - int cnt = 0; - - jobs = NULL; - - - if (!jobIds) { - perror(file); - return 1; - } - - while ( 1 ) { - char *nl; - if ( !fgets(buf,sizeof buf,jobIds) ) - { - if (feof(jobIds)) - break; - - free_jobs(jobs); - fprintf(stderr, "Error reading file\n"); - return 1; - } - nl = strchr(buf,'\n'); - if (nl) *nl = 0; - /* TODO: check if it is really jobId, e.g. by edg_wlc_JobIdParse() */ - - if ( !(jobs = realloc(jobs, (cnt+2)*sizeof(*jobs))) ) - { - perror("cond_parse()"); - return(1); - } - jobs[cnt++] = strdup(buf); - } - jobs[cnt] = NULL; - - fclose(jobIds); - *jobs_out = jobs; - - return 0; -} - -static int get_timeout(const char *arg, int *timeout) -{ - int t = -1; - char tunit = '\0'; - - if (sscanf(arg,"%d%c",&t,&tunit) > 0) { - if (tunit) { - switch (tunit) { - case 'd': t *= 86400; break; // 24*60*60 - case 'h': t *= 3600; break; // 60*60 - case 'm': t *= 60; break; - case 's': break; - default: fprintf(stderr,"Allowed time units are s,m,h,d\n"); - return -1; - } - } - } - if (t < 0) return -1; - *timeout = t; - return 0; -} - -static const char* const request_headers[] = { - "Cache-Control: no-cache", - "Accept: application/x-dglb", - "User-Agent: edg_wll_Api/" PROTO_VERSION "/" COMP_PROTO, - "Content-Type: application/x-dglb", - NULL -}; - -/** Client side purge - * \retval EAGAIN only partial result returned, call repeatedly to get all - * output data - */ -static int edg_wll_Purge( - edg_wll_Context ctx, - edg_wll_PurgeRequest *request, - edg_wll_PurgeResult *result) -{ - char *send_mess, - *response = NULL, - *recv_mess = NULL; - - edg_wll_ResetError(ctx); - - if (request->flags & EDG_WLL_PURGE_CLIENT_DUMP) - return edg_wll_SetError(ctx,ENOSYS,"client dump"); - - if (edg_wll_PurgeRequestToXML(ctx, request, &send_mess)) - goto edg_wll_purge_end; - - ctx->p_tmp_timeout = ctx->p_query_timeout; - if (ctx->p_tmp_timeout.tv_sec < 600) ctx->p_tmp_timeout.tv_sec = 600; - - - if (ctx->isProxy){ - ctx->isProxy = 0; - if (edg_wll_http_send_recv_proxy(ctx, "POST /purgeRequest HTTP/1.1", - request_headers,send_mess,&response,NULL,&recv_mess)) - goto edg_wll_purge_end; - } - else { - if (set_server_name_and_port(ctx, NULL)) - goto edg_wll_purge_end; - - if (edg_wll_http_send_recv(ctx, - "POST /purgeRequest HTTP/1.1", request_headers, send_mess, - &response, NULL, &recv_mess)) - goto edg_wll_purge_end; - } - - if (http_check_status(ctx, response)) - goto edg_wll_purge_end; - - if (edg_wll_ParsePurgeResult(ctx, recv_mess, result)) - goto edg_wll_purge_end; - -edg_wll_purge_end: - if (response) free(response); - if (recv_mess) free(recv_mess); - if (send_mess) free(send_mess); - return edg_wll_Error(ctx,NULL,NULL); -} diff --git a/org.glite.lb.utils/src/state_history.c b/org.glite.lb.utils/src/state_history.c deleted file mode 100644 index 17cb8ea..0000000 --- a/org.glite.lb.utils/src/state_history.c +++ /dev/null @@ -1,95 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include -#include -#include - -#include "glite/lb/context.h" -#include "glite/lb/consumer.h" - -#include "glite/lb/intjobstat.h" -#include "glite/lb/seqcode_aux.h" -#include "glite/lb/stat_fields.h" -#include "glite/lb/process_event.h" - -#define usage() { \ - fprintf(stderr,"usage: %s [-f fields] \n",argv[0]); \ - fprintf(stderr,"\navailable fields:\n\t"); \ - glite_lb_dump_stat_fields(); \ - putc(10,stderr); \ -} - -int main (int argc, char ** argv) -{ - edg_wll_Context ctx; - edg_wll_QueryRec jc[2]; - edg_wll_Event *events; - int i,n,opt; - intJobStat is; - char *farg = "network_server,jdl:VirtualOrganisation,destination,done_code,reason"; - void *fields; - - while ((opt = getopt(argc,argv,"f:")) != -1) switch (opt) { - case 'f': farg = optarg; break; - default: usage(); return 1; - } - - - memset(&jc,0,sizeof jc); - if (optind+1 != argc - || glite_jobid_parse(argv[optind],&jc[0].value.j) - || glite_lb_parse_stat_fields(farg,&fields)) - { - usage(); - return 1; - } - - - edg_wll_InitContext(&ctx); - jc[0].attr = EDG_WLL_QUERY_ATTR_JOBID; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - - if (edg_wll_QueryEvents(ctx,jc,NULL,&events)) { - char *ed,*et; - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"%s: %s (%s)\n",argv[1],et,ed); - return 1; - } - - for (n=0; events[n].type; n++); - - init_intJobStat(&is); - glite_jobid_dup(jc[0].value.j,&is.pub.jobId); - - qsort(events,n,sizeof *events,compare_events_by_seq); - - for (i=0; i -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "glite/lb/context.h" -#include "glite/lb/jobstat.h" - -#include "glite/jp/types.h" -#include "glite/jp/context.h" -#include "glite/jp/backend.h" -#include "glite/jp/file_plugin.h" -#include "glite/jp/known_attr.h" -#include "glite/jp/attr.h" -#include "glite/lb/job_attrs.h" - - -typedef int init_f(glite_jp_context_t ctx, glite_jpps_fplug_data_t *data); -typedef void done_f(glite_jp_context_t ctx, glite_jpps_fplug_data_t *data); - -void process_attrs(glite_jp_context_t jpctx, glite_jpps_fplug_data_t plugin_data, void *data_handle, FILE *outfile); -void process_attrs2(glite_jp_context_t jpctx, glite_jpps_fplug_data_t plugin_data, void *data_handle, FILE *outfile); - -static const char rcsid[] = "@(#)$Id$"; -static int verbose = 0; -static char *infilename = NULL; -static char *outfilename = NULL; -static int versionone = 0; - -static struct option const long_options[] = { - { "file", required_argument, 0, 'f' }, - { "outfile", required_argument, 0, 'o' }, - { "versionone", no_argument, 0, '1' }, - { "help", no_argument, 0, 'h' }, - { "verbose", no_argument, 0, 'v' }, - { "version", no_argument, 0, 'V' }, - { NULL, 0, NULL, 0} -}; - -/* - * usage - */ -static void -usage(char *program_name) { - fprintf(stdout,"LB statistics\n" - "- reads a dump file (one job only!) \n" - "- and outputs an XML with statistics to stdout \n\n" - "Usage: %s [option]\n" - "-h, --help display this help and exit\n" - "-V, --version output version information and exit\n" - "-v, --verbose print extensive debug output to stderr\n" - "-f, --file dump file to process\n" - "-o, --outfile output filename\n" - "-1, --versionone use version 1 of the attributes (obsolete now)\n\n", - program_name); -} - -/* - * substitute implementatin of JP backend - */ - -int glite_jppsbe_pread(glite_jp_context_t ctx, void *handle, void *buf, size_t nbytes, off_t offset, ssize_t *nbytes_ret) { - FILE *f; - - f = (FILE *)handle; - if (fseek(f, offset, SEEK_SET) != 0) { - *nbytes_ret = 0; - return 0; - } - *nbytes_ret = fread(buf, 1, nbytes, f); - - return ferror(f) ? 1 : 0; -} - -/* - * main - */ -int main(int argc, char *argv[]) -{ - glite_jp_context_t jpctx; - glite_jpps_fplug_data_t plugin_data; - void *data_handle, *lib_handle; - FILE *infile,*outfile = NULL; - char *err; - init_f *plugin_init; - done_f *plugin_done; - int opt; - - /* get arguments */ - while ((opt = getopt_long(argc,argv, - "f:" /* input file */ - "o:" /* output file */ - "1" /* version one of the attributes */ - "h" /* help */ - "v" /* verbose */ - "V", /* version */ - long_options, (int *) 0)) != EOF) { - - switch (opt) { - case 'V': fprintf(stdout,"%s:\t%s\n",argv[0],rcsid); return(0); - case 'v': verbose = 1; break; - case 'f': infilename = optarg; break; - case 'o': outfilename = optarg; break; - case '1': versionone = 1; break; - case 'h': - default: - usage(argv[0]); return(0); - } - } - - /* load L&B plugin and its 'init' symbol */ - if ((lib_handle = dlopen("glite_lb_plugin.so", RTLD_LAZY)) == NULL) { - err = dlerror() ? :"unknown error"; - fprintf(stderr,"lb_statistics: can't load L&B plugin (%s)\n", err); - return 1; - } else if (verbose) fprintf(stdout,"lb_statistics: loaded L&B plugin\n"); - - if ((plugin_init = dlsym(lib_handle, "init")) == NULL || - (plugin_done = dlsym(lib_handle, "done")) == NULL) { - err = dlerror() ? : "unknown error"; - fprintf(stderr,"lb_statistics: can't find symbol 'init' or 'done' (%s)\n", err); - dlclose(lib_handle); - return 1; - } else if (verbose) fprintf(stdout,"lb_statistics: L&B plugin check o.k.\n"); - - /* dump file with events */ - if ((infile = fopen(infilename, "rt")) == NULL) { - fprintf(stderr,"lb_statistics: Error opening file %s: %s\n", infilename, strerror(errno)); - dlclose(lib_handle); - return 1; - } else if (verbose) fprintf(stdout,"lb_statistics: opened input file %s\n", infilename); - - /* output filename */ - if (outfilename) { - if ((outfile = fopen(outfilename, "wt")) == NULL) { - fprintf(stderr,"lb_statistics: Error opening file %s: %s\n", outfilename, strerror(errno)); - dlclose(lib_handle); - fclose(infile); - } else if (verbose) fprintf(stdout,"lb_statistics: opened output file %s\n", outfilename); - } else { - outfile = stdout; - if (verbose) fprintf(stdout,"lb_statistics: output will go to stdout\n"); - } - - /* use the plugin */ - jpctx = calloc(1,sizeof *jpctx); - plugin_init(jpctx, &plugin_data); - - jpctx->plugins = calloc(2,sizeof(*jpctx->plugins)); - jpctx->plugins[0] = &plugin_data; - - plugin_data.ops.open(jpctx, infile, "uri://", &data_handle); - - if (data_handle) { - - if (versionone) { - process_attrs(jpctx, plugin_data, data_handle, outfile); - } else { - process_attrs2(jpctx, plugin_data, data_handle, outfile); - } - - plugin_data.ops.close(jpctx, data_handle); - } - plugin_done(jpctx, &plugin_data); - - fclose(infile); - if (verbose) fprintf(stdout,"lb_statistics: closed input file %s\n", infilename); - - if (outfile) { - fclose(outfile); - if (verbose) fprintf(stdout,"lb_statistics: closed output file %s\n", outfilename); - } - - dlclose(lib_handle); - if (verbose) fprintf(stdout,"lb_statistics: L&B plugin closed\n"); - - return 0; -} - diff --git a/org.glite.lb.ws-interface/.Makefile.swp b/org.glite.lb.ws-interface/.Makefile.swp deleted file mode 100644 index 15a25d6416ea369d578b3b53c31d08733434e2d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2&u`;I6vy8pBnUs21#X;%G+MzT+wE>uiAWZ-yP*x6w!3L}K^0Qvj3LJL*l|8fPgC}wEO}5I3ffGZcx7CIE|A!bkQOqt;W%(u{|?y-uu3p zIW(^|f3v>Mmds0p>m1QHe|)<9-p^?+=_SHgTC{?wW2O(LY?*JxhSy6()ONVA)}1}k_N16G zkAAHc&mKr5gX&UCT`;@E zOOuaMIK3)SiMyK_A6V%cS*>kv4ycqZ({U2=W*ha(wT-P> zZfM+fB4N1!hmp|Xdrn6TjLP9{5yf86gFVCF!(L!Uc&~$UPG&wvVXN;+ z7c&=Z%UrA4n27`T_`$S|%AxDUNxF{b%U5g9kG44*YHLp( z2)UU_S%(RAaHyl@L=1(Ko{VNHf>V6P$u#oWFvLEWeODOmDDdqt3T_FWScqshYk;VQ zDV;v&lnbkk&6WD<#%8l-mkWoLRWBYgqlrUwmgU@9$uGM?gQxJ-^be8iU>(; rbEwJiR%KzdlcwCQ9F7_WG`h3X8ye>h*5=q1(RTVWVYeOG7cu<}0Tiz2 diff --git a/org.glite.lb.ws-interface/.cvsignore b/org.glite.lb.ws-interface/.cvsignore deleted file mode 100755 index 1df717b..0000000 --- a/org.glite.lb.ws-interface/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -.project -.cdtproject \ No newline at end of file diff --git a/org.glite.lb.ws-interface/LICENSE b/org.glite.lb.ws-interface/LICENSE deleted file mode 100755 index 01b973b..0000000 --- a/org.glite.lb.ws-interface/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -Copyright (c) 2004 on behalf of the EU EGEE Project: -The European Organization for Nuclear Research (CERN), -Istituto Nazionale di Fisica Nucleare (INFN), Italy -Datamat Spa, Italy -Centre National de la Recherche Scientifique (CNRS), France -CS Systeme d'Information (CSSI), France -Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden -Universiteit van Amsterdam (UvA), Netherlands -University of Helsinki (UH.HIP), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.lb.ws-interface/Makefile b/org.glite.lb.ws-interface/Makefile deleted file mode 100644 index 6e97ae6..0000000 --- a/org.glite.lb.ws-interface/Makefile +++ /dev/null @@ -1,80 +0,0 @@ -# Default values -top_srcdir=.. -builddir=build -top_builddir=${top_srcdir}/${builddir} -stagedir=. -globalprefix=glite -lbprefix=lb -package=glite-lb-ws-interface -version=0.0.0 -PREFIX=/opt/glite - --include Makefile.inc --include ../project/version.properties - -version=${module.version} - -SUFFIXES = .T - -VPATH=${top_srcdir}/src -AT3=${stagedir}/sbin/glite-lb-at3 -XSLTPROC:=xsltproc --nonet -XMLLINT:=xmllint --nonet -TIDY=tidy -i -q --show-warnings no --tidy-mark no --wrap 0 -docbookxls:=http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl - -STAGETO=interface - -WSDL=LB.wsdl LBTypes.wsdl - -all compile: ${WSDL} ${doc} glue2-copy.xsd - -check: - @echo No unit test required for interface-only module. - -stage: compile - $(MAKE) install PREFIX=${stagedir} DOSTAGE=yes - -glue2-copy.xsd: - wget -O $@ http://schemas.ogf.org/glue/2008/05/spec_2.0_d42_r01 || cp ${top_srcdir}/src/glue2.xsd $@ - -install: - -mkdir -p ${PREFIX}/${STAGETO} - -mkdir -p ${PREFIX}/share/doc/${package}-${version}/examples - install -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version} - ( cd ${top_srcdir}/project && install -m 644 ChangeLog package.description package.summary ${PREFIX}/share/doc/${package}-${version} ) - -test -f LB.html && install -m 644 LB.html ${PREFIX}/share/doc/${package}-${version} -# install the generated stuff instead -# cd ${top_srcdir}/interface && install -m 644 ${WSDL} ${PREFIX}/${STAGETO} - install -m 644 ${WSDL} ${PREFIX}/${STAGETO} - install -m 644 glue2-copy.xsd ${PREFIX}/${STAGETO}/glue2.xsd - install -m 644 ${top_srcdir}/src/lb4agu.wsdl ${PREFIX}/${STAGETO} - -# JP has its own version anyway -# if [ x${DOSTAGE} = xyes ]; then \ -# mkdir -p ${PREFIX}/share/lb; \ -# install -m 644 ${top_srcdir}/src/puke-wsdl.xsl ${top_srcdir}/src/puke-ug.xsl ${PREFIX}/share/lb; \ -# fi - -clean: - rm -vf *.h *.html *.xml *.wsdl glue2-copy.xsd - rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/ - -%.xml: %.xml.T - rm -f $@ - ${AT3} $< >$@ || rm -f $@ - chmod -w $@ >/dev/null - -${WSDL}: %.wsdl: %.xml puke-wsdl.xsl - ${XSLTPROC} ../src/puke-wsdl.xsl $< >$@ - -${TIDY} -xml -m $@ -# XXX: obsolete: -# -perl -i -n -e 'if (/^\s*$$/) { $$empty .= "\n"; } elsif (/^\s*<(xsd:)?(enumeration|element|input|output|fault)/) { print $$_; $$empty = "";} else { print "$$empty$$_"; $$empty=""; }; ' $@ - -LB.html: doc.xml LBTypes.xml LB.xml puke-ug.xsl - ${XSLTPROC} --novalid ../src/puke-ug.xsl $< >doc-html.xml - -${TIDY} -xml -m doc-html.xml -# ${XMLLINT} --valid --noout doc-html.xml - ${XSLTPROC} --stringparam chapter.autolabel 0 ${docbookxls} doc-html.xml >$@ - -${TIDY} -asxhtml -m $@ - diff --git a/org.glite.lb.ws-interface/build.xml b/org.glite.lb.ws-interface/build.xml deleted file mode 100644 index e76969a..0000000 --- a/org.glite.lb.ws-interface/build.xml +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb.ws-interface/configure b/org.glite.lb.ws-interface/configure deleted file mode 100755 index 8f92219..0000000 --- a/org.glite.lb.ws-interface/configure +++ /dev/null @@ -1,833 +0,0 @@ -#!/usr/bin/perl - -# WARNING: Don't edit this file unless it is the master copy in org.glite.lb -# -# For the purpose of standalone builds of lb/jobid/lbjp-common components -# it is copied on tagging - -# $Header$ -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners/ for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use Getopt::Long; - -my $pwd = `pwd`; chomp $pwd; -my $prefix = $pwd.'/stage'; -my $stagedir; -my $staged; -my $module; -my $thrflavour = 'gcc64dbgpthr'; -my $nothrflavour = 'gcc64dbg'; -my $mode = 'build'; -my $help = 0; -my $listmodules; -my $version; -my $branch; -my $output; -my $lb_tag = ''; -my $lbjp_tag = ''; -my $jp_tag = ''; -my $sec_tag = ''; -my $jobid_tag = ''; -my $libdir = getlibdir(); - -my @nodes = qw/client server logger utils client-java doc ws-test db jpprimary jpindex jpclient harvester/; -my %enable_nodes; -my %disable_nodes; - -my %extern_prefix = ( - cares => '/opt/c-ares', - classads => '/opt/classads', - cppunit => '/usr', - expat => '/usr', - globus => '/opt/globus', - gsoap => '/usr', - mysql => '/usr', - 'mysql-devel' => '', - 'mysql-server' => '', - voms => '/opt/glite', - gridsite => '/opt/glite', - lcas => '/opt/glite', - trustmanager => '/opt/glite', - utiljava => '/opt/glite', - ant => '/usr', - jdk => '/usr', - libtar => '/usr', - axis => '/usr', - log4c => '/usr', - postgresql => '/usr' -); - -my %jar = ( - 'commons-codec' => '/usr/share/java/commons-codec.jar', - 'commons-lang' => '/usr/share/java/commons-lang.jar', -); - - -my %glite_prefix; -my %need_externs; -my %need_externs_type; -my %need_jars; -my %extrafull; -my %extranodmod; -my %deps; -my %deps_type; -my %topbuild; - -my %lbmodules = ( - 'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim glite-LB/], - 'security' => [qw/gss gsoap-plugin/], - 'lbjp-common' => [qw/db log maildir server-bones trio jp-interface/], - 'jobid' => [qw/api-c api-cpp api-java/], - 'jp' => [ qw/client doc index primary server-common ws-interface/ ], - ); - - -my @opts = ( - 'prefix=s' => \$prefix, - 'staged=s' => \$staged, - 'module=s' => \$module, - 'thrflavour=s' => \$thrflavour, - 'nothrflavour=s' => \$nothrflavour, - 'mode=s' => \$mode, - 'listmodules=s' => \$listmodules, - 'version=s' => \$version, - 'branch=s' => \$branch, - 'output=s' => \$output, - 'stage=s' => \$stagedir, - 'lb-tag=s' => \$lb_tag, - 'lbjp-common-tag=s' => \$lbjp_tag, - 'jp-tag=s' => \$jp_tag, - 'security-tag=s' => \$sec_tag, - 'jobid-tag=s' => \$jobid_tag, - 'help' => \$help, - 'libdir=s' => \$libdir, -); - -for (@nodes) { - $enable_nodes{$_} = 0; - $disable_nodes{$_} = 0; - - push @opts,"disable-$_",\$disable_nodes{$_}; - push @opts,"enable-$_",\$enable_nodes{$_}; -} - -push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix; -push @opts,"with-$_=s",\$jar{$_} for keys %jar; - -my @keeparg = @ARGV; - -GetOptions @opts or die "Errors parsing command line\n"; - -$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq ''; -$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq ''; - -if ($help) { usage(); exit 0; } - -if ($listmodules) { - my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}}; - print "@m\n"; - exit 0; -} - -warn "$0: --version, --branch and --output make sense only in --mode=etics\n" - if ($version || $output || $branch) && $mode ne 'etics'; - -my $en; -for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; } - -my $dis; -for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; } - -die "--enable-* and --disable-* are mutually exclusive\n" - if $en && $dis; - -die "--module cannot be used with --enable-* or --disable-*\n" - if $module && ($en || $dis); - -die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}}; - -if ($dis) { - for (@nodes) { - $enable_nodes{$_} = 1 unless $disable_nodes{$_}; - } -} - -if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ; - -for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; } - -$stagedir = $prefix unless $stagedir; - -if ($mode eq 'build') { - print "Writing config.status\n"; - open CONF,">config.status" or die "config.status: $!\n"; - print CONF "$0 @keeparg\n"; - close CONF; -} - - -my @modules; -my %aux; - -if ($module) { -# push @modules,split(/[,.]+/,$module); - push @modules,$module; -} -else { - @modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes)); - - my $n; - - do { - local $"="\n"; - $n = $#modules; - push @modules,(map @{$deps{$_}},@modules); - - undef %aux; @aux{@modules} = (1) x ($#modules+1); - @modules = keys %aux; - } while ($#modules > $n); -} - -@aux{@modules} = (1) x ($#modules+1); -delete $aux{$_} for (split /,/,$staged); -@modules = keys %aux; - -mode_build() if $mode eq 'build'; -mode_checkout() if $mode eq 'checkout'; -mode_etics($module) if $mode eq 'etics'; - -sub mode_build { - print "\nBuilding modules: @modules\n"; - - my @ext = map @{$need_externs{$_}},@modules; - my @myjars = map @{$need_jars{$_}},@modules; - undef %aux; @aux{@ext} = 1; - @ext = keys %aux; - undef %aux; @aux{@myjars} = (1) x ($#myjars+1); - @myjars = keys %aux; - - print "\nRequired externals:\n"; - print "\t$_: $extern_prefix{$_}\n" for @ext; - print "\t$_: $jar{$_}\n" for @myjars; - print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n"; - - mkinc($_) for @modules; - - print "Creating Makefile\n"; - - open MAK,">Makefile" or die "Makefile: $!\n"; - - print MAK "all: @modules\n\nclean:\n"; - - for (@modules) { - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - print MAK "\tcd $full$build && \${MAKE} clean\n" - } - - print MAK "\ndistclean:\n"; - - for (@modules) { - my $full = full($_); - print MAK $topbuild{$_} ? - "\tcd $full$build && \${MAKE} distclean\n" : - "\trm -rf $full$build\n" - } - - print MAK "\n"; - - for (@modules) { - my %ldeps; undef %ldeps; - @ldeps{@{$deps{$_}}} = 1; - for my $x (split /,/,$staged) { delete $ldeps{$x}; } - my @dnames = $module ? () : keys %ldeps; - - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - - print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n"; - } - - close MAK; -} - -sub mode_checkout() { - for (@modules) { - my $module = $_; - my $tag = ""; - if ($lb_tag){ - for (@{$lbmodules{lb}}){ - if ("lb.".$_ eq $module){ - $tag = '-r '.$lb_tag; - } - } - } - if ($lbjp_tag){ - for (@{$lbmodules{'lbjp-common'}}){ - if ("lbjp-common.".$_ eq $module){ - $tag = '-r '.$lbjp_tag; - } - } - } - if ($jp_tag){ - for (@{$lbmodules{'jp'}}){ - if ("jp.".$_ eq $module){ - $tag = '-r '.$jp_tag; - } - } - } - if ($sec_tag){ - for (@{$lbmodules{security}}){ - if ("security.".$_ eq $module){ - $tag = '-r '.$sec_tag; - } - } - } - if ($jobid_tag){ - for (@{$lbmodules{jobid}}){ - if ("jobid.".$_ eq $module){ - $tag = '-r '.$jobid_tag; - } - } - } - #if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){ - # print "found"; - #} - $_ = full($_); - print "\n*** Checking out $_\n"; - system("cvs checkout $tag $_") == 0 or die "cvs checkout $tag $_: $?\n"; - } -} - -BEGIN{ -%need_externs_aux = ( - 'lb.client' => [ qw/cppunit:B classads/ ], - 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava/ ], - 'lb.common' => [ qw/expat cares:B cppunit:B classads/ ], - 'lb.doc' => [], - 'lb.logger' => [ qw/cppunit:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ], - 'lb.state-machine' => [ qw/classads/ ], - 'lb.utils' => [ qw/cppunit:B/ ], - 'lb.ws-interface' => [], - 'lb.ws-test' => [ qw/gsoap:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw/postgresql:R/ ], - 'lb.yaim' => [ qw/glite-yaim-core:R/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], - 'lbjp-common.db' => [ qw/mysql:B mysql-devel:B postgresql:B/ ], - 'lbjp-common.log' => [ qw/log4c/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw// ], - 'lbjp-common.trio' => [ qw/cppunit:B/ ], - 'lbjp-common.jp-interface' => [ qw/cppunit:B log4c:B/ ], - 'security.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B/ ], - 'security.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap:B/ ], - 'jobid.api-c' => [ qw/cppunit:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], - 'jobid.api-java' => [ qw/ant:B jdk:B/ ], - 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], - 'jp.doc' => [], - 'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ], - 'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ], - 'jp.server-common' => [], - 'jp.ws-interface' => [], -); - -for my $ext (keys %need_externs_aux) { - for (@{$need_externs_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$need_externs{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $need_externs_type{$ext}->{$1} = $type; - } -} - -%need_jars = ( - 'jobid.api-java' => [ qw/commons-codec/ ], - 'lb.client-java' => [ qw/commons-lang/ ], -); - -for my $jar (keys %need_jars) { - for (@{$need_jars{$jar}}) { - $need_externs_type{$jar}->{$_} = 'BR'; # XXX - } -} - -%deps_aux = ( - 'lb.client' => [ qw/ - lb.types:B lb.common - lbjp-common.trio - jobid.api-cpp:B jobid.api-c - security.gss - / ], - 'lb.client-java' => [ qw/ - lb.types:B - lb.ws-interface:B - jobid.api-java - / ], - 'lb.common' => [ qw/ - jobid.api-cpp:B jobid.api-c - lb.types:B lbjp-common.trio security.gss - / ], - 'lb.doc' => [ qw/lb.types:B/ ], - 'lb.logger' => [ qw/ - lbjp-common.trio - lbjp-common.log - jobid.api-c - lb.common - security.gss - / ], - 'lb.server' => [ qw/ - lb.ws-interface lb.types:B lb.common lb.state-machine - lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log - jobid.api-c - security.gsoap-plugin security.gss - / ], - 'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ], - 'lb.utils' => [ qw/ - lbjp-common.jp-interface - jobid.api-c - lbjp-common.trio lbjp-common.maildir - lb.client lb.state-machine - / ], - 'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ], - 'lb.ws-interface' => [ qw/lb.types:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw/ - jobid.api-c lbjp-common.trio lbjp-common.db lb.common lb.client - security.gss lbjp-common.log - / ], - 'lb.yaim' => [ qw// ], - 'lb.glite-LB' => [ qw/ - lb.logger:R lb.server:R lb.utils:R lb.doc:R - lb.ws-test:R lb.harvester:R lb.yaim:R - / ], - 'lbjp-common.db' => [ qw/lbjp-common.trio lbjp-common.log/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw/lbjp-common.log/ ], - 'lbjp-common.trio' => [ qw// ], - 'security.gss' => [ qw// ], - 'security.gsoap-plugin' => [ qw/security.gss/ ], - 'jobid.api-c' => [ qw// ], - 'jobid.api-cpp' => [ qw/jobid.api-c/ ], - 'jobid.api-java' => [ qw// ], - - 'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ], - - 'jp.client' => [ qw/ - jp.ws-interface - lbjp-common.jp-interface lbjp-common.maildir - jobid.api-c - security.gsoap-plugin - / ], - 'jp.doc' => [ qw// ], - 'jp.index' => [ qw/ - jp.server-common jp.ws-interface - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.primary' => [ qw/ - jobid.api-c - jp.server-common jp.ws-interface - lb.state-machine - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.server-common' => [ qw/ - lbjp-common.jp-interface lbjp-common.db - / ], - 'jp.ws-interface' => [ qw// ], -); - -for my $ext (keys %deps_aux) { - for (@{$deps_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$deps{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $deps_type{$ext}->{$1} = $type; - } -} - - -%extrafull = ( gridsite=>'org.gridsite.core'); - -#( java => 'client-java' ); -%extranodmod = ( - db => 'lbjp-common.db', - jpprimary => 'jp.primary', - jpindex => 'jp.index', - jpclient => 'jp.client', -); - -my @t = qw/lb.client-java jobid.api-java lb.types/; -@topbuild{@t} = (1) x ($#t+1); -} - -sub full -{ - my $short = shift; - return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short; -} - -sub mkinc -{ - my %aux; - undef %aux; - my @m=qw/ -lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim -security.gss security.gsoap-plugin -jobid.api-c jobid.api-cpp jobid.api-java -lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface -jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface -/; - @aux{@m} = (1) x ($#m+1); - - my $short = shift; - my $full = full $short; - - unless ($aux{$short}) { - print "Makefile.inc not needed in $full\n"; - return; - } - - my $build = ''; - - unless ($topbuild{$_}) { - $build = '/build'; - unless (-d "$full/build") { - mkdir "$full/build" or die "mkdir $full/build: $!\n"; - } - unlink "$full/build/Makefile"; - symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n"; - } - - open MKINC,">$full$build/Makefile.inc" - or die "$full$build/Makefile.inc: $!\n"; - - print "Creating $full$build/Makefile.inc\n"; - - print MKINC qq{ -PREFIX = $prefix -stagedir = $stagedir -thrflavour = $thrflavour -nothrflavour = $nothrflavour -libdir = $libdir -}; - - for (@{$need_externs{$short}}) { - print MKINC "${_}_prefix = $extern_prefix{$_}\n" - } - - for (@{$need_jars{$short}}) { - print MKINC "${_}_jar = $jar{$_}\n" - } - - my $need_gsoap = 0; - for (@{$need_externs{$short}}) { $need_gsoap = 1 if $_ eq 'gsoap'; } - - print MKINC "gsoap_default_version=".gsoap_version()."\n" if $need_gsoap; - - close MKINC; -} - -my %etics_externs; -my %etics_projects; -BEGIN{ - %etics_externs = ( - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - gridsite=>'org.gridsite.shared', - lcas=>'org.glite.security.lcas', - trustmanager=>'org.glite.security.trustmanager', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - ); - %etics_projects = ( - vdt=>[qw/globus globus_essentials/], - 'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema/], - ); -}; - -sub mode_etics { - $fmod = shift; - - die "$0: --module required with --etics\n" unless $fmod; - - my ($subsys,$module) = split /\./,$fmod; - - my ($major,$minor,$rev,$age); - - if ($version) { - $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/; - ($major,$minor,$rev,$age) = ($1,$2,$3,$4); - } - else { - open V,"org.glite.$subsys.$module/project/version.properties" - or die "org.glite.$subsys.$module/project/version.properties: $!\n"; - - while ($_ = ) { - chomp; - ($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/; - $age = $1 if /module\.age\s*=\s*([[:digit:]]+)/; - } - close V; - } - - my @copts = (); - my %ge; - @ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1); - - for (@{$need_externs{"$subsys.$module"}}) { - if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; - } - } - - for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - push @copts,"--with-$_ \${$eext.location}/$_*.jar"; - } - - my $conf; - my $conftag; - - if ($branch) { - $conf = "glite-${subsys}-${module}_$branch"; - $conftag = $branch; - $dwpath = ""; } - else { - $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - $conftag = $conf; - $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n"; } -# my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - my $file = $output ? $output : "$conf.ini"; - open C,">$file" or die "$file: $!\n"; - - my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build"; - - my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..'; - - my $package_description = ""; - my $package_summary = ""; - - if (-e "org.glite.$subsys.$module/project/package.description") { - open V, "org.glite.$subsys.$module/project/package.description"; - $package_description = join ("", ); - close V; - chomp $package_description; - $package_description =~ s/\n/\\n/g; - $package_description = "package.description = $package_description"; - } - else { - print STDERR "package.description not found for $subsys.$module!\n"; } - - if (-e "org.glite.$subsys.$module/project/package.summary") { - open V, "org.glite.$subsys.$module/project/package.summary"; - $package_summary = join ("", ); - close V; - chomp $package_summary; - $package_summary =~ s/\n/\\n/g; - $package_summary = "package.summary = $package_summary"; - } - else { - print STDERR "package.summary not found for $subsys.$module!\n"; } - - - print STDERR "Writing $file\n"; - print C qq{ -[Configuration-$conf] -profile = None -moduleName = org.glite.$subsys.$module -displayName = $conf -description = org.glite.$subsys.$module -projectName = org.glite -age = $age -deploymentType = None -tag = $conftag -version = $major.$minor.$rev -$dwpath -[Platform-default:VcsCommand] -displayName = None -description = None -tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName} -branch = None -commit = None -checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName} - -[Platform-default:BuildCommand] -postpublish = None -packaging = None -displayName = None -description = None -doc = None -prepublish = None -publish = None -compile = make -init = None -install = make install -clean = make clean -test = make check -configure = cd $confdir && \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts -checkstyle = None - -[Platform-default:Property] -$buildroot -$package_description -$package_summary - -[Platform-default:DynamicDependency] - -}; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; - } - } - - my $type = $need_externs_type{"$subsys.$module"}->{$_}; - print C "$proj|$eext = $type\n"; - } - - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "org.glite|org.glite.$_ = $type\n"; - } - - close C; -} - -sub gsoap_version { - local $_; - my $gsoap_version; - open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n"; - - while ($_ = ) { - chomp; - - $gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/; - } - close S; - return $gsoap_version; -} - -sub getlibdir { - if ( -e "/etc/debian_version") { # We are on Debian - $lib64="lib"; - $lib32="lib32"; } - else { # Another distribution - $lib64="lib64"; - $lib32="lib"; } - $libdir=$lib32; - - open INP, "uname -s | "; # Check kernel name - $kname= ; - chomp($kname); - close INP; - - if ( $kname == "Linux") { - $arch = ("x86_64\npowerpc\nppc64\n"); - - open INP, "uname -p | "; # Check processor type - $procname= ; - chomp($procname); - close INP; - - if ($arch =~/^$procname\n/) { - return ($lib64); } - - open INP, "uname -m | "; # Check machine hardware - $machname= ; - chomp($machname); - close INP; - - if ($arch =~/^$machname\n/) { - return ($lib64); } - - # special cases (hyperlink lib64, Debian) - if (-l "/usr/lib64") { - $libdir=$lib32; } - - # if /usr/lib64 doesn't exist at all (AIX) - unless ( -e "/usr/lib64" ) { - $libdir=$lib32; } - } - - if ( $kname == "SunOS") { - if (-e "/usr/lib/64") { - $libdir="lib/64"; } - } - - return $libdir; -} - -sub usage { - my @ext = keys %extern_prefix; - my @myjars, keys %jar; - - print STDERR qq{ -usage: $0 options - -General options (defaults in []): - --prefix=PREFIX destination directory [./stage] - --staged=module,module,... what is already in PREFIX (specify without org.glite.) - --thrflavour=flavour - --nothrflavour=flavour threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg] - --listmodules=subsys list modules of a subsystem - --libdir=libdir typically [lib,lib64] postfix - -Mode of operation: - --mode={checkout|build|etics} what to do [build] - -What to build: - --module=module build this module only (mostly in-Etics operation) - --enable-NODE build this "node" (set of modules) only. Available nodes are - @{$lbmodules{lb}},@{$lbmodules{security}} - --disable-NODE don't build this node - --lb-tag=tag checkout LB modules with specific tag - --jp-tag=tag checkout JP modules with specific tag - --lbjp-common-tag=tag checkout lbjp-common modules with specific tag - --security-tag=tag checkout security modules with specific tag - --jobid-tag=tag checkout jobid modules with specific tag - -Dependencies: - --with-EXTERNAL=PATH where to look for an external. Required externals - (not all for all modules) are: - @ext - --with-JAR=JAR where to look for jars. Required jars are: - @myjars - Summary of what will be used is always printed - -}; - -} diff --git a/org.glite.lb.ws-interface/examples/userjobs.pl b/org.glite.lb.ws-interface/examples/userjobs.pl deleted file mode 100755 index cde0d18..0000000 --- a/org.glite.lb.ws-interface/examples/userjobs.pl +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/perl -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use SOAP::Lite; -use Data::Dumper; -use XML::LibXML; -use XML::LibXML::XPathContext; - -$ENV{HTTPS_CA_DIR}='/etc/grid-security/certificates'; -$ENV{HTTPS_VERSION}='3'; - -$ENV{HTTPS_CA_FILE}= $ENV{HTTPS_CERT_FILE} = $ENV{HTTPS_KEY_FILE} = - $ENV{X509_USER_PROXY} ? $ENV{X509_USER_PROXY} : "/tmp/x509up_u$<"; - -$proxy = shift or die "usage: $0 https://server.to.query:port/\n"; - -$c = SOAP::Lite -> proxy($proxy) -> uri('http://glite.org/wsdl/services/lb'); - -$c->service('http://egee.cesnet.cz/en/WSDL/3.1/LB.wsdl'); -$c->ns('http://glite.org/wsdl/elements/lb'); - -$c->on_fault(sub { print Dumper($_[1]->fault); $fault = 1; }); - -$resp = $c->UserJobs(); - -print Dumper $resp; - diff --git a/org.glite.lb.ws-interface/project/ChangeLog b/org.glite.lb.ws-interface/project/ChangeLog deleted file mode 100644 index 4070291..0000000 --- a/org.glite.lb.ws-interface/project/ChangeLog +++ /dev/null @@ -1,22 +0,0 @@ -2.4.0-2 (lb-1.7.1-1) -- follow changes in lb.build (1.6.0-1 -> 1.6.1-1) - -3.0.0-1 -- LB 2.0 release - -3.0.0-2 -- fixed configure to work in etics - -3.0.0-3 -- configure script update (globus flavors added to configure call) - -3.0.0-4 -- configure script update - -3.0.1-1 -- Initial implementation of WS notifications - -3.1.0-1 -- Primitive AGU compatibility -- Support for CREAM jobs - diff --git a/org.glite.lb.ws-interface/project/build.number b/org.glite.lb.ws-interface/project/build.number deleted file mode 100644 index 61ccac8..0000000 --- a/org.glite.lb.ws-interface/project/build.number +++ /dev/null @@ -1,2 +0,0 @@ -#Fri Aug 18 12:28:54 CEST 2006 -module.build=0144 diff --git a/org.glite.lb.ws-interface/project/build.properties b/org.glite.lb.ws-interface/project/build.properties deleted file mode 100755 index e69de29..0000000 diff --git a/org.glite.lb.ws-interface/project/configure.properties.xml b/org.glite.lb.ws-interface/project/configure.properties.xml deleted file mode 100644 index 563b7bd..0000000 --- a/org.glite.lb.ws-interface/project/configure.properties.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - -top_srcdir=.. -builddir=build -stagedir=${stage.abs.dir} -distdir=${dist.dir} -globalprefix=${global.prefix} -lbprefix=${subsystem.prefix} -package=${module.package.name} -PREFIX=${install.dir} -version=${module.version} -glite_location=${with.glite.location} - - - diff --git a/org.glite.lb.ws-interface/project/package.description b/org.glite.lb.ws-interface/project/package.description deleted file mode 100644 index 998fe69..0000000 --- a/org.glite.lb.ws-interface/project/package.description +++ /dev/null @@ -1 +0,0 @@ -glite-lb-ws-interface contains the LB web service interface specification (LB.wsdl and LBTypes.wsdl). diff --git a/org.glite.lb.ws-interface/project/package.summary b/org.glite.lb.ws-interface/project/package.summary deleted file mode 100644 index 2f3dbc8..0000000 --- a/org.glite.lb.ws-interface/project/package.summary +++ /dev/null @@ -1 +0,0 @@ -gLite Logging and Bookkeeping web service interface diff --git a/org.glite.lb.ws-interface/project/properties.xml b/org.glite.lb.ws-interface/project/properties.xml deleted file mode 100644 index 736515e..0000000 --- a/org.glite.lb.ws-interface/project/properties.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb.ws-interface/project/tar_exclude b/org.glite.lb.ws-interface/project/tar_exclude deleted file mode 100644 index e69de29..0000000 diff --git a/org.glite.lb.ws-interface/project/version.properties b/org.glite.lb.ws-interface/project/version.properties deleted file mode 100755 index 888ecb1..0000000 --- a/org.glite.lb.ws-interface/project/version.properties +++ /dev/null @@ -1,3 +0,0 @@ -# $Header$ -module.version=3.1.0 -module.age=1 diff --git a/org.glite.lb.ws-interface/src/LB.xml b/org.glite.lb.ws-interface/src/LB.xml deleted file mode 100644 index 780c687..0000000 --- a/org.glite.lb.ws-interface/src/LB.xml +++ /dev/null @@ -1,137 +0,0 @@ - - - - - CVS revision: - - - Logging and Bookkeeping (L&B) service keeps track of grid jobs. - - The service receives job events - from various components of the Workload Management System, stores - them, and derives then the corresponding job states. - - Job information is fed into LB through a logging interface - (legacy C and shell API) - and it is not exposed as a web service yet. - - The users may query job states or retrieve LB events either via the same C/C++ - interface or via this web-service interface. - - Besides querying for the job state actively the user may also register for - receiving notifications on particular job state changes. - This functionality is supported only in the legacy C/C++ interface. - - - - - - - - - - Return version of the service. - Dummy parameter (workaround for gSoap). - Returned version. - Any error. - - - Query state of a single job. - Id of the queried job. - Which data fields to retrieve. - Current state of the job. - Any error. - - - Simplified query, return all jobs of the authenticated user. - JobId's of jobs matching the query. - States of jobs matching the query. - Any error. - - - Retrieve a list of jobs, including their states, based on query conditions. - The conditions take the form of a list of lists. - Elements of the inner lists refer to a single job attribute, the conditions are or-ed. - Elements of the outer list may refer to different job attributes, they are and-ed. - - The query conditions. - Which data fields to retrieve. - JobId's of jobs matching the query. - States of jobs matching the query. - Any error. - - - - Retrieve events matching a query. - There are two sets of conditions, on jobs and on individual events, both have to be satisfied. - Both query conditions have the same format as in QueryJobs. - - - Conditions on jobs. - - - Conditions on individual events. - - All matchin events. - Any error. - - - - Server supported indexed attributes - - Dummy parameter (workaround for gSoap). - - Any error. - - - - Retrieve limit on query result size (no. of events or jobs). - Not implemented at server side. - - Dummy parameter (workaround for gSoap). - - Any error. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb.ws-interface/src/LBTypes.xml.T b/org.glite.lb.ws-interface/src/LBTypes.xml.T deleted file mode 100644 index a932bad..0000000 --- a/org.glite.lb.ws-interface/src/LBTypes.xml.T +++ /dev/null @@ -1,308 +0,0 @@ - - -@@@LANG: wsdl - - - - - CVS revision: - - - - Flags determining which fields of job status should be retrieved. - Can be combined arbitrarily. - Include also long job descriptions (JDL). - Return list of subjobs of a DAG. - Return state of the subjobs, i.e. apply other flags recursively - Return a histogram of subjob states (fast computation method, certain subjobs will be in an "unknown" state) - Return a full histogram of subjob states. - - - -@@@{ - for my $stat ($status->getTypesOrdered) { - my $u = uc $stat; - my $c = getTypeComment $status $stat; - gen qq{ -! $c -}; - } -@@@} - - -@@@{ - for my $n ($status->getAllFieldsOrdered) { - my $f = selectField $status $n; - if ($f->{codes}) { - my $n = getName $f; - $n = $1.ucfirst $2 while $n =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - gen qq{ -! -}; - for (@{$f->{codes}}) { - my $uc = uc $_->{name}; - gen qq{ -! $_->{comment} -}; - } - gen qq{ -! -}; - } - } -@@@} - - - Status of a job, possibly including subjobs. - Status name. -@@@{ - for my $n (getAllFieldsOrdered $status) { - selectField $status $n; - my $f = getField $status; - my $name = getName $f; - $name = $1.ucfirst $2 while $name =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - my $type = $f->{type}; - my $list = 'no'; - - if ($main::baseTypes{$type}) { - $type = eval $main::types{wsdl}->{$main::baseTypes{$type}}; - $list = 'yes' - } - elsif ($f->{codes}) { - $type = $name; - } - else { - $type = getType $f; - } - - my $comment = getComment $f; - if ($name eq 'stateEnterTimes' || $name eq 'childrenHist') { -# XXX: stateEnterTimes and childrenHist are the only case of enum-indexed array - gen qq{ -! $comment -}; - } - else { -# XXX: currently nothing is "optional" as we don't know from status.T - gen qq{ -! $comment -}; - } - } -@@@} - - - -@@@{ - for my $name (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } getTypes $event) { - my $comment = getTypeComment $event $name; - $name = $1.ucfirst $2 while $name =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - gen qq{ -! $comment -}; - } -@@@} - - -@@@{ - selectType $event '_common_'; - for ($event->getFieldsOrdered) { - my $f = selectField $event $_; - if ($f->{codes}) { - my $n = ucfirst getName $f; - $n = $1.ucfirst $2 while $n =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - gen qq{ -! -}; - for (@{$f->{codes}}) { - my $uc = uc $_->{name}; - gen qq{ -! $_->{comment} -}; - } - gen qq{ -! -! -}; - } - } - - for my $type (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } getTypes $event) { - my $tn = $type; - $tn = $1.ucfirst $2 while $tn =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - - selectType $event $type; - for ($event->getFieldsOrdered) { - my $f = selectField $event $_; - if ($f->{codes}) { - my $n = $tn . '_' . getName $f; - $n = $1.ucfirst $2 while $n =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - gen qq{ -! -}; - for (@{$f->{codes}}) { - my $uc = uc $_->{name}; - gen qq{ -! $_->{comment} -}; - } - gen qq{ -! -! -}; - } - } - - gen qq{ -! -}; - selectType $event '_common_'; - for ($event->getFieldsOrdered) { - my $f = selectField $event $_; - my $fn = $f->{name}; - my $ftn = $f->getType; - - $fn = $1.ucfirst $2 while $fn =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - $ftn = ucfirst $fn if ($f->{codes}); - $ftn = $1.ucfirst $2 while $ftn =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - - my $comment = getComment $f; - my $opt = $f->{optional} ? 'yes' : 'no'; - gen qq{\t\t\t\t$comment -}; - } - - selectType $event $type; - for ($event->getFieldsOrdered) { - my $f = selectField $event $_; - my $fn = $f->{name}; - my $ftn = $f->getType; - - - $fn = $1.ucfirst $2 while $fn =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - $ftn = $tn . '_' . $fn if ($f->{codes}); - $ftn = $1.ucfirst $2 while $ftn =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - - - my $comment = getComment $f; - my $opt = $f->{optional} ? 'yes' : 'no'; - gen qq{\t\t\t\t$comment -}; - } - gen "\n\n"; - } -@@@} - - - Possible sources of LB events. - - - - - - - - - - - - - - - The job state. - When the state was entered last time. - - - - The job state of the children. - How many children are in this state. - - - - - - - - - - - - - - - Generic SOAP fault, used to deliver any LB errors. - Source component (module) of the error. - Numeric error code. - Error text corresponding to the code. - Additional description of the error (e.g. filename) - Reason of the error, coming from lower levels. - - - - An element of outer list of query conditions in job queries. - It expresses possibly several conditions (records) on a single job attribute. - These conditions are logically OR-ed. - The job attribute to which the query conditions apply. - Name of the queried user tag if attr is USERTAG. - Name of the job state to which "attr = TIME" condition refers. - The conditions. - - - - Specification of a job attribute in query. - A concrete JobId - Owner of the job (X509 certificate subject). - Status of the job (see statName type). - Where the job is currently handled (hostname). - Where the job is or was scheduled to be executed. - How the job terminated (see doneCode type) - Value of particular user tag. The tag name has to be specified in queryConditions.tagName. - When the job entered a particular state. The state has to be specified in queryCondition.statName. - Logging level (see "dglog.h"), see _edg_wll_QueryRec - The job was resubmitted. - JobId of the job parend (DAG). - UNIX exit code of the job. - Where the event was generated. - Source component. - Instance of the source component. - Event type. - Checkpoint tag. - JDL Attribute. - Staus enter time. - Last update time. - Network server aka RB aka WMproxy endpoint - - - - A single query condition. - Relational operator of the condition. - Value to compare the attribute with. - Another value to compare the attribute with (op = WITHIN only). - - - - Relational operator of query conditions. - Attribute is equal to the specified value - Attribute is less than the specified value or equal - Attribute is greater than the specified value or equal - Attribute is withing a range (queryRecord.value2 must be specified) - Attribute is not equal to the specified value. - Attribute has changed its value from last check (notification conditions only). - - - - A value to compare an attribute with in queries. - Exactly one of the elements must be specified. - Integer. - String. - Timestamp. - - - - - - diff --git a/org.glite.lb.ws-interface/src/README-lb4agu.txt b/org.glite.lb.ws-interface/src/README-lb4agu.txt deleted file mode 100644 index 899b0c3..0000000 --- a/org.glite.lb.ws-interface/src/README-lb4agu.txt +++ /dev/null @@ -1,52 +0,0 @@ -References: ------------ -[AGU] AGU Execution Service strawman rendering (draft v9), http://forge.ogf.org/sf/go/doc15628 -[GLUE] GLUE Specification v. 2.0, http://www.ogf.org/documents/GFD.147.pdf -[GLUE-EGEE09] GLUE 2.0: Rollout strategy and current status, presentation at EGEE'09 conference, -http://indico.cern.ch/materialDisplay.py?contribId=279&sessionId=56&materialId=slides&confId=55893 -[GLUE-HTML] GLUE 2.0 HTML rendering, http://cern.ch/glue20 -[GLUE-REAL] GLUE 2.0 – Reference Realizations to Concrete Data Models (draft v1), http://forge.ogf.org/sf/go/doc15221 -[GLUE-USECASES] GLUE 2.0 Use Cases (draft v3), http://forge.ogf.org/sf/go/doc14621 -[GLUE-WG] The GLUE Working Group of OGF, http://forge.ogf.org/sf/projects/glue-wg -[GLUE-XMLSchema-xsd] GLUE 2.0 XML Schema (Draft 41, Public Comment), http://schemas.ogf.org/glue/2008/05/spec_2.0_d42_r01, -http://glueman.svn.sourceforge.net/viewvc/glueman/trunk/glue-xsd/xsd/ -[GLUE-XMLSchema-html] GLUE 2.0 XML Schema (Draft 41, Public Comment) HTML rendering, http://www.desy.de/~paul/GLUE/GLUE2.html -[GLUE-XMLSchema-wiki] http://forge.ogf.org/sf/wiki/do/viewPage/projects.glue-wg/wiki/GLUE2XMLSchema -[LB-WS] Logging and Bookkeeping Web Services, http://egee.cesnet.cz/en/WSDL/ - -Aim: ----- -implement GetActivityStatus, GetActivityInfo and QueryActivityInfo [AGU] operations -in LB (namely enhance existing LB-WS interface): - -- GetActivityStatus - return states of given jobs (list of jobIds) -- GetActivityInfo - return complete state information (history?) of given jobs (list of jobIds) -- QueryActivityInfo - query all (user?) jobs - -LB-WS MUST return a GLUE 2.0 compliant response. - -Terminology in GLUE 2.0: ------------------------- -GLUE 2 looks a bit different to GLUE 1, but most of the concepts -are there under different names (see also [GLUE-EGEE09]) -– Site -> AdminDomain -– (VO) -> UserDomain -– Element -> Service, Service -> Endpoint -– AccessControlBaseRule -> AccessPolicy, MappingPolicy -– CE, VOView -> ComputingManager, ComputingShare -– Cluster/SubCluster -> ExecutionEnvironment -– (Job) -> Activity -– SA/VOInfo -> StorageShare - -Open issues: ------------- -- mapping of LB states to AGU states (see [AGU], section 5) - -Off topic: ----------- -- could the following be applicable to LB? --- SQL Schema Realization of GLUE 2.0 (see [GLUE-REAL], section 4) --- LDAP Schema Realization (see [GLUE-REAL], section 5) - - - diff --git a/org.glite.lb.ws-interface/src/doc.xml b/org.glite.lb.ws-interface/src/doc.xml deleted file mode 100644 index 78cb6a5..0000000 --- a/org.glite.lb.ws-interface/src/doc.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/org.glite.lb.ws-interface/src/glue2.xsd b/org.glite.lb.ws-interface/src/glue2.xsd deleted file mode 100644 index f6f50ee..0000000 --- a/org.glite.lb.ws-interface/src/glue2.xsd +++ /dev/null @@ -1,1371 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - general - usersupport - sysadmin - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - basic - gacl - - - - - - - - - - - - webservice - jndi - legacy - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb.ws-interface/src/lb4agu.wsdl b/org.glite.lb.ws-interface/src/lb4agu.wsdl deleted file mode 100644 index a68d992..0000000 --- a/org.glite.lb.ws-interface/src/lb4agu.wsdl +++ /dev/null @@ -1,188 +0,0 @@ - - -CVS revision: $Header$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - List of jobIDs - - - - - List of job states - - - - - - List of jobIDs - - - - - - List of complete job states (incl. history?) - - - - - - - - - - - - - - - - Return states of given jobs. - - - - - - - Return complete state information (history?) of given jobs. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb.ws-interface/src/puke-ug.xsl b/org.glite.lb.ws-interface/src/puke-ug.xsl deleted file mode 100644 index cab6911..0000000 --- a/org.glite.lb.ws-interface/src/puke-ug.xsl +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - - - - <xsl:value-of select="document('LB.xml')/service/@name"/> - - - Overview - - - - - Operations - - - - - - - - - Types - - - - - - - - - - - - - list of - - - - - - - - - - - - - - - - - - - <xsl:value-of select="@name"/> - - - Inputs: - - - - - - - N/A - - - - Outputs: - - - - - - - - - - - - <xsl:value-of select="@name"/> - - - - Structure (sequence complex type in WSDL) - Fields: ( type name description ) - - - Union (choice complex type in WSDL) - Fields: ( type name description ) - - - Enumeration (restriction of xsd:string in WSDL), - exactly one of the values must be specified. - - Values: - - - Flags (sequence of restricted xsd:string in WSDL), - any number of values can be specified together. - - Values: - - - - - - - - - list of - - - - - - - - - - - - - - - - - - - - (optional) - - - - - - - - - - - - - diff --git a/org.glite.lb.ws-interface/src/puke-wsdl.xsl b/org.glite.lb.ws-interface/src/puke-wsdl.xsl deleted file mode 100644 index b6fb16f..0000000 --- a/org.glite.lb.ws-interface/src/puke-wsdl.xsl +++ /dev/null @@ -1,303 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - false - - - - - - - - - - : - - - - - - 0 - 1 - - - - - unbounded - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - : - - - - - unbounded - 1 - - - - - 0 - 1 - - - - - - - - - - - - - - - : - - - - - unbounded - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.lb.ws-test/Makefile b/org.glite.lb.ws-test/Makefile deleted file mode 100644 index b51cc6f..0000000 --- a/org.glite.lb.ws-test/Makefile +++ /dev/null @@ -1,82 +0,0 @@ -top_srcdir=.. -stagedir=. -version=0.0.0 -PREFIX=/opt/glite - -glite_location=/opt/glite -globus_prefix=/opt/globus -nothrflavour=gcc32 -thrflavour=gcc32pthr -expat_prefix=/opt/expat -cares_prefix=/opt/c-ares -gsoap_prefix=/opt/gsoap -classads_prefix=/opt/classads -voms_prefix=/opt/voms - --include Makefile.inc --include ../project/version.properties - -version=${module.version} - -CEXAMPLES:=ws_getversion ws_jobstat ws_joblog ws_lb4agu_GetActivityStatus ws_lb4agu_GetActivityInfo -#TODO ws_query_ex - -default all: ${CEXAMPLES} - -VPATH=${top_srcdir}/examples -CC=gcc -DEBUG:=-g -O0 -Wall -CFLAGS=-I${gsoap_prefix}/include -I${gsoap_prefix}/ \ - -I${stagedir}/include -I${top_srcdir}/src -I. \ - -I${globus_prefix}/include/${nothrflavour} \ - ${DEBUG} - -COMPILE:=libtool --mode=compile ${CC} ${CFLAGS} -LINK:=libtool --mode=link ${CC} -rpath ${stagedir}/${libdir} ${LDFLAGS} -INSTALL:=libtool --mode=install install - -GSOAP_FILES_PREFIX:= bk_ws_ -dotless_gsoap_ver:=${shell echo ${gsoap_default_version} | tr -d . } -ifeq ($(shell test -f ${stagedir}/${libdir}/libglite_security_gsoap_plugin_${dotless_gsoap_ver}_${nothrflavour}_c.so && echo ok),ok) - langflavour:=_c -endif -GSOAP_LIB:=-L${stagedir}/${libdir} -lglite_security_gsoap_plugin_${dotless_gsoap_ver}_${nothrflavour}${langflavour} - -WS_CLIENT_OBJS:= $(GSOAP_FILES_PREFIX)C.o $(GSOAP_FILES_PREFIX)Client.o ws_fault.o -# ws_typeref.o -WS_CLIENT_LIBS:= ${GSOAP_LIB} - -SOAP_FILES:=${GSOAP_FILES_PREFIX}H.h ${GSOAP_FILES_PREFIX}C.c ${GSOAP_FILES_PREFIX}Server.c ${GSOAP_FILES_PREFIX}Client.c ${GSOAP_FILES_PREFIX}ServerLib.c ${GSOAP_FILES_PREFIX}ClientLib.c LoggingAndBookkeeping.nsmap - -gsoap_bin_prefix:=${shell if [ -x ${gsoap_prefix}/bin/soapcpp2 ]; then echo ${gsoap_prefix}/bin; else echo ${gsoap_prefix}; fi } - -${SOAP_FILES}: %: LB.xh - ${gsoap_bin_prefix}/soapcpp2 -w -c -p ${GSOAP_FILES_PREFIX} LB.xh - -${CEXAMPLES}: %: %.o ${WS_CLIENT_OBJS} - ${LINK} -o $@ $@.o ${WS_CLIENT_OBJS} ${WS_CLIENT_LIBS} - -%.o %.lo: %.c soap_version.h ${SOAP_FILES} - ${COMPILE} -c $< - -check: - @echo "No test" - -install: - mkdir -p ${PREFIX}/examples/ - for f in ${CEXAMPLES}; do \ - ${INSTALL} -m 755 $$f ${PREFIX}/examples/glite-lb-$$f; \ - done - -clean: - rm -rvf .libs LB.xh *.xml ${GSOAP_FILES_PREFIX}* *.o *.lo *.nsmap soap_version.h ${CEXAMPLES} - rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/ - -LB.xh: ws_typemap.dat ${stagedir}/interface/LB.wsdl - ${gsoap_bin_prefix}/wsdl2h -c -t ${top_srcdir}/examples/ws_typemap.dat -I${stagedir}/interface -o $@ ${stagedir}/interface/LB.wsdl - -soap_version.h: - ${gsoap_bin_prefix}/soapcpp2 /dev/null - perl -ne '$$. == 2 && /.*([0-9]+)\.([0-9]+)\.([0-9]+)([a-z]?).*/ && printf "#define GSOAP_VERSION %d%02d%02d\n#define GSOAP_VERSION_LETTER '\''".($$4?$$4:"\\0")."'\''\n",$$1,$$2,$$3' soapH.h >$@ - -rm soapC.cpp soapH.h soapStub.h soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp - diff --git a/org.glite.lb.ws-test/configure b/org.glite.lb.ws-test/configure deleted file mode 100755 index c82ed75..0000000 --- a/org.glite.lb.ws-test/configure +++ /dev/null @@ -1,843 +0,0 @@ -#!/usr/bin/perl - -# WARNING: Don't edit this file unless it is the master copy in org.glite.lb -# -# For the purpose of standalone builds of lb/jobid/lbjp-common components -# it is copied on tagging - -# $Header$ -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners/ for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -use Getopt::Long; - -my $pwd = `pwd`; chomp $pwd; -my $prefix = $pwd.'/stage'; -my $stagedir; -my $staged; -my $module; -my $thrflavour = 'gcc64dbgpthr'; -my $nothrflavour = 'gcc64dbg'; -my $mode = 'build'; -my $help = 0; -my $listmodules; -my $version; -my $branch; -my $output; -my $lb_tag = ''; -my $lbjp_tag = ''; -my $jp_tag = ''; -my $sec_tag = ''; -my $jobid_tag = ''; -my $libdir = getlibdir(); - -my @nodes = qw/client server logger utils client-java doc ws-test db jpprimary jpindex jpclient harvester/; -my %enable_nodes; -my %disable_nodes; - -my %extern_prefix = ( - cares => '/opt/c-ares', - classads => '/opt/classads', - cppunit => '/usr', - expat => '/usr', - globus => '/opt/globus', - gsoap => '/usr', - mysql => '/usr', - 'mysql-devel' => '', - 'mysql-server' => '', - voms => '/opt/glite', - gridsite => '/opt/glite', - lcas => '/opt/glite', - trustmanager => '/opt/glite', - utiljava => '/opt/glite', - ant => '/usr', - jdk => '/usr', - libtar => '/usr', - axis => '/usr', - log4c => '/usr', - postgresql => '/usr' -); - -my %jar = ( - 'commons-codec' => '/usr/share/java/commons-codec.jar', - 'commons-lang' => '/usr/share/java/commons-lang.jar', -); - - -my %glite_prefix; -my %need_externs; -my %need_externs_type; -my %need_jars; -my %extrafull; -my %extranodmod; -my %deps; -my %deps_type; -my %topbuild; - -my %lbmodules = ( - 'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim glite-LB/], - 'security' => [qw/gss gsoap-plugin/], - 'lbjp-common' => [qw/db log maildir server-bones trio jp-interface/], - 'jobid' => [qw/api-c api-cpp api-java/], - 'jp' => [ qw/client doc index primary server-common ws-interface/ ], - ); - - -my @opts = ( - 'prefix=s' => \$prefix, - 'staged=s' => \$staged, - 'module=s' => \$module, - 'thrflavour=s' => \$thrflavour, - 'nothrflavour=s' => \$nothrflavour, - 'mode=s' => \$mode, - 'listmodules=s' => \$listmodules, - 'version=s' => \$version, - 'branch=s' => \$branch, - 'output=s' => \$output, - 'stage=s' => \$stagedir, - 'lb-tag=s' => \$lb_tag, - 'lbjp-common-tag=s' => \$lbjp_tag, - 'jp-tag=s' => \$jp_tag, - 'security-tag=s' => \$sec_tag, - 'jobid-tag=s' => \$jobid_tag, - 'help' => \$help, - 'libdir=s' => \$libdir, -); - -for (@nodes) { - $enable_nodes{$_} = 0; - $disable_nodes{$_} = 0; - - push @opts,"disable-$_",\$disable_nodes{$_}; - push @opts,"enable-$_",\$enable_nodes{$_}; -} - -push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix; -push @opts,"with-$_=s",\$jar{$_} for keys %jar; - -my @keeparg = @ARGV; - -GetOptions @opts or die "Errors parsing command line\n"; - -$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq ''; -$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq ''; - -if ($help) { usage(); exit 0; } - -if ($listmodules) { - my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}}; - print "@m\n"; - exit 0; -} - -warn "$0: --version, --branch and --output make sense only in --mode=etics\n" - if ($version || $output || $branch) && $mode ne 'etics'; - -my $en; -for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; } - -my $dis; -for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; } - -die "--enable-* and --disable-* are mutually exclusive\n" - if $en && $dis; - -die "--module cannot be used with --enable-* or --disable-*\n" - if $module && ($en || $dis); - -die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}}; - -if ($dis) { - for (@nodes) { - $enable_nodes{$_} = 1 unless $disable_nodes{$_}; - } -} - -if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ; - -for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; } - -$stagedir = $prefix unless $stagedir; - -if ($mode eq 'build') { - print "Writing config.status\n"; - open CONF,">config.status" or die "config.status: $!\n"; - print CONF "$0 @keeparg\n"; - close CONF; -} - - -my @modules; -my %aux; - -if ($module) { -# push @modules,split(/[,.]+/,$module); - push @modules,$module; -} -else { - @modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes)); - - my $n; - - do { - local $"="\n"; - $n = $#modules; - push @modules,(map @{$deps{$_}},@modules); - - undef %aux; @aux{@modules} = (1) x ($#modules+1); - @modules = keys %aux; - } while ($#modules > $n); -} - -@aux{@modules} = (1) x ($#modules+1); -delete $aux{$_} for (split /,/,$staged); -@modules = keys %aux; - -mode_build() if $mode eq 'build'; -mode_checkout() if $mode eq 'checkout'; -mode_etics($module) if $mode eq 'etics'; - -sub mode_build { - print "\nBuilding modules: @modules\n"; - - my @ext = map @{$need_externs{$_}},@modules; - my @myjars = map @{$need_jars{$_}},@modules; - undef %aux; @aux{@ext} = 1; - @ext = keys %aux; - undef %aux; @aux{@myjars} = (1) x ($#myjars+1); - @myjars = keys %aux; - - print "\nRequired externals:\n"; - print "\t$_: $extern_prefix{$_}\n" for @ext; - print "\t$_: $jar{$_}\n" for @myjars; - print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n"; - - mkinc($_) for @modules; - - print "Creating Makefile\n"; - - open MAK,">Makefile" or die "Makefile: $!\n"; - - print MAK "all: @modules\n\nclean:\n"; - - for (@modules) { - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - print MAK "\tcd $full$build && \${MAKE} clean\n" - } - - print MAK "\ndistclean:\n"; - - for (@modules) { - my $full = full($_); - print MAK $topbuild{$_} ? - "\tcd $full$build && \${MAKE} distclean\n" : - "\trm -rf $full$build\n" - } - - print MAK "\n"; - - for (@modules) { - my %ldeps; undef %ldeps; - @ldeps{@{$deps{$_}}} = 1; - for my $x (split /,/,$staged) { delete $ldeps{$x}; } - my @dnames = $module ? () : keys %ldeps; - - my $full = full($_); - my $build = $topbuild{$_} ? '': '/build'; - - print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n"; - } - - close MAK; -} - -sub mode_checkout() { - for (@modules) { - my $module = $_; - my $tag = ""; - if ($lb_tag){ - for (@{$lbmodules{lb}}){ - if ("lb.".$_ eq $module){ - $tag = '-r '.$lb_tag; - } - } - } - if ($lbjp_tag){ - for (@{$lbmodules{'lbjp-common'}}){ - if ("lbjp-common.".$_ eq $module){ - $tag = '-r '.$lbjp_tag; - } - } - } - if ($jp_tag){ - for (@{$lbmodules{'jp'}}){ - if ("jp.".$_ eq $module){ - $tag = '-r '.$jp_tag; - } - } - } - if ($sec_tag){ - for (@{$lbmodules{security}}){ - if ("security.".$_ eq $module){ - $tag = '-r '.$sec_tag; - } - } - } - if ($jobid_tag){ - for (@{$lbmodules{jobid}}){ - if ("jobid.".$_ eq $module){ - $tag = '-r '.$jobid_tag; - } - } - } - #if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){ - # print "found"; - #} - $_ = full($_); - print "\n*** Checking out $_\n"; - system("cvs checkout $tag $_") == 0 or die "cvs checkout $tag $_: $?\n"; - } -} - -BEGIN{ -%need_externs_aux = ( - 'lb.client' => [ qw/cppunit:B classads/ ], - 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava/ ], - 'lb.common' => [ qw/expat cares:B cppunit:B classads/ ], - 'lb.doc' => [], - 'lb.logger' => [ qw/cppunit:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ], - 'lb.state-machine' => [ qw/classads/ ], - 'lb.utils' => [ qw/cppunit:B/ ], - 'lb.ws-interface' => [], - 'lb.ws-test' => [ qw/gsoap:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw// ], - 'lb.yaim' => [ qw/yaim_core:R/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], - 'lbjp-common.db' => [ qw/mysql:B mysql-devel:B postgresql:B cppunit:B log4c:B/ ], - 'lbjp-common.log' => [ qw/log4c/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw// ], - 'lbjp-common.trio' => [ qw/cppunit:B/ ], - 'lbjp-common.jp-interface' => [ qw/cppunit:B log4c:B/ ], - 'security.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B/ ], - 'security.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap:B/ ], - 'jobid.api-c' => [ qw/cppunit:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], - 'jobid.api-java' => [ qw/ant:B jdk:B/ ], - 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], - 'jp.doc' => [], - 'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ], - 'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ], - 'jp.server-common' => [], - 'jp.ws-interface' => [], -); - -for my $ext (keys %need_externs_aux) { - for (@{$need_externs_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$need_externs{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $need_externs_type{$ext}->{$1} = $type; - } -} - -%need_jars = ( - 'jobid.api-java' => [ qw/commons-codec/ ], - 'lb.client-java' => [ qw/commons-lang/ ], -); - -for my $jar (keys %need_jars) { - for (@{$need_jars{$jar}}) { - $need_externs_type{$jar}->{$_} = 'BR'; # XXX - } -} - -%deps_aux = ( - 'lb.client' => [ qw/ - lb.types:B lb.common - lbjp-common.trio - jobid.api-cpp:B jobid.api-c - security.gss - / ], - 'lb.client-java' => [ qw/ - lb.types:B - lb.ws-interface:B - jobid.api-java - / ], - 'lb.common' => [ qw/ - jobid.api-cpp:B jobid.api-c - lb.types:B lbjp-common.trio security.gss - / ], - 'lb.doc' => [ qw/lb.types:B/ ], - 'lb.logger' => [ qw/ - lbjp-common.trio - lbjp-common.log - jobid.api-c - lb.common - security.gss - / ], - 'lb.server' => [ qw/ - lb.ws-interface lb.types:B lb.common lb.state-machine - lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log - jobid.api-c - security.gsoap-plugin security.gss - / ], - 'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ], - 'lb.utils' => [ qw/ - lbjp-common.jp-interface - jobid.api-c - lbjp-common.trio lbjp-common.maildir - lb.client lb.state-machine - / ], - 'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ], - 'lb.ws-interface' => [ qw/lb.types:B/ ], - 'lb.types' => [ qw// ], - 'lb.harvester' => [ qw/ - jobid.api-c lbjp-common.trio lbjp-common.db lb.common lb.client - security.gss lbjp-common.log - / ], - 'lb.yaim' => [ qw// ], - 'lb.glite-LB' => [ qw/ - lb.logger:R lb.server:R lb.utils:R lb.doc:R - lb.ws-test:R lb.harvester:R lb.yaim:R lb.client-java:R - / ], - 'lbjp-common.db' => [ qw/lbjp-common.trio lbjp-common.log/ ], - 'lbjp-common.maildir' => [ qw// ], - 'lbjp-common.server-bones' => [ qw/lbjp-common.log/ ], - 'lbjp-common.trio' => [ qw// ], - 'security.gss' => [ qw// ], - 'security.gsoap-plugin' => [ qw/security.gss/ ], - 'jobid.api-c' => [ qw// ], - 'jobid.api-cpp' => [ qw/jobid.api-c/ ], - 'jobid.api-java' => [ qw// ], - - 'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ], - - 'jp.client' => [ qw/ - jp.ws-interface - lbjp-common.jp-interface lbjp-common.maildir - jobid.api-c - security.gsoap-plugin - / ], - 'jp.doc' => [ qw// ], - 'jp.index' => [ qw/ - jp.server-common jp.ws-interface - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.primary' => [ qw/ - jobid.api-c - jp.server-common jp.ws-interface - lb.state-machine - lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones - security.gsoap-plugin - / ], - 'jp.server-common' => [ qw/ - lbjp-common.jp-interface lbjp-common.db - / ], - 'jp.ws-interface' => [ qw// ], -); - -for my $ext (keys %deps_aux) { - for (@{$deps_aux{$ext}}) { - /([^:]*)(?::(.*))?/; - push @{$deps{$ext}},$1; - my $type = $2 ? $2 : 'BR'; - $deps_type{$ext}->{$1} = $type; - } -} - - -%extrafull = ( gridsite=>'org.gridsite.core'); - -#( java => 'client-java' ); -%extranodmod = ( - db => 'lbjp-common.db', - jpprimary => 'jp.primary', - jpindex => 'jp.index', - jpclient => 'jp.client', -); - -%obsoletes = ( - 'lb.yaim' => [ qq/glite-yaim-lb/ ], -); - -my @t = qw/lb.client-java jobid.api-java lb.types/; -@topbuild{@t} = (1) x ($#t+1); -} - -sub full -{ - my $short = shift; - return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short; -} - -sub mkinc -{ - my %aux; - undef %aux; - my @m=qw/ -lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB -security.gss security.gsoap-plugin -jobid.api-c jobid.api-cpp jobid.api-java -lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface -jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface -/; - @aux{@m} = (1) x ($#m+1); - - my $short = shift; - my $full = full $short; - - unless ($aux{$short}) { - print "Makefile.inc not needed in $full\n"; - return; - } - - my $build = ''; - - unless ($topbuild{$_}) { - $build = '/build'; - unless (-d "$full/build") { - mkdir "$full/build" or die "mkdir $full/build: $!\n"; - } - unlink "$full/build/Makefile"; - symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n"; - } - - open MKINC,">$full$build/Makefile.inc" - or die "$full$build/Makefile.inc: $!\n"; - - print "Creating $full$build/Makefile.inc\n"; - - print MKINC qq{ -PREFIX = $prefix -stagedir = $stagedir -thrflavour = $thrflavour -nothrflavour = $nothrflavour -libdir = $libdir -}; - - for (@{$need_externs{$short}}) { - print MKINC "${_}_prefix = $extern_prefix{$_}\n" - } - - for (@{$need_jars{$short}}) { - print MKINC "${_}_jar = $jar{$_}\n" - } - - my $need_gsoap = 0; - for (@{$need_externs{$short}}) { $need_gsoap = 1 if $_ eq 'gsoap'; } - - print MKINC "gsoap_default_version=".gsoap_version()."\n" if $need_gsoap; - - close MKINC; -} - -my %etics_externs; -my %etics_projects; -BEGIN{ - %etics_externs = ( - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - gridsite=>'org.gridsite.shared', - lcas=>'org.glite.security.lcas', - trustmanager=>'org.glite.security.trustmanager', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - yaim_core=>'org.glite.yaim.core', - ); - %etics_projects = ( - vdt=>[qw/globus globus_essentials/], - 'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/], - ); -}; - -sub mode_etics { - $fmod = shift; - - die "$0: --module required with --etics\n" unless $fmod; - - my ($subsys,$module) = split /\./,$fmod; - - my ($major,$minor,$rev,$age); - - if ($version) { - $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/; - ($major,$minor,$rev,$age) = ($1,$2,$3,$4); - } - else { - open V,"org.glite.$subsys.$module/project/version.properties" - or die "org.glite.$subsys.$module/project/version.properties: $!\n"; - - while ($_ = ) { - chomp; - ($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/; - $age = $1 if /module\.age\s*=\s*([[:digit:]]+)/; - } - close V; - } - - my @copts = (); - my %ge; - @ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1); - - for (@{$need_externs{"$subsys.$module"}}) { - if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; - } - } - - for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - push @copts,"--with-$_ \${$eext.location}/$_*.jar"; - } - - my $conf; - my $conftag; - - if ($branch) { - $conf = "glite-${subsys}-${module}_$branch"; - $conftag = $branch; - $dwpath = ""; } - else { - $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - $conftag = $conf; - $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n"; } -# my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; - my $file = $output ? $output : "$conf.ini"; - open C,">$file" or die "$file: $!\n"; - - my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build"; - - my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..'; - - my $package_description = ""; - my $package_summary = ""; - - if (-e "org.glite.$subsys.$module/project/package.description") { - open V, "org.glite.$subsys.$module/project/package.description"; - $package_description = join ("", ); - close V; - chomp $package_description; - $package_description =~ s/\n/\\n/g; - $package_description = "package.description = $package_description"; - } - else { - print STDERR "package.description not found for $subsys.$module!\n"; } - - if (-e "org.glite.$subsys.$module/project/package.summary") { - open V, "org.glite.$subsys.$module/project/package.summary"; - $package_summary = join ("", ); - close V; - chomp $package_summary; - $package_summary =~ s/\n/\\n/g; - $package_summary = "package.summary = $package_summary"; - } - else { - print STDERR "package.summary not found for $subsys.$module!\n"; } - - - print STDERR "Writing $file\n"; - print C qq{ -[Configuration-$conf] -profile = None -moduleName = org.glite.$subsys.$module -displayName = $conf -description = org.glite.$subsys.$module -projectName = org.glite -age = $age -deploymentType = None -tag = $conftag -version = $major.$minor.$rev -$dwpath -[Platform-default:VcsCommand] -displayName = None -description = None -tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName} -branch = None -commit = None -checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName} - -[Platform-default:BuildCommand] -postpublish = None -packaging = None -displayName = None -description = None -doc = None -prepublish = None -publish = None -compile = make -init = None -install = make install -clean = make clean -test = make check -configure = cd $confdir && /usr/bin/perl \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts -checkstyle = None - -[Platform-default:Property] -$buildroot -$package_description -$package_summary -}; - for (@{$obsoletes{"$subsys.$module"}}) { - print C "package.obsoletes = $_\n"; - print C "package.replaces = $_\n"; - } - - print C qq{ -[Platform-default:DynamicDependency] -}; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; - } - } - - my $type = $need_externs_type{"$subsys.$module"}->{$_}; - print C "$proj|$eext = $type\n"; - } - - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "org.glite|org.glite.$_ = $type\n"; - } - - close C; -} - -sub gsoap_version { - local $_; - my $gsoap_version; - open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n"; - - while ($_ = ) { - chomp; - - $gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/; - } - close S; - return $gsoap_version; -} - -sub getlibdir { - if ( -e "/etc/debian_version") { # We are on Debian - $lib64="lib"; - $lib32="lib32"; } - else { # Another distribution - $lib64="lib64"; - $lib32="lib"; } - $libdir=$lib32; - - open INP, "uname -s | "; # Check kernel name - $kname= ; - chomp($kname); - close INP; - - if ( $kname == "Linux") { - $arch = ("x86_64\npowerpc\nppc64\n"); - - open INP, "uname -p | "; # Check processor type - $procname= ; - chomp($procname); - close INP; - - if ($arch =~/^$procname\n/) { - return ($lib64); } - - open INP, "uname -m | "; # Check machine hardware - $machname= ; - chomp($machname); - close INP; - - if ($arch =~/^$machname\n/) { - return ($lib64); } - - # special cases (hyperlink lib64, Debian) - if (-l "/usr/lib64") { - $libdir=$lib32; } - - # if /usr/lib64 doesn't exist at all (AIX) - unless ( -e "/usr/lib64" ) { - $libdir=$lib32; } - } - - if ( $kname == "SunOS") { - if (-e "/usr/lib/64") { - $libdir="lib/64"; } - } - - return $libdir; -} - -sub usage { - my @ext = keys %extern_prefix; - my @myjars, keys %jar; - - print STDERR qq{ -usage: $0 options - -General options (defaults in []): - --prefix=PREFIX destination directory [./stage] - --staged=module,module,... what is already in PREFIX (specify without org.glite.) - --thrflavour=flavour - --nothrflavour=flavour threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg] - --listmodules=subsys list modules of a subsystem - --libdir=libdir typically [lib,lib64] postfix - -Mode of operation: - --mode={checkout|build|etics} what to do [build] - -What to build: - --module=module build this module only (mostly in-Etics operation) - --enable-NODE build this "node" (set of modules) only. Available nodes are - @{$lbmodules{lb}},@{$lbmodules{security}} - --disable-NODE don't build this node - --lb-tag=tag checkout LB modules with specific tag - --jp-tag=tag checkout JP modules with specific tag - --lbjp-common-tag=tag checkout lbjp-common modules with specific tag - --security-tag=tag checkout security modules with specific tag - --jobid-tag=tag checkout jobid modules with specific tag - -Dependencies: - --with-EXTERNAL=PATH where to look for an external. Required externals - (not all for all modules) are: - @ext - --with-JAR=JAR where to look for jars. Required jars are: - @myjars - Summary of what will be used is always printed - -}; - -} diff --git a/org.glite.lb.ws-test/examples/ws_comlex.pl b/org.glite.lb.ws-test/examples/ws_comlex.pl deleted file mode 100755 index 851c418..0000000 --- a/org.glite.lb.ws-test/examples/ws_comlex.pl +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/perl -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# version known to support enough from document/literal to work -use SOAP::Lite 0.69; - -use Data::Dumper; - -$ENV{HTTPS_CA_DIR}='/etc/grid-security/certificates'; -$ENV{HTTPS_VERSION}='3'; - -$ENV{HTTPS_CA_FILE}= $ENV{HTTPS_CERT_FILE} = $ENV{HTTPS_KEY_FILE} = - $ENV{X509_USER_PROXY} ? $ENV{X509_USER_PROXY} : "/tmp/x509up_u$<"; - - -$srv = shift; -$when = shift; - -die "usage: $0 service when\n" unless $when; - -$c = SOAP::Lite - -> uri('http://glite.org/wsdl/services/lb') - -> proxy($srv) ; - - -# TODO: replace with $srv/lb/?wsdl once it works -service $c 'http://egee.cesnet.cz/en/WSDL/HEAD/LB.wsdl'; - -$c->serializer->register_ns('http://glite.org/wsdl/types/lb','lbt'); - -ns $c 'http://glite.org/wsdl/elements/lb'; - -$req = SOAP::Data->value( - SOAP::Data->name(conditions => \SOAP::Data->value( - SOAP::Data->name(attr => 'TIME')->type('lbt:queryAttr'), - SOAP::Data->name(statName => 'SUBMITTED')->type('lbt:statName'), - SOAP::Data->name(record=>\SOAP::Data->value( - SOAP::Data->name(op => 'LESS')->type('lbt:queryOp'), - SOAP::Data->name(value1 => \SOAP::Data->value( - SOAP::Data->name(t => \SOAP::Data->value( - SOAP::Data->name(tvSec => $when+1), - SOAP::Data->name(tvUsec => 0), - )) - )) - )) - )), - SOAP::Data->name(conditions => \SOAP::Data->value( - SOAP::Data->name(attr => 'EXITCODE')->type('lbt:queryAttr'), - SOAP::Data->name(record=>\SOAP::Data->value( - SOAP::Data->name(op => 'EQUAL')->type('lbt:queryOp'), - SOAP::Data->name(value1 => \SOAP::Data->value( - SOAP::Data->name(i => $when) - )) - )) - )), - SOAP::Data->name(flags => \SOAP::Data->value( - SOAP::Data->name(flag => 'CLASSADS')->type('lbt:jobFlagsValue'), - SOAP::Data->name(flag => 'CHILDSTAT')->type('lbt:jobFlagsValue') - )), - ); - -on_fault $c sub { print Dumper($_[1]->fault); $fault = 1; }; - -$resp = $c -> QueryJobs($req); - -@res = $resp->paramsout; - -print Dumper(@res),"\n"; - diff --git a/org.glite.lb.ws-test/examples/ws_fault.c b/org.glite.lb.ws-test/examples/ws_fault.c deleted file mode 100644 index 9a48229..0000000 --- a/org.glite.lb.ws-test/examples/ws_fault.c +++ /dev/null @@ -1,72 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#define _GNU_SOURCE 1 - -#include -#include - -#include "soap_version.h" -#include "glite/security/glite_gscompat.h" - -#include "bk_ws_H.h" -#include "bk_ws_Stub.h" - - -#if GSOAP_VERSION >= 20709 - #define GFNUM SOAP_TYPE_lbt__genericFault -#else - #define GFNUM SOAP_TYPE__genericFault -#endif - - -int glite_lb_FaultToErr(const struct soap *soap,char **text) -{ - struct SOAP_ENV__Detail *detail; - struct lbt__genericFault *f; - - if (!soap->fault) { - *text = strdup("SOAP: (no error info)"); - return EINVAL; - } - - detail = soap->version == 2 ? soap->fault->SOAP_ENV__Detail : soap->fault->detail; - if (detail->__type == GFNUM) { -#if GSOAP_VERSION >= 20709 - f = (struct lbt__genericFault *)detail->fault; -#elif GSOAP_VERSION >= 20700 - f = ((struct _genericFault *) detail->fault) - ->lbe__genericFault; -#else - f = ((struct _genericFault *) detail->value) - ->lbe__genericFault; -#endif - if (f && (f->description || f->text)) { - *text = strdup(f->description ? : f->text); - return f->code; - } else { - *text = strdup("no or not parsable error from SOAP"); - return EINVAL; - } - } - else { - if (detail->__any) asprintf(text, "SOAP: %s", detail->__any); - else asprintf(text,"SOAP: %s", soap->version == 2 ? - GLITE_SECURITY_GSOAP_REASON(soap) : soap->fault->faultstring); - return EINVAL; - } -} diff --git a/org.glite.lb.ws-test/examples/ws_fault.h b/org.glite.lb.ws-test/examples/ws_fault.h deleted file mode 100644 index f1333d8..0000000 --- a/org.glite.lb.ws-test/examples/ws_fault.h +++ /dev/null @@ -1,23 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#ifndef __GLITE_LB_WS_FAULT_H__ -#define __GLITE_LB_WS_FAULT_H__ - -int glite_lb_FaultToErr(const struct soap *soap,char **text); - -#endif diff --git a/org.glite.lb.ws-test/examples/ws_getversion.c b/org.glite.lb.ws-test/examples/ws_getversion.c deleted file mode 100644 index 4049344..0000000 --- a/org.glite.lb.ws-test/examples/ws_getversion.c +++ /dev/null @@ -1,103 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include - -#include "glite/security/glite_gsplugin.h" - -#include "bk_ws_H.h" -#include "ws_fault.h" - -#include "soap_version.h" -#if GSOAP_VERSION <= 20602 -#define soap_call___lb__GetVersion soap_call___ns1__GetVersion -#endif - -#include "LoggingAndBookkeeping.nsmap" - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"server", 1, NULL, 'm'}, -}; - -static void usage(char *me) -{ - fprintf(stderr,"usage: %s [option]\n" - "\t-h, --help Shows this screen.\n" - "\t-m, --server BK server address:port.\n" - , me); -} - -int main(int argc,char** argv) -{ - glite_gsplugin_Context gsplugin_ctx; - struct soap soap; - struct _lbe__GetVersion in; - struct _lbe__GetVersionResponse out; - int opt, err; - char *server = "http://localhost:9003/", - *name = NULL; - - - name = strrchr(argv[0],'/'); - if (name) name++; else name = argv[0]; - - while ((opt = getopt_long(argc, argv, "hm:", opts, NULL)) != EOF) switch (opt) - { - case 'h': usage(name); return 0; - case 'm': server = optarg; break; - case '?': usage(name); return 1; - } - - glite_gsplugin_init_context(&gsplugin_ctx); - - soap_init(&soap); - soap_set_namespaces(&soap, namespaces); - - if ( soap_register_plugin_arg(&soap, glite_gsplugin, (void *)gsplugin_ctx) ) - { - soap_print_fault(&soap, stderr); - return 1; - } - - memset(&in, 0, sizeof(in)); - memset(&out, 0, sizeof(out)); - switch (err = soap_call___lb__GetVersion(&soap, server, "", &in, &out)) - { - case SOAP_OK: printf("Server version: %s\n", out.version); break; - case SOAP_FAULT: - case SOAP_SVR_FAULT: - { - char *et; - int err; - - err = glite_lb_FaultToErr(&soap,&et); - fprintf(stderr,"%s: %s (%s)\n",argv[0],strerror(err),et); - exit(1); - } - default: - printf("???, err=%d\n", err); - soap_print_fault(&soap, stderr); - } - - soap_end(&soap); - soap_done(&soap); - glite_gsplugin_free_context(gsplugin_ctx); - - return 0; -} diff --git a/org.glite.lb.ws-test/examples/ws_getversion.pl b/org.glite.lb.ws-test/examples/ws_getversion.pl deleted file mode 100755 index f4479af..0000000 --- a/org.glite.lb.ws-test/examples/ws_getversion.pl +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/perl -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# version known to support enough from document/literal to work -use SOAP::Lite 0.69; - -use Data::Dumper; - -$ENV{HTTPS_CA_DIR}='/etc/grid-security/certificates'; -$ENV{HTTPS_VERSION}='3'; - -$ENV{HTTPS_CA_FILE}= $ENV{HTTPS_CERT_FILE} = $ENV{HTTPS_KEY_FILE} = - $ENV{X509_USER_PROXY} ? $ENV{X509_USER_PROXY} : "/tmp/x509up_u$<"; - -die "usage: $0 https://server:port\n" unless $#ARGV == 0; - -$srv = shift; - - -$c = SOAP::Lite - -> uri('http://glite.org/wsdl/services/lb') - -> proxy("$srv/lb") ; - - -# TODO: replace with $srv/lb/?wsdl once it works -service $c 'http://egee.cesnet.cz/en/WSDL/HEAD/LB.wsdl'; - -ns $c 'http://glite.org/wsdl/elements/lb'; - -on_fault $c sub { print Dumper($_[1]->fault); $fault = 1; }; - -$resp = GetVersion $c; - -print $resp->result,"\n"; - diff --git a/org.glite.lb.ws-test/examples/ws_joblog.c b/org.glite.lb.ws-test/examples/ws_joblog.c deleted file mode 100644 index 57ac405..0000000 --- a/org.glite.lb.ws-test/examples/ws_joblog.c +++ /dev/null @@ -1,145 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include - -#include "soap_version.h" -#include "glite/security/glite_gsplugin.h" -#include "glite/security/glite_gscompat.h" - -#include "bk_ws_H.h" -#include "ws_fault.h" - -#if GSOAP_VERSION <= 20602 -#define soap_call___lb__QueryEvents soap_call___ns1__QueryEvents -#endif - -#include "LoggingAndBookkeeping.nsmap" - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"server", 1, NULL, 'm'}, - {"jobid", 1, NULL, 'j'} -}; - -static void usage(char *me) -{ - fprintf(stderr,"usage: %s [option]\n" - "\t-h, --help Shows this screen.\n" - "\t-m, --server BK server address:port.\n" - "\t-j, --jobid ID of requested job.\n" - , me); -} - -int main(int argc,char** argv) -{ - glite_gsplugin_Context gsplugin_ctx; - struct soap *mydlo = soap_new(); - struct _lbe__QueryEventsResponse out,*outp = &out; - struct _lbe__QueryEvents in; - int opt, err; - char *server = "http://localhost:9003/", - *jobid = NULL, - *name = NULL; - - - struct lbt__queryConditions *qcp; - struct lbt__queryRecord *qrp; - struct lbt__queryRecValue qv; - - name = strrchr(argv[0],'/'); - if (name) name++; else name = argv[0]; - - while ((opt = getopt_long(argc, argv, "hm:j:", opts, NULL)) != EOF) switch (opt) - { - case 'h': usage(name); return 0; - case 'm': server = optarg; break; - case 'j': jobid = optarg; break; - case '?': usage(name); return 1; - } - - if ( !jobid ) - { - printf("jobid should be given\n"); - usage(name); - return 1; - } - - glite_gsplugin_init_context(&gsplugin_ctx); - - soap_set_namespaces(mydlo, namespaces); - if ( soap_register_plugin_arg(mydlo, glite_gsplugin, (void *)gsplugin_ctx) ) - { - soap_print_fault(mydlo, stderr); - return 1; - } - - GLITE_SECURITY_GSOAP_LIST_CREATE(mydlo, &in, jobConditions, struct lbt__queryConditions, 1); - qcp = GLITE_SECURITY_GSOAP_LIST_GET(in.jobConditions, 0); - in.eventConditions = NULL; - in.__sizeeventConditions = 0; - - memset(qcp,0,sizeof(*qcp)); - qcp->attr = lbt__queryAttr__JOBID; - GLITE_SECURITY_GSOAP_LIST_CREATE(mydlo, qcp, record, struct lbt__queryRecord, 1); - qrp = GLITE_SECURITY_GSOAP_LIST_GET(qcp->record, 0); - - memset(qrp,0,sizeof(*qrp)); - qrp->op = lbt__queryOp__EQUAL; - qrp->value1 = &qv; - - GLITE_SECURITY_GSOAP_CHOICE_SET(&qv,c,lbt,queryRecValue,2,jobid); - -// qv.__union_2 = SOAP_UNION_lbt__union_2_c; -// qv.union_2.c = jobid; - - switch (err = soap_call___lb__QueryEvents(mydlo, server, "",&in,&out)) - { - case SOAP_OK: - { - struct soap *outsoap = soap_new(); - outsoap->sendfd = 1; - - soap_serialize_PointerTo_lbe__QueryEventsResponse(outsoap,&outp); - soap_begin_send(outsoap); - soap_put_PointerTo_lbe__QueryEventsResponse(outsoap,&outp,"joblog","http://glite.org/wsdl/elements/lb:QueryJobsResponse"); - - break; - } - case SOAP_FAULT: - case SOAP_SVR_FAULT: - { - char *et; - int err; - - err = glite_lb_FaultToErr(mydlo,&et); - fprintf(stderr,"%s: %s (%s)\n",argv[0],strerror(err),et); - soap_done(mydlo); - exit(1); - } - default: - fprintf(stderr,"err = %d\n",err); - soap_print_fault(mydlo,stderr); - } - - soap_end(mydlo/*, out.events*/); - soap_done(mydlo); - free(mydlo); - glite_gsplugin_free_context(gsplugin_ctx); - return 0; -} diff --git a/org.glite.lb.ws-test/examples/ws_joblog.pl b/org.glite.lb.ws-test/examples/ws_joblog.pl deleted file mode 100755 index 04d93f5..0000000 --- a/org.glite.lb.ws-test/examples/ws_joblog.pl +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/perl -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# version known to support enough from document/literal to work -use SOAP::Lite 0.69; - -use Data::Dumper; - -$ENV{HTTPS_CA_DIR}='/etc/grid-security/certificates'; -$ENV{HTTPS_VERSION}='3'; - -$ENV{HTTPS_CA_FILE}= $ENV{HTTPS_CERT_FILE} = $ENV{HTTPS_KEY_FILE} = - $ENV{X509_USER_PROXY} ? $ENV{X509_USER_PROXY} : "/tmp/x509up_u$<"; - -die "usage: $0 jobid\n" unless $#ARGV == 0; - -$job = shift; - -$job =~ ?https://([^:]*):([0-9]*)/(.*)?; -$port = $2 + 3; -$srv = "https://$1:$port/lb"; - - -$c = SOAP::Lite - -> uri('http://glite.org/wsdl/services/lb') - -> proxy($srv) ; - - -# TODO: replace with $srv/lb/?wsdl once it works -service $c 'http://egee.cesnet.cz/en/WSDL/HEAD/LB.wsdl'; - -$c->serializer->register_ns('http://glite.org/wsdl/types/lb','lbt'); - -ns $c 'http://glite.org/wsdl/elements/lb'; - -$req = SOAP::Data->value( - SOAP::Data->name(jobConditions => \SOAP::Data->value( - SOAP::Data->name(attr => 'JOBID')->type('lbt:queryAttr'), - SOAP::Data->name(record => \SOAP::Data->value( - SOAP::Data->name(op => 'EQUAL')->type('lbt:queryOp'), - SOAP::Data->name(value1 => \SOAP::Data->value( - SOAP::Data->name(c => $job) - )) - )) - )), - ); - -on_fault $c sub { print Dumper($_[1]->fault); $fault = 1; }; - -$resp = $c -> QueryEvents($req); - -print Dumper($resp->result),"\n"; - diff --git a/org.glite.lb.ws-test/examples/ws_jobstat.c b/org.glite.lb.ws-test/examples/ws_jobstat.c deleted file mode 100644 index 7c4d040..0000000 --- a/org.glite.lb.ws-test/examples/ws_jobstat.c +++ /dev/null @@ -1,126 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include - -#include "soap_version.h" -#include "glite/security/glite_gsplugin.h" -#include "glite/security/glite_gscompat.h" - -#include "bk_ws_H.h" -#include "ws_fault.h" - -#if GSOAP_VERSION <= 20602 -#define soap_call___lb__JobStatus soap_call___ns1__JobStatus -#endif - -#include "LoggingAndBookkeeping.nsmap" - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"server", 1, NULL, 'm'}, - {"jobid", 1, NULL, 'j'} -}; - -static void usage(char *me) -{ - fprintf(stderr,"usage: %s [option]\n" - "\t-h, --help Shows this screen.\n" - "\t-m, --server BK server address:port.\n" - "\t-j, --jobid ID of requested job.\n" - , me); -} - -int main(int argc,char** argv) -{ - glite_gsplugin_Context gsplugin_ctx; - struct soap *mydlo = soap_new(); - struct _lbe__JobStatusResponse out; - struct _lbe__JobStatus in; - int opt, err; - char *server = "http://localhost:9003/", - *jobid = NULL, - *name = NULL; - - - name = strrchr(argv[0],'/'); - if (name) name++; else name = argv[0]; - - while ((opt = getopt_long(argc, argv, "hm:j:", opts, NULL)) != EOF) switch (opt) - { - case 'h': usage(name); return 0; - case 'm': server = optarg; break; - case 'j': jobid = optarg; break; - case '?': usage(name); return 1; - } - - if ( !jobid ) - { - printf("jobid should be given\n"); - usage(name); - return 1; - } - - soap_set_namespaces(mydlo, namespaces); - glite_gsplugin_init_context(&gsplugin_ctx); - - if ( soap_register_plugin_arg(mydlo, glite_gsplugin, (void *)gsplugin_ctx) ) - { - soap_print_fault(mydlo, stderr); - return 1; - } - - - in.jobid = soap_strdup(mydlo, jobid); - in.flags = NULL; - - switch (err = soap_call___lb__JobStatus(mydlo, server, "",&in,&out)) - { - case SOAP_OK: - { - struct soap *outsoap = soap_new();; - - outsoap->sendfd = 1; - soap_serialize_PointerTolbt__jobStatus(outsoap,&out.stat); - soap_begin_send(outsoap); - soap_put_PointerTolbt__jobStatus(outsoap,&out.stat,"status","http://glite.org/wsdl/types/lb:jobStatus"); - soap_end_send(outsoap); - } - break; - case SOAP_FAULT: - case SOAP_SVR_FAULT: - { - char *et; - int err; - - err = glite_lb_FaultToErr(mydlo,&et); - fprintf(stderr,"%s: %s (%s)\n",argv[0],strerror(err),et); - exit(1); - } - default: - fprintf(stderr,"err = %d\n",err); - soap_print_fault(mydlo,stderr); - } - - soap_end(mydlo); - soap_done(mydlo); - free(mydlo); - glite_gsplugin_free_context(gsplugin_ctx); - - return 0; -} diff --git a/org.glite.lb.ws-test/examples/ws_jobstat.pl b/org.glite.lb.ws-test/examples/ws_jobstat.pl deleted file mode 100755 index 180edc8..0000000 --- a/org.glite.lb.ws-test/examples/ws_jobstat.pl +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/perl -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# version known to support enough from document/literal to work -use SOAP::Lite 0.69; - -use Data::Dumper; - -$ENV{HTTPS_CA_DIR}='/etc/grid-security/certificates'; -$ENV{HTTPS_VERSION}='3'; - -$ENV{HTTPS_CA_FILE}= $ENV{HTTPS_CERT_FILE} = $ENV{HTTPS_KEY_FILE} = - $ENV{X509_USER_PROXY} ? $ENV{X509_USER_PROXY} : "/tmp/x509up_u$<"; - -die "usage: $0 jobid\n" unless $#ARGV == 0; - -$job = shift; - -$job =~ ?https://([^:]*):([0-9]*)/(.*)?; -$port = $2 + 3; -$srv = "https://$1:$port/lb"; - - -$c = SOAP::Lite - -> uri('http://glite.org/wsdl/services/lb') - -> proxy($srv) ; - - -# TODO: replace with $srv/lb/?wsdl once it works -service $c 'http://egee.cesnet.cz/en/WSDL/HEAD/LB.wsdl'; - -$c->serializer->register_ns('http://glite.org/wsdl/types/lb','lbt'); - -ns $c 'http://glite.org/wsdl/elements/lb'; - -$req = SOAP::Data->value( - SOAP::Data->name(jobid => $job), - SOAP::Data->name(flags => \SOAP::Data->value( - SOAP::Data->name(flag => 'CLASSADS')->type('lbt:jobFlagsValue'), - SOAP::Data->name(flag => 'CHILDSTAT')->type('lbt:jobFlagsValue') - )), - ); - -on_fault $c sub { print Dumper($_[1]->fault); $fault = 1; }; - -$resp = $c -> JobStatus($req); - -print Dumper($resp->result),"\n"; - diff --git a/org.glite.lb.ws-test/examples/ws_lb4agu_GetActivityInfo.c b/org.glite.lb.ws-test/examples/ws_lb4agu_GetActivityInfo.c deleted file mode 100644 index 40921b6..0000000 --- a/org.glite.lb.ws-test/examples/ws_lb4agu_GetActivityInfo.c +++ /dev/null @@ -1,127 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include - -#include "soap_version.h" -#include "glite/security/glite_gsplugin.h" -#include "glite/security/glite_gscompat.h" - -#include "bk_ws_H.h" -#include "ws_fault.h" - -#include "LoggingAndBookkeeping.nsmap" - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"server", 1, NULL, 'm'}, - {"jobid", 1, NULL, 'j'} -}; - -static void usage(char *me) -{ - fprintf(stderr,"usage: %s [option]\n" - "\t-h, --help Shows this screen.\n" - "\t-m, --server BK server address:port.\n" - "\t-j, --jobid ID of requested job.\n" - , me); -} - -int main(int argc,char** argv) -{ - glite_gsplugin_Context gsplugin_ctx; - struct soap *mydlo = soap_new(); - struct _lb4ague__GetActivityInfoRequest *in; - struct _lb4ague__GetActivityInfoResponse *out; - int opt, err; - char *server = "http://localhost:9003/", - *jobid = NULL, - *name = NULL; - int ret_code = 1; - - - name = strrchr(argv[0],'/'); - if (name) name++; else name = argv[0]; - - while ((opt = getopt_long(argc, argv, "hm:j:", opts, NULL)) != EOF) switch (opt) - { - case 'h': usage(name); return 0; - case 'm': server = optarg; break; - case 'j': jobid = optarg; break; - case '?': usage(name); return 1; - } - - if ( !jobid ) - { - printf("jobid should be given\n"); - usage(name); - return 1; - } - - soap_set_namespaces(mydlo, namespaces); - glite_gsplugin_init_context(&gsplugin_ctx); - - if ( soap_register_plugin_arg(mydlo, glite_gsplugin, (void *)gsplugin_ctx) ) - { - soap_print_fault(mydlo, stderr); - return 1; - } - - - in = soap_malloc(mydlo, sizeof(*in)); - out = soap_malloc(mydlo, sizeof(*out)); - in->id = soap_malloc(mydlo,sizeof(in->id[0])); - in->id[0] = soap_strdup(mydlo, jobid); - in->__sizeid = 1; - - switch (err = soap_call___lb4agu__GetActivityInfo(mydlo, server, "",in,out)) { - case SOAP_OK: - { - struct soap *outsoap = soap_new();; - - outsoap->sendfd = 1; - soap_serialize_PointerTo_lb4ague__GetActivityInfoResponse(outsoap,&out); - soap_begin_send(outsoap); - soap_put_PointerTo_lb4ague__GetActivityInfoResponse(outsoap,&out,"status","http://glite.org/wsdl/services/lb4agu:GetActivityInfoResponse"); - soap_end_send(outsoap); - - ret_code = 0; - } - break; - case SOAP_FAULT: - case SOAP_SVR_FAULT: - { - char *et; - int err; - - err = glite_lb_FaultToErr(mydlo,&et); - fprintf(stderr,"%s: %s (%s)\n",argv[0],strerror(err),et); - } - break; - default: - fprintf(stderr,"err = %d\n",err); - soap_print_fault(mydlo,stderr); - } - - soap_end(mydlo); - soap_done(mydlo); - free(mydlo); - glite_gsplugin_free_context(gsplugin_ctx); - - return ret_code; -} diff --git a/org.glite.lb.ws-test/examples/ws_lb4agu_GetActivityStatus.c b/org.glite.lb.ws-test/examples/ws_lb4agu_GetActivityStatus.c deleted file mode 100644 index 1a1daee..0000000 --- a/org.glite.lb.ws-test/examples/ws_lb4agu_GetActivityStatus.c +++ /dev/null @@ -1,127 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include - -#include "soap_version.h" -#include "glite/security/glite_gsplugin.h" -#include "glite/security/glite_gscompat.h" - -#include "bk_ws_H.h" -#include "ws_fault.h" - -#include "LoggingAndBookkeeping.nsmap" - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"server", 1, NULL, 'm'}, - {"jobid", 1, NULL, 'j'} -}; - -static void usage(char *me) -{ - fprintf(stderr,"usage: %s [option]\n" - "\t-h, --help Shows this screen.\n" - "\t-m, --server BK server address:port.\n" - "\t-j, --jobid ID of requested job.\n" - , me); -} - -int main(int argc,char** argv) -{ - glite_gsplugin_Context gsplugin_ctx; - struct soap *mydlo = soap_new(); - struct _lb4ague__GetActivityStatusRequest *in; - struct _lb4ague__GetActivityStatusResponse *out; - int opt, err; - char *server = "http://localhost:9003/", - *jobid = NULL, - *name = NULL; - int ret_code = 1; - - - name = strrchr(argv[0],'/'); - if (name) name++; else name = argv[0]; - - while ((opt = getopt_long(argc, argv, "hm:j:", opts, NULL)) != EOF) switch (opt) - { - case 'h': usage(name); return 0; - case 'm': server = optarg; break; - case 'j': jobid = optarg; break; - case '?': usage(name); return 1; - } - - if ( !jobid ) - { - printf("jobid should be given\n"); - usage(name); - return 1; - } - - soap_set_namespaces(mydlo, namespaces); - glite_gsplugin_init_context(&gsplugin_ctx); - - if ( soap_register_plugin_arg(mydlo, glite_gsplugin, (void *)gsplugin_ctx) ) - { - soap_print_fault(mydlo, stderr); - return 1; - } - - - in = soap_malloc(mydlo, sizeof(*in)); - in->id = soap_malloc(mydlo, 1 * sizeof(char *)); - in->id[0] = soap_strdup(mydlo, jobid); - in->__sizeid = 1; - out = soap_malloc(mydlo, sizeof(*out)); - - switch (err = soap_call___lb4agu__GetActivityStatus(mydlo, server, "",in,out)) { - case SOAP_OK: - { - struct soap *outsoap = soap_new();; - - outsoap->sendfd = 1; - soap_serialize_PointerTo_lb4ague__GetActivityStatusResponse(outsoap,&out); - soap_begin_send(outsoap); - soap_put_PointerTo_lb4ague__GetActivityStatusResponse(outsoap,&out,"status","http://glite.org/wsdl/services/lb4agu:GetActivityStatusResponse"); - soap_end_send(outsoap); - - ret_code = 0; - } - break; - case SOAP_FAULT: - case SOAP_SVR_FAULT: - { - char *et; - int err; - - err = glite_lb_FaultToErr(mydlo,&et); - fprintf(stderr,"%s: %s (%s)\n",argv[0],strerror(err),et); - } - break; - default: - fprintf(stderr,"err = %d\n",err); - soap_print_fault(mydlo,stderr); - } - - soap_end(mydlo); - soap_done(mydlo); - free(mydlo); - glite_gsplugin_free_context(gsplugin_ctx); - - return ret_code; -} diff --git a/org.glite.lb.ws-test/examples/ws_lb4agu_GetActivityStatus.pl b/org.glite.lb.ws-test/examples/ws_lb4agu_GetActivityStatus.pl deleted file mode 100755 index 966a813..0000000 --- a/org.glite.lb.ws-test/examples/ws_lb4agu_GetActivityStatus.pl +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/perl -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# version known to support enough from document/literal to work -#use SOAP::Lite 0.69; -use SOAP::Lite; - -use Data::Dumper; - -$ENV{HTTPS_CA_DIR}='/etc/grid-security/certificates'; -$ENV{HTTPS_VERSION}='3'; - -$ENV{HTTPS_CA_FILE}= $ENV{HTTPS_CERT_FILE} = $ENV{HTTPS_KEY_FILE} = - $ENV{X509_USER_PROXY} ? $ENV{X509_USER_PROXY} : "/tmp/x509up_u$<"; - -die "usage: $0 jobid\n" unless $#ARGV == 0; - -$job = shift; - -$job =~ ?https://([^:]*):([0-9]*)/(.*)?; -$port = $2 + 3; -$srv = "https://$1:$port/lb"; - - -$c = SOAP::Lite - -> uri('http://glite.org/wsdl/services/lb') - -> proxy($srv) ; - - -# TODO: replace with $srv/lb/?wsdl once it works -service $c "file://$ENV{PWD}/LB.wsdl"; - -$c->serializer->register_ns('http://glite.org/wsdl/services/lb4agu','lb4agu'); -# ns $c 'http://glite.org/wsdl/elements/lb'; - -$req = SOAP::Data->value( - SOAP::Data->name(id => $job), - ); - -on_fault $c sub { print Dumper($_[1]->fault); $fault = 1; }; - -$resp = $c -> GetActivityStatus($req); - -print Dumper($resp->result),"\n"; - diff --git a/org.glite.lb.ws-test/examples/ws_query_ex.c b/org.glite.lb.ws-test/examples/ws_query_ex.c deleted file mode 100644 index e2e2ff1..0000000 --- a/org.glite.lb.ws-test/examples/ws_query_ex.c +++ /dev/null @@ -1,231 +0,0 @@ -/* -Copyright (c) Members of the EGEE Collaboration. 2004-2010. -See http://www.eu-egee.org/partners for details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#include -#include - -#include "glite/lb/consumer.h" - -#include "soap_version.h" -#include "glite/security/glite_gsplugin.h" -#include "glite/security/glite_gscompat.h" - -#include "bk_ws_H.h" -#include "ws_fault.h" -#include "ws_typeref.h" - -#if GSOAP_VERSION <= 20602 -#define soap_call___lb__QueryJobs soap_call___ns1__QueryJobs -#endif - -#include "LoggingAndBookkeeping.nsmap" - - -static struct option opts[] = { - {"help", 0, NULL, 'h'}, - {"server", 1, NULL, 'm'} -}; - -static void usage(char *me) -{ - fprintf(stderr,"usage: %s [option]\n" - "\t-h, --help Shows this screen.\n" - "\t-m, --server BK server address:port.\n" - , me); -} - -static void printstat(edg_wll_JobStat stat, int level); - -int main(int argc,char** argv) -{ - edg_wll_Context ctx; - glite_gsplugin_Context gsplugin_ctx; - edg_wll_QueryRec **conditions = NULL; - struct soap *soap = soap_new(); - struct _lbe__QueryJobs *qjobs = NULL; - struct _lbe__QueryJobsResponse out; - int opt, err; - char *server = "http://localhost:9003/", - *name = NULL; - int i; - - name = strrchr(argv[0],'/'); - if (name) name++; else name = argv[0]; - - while ((opt = getopt_long(argc, argv, "hm:", opts, NULL)) != EOF) switch (opt) - { - case 'h': usage(name); return 0; - case 'm': server = optarg; break; - case '?': usage(name); return 1; - } - - edg_wll_InitContext(&ctx); - glite_gsplugin_init_context(&gsplugin_ctx); - soap_set_namespaces(soap, namespaces); - if ( soap_register_plugin_arg(soap, glite_gsplugin, (void *)gsplugin_ctx) ) - { - soap_print_fault(soap, stderr); - return 1; - } - - glite_gsplugin_set_udata(soap, ctx); - - conditions = (edg_wll_QueryRec **)calloc(3,sizeof(edg_wll_QueryRec *)); - - conditions[0] = (edg_wll_QueryRec *)calloc(2,sizeof(edg_wll_QueryRec)); - conditions[0][0].attr = EDG_WLL_QUERY_ATTR_STATUS; - conditions[0][0].op = EDG_WLL_QUERY_OP_UNEQUAL; - conditions[0][0].value.i = EDG_WLL_JOB_DONE; - - conditions[1] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); - conditions[1][0].attr = EDG_WLL_QUERY_ATTR_OWNER; -#warning FIXME: NULL should work, use optional in WSDL? -// conditions[1][0].op = EDG_WLL_QUERY_OP_EQUAL; -// conditions[1][0].value.c = NULL; - conditions[1][0].op = EDG_WLL_QUERY_OP_UNEQUAL; - conditions[1][0].value.c = "x"; - - qjobs = soap_malloc(soap, sizeof(*qjobs)); - memset(qjobs, 0, sizeof(*qjobs)); - qjobs->flags = soap_malloc(soap, sizeof(*qjobs->flags)); - memset(qjobs->flags, 0, sizeof(*qjobs->flags)); - if (!qjobs->flags || edg_wll_QueryCondsExtToSoap(soap, (const edg_wll_QueryRec **)conditions, &qjobs->__sizeconditions, &qjobs->conditions) - || edg_wll_JobStatFlagsToSoap(soap, EDG_WLL_STAT_CLASSADS || EDG_WLL_STAT_CHILDREN || EDG_WLL_STAT_CHILDSTAT, qjobs->flags) ) { - char *et,*ed; - - fprintf(stderr, "%s: soap types conversion error...\n", argv[0]); - edg_wll_FaultToErr(soap, ctx); - edg_wll_Error(ctx, &et, &ed); - fprintf(stderr, "%s: %s (%s)\n", argv[0], et, ed); - exit(1); - } - - for (i = 0; conditions[i]; i++) free(conditions[i]); - free(conditions); - - err = soap_call___lb__QueryJobs(soap, server, "", qjobs, &out); - switch ( err ) { - case SOAP_OK: { - int i; - - printf("Query succesfull...\n"); - printf("%-65s%s\n\n", "jobid", "state"); - for ( i = 0; i < out.__sizejobs; i++ ) { - edg_wll_JobStatCode statCode; - - - edg_wll_SoapToJobStatCode(GLITE_SECURITY_GSOAP_LIST_GET(out.states, i)->state, &statCode); - char *s = edg_wll_StatToString(statCode); - printf("%-65s%s\n", out.jobs[i], s); - free(s); - } - } - break; - case SOAP_FAULT: - case SOAP_SVR_FAULT: { - char *et,*ed; - - edg_wll_FaultToErr(soap, ctx); - edg_wll_Error(ctx,&et,&ed); - fprintf(stderr,"%s: %s (%s)\n",argv[0],et,ed); - exit(1); - } - default: - fprintf(stderr,"err = %d\n",err); - soap_print_fault(soap,stderr); - } - - soap_end(soap); - soap_done(soap); - free(soap); - glite_gsplugin_free_context(gsplugin_ctx); - edg_wll_FreeContext(ctx); - - return 0; -} - -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("%ssubjob_failed : %d\n", ind, stat.subjob_failed); - printf("%sdone_code : %d\n", ind, 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); -} diff --git a/org.glite.lb.ws-test/examples/ws_status_history_test.sh b/org.glite.lb.ws-test/examples/ws_status_history_test.sh deleted file mode 100755 index 5ec8529..0000000 --- a/org.glite.lb.ws-test/examples/ws_status_history_test.sh +++ /dev/null @@ -1,101 +0,0 @@ -#! /bin/bash -# -# Copyright (c) Members of the EGEE Collaboration. 2004-2010. -# See http://www.eu-egee.org/partners for details on the copyright holders. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# -# bug #29165: Times in job status history downloaded from LB are schifted -# -# description: -# Test compares returned history from: -# - official job status example (C API) -# - WS call (gsoap) -# - WS XML response message (gsoap) -# -# requirements: -# - stage area, default `pwd` -# - built WS LB server examples -# - gsoap-plugin in stage built with 'make DEBUG="-DDEBUG"' -# - running LB server, LB locallogger, and LB interlogger -# - proxy certificate for logging and querying -# - -STAGE_LOCATION=${STAGE_LOCATION:-`pwd`} -WS_EXAMPLES_LOCATION=${WS_EXAMPLES_LOCATION:-$STAGE_LOCATION/../org.glite.lb.server/build} -LBSERVER=${LBSERVER:-`hostname -f`:9000} -LBLOGGER=${LBLOGGER:-`hostname -f`:9002} - -script=$(EDG_WL_LOG_DESTINATION=$LBLOGGER $STAGE_LOCATION/examples/glite-lb-submitted.sh -m $LBSERVER 2>log | tail -n 1) -eval $script -test -z "$EDG_JOBID" && exit 2 - -echo "jobid: $EDG_JOBID" -EDG_WL_LOG_DESTINATION=$LBLOGGER $STAGE_LOCATION/examples/glite-lb-waiting.sh -j $EDG_JOBID 2>>log|| exit 3 -sleep 1 -EDG_WL_LOG_DESTINATION=$LBLOGGER $STAGE_LOCATION/examples/glite-lb-ready.sh -j $EDG_JOBID 2>>log|| exit 4 -sleep 1 -EDG_WL_LOG_DESTINATION=$LBLOGGER $STAGE_LOCATION/examples/glite-lb-done.sh -j $EDG_JOBID 2>>log|| exit 5 -sleep 1 -EDG_WL_LOG_DESTINATION=$LBLOGGER $STAGE_LOCATION/examples/glite-lb-cleared.sh -j $EDG_JOBID 2>>log|| exit 6 -sleep 1 -rm -f log - -# C API -status="`TZ=C $STAGE_LOCATION/examples/glite-lb-job_status $EDG_JOBID`" -if test x$(echo "$status" | grep '^state[ :]' | sed -e 's/^.*:[ ]*\(.*\)/\1/') != xCleared; then - echo "ERROR: Expected Cleared status of $EDG_JOBID" - exit 7 -fi -echo "$status" | grep '^stateEnterTimes[ :]' -A 12 > hist-c.txt - -# WS call result -rm -f RECV.log SENT.log TEST.log -TZ=C $WS_EXAMPLES_LOCATION/ws_jobstat -j $EDG_JOBID | grep stateEnterTimes -A 12 > hist-ws.txt -diff -u hist-c.txt hist-ws.txt -ret1=$? -if [ "$ret1" != "0" ]; then - echo "FAILED: WS and C API results differs" -fi - -# WS XML message -if [ ! -s "RECV.log" ]; then - echo "WARNING: RECV.log not found, WS/XML not compared" - exit $ret1 -fi -echo "stateEnterTimes : " > hist-ws-recv.txt -echo " Undefined - not available -" >> hist-ws-recv.txt -grep '^[ \t]*<' RECV.log | xmllint --format - | grep -A3 '' | grep '\|' | tr '\n' ' ' | sed -e 's/<\/time>/<\/time>\n/g' | while read statexml timexml; do - state=`echo $statexml | tr '\n' ' ' | sed -e 's/.*\(.*\)<\/state>.*/\1/'` - time=`echo $timexml | tr '\n' ' ' | sed -e 's/.*
  • %s\r\n", - pomB, chid,chid); - - free(chid); - free(pomB); - pomB = pomA; - i++; - } - - char *ret; - asprintf(&ret, "\r\n\t\r\n"); - pomA = ret; - if (pomB[0]){ - asprintf(&ret, "%s

    User jobs

    \r\n" - "
      %s
    ", - pomA, pomB - ); - free(pomA); - free(pomB); - } - pomA = ret; - asprintf(&ret, "%sUser subject: %s

    " - "\t\r\n", - pomA, ctx->peerName?ctx->peerName: "<anonymous>" - ); - free(pomA); - - *message = ret; - - return 0; -} - -int edg_wll_UserNotifsToHTML(edg_wll_Context ctx UNUSED_VAR, char **notifids, char **message){ - char *pomA = NULL, *pomB = NULL; - pomB = strdup(""); - - int i = 0; - while(notifids && notifids[i]){ - asprintf(&pomA, "%s\t\t