From c8f32e05864aeea72d36c89be59e0f965c44728a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Milo=C5=A1=20Mula=C4=8D?= Date: Fri, 12 Aug 2005 10:56:25 +0000 Subject: [PATCH] void IS server - seems compiling --- org.glite.jp.index/Makefile | 67 +++-- .../project/configure.properties.xml | 5 + org.glite.jp.index/src/bones_server.c | 272 +++++++++++++++++++++ org.glite.jp.index/src/conf.c | 15 ++ org.glite.jp.index/src/conf.h | 17 ++ org.glite.jp.index/src/soap_ops.c | 39 +-- org.glite.jp.index/src/typemap.dat | 1 + 7 files changed, 376 insertions(+), 40 deletions(-) create mode 100644 org.glite.jp.index/src/bones_server.c create mode 100644 org.glite.jp.index/src/conf.c create mode 100644 org.glite.jp.index/src/conf.h diff --git a/org.glite.jp.index/Makefile b/org.glite.jp.index/Makefile index 3b893cd..f0896b5 100644 --- a/org.glite.jp.index/Makefile +++ b/org.glite.jp.index/Makefile @@ -23,15 +23,17 @@ CC=gcc -include Makefile.inc -VPATH=${top_srcdir}/src:${top_srcdir}/examples:${top_srcdir}/test:${top_srcdir}/project:${jpproject} +VPATH=${top_srcdir}/src:${top_srcdir}/examples:${top_srcdir}/test:${top_srcdir}/project:${jpproject}:${stagedir}/interface GLOBUS_LIBS:=-L${globus_prefix}/lib \ -lglobus_common_${nothrflavour} \ -lglobus_gssapi_gsi_${nothrflavour} +GLOBUS_CFLAGS:=-I${globus_prefix}/include/${nothrflavour} + DEBUG:=-g -O0 -DDEBUG -CFLAGS:=${DEBUG} -I. -I${gsoap_prefix}/include -I${stagedir}/include +CFLAGS:=${DEBUG} -I. -I${top_srcdir}/interface -I${top_srcdir}/src -I${gsoap_prefix}/include -I${stagedir}/include ${GLOBUS_CFLAGS} -I${mysql_prefix}/include -I${mysql_prefix}/include/mysql LDFLAGS:=-L${stagedir}/lib LINK:=libtool --mode=link ${CC} ${LDFLAGS} @@ -40,46 +42,58 @@ INSTALL:=libtool --mode=install install daemon:=glite-jp-indexd -example:=jpis-test soap_prefix:=jpis_ -SRCS:= simple_server.c soap_ops.c \ +SRCS:= conf.c bones_server.c soap_ops.c \ ${soap_prefix}C.c \ - ${soap_prefix}Server.c + ${soap_prefix}ServerLib.c \ + ${soap_prefix}ClientLib.c -EXA_SRCS:=jpis-test.c ${soap_prefix}C.c ${soap_prefix}Client.c +OBJS:=${SRCS:.c=.o} -OBJS:=${SRCS:.c=.o} stdsoap2.o -EXA_OBJS:=${EXA_SRCS:.c=.o} stdsoap2.o COMMONLIB:=-lglite_jp_common +BONESLIB:=-lglite_lb_server_bones +GSOAPLIB:=-lglite_security_gsoap_plugin_${nothrflavour} -lglite_security_gss_${nothrflavour} \ + -L${gsoap_prefix}/lib -lgsoap${GSOAP_DEBUG} -L${ares_prefix}/lib -lares +TRIOLIB:=-lglite_lb_trio + +ifneq (${mysql_prefix},/usr) + ifeq ($(shell echo ${mysql_version} | cut -d. -f1,2),4.1) + MYSQLIB := -L${mysql_prefix}/lib/mysql -lmysqlclient + else + MYSQLIB := -L${mysql_prefix}/lib -lmysqlclient + endif +else + MYSQLIB := -lmysqlclient +endif + default all: compile -compile: ${daemon} ${example} +compile: ${daemon} ${daemon}: ${OBJS} - ${LINK} -o $@ ${OBJS} ${COMMONLIB} ${GLOBUS_LIBS} + ${LINK} -o $@ -export-dynamic ${OBJS} ${BONESLIB} ${TRIOLIB} ${COMMONLIB} ${GSOAPLIB} ${GLOBUS_LIBS} ${MYSQLIB} -${example}: ${EXA_OBJS} - ${LINK} -o $@ ${EXA_OBJS} JobProvenanceIS.xh: JobProvenanceIS.wsdl JobProvenanceTypes.wsdl typemap.dat - cp ${jpproject}/JobProvenanceTypes.wsdl . + cp ${stagedir}/interface/JobProvenanceTypes.wsdl . ${gsoap_prefix}/bin/wsdl2h -t ${top_srcdir}/src/typemap.dat -c -o $@ $< rm -f JobProvenanceTypes.wsdl +${soap_prefix}ClientLib.c ${soap_prefix}Client.c \ +${soap_prefix}Server.c ${soap_prefix}ServerLib.c \ ${soap_prefix}C.c ${soap_prefix}H.h: JobProvenanceIS.xh - ${gsoap_prefix}/bin/soapcpp2 -w -c -p ${soap_prefix} JobProvenanceIS.xh - -#$(SOAP_PREFIX)H.h $(SOAP_PREFIX)C.c: LB.xh -# $(GSOAP_BIN_PATH)/soapcpp2 -w -c -p $(SOAP_PREFIX) LB.xh -# -#LB.xh: LB.wsdl typemap.dat -# $(GSOAP_BIN_PATH)/wsdl2h -c -o $@ LB.wsdl -# + ${gsoap_prefix}/bin/soapcpp2 -n -w -c -p ${soap_prefix} JobProvenanceIS.xh +#env_C.c env_Server.c: +# touch env.xh +# cp ${stagedir}/interface/JobProvenanceTypes.wsdl . +# ${gsoap_prefix}/bin/wsdl2h -t ${top_srcdir}/src/typemap.dat -c -o env.xh JobProvenanceTypes.wsdl +# rm -f JobProvenanceTypes.wsdl +# ${gsoap_prefix}/bin/soapcpp2 -w -c -p env_ env.xh check: -echo nothing yet @@ -102,7 +116,7 @@ distbin: $(MAKE) install PREFIX=`pwd`/tmpbuilddir${stagedir} save_dir=`pwd`; cd tmpbuilddir${stagedir} && tar -czf $$save_dir/${top_srcdir}/${distdir}/${package}-${version}_bin.tar.gz *; cd $$save_dir rm -rf tmpbuilddir - + install: -mkdir -p ${PREFIX}/bin ${PREFIX}/etc ${PREFIX}/etc/init.d for p in bkserverd bkindex; do \ @@ -117,7 +131,7 @@ install: clean: -soap_ops.o jpis-test.o simple_server.o: ${soap_prefix}H.h +soap_ops.o bones_server.o simple_server.o: ${soap_prefix}H.h # we have no real config.h but have to force gSoap not to use # linux ftime with broken (aka obsolete) DST information @@ -127,3 +141,10 @@ stdsoap2.o: ${gsoap_prefix}/devel/stdsoap2.c @echo 'The following warning "time_t (de)serialization is not MT safe on this platform" is harmless' ${CC} -o $@ -c -DHAVE_CONFIG_H ${CFLAGS} ${gsoap_prefix}/devel/stdsoap2.c +soap_ops.o bones_server.o: soap_version.h + +soap_version.h: + ${gsoap_prefix}/bin/soapcpp2 /dev/null + perl -ne '$$. == 2 && /.*([0-9])\.([0-9])\.([0-9]).*/ && printf "#define GSOAP_VERSION %d%02d%02d\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.jp.index/project/configure.properties.xml b/org.glite.jp.index/project/configure.properties.xml index 72af8f4..588d8ae 100644 --- a/org.glite.jp.index/project/configure.properties.xml +++ b/org.glite.jp.index/project/configure.properties.xml @@ -12,6 +12,9 @@ Revision history: $Log$ + Revision 1.3 2004/12/01 18:45:38 zsalvet + *** empty log message *** + Revision 1.2 2004/11/22 14:00:37 dimeglio Updated to use standard files Fixed names (was using common instead of real module name) @@ -43,6 +46,8 @@ globus_prefix=${with.globus.prefix} expat_prefix=${with.expat.prefix} gsoap_prefix=${with.gsoap.prefix} ares_prefix=${with.ares.prefix} +mysql_prefix=${with.mysql.prefix} +mysql_version=${ext.mysql.version} thrflavour=${with.globus.thr.flavor} nothrflavour=${with.globus.nothr.flavor} cppunit=${with.cppunit.prefix} diff --git a/org.glite.jp.index/src/bones_server.c b/org.glite.jp.index/src/bones_server.c new file mode 100644 index 0000000..12b39bc --- /dev/null +++ b/org.glite.jp.index/src/bones_server.c @@ -0,0 +1,272 @@ +#include +#include +#include +#include + +#include "glite/jp/types.h" +#include "glite/jp/context.h" + +#include "glite/lb/srvbones.h" +#include "glite/security/glite_gss.h" + +#include +#include "glite/security/glite_gsplugin.h" + +#include "conf.h" + +#include "soap_version.h" +#include "jpis_H.h" + +#define CONN_QUEUE 20 + +extern SOAP_NMAC struct Namespace jpis__namespaces[],jpps__namespaces[]; +extern SOAP_NMAC struct Namespace namespaces[] = { {NULL,NULL} }; +// namespaces[] not used here, but need to prevent linker to complain... + +static int newconn(int,struct timeval *,void *); +static int request(int,struct timeval *,void *); +static int reject(int); +static int disconn(int,struct timeval *,void *); +static int data_init(void **data); + +static struct glite_srvbones_service stab = { + "JP Index Server", -1, newconn, request, reject, disconn +}; + +static time_t cert_mtime; +static char *server_cert, *server_key, *cadir; +static gss_cred_id_t mycred = GSS_C_NO_CREDENTIAL; +static char *mysubj; + +static char *port = "8902"; +static int debug = 1; + +static glite_jp_context_t ctx; + +//static int call_opts(glite_jp_context_t,char *,char *,int (*)(glite_jp_context_t,int,char **)); + +char *glite_jp_default_namespace; + + + +int main(int argc, char *argv[]) +{ + int one = 1,opt,i; + edg_wll_GssStatus gss_code; + struct sockaddr_in a; + glite_jp_is_conf conf; + char *config_file; + + + glite_jp_init_context(&ctx); + + /* Read config options/file */ + config_file = NULL; + glite_jp_get_conf(argc, argv, config_file, &conf); + + +#if GSOAP_VERSION <= 20602 + for (i=0; jpis__namespaces[i].id && strcmp(jpis__namespaces[i].id,"ns1"); i++); +#else + for (i=0; jpis__namespaces[i].id && strcmp(jpis__namespaces[i].id,"jpsrv"); i++); +#endif + assert(jpis__namespaces[i].id); + glite_jp_default_namespace = jpis__namespaces[i].ns; + + stab.conn = socket(PF_INET, SOCK_STREAM, 0); + if (stab.conn < 0) { + perror("socket"); + return 1; + } + + setsockopt(stab.conn,SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); + + a.sin_family = AF_INET; + a.sin_addr.s_addr = INADDR_ANY; + a.sin_port = htons(atoi(port)); + if (bind(stab.conn,(struct sockaddr *) &a, sizeof(a)) ) { + char buf[200]; + + snprintf(buf,sizeof(buf),"bind(%d)",atoi(port)); + perror(buf); + return 1; + } + + if (listen(stab.conn,CONN_QUEUE)) { + perror("listen()"); + return 1; + } + + if (!server_cert || !server_key) + fprintf(stderr, "%s: WARNING: key or certificate file not specified, " + "can't watch them for changes\n", + 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, &mysubj, &gss_code)) + fprintf(stderr,"Server idenity: %s\n",mysubj); + else fputs("WARNING: Running unauthenticated\n",stderr); + + /* XXX: daemonise */ + + glite_srvbones_set_param(GLITE_SBPARAM_SLAVES_COUNT,1); + glite_srvbones_run(data_init,&stab,1 /* XXX: entries in stab */,debug); + + return 0; +} + +static int data_init(void **data) +{ + *data = (void *) soap_new(); + + printf("[%d] slave started\n",getpid()); + + /* slave's init comes here */ + + return 0; +} + +static int newconn(int conn,struct timeval *to,void *data) +{ + struct soap *soap = (struct soap *) data; + glite_gsplugin_Context plugin_ctx; + + gss_cred_id_t newcred = GSS_C_NO_CREDENTIAL; + edg_wll_GssStatus gss_code; + gss_name_t client_name = GSS_C_NO_NAME; + gss_buffer_desc token = GSS_C_EMPTY_BUFFER; + OM_uint32 maj_stat,min_stat; + int ret = 0; + + + soap_init2(soap,SOAP_IO_KEEPALIVE,SOAP_IO_KEEPALIVE); + soap_set_namespaces(soap,jpis__namespaces); + soap->user = (void *) ctx; /* XXX: one instance per slave */ + +/* not yet: client to JP Storage Server + * probably wil come to other place, just not forget it.... + ctx->other_soap = soap_new(); + soap_init(ctx->other_soap); + soap_set_namespaces(ctx->other_soap,jpps__namespaces); +*/ + + + glite_gsplugin_init_context(&plugin_ctx); + plugin_ctx->connection = calloc(1,sizeof *plugin_ctx->connection); + soap_register_plugin_arg(soap,glite_gsplugin,plugin_ctx); + +/* now we probably no not play AAA game, but useful in future */ + 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,NULL,&gss_code)) + { + + printf("[%d] reloading credentials\n",getpid()); /* XXX: log */ + gss_release_cred(&min_stat,&mycred); + mycred = newcred; + } + break; + case -1: + printf("[%d] edg_wll_gss_watch_creds failed\n", getpid()); /* XXX: log */ + break; + } + + /* TODO: DNS paranoia etc. */ + + if (edg_wll_gss_accept(mycred,conn,to,plugin_ctx->connection,&gss_code)) { + printf("[%d] GSS connection accept failed, closing.\n", getpid()); + ret = 1; + goto cleanup; + } + + maj_stat = gss_inquire_context(&min_stat,plugin_ctx->connection->context, + &client_name, NULL, NULL, NULL, NULL, NULL, NULL); + + if (!GSS_ERROR(maj_stat)) + maj_stat = gss_display_name(&min_stat,client_name,&token,NULL); + + if (ctx->peer) free(ctx->peer); + if (!GSS_ERROR(maj_stat)) { + printf("[%d] client DN: %s\n",getpid(),(char *) token.value); /* XXX: log */ + + ctx->peer = strdup(token.value); + memset(&token, 0, sizeof(token)); + } + else { + printf("[%d] annonymous client\n",getpid()); + ctx->peer = NULL; + } + + if (client_name != GSS_C_NO_NAME) gss_release_name(&min_stat, &client_name); + if (token.value) gss_release_buffer(&min_stat, &token); + + return 0; + +cleanup: + glite_gsplugin_free_context(plugin_ctx); + soap_end(soap); + + return ret; +} + +static int request(int conn,struct timeval *to,void *data) +{ + struct soap *soap = data; + glite_jp_context_t ctx = soap->user; + + glite_gsplugin_set_timeout(glite_gsplugin_get_context(soap),to); + + soap->max_keep_alive = 1; /* XXX: prevent gsoap to close connection */ + soap_begin(soap); + if (soap_begin_recv(soap)) { + if (soap->error < SOAP_STOP) { + soap_send_fault(soap); + return EIO; + } + return ENOTCONN; + } + + soap->keep_alive = 1; + if (soap_envelope_begin_in(soap) + || soap_recv_header(soap) + || soap_body_begin_in(soap) + || jpis__serve_request(soap) +#if GSOAP_VERSION >= 20700 + || (soap->fserveloop && soap->fserveloop(soap)) +#endif + ) + { + soap_send_fault(soap); + if (ctx->error) { + /* XXX: shall we die on some errors? */ + int err = ctx->error->code; + glite_jp_clear_error(ctx); + return err; + } + return 0; + } + + glite_jp_run_deferred(ctx); + return 0; +} + +static int reject(int conn) +{ + int flags = fcntl(conn, F_GETFL, 0); + + fcntl(conn,F_SETFL,flags | O_NONBLOCK); + edg_wll_gss_reject(conn); + + return 0; +} + +static int disconn(int conn,struct timeval *to,void *data) +{ + struct soap *soap = (struct soap *) data; + soap_end(soap); // clean up everything and close socket + + return 0; +} diff --git a/org.glite.jp.index/src/conf.c b/org.glite.jp.index/src/conf.c new file mode 100644 index 0000000..3a2590f --- /dev/null +++ b/org.glite.jp.index/src/conf.c @@ -0,0 +1,15 @@ +/* Module for obtaining configuration for Index Server */ + +#ident "$Header$" + +#include "conf.h" + + + +int glite_jp_get_conf(int argc, char **argv, char *config_file, glite_jp_is_conf *conf) +{ + // read comman line options and configuration file + // XXX: use EGEE global configure tools in future... + + return 0; +} diff --git a/org.glite.jp.index/src/conf.h b/org.glite.jp.index/src/conf.h new file mode 100644 index 0000000..4771b0e --- /dev/null +++ b/org.glite.jp.index/src/conf.h @@ -0,0 +1,17 @@ +#ifndef _CONF_H +#define _CONF_H + +#ident "$Header$" + + +typedef struct _glite_jp_is_conf { + // all I need to get from comman line options and configuration file +} glite_jp_is_conf; + + + +// read commad line options and configuration file +int glite_jp_get_conf(int argc, char **argv, char *config_file, glite_jp_is_conf *conf); + + +#endif diff --git a/org.glite.jp.index/src/soap_ops.c b/org.glite.jp.index/src/soap_ops.c index 5af7352..ef12fe1 100644 --- a/org.glite.jp.index/src/soap_ops.c +++ b/org.glite.jp.index/src/soap_ops.c @@ -5,12 +5,14 @@ #include "glite/jp/context.h" #include "jpis_H.h" -#include "JobProvenanceIS.nsmap" +#include "jpis_.nsmap" +#include "soap_version.h" -static struct jptype__GenericJPFaultType *jp2s_error(struct soap *soap, + +static struct jptype__genericFault *jp2s_error(struct soap *soap, const glite_jp_error_t *err) { - struct jptype__GenericJPFaultType *ret = NULL; + struct jptype__genericFault *ret = NULL; if (err) { ret = soap_malloc(soap,sizeof *ret); memset(ret,0,sizeof *ret); @@ -27,13 +29,17 @@ static void err2fault(const glite_jp_context_t ctx,struct soap *soap) { char *et; struct SOAP_ENV__Detail *detail = soap_malloc(soap,sizeof *detail); - struct _GenericJPFault *f = soap_malloc(soap,sizeof *f); + struct _genericFault *f = soap_malloc(soap,sizeof *f); - f->jptype__GenericJPFault = jp2s_error(soap,ctx->error); + f->jpelem__genericFault = jp2s_error(soap,ctx->error); - detail->__type = SOAP_TYPE__GenericJPFault; + detail->__type = SOAP_TYPE__genericFault; +#if GSOAP_VERSION >= 20700 + detail->fault = f; +#else detail->value = f; +#endif detail->__any = NULL; soap_receiver_fault(soap,"Oh, shit!",NULL); @@ -41,6 +47,7 @@ static void err2fault(const glite_jp_context_t ctx,struct soap *soap) else soap->fault->detail = detail; } +/* static void s2jp_tag(const struct jptype__TagValue *stag,glite_jp_tagval_t *jptag) { memset(jptag,0,sizeof *jptag); @@ -54,26 +61,24 @@ static void s2jp_tag(const struct jptype__TagValue *stag,glite_jp_tagval_t *jpta jptag->value = (char *) stag->blobValue->__ptr; } } +*/ #define CONTEXT_FROM_SOAP(soap,ctx) glite_jp_context_t ctx = (glite_jp_context_t) ((soap)->user) -SOAP_FMAC5 int SOAP_FMAC6 jpsrv__UpdateJobs( +SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__UpdateJobs( struct soap *soap, - char *feed_id, - struct jptype__UpdateJobsData *jobs, - enum xsd__boolean done -) + struct _jpelem__UpdateJobs *jpelem__UpdateJobs, + struct _jpelem__UpdateJobsResponse *jpelem__UpdateJobsResponse) { - printf("%s items %d jobid %s\n",__FUNCTION__,jobs->__sizejob, - jobs->job[0]->jobid); + puts(__FUNCTION__); return SOAP_OK; } -SOAP_FMAC5 int SOAP_FMAC6 jpsrv__QueryJobs( + +SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__QueryJobs( struct soap *soap, - struct jptype__IndexQuery *query, - struct jpsrv__QueryJobsResponse *resp -) + struct _jpelem__QueryJobs *jpelem__QueryJobs, + struct _jpelem__QueryJobsResponse *jpelem__QueryJobsResponse) { puts(__FUNCTION__); return SOAP_OK; diff --git a/org.glite.jp.index/src/typemap.dat b/org.glite.jp.index/src/typemap.dat index 7032cb2..72f515f 100644 --- a/org.glite.jp.index/src/typemap.dat +++ b/org.glite.jp.index/src/typemap.dat @@ -1,2 +1,3 @@ jpsrv = http://glite.org/wsdl/services/jp jptype = http://glite.org/wsdl/types/jp +jpelem = http://glite.org/wsdl/elements/jp -- 1.8.2.3