From a26709a6d52dfd64868647b3163bcca891956aff Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ale=C5=A1=20K=C5=99enek?= Date: Mon, 19 Sep 2005 15:24:20 +0000 Subject: [PATCH] "The gigantic merge"; from release 1.4 branch to HEAD --- org.glite.lb.client/src/notification.c | 7 ++- org.glite.lb.client/src/prod_proto.c | 39 ++++++++------ org.glite.lb.client/src/producer.c | 4 +- org.glite.lb.common/interface/il_msg.h | 4 +- org.glite.lb.common/src/il_msg.c | 30 ++++++++--- org.glite.lb.common/test/il_msg_test.cpp | 12 ++--- org.glite.lb.logger/src/send_event.c | 24 ++++++--- org.glite.lb.server/Makefile | 57 ++++++++++++++------ .../project/configure.properties.xml | 7 +++ org.glite.lb.server/src/store.c.T | 20 +++++-- org.glite.lb.server/src/stored_master.c | 13 +++-- org.glite.lb/build.xml | 61 +++++++++++++++++++++- 12 files changed, 204 insertions(+), 74 deletions(-) diff --git a/org.glite.lb.client/src/notification.c b/org.glite.lb.client/src/notification.c index acd991a..a9fe57b 100644 --- a/org.glite.lb.client/src/notification.c +++ b/org.glite.lb.client/src/notification.c @@ -446,11 +446,11 @@ err: } -static edg_wll_Context tmp_ctx; -static int gss_reader(char *buffer, int max_len) +static int gss_reader(void *user_data, char *buffer, int max_len) { edg_wll_GssStatus gss_code; + edg_wll_Context tmp_ctx = (edg_wll_Context)user_data; int ret, len; ret = edg_wll_gss_read_full(&tmp_ctx->connPoolNotif[0].gss, @@ -485,8 +485,7 @@ static int recv_notif(edg_wll_Context ctx) ctx->connPoolNotif[0].bufUse = 0; ctx->connPoolNotif[0].bufSize = 0; - tmp_ctx = ctx; - len = read_il_data(&ctx->connPoolNotif[0].buf, gss_reader); + len = read_il_data(ctx, &ctx->connPoolNotif[0].buf, gss_reader); if(len < 0) return(len); diff --git a/org.glite.lb.client/src/prod_proto.c b/org.glite.lb.client/src/prod_proto.c index 7d24851..367d9c1 100644 --- a/org.glite.lb.client/src/prod_proto.c +++ b/org.glite.lb.client/src/prod_proto.c @@ -66,18 +66,22 @@ int edg_wll_log_proto_handle_gss_failures(edg_wll_Context context, int code, edg } -static edg_wll_Context tmp_context; -static edg_wll_PlainConnection *tmp_conn; + +struct reader_data { + edg_wll_Context ctx; + void *conn; +}; static int -plain_reader(char *buffer, int max_len) +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(tmp_conn, buffer, max_len, &tmp_context->p_tmp_timeout); + len = edg_wll_plain_read_full(data->conn, buffer, max_len, &data->ctx->p_tmp_timeout); if(len < 0) - edg_wll_SetError(tmp_context, LB_PROTO, "get_reply_plain(): error reading message data"); + edg_wll_SetError(data->ctx, LB_PROTO, "get_reply_plain(): error reading message data"); return(len); } @@ -96,11 +100,12 @@ get_reply_plain(edg_wll_Context context, edg_wll_PlainConnection *conn, char **b { char *msg; int len, code; + struct reader_data data; + data.ctx = context; + data.conn = conn; code = 0; - tmp_context = context; - tmp_conn = conn; - len = read_il_data(&msg, plain_reader); + len = read_il_data(&data, &msg, plain_reader); if(len < 0) goto get_reply_plain_end; @@ -116,20 +121,19 @@ get_reply_plain_end: } -static edg_wll_GssConnection *tmp_gss_conn; - static int -gss_reader(char *buffer, int max_len) +gss_reader(void *user_data, char *buffer, int max_len) { + struct reader_data *data = (struct reader_data *)user_data; int ret, len; edg_wll_GssStatus gss_code; - ret = edg_wll_gss_read_full(tmp_gss_conn, buffer, max_len, &tmp_context->p_tmp_timeout, + ret = edg_wll_gss_read_full(data->conn, buffer, max_len, &data->ctx->p_tmp_timeout, &len, &gss_code); if(ret < 0) { - edg_wll_log_proto_handle_gss_failures(tmp_context, ret, &gss_code, "edg_wll_gss_read_full"); - edg_wll_UpdateError(tmp_context, LB_PROTO, "get_reply_gss(): error reading message"); + edg_wll_log_proto_handle_gss_failures(data->ctx, ret, &gss_code, "edg_wll_gss_read_full"); + edg_wll_UpdateError(data->ctx, LB_PROTO, "get_reply_gss(): error reading message"); } return(ret); @@ -142,10 +146,11 @@ get_reply_gss(edg_wll_Context context, edg_wll_GssConnection *conn, char **buf, { char *msg; int code; + struct reader_data data; - tmp_context = context; - tmp_gss_conn = conn; - code = read_il_data(&msg, gss_reader); + data.ctx = context; + data.conn = conn; + code = read_il_data(&data, &msg, gss_reader); if(code < 0) goto get_reply_gss_end; diff --git a/org.glite.lb.client/src/producer.c b/org.glite.lb.client/src/producer.c index 27c71fd..bd6905c 100644 --- a/org.glite.lb.client/src/producer.c +++ b/org.glite.lb.client/src/producer.c @@ -127,7 +127,7 @@ static int edg_wll_DoLogEvent( if ((answer = edg_wll_gss_connect(cred, context->p_destination, context->p_dest_port, &context->p_tmp_timeout, &con, &gss_stat)) < 0) { - edg_wll_log_proto_handle_gss_failures(context,answer,&gss_stat,"edg_wll_gss_connect()"); + answer = edg_wll_log_proto_handle_gss_failures(context,answer,&gss_stat,"edg_wll_gss_connect()"); goto edg_wll_DoLogEvent_end; } @@ -274,7 +274,7 @@ static int edg_wll_DoLogEventDirect( #endif if ((answer = edg_wll_gss_connect(cred,host,port, &context->p_tmp_timeout, &con, &gss_stat)) < 0) { - edg_wll_log_proto_handle_gss_failures(context,answer,&gss_stat,"edg_wll_gss_connect()"); + answer = edg_wll_log_proto_handle_gss_failures(context,answer,&gss_stat,"edg_wll_gss_connect()"); goto edg_wll_DoLogEventDirect_end; } diff --git a/org.glite.lb.common/interface/il_msg.h b/org.glite.lb.common/interface/il_msg.h index cb839f8..a2e33a4 100644 --- a/org.glite.lb.common/interface/il_msg.h +++ b/org.glite.lb.common/interface/il_msg.h @@ -33,6 +33,8 @@ int encode_il_msg(char **, const char *); int encode_il_reply(char **, int, int, const char *); int decode_il_msg(char **, const char *); int decode_il_reply(int *, int *, char **, const char *); -int read_il_data(char **, int (*)(char *, const int)); +int read_il_data(void *user_data, + char **buffer, + int (*reader)(void *user_data, char *buffer, const int)); #endif diff --git a/org.glite.lb.common/src/il_msg.c b/org.glite.lb.common/src/il_msg.c index a9e3fff..dc07813 100644 --- a/org.glite.lb.common/src/il_msg.c +++ b/org.glite.lb.common/src/il_msg.c @@ -7,15 +7,18 @@ #include #include +#define IL_PROTOCOL_MAGIC_WORD "michal" + int encode_il_msg(char **buffer, const char *event) { int len; char *p; + char *protocol_magic_word = IL_PROTOCOL_MAGIC_WORD; /* allocate enough room to hold the message */ - len = 17 + len_string((char*)event); + len = 17 + len_string(protocol_magic_word) + len_string((char*)event); if((*buffer = malloc(len)) == NULL) { return(-1); } @@ -27,6 +30,7 @@ encode_il_msg(char **buffer, const char *event) p += 17; /* write rest of the message */ + p = put_string(p, protocol_magic_word); p = put_string(p, (char*)event); return(p - *buffer); @@ -59,8 +63,21 @@ int decode_il_msg(char **event, const char *buf) { char *p; + char *protocol_magic_word=NULL; + int magic_word_check_failed = 0; + + /* First check that the protocol 'magic' word is there */ + p = get_string((char*)buf, &protocol_magic_word); + if (protocol_magic_word) { + if (strcmp (protocol_magic_word, IL_PROTOCOL_MAGIC_WORD) != 0) { + magic_word_check_failed = 1; + } + free(protocol_magic_word); + } + + if (magic_word_check_failed != 0) return (-1); - p = get_string((char*)buf, event); + p = get_string(p, event); if(p == NULL) { if(*event) { free(*event); *event = NULL; }; return(-1); @@ -88,14 +105,15 @@ decode_il_reply(int *maj, int *min, char **err, const char * buf) int -read_il_data(char **buffer, - int (*reader)(char *, const int)) +read_il_data(void *user_data, + char **buffer, + int (*reader)(void *, char *, const int)) { char buf[17]; int ret, len; /* read 17 byte header */ - len = (*reader)(buf, 17); + len = (*reader)(user_data, buf, 17); if(len < 0) { goto err; } @@ -113,7 +131,7 @@ read_il_data(char **buffer, } /* read body */ - ret = (*reader)(*buffer, len); + ret = (*reader)(user_data, *buffer, len); if(ret < 0) { free(*buffer); *buffer = NULL; diff --git a/org.glite.lb.common/test/il_msg_test.cpp b/org.glite.lb.common/test/il_msg_test.cpp index 6748bdb..99c0311 100644 --- a/org.glite.lb.common/test/il_msg_test.cpp +++ b/org.glite.lb.common/test/il_msg_test.cpp @@ -28,7 +28,7 @@ public: } void testEncodeMsg() { - CPPUNIT_ASSERT_EQUAL(len_msg, 26); + CPPUNIT_ASSERT_EQUAL(len_msg, 35); CPPUNIT_ASSERT(buffer_msg != NULL); CPPUNIT_ASSERT(!strncmp(buffer_msg, msg, len_msg)); } @@ -67,10 +67,10 @@ public: int l; char *s; - l = read_il_data(&s, test_reader); - CPPUNIT_ASSERT_EQUAL(l, 9); + l = read_il_data(/*user data*/NULL, &s, test_reader); + CPPUNIT_ASSERT_EQUAL(l, 18); CPPUNIT_ASSERT(s != NULL); - CPPUNIT_ASSERT(!strcmp(s, "6 zprava\n")); + CPPUNIT_ASSERT(!strcmp(s, "6 michal\n6 zprava\n")); free(s); } @@ -80,14 +80,14 @@ private: static const char *msg, *rep; static int pos; - static int test_reader(char *buf, int len) { + static int test_reader(void *user_data, char *buf, int len) { strncpy(buf, msg+pos, len); pos += len; return(len); } }; -const char *IlMsgTest::msg = " 9\n6 zprava\n"; +const char *IlMsgTest::msg = " 18\n6 michal\n6 zprava\n"; const char *IlMsgTest::rep = " 14\n10\n20\n5 chyba\n"; int IlMsgTest::pos; diff --git a/org.glite.lb.logger/src/send_event.c b/org.glite.lb.logger/src/send_event.c index 6ed63d4..65e2c01 100644 --- a/org.glite.lb.logger/src/send_event.c +++ b/org.glite.lb.logger/src/send_event.c @@ -91,19 +91,22 @@ confirm_msg(struct server_msg *msg, int code, int code_min) #endif -static edg_wll_GssConnection *tmp_gss; + +struct reader_data { + edg_wll_GssConnection *gss; + struct timeval *timeout; +}; + static int -gss_reader(char *buffer, int max_len) +gss_reader(void *user_data, char *buffer, int max_len) { int ret, len; - struct timeval tv; + struct reader_data *data = (struct reader_data *)user_data; edg_wll_GssStatus gss_stat; - tv.tv_sec = TIMEOUT; - tv.tv_usec = 0; - ret = edg_wll_gss_read_full(tmp_gss, buffer, max_len, &tv, &len, &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; @@ -130,9 +133,14 @@ get_reply(struct event_queue *eq, char **buf, int *code_min) char *msg; int ret, code; size_t len, l; + struct timeval tv; + struct reader_data data; - tmp_gss = &eq->gss; - len = read_il_data(&msg, gss_reader); + 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) return(-1); diff --git a/org.glite.lb.server/Makefile b/org.glite.lb.server/Makefile index 0df3eb4..e047f08 100644 --- a/org.glite.lb.server/Makefile +++ b/org.glite.lb.server/Makefile @@ -36,7 +36,11 @@ GSOAP_FILES_PREFIX:= bk_ws_ YACC=bison -y CC=gcc -VPATH=${top_srcdir}/interface:${top_srcdir}/src:${top_srcdir}/test:${top_srcdir}/examples:${top_srcdir}/project +ifeq ($(gsoap_version),2.7.0) + VPATH=${top_srcdir}/interface:${top_srcdir}/src:${top_srcdir}/test:${top_srcdir}/examples:${top_srcdir}/project:${gsoap_prefix} +else + VPATH=${top_srcdir}/interface:${top_srcdir}/src:${top_srcdir}/test:${top_srcdir}/examples:${top_srcdir}/project +endif AT3=perl -I${top_srcdir}/project ${top_srcdir}/project/at3 TEST_LIBS:=-L${cppunit}/lib -lcppunit @@ -56,7 +60,7 @@ CFLAGS:= \ -I${top_srcdir}/interface \ -I${expat_prefix}/include \ -I${ares_prefix}/include \ - -I${gsoap_prefix}/include \ + -I${gsoap_prefix}/include -I${gsoap_prefix}/ \ ${COVERAGE_FLAGS} \ -I${mysql_prefix}/include -I${mysql_prefix}/include/mysql \ -I${globus_prefix}/include/${nothrflavour} \ @@ -78,6 +82,12 @@ GLOBUS_LIBS:= -L${globus_prefix}/lib \ -lglobus_common_${nothrflavour} \ -lglobus_gssapi_gsi_${nothrflavour} \ +ifeq ($(shell ls ${gsoap_prefix}/bin/soapcpp2),${gsoap_prefix}/bin/soapcpp2) + gsoap_bin_prefix := ${gsoap_prefix}/bin +else + gsoap_bin_prefix := ${gsoap_prefix} +endif + ifneq (${mysql_prefix},/usr) ifeq ($(shell echo ${mysql_version} | cut -d. -f1,2),4.1) mysqlib := -L${mysql_prefix}/lib/mysql @@ -118,20 +128,33 @@ BKSERVER_BASE_OBJS:= \ lb_xml_parse_V21.o \ lock.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 + notification.o il_notification.o notif_match.o stats.o 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_fault.o ws_typeref.o - - BKSERVER_LIBS= \ - ${SRVBONES_LIB} \ - -lglite_lb_common_${nothrflavour} \ - -L${gsoap_prefix}/lib -lgsoap \ - -lglite_security_gsoap_plugin_${nothrflavour} \ - ${EXT_LIBS} + ifeq ($(gsoap_version),2.7.0) + BKSERVER_OBJS:= \ + ${BKSERVER_BASE_OBJS} \ + ${GSOAP_FILES_PREFIX}C.o ${GSOAP_FILES_PREFIX}Server.o \ + ws_query.o ws_fault.o ws_typeref.o stdsoap2.o + + BKSERVER_LIBS= \ + ${SRVBONES_LIB} \ + -lglite_lb_common_${nothrflavour} \ + -lglite_security_gsoap_plugin_${nothrflavour} \ + ${EXT_LIBS} + else + BKSERVER_OBJS:= \ + ${BKSERVER_BASE_OBJS} \ + ${GSOAP_FILES_PREFIX}C.o ${GSOAP_FILES_PREFIX}Server.o \ + ws_query.o ws_fault.o ws_typeref.o + + BKSERVER_LIBS= \ + ${SRVBONES_LIB} \ + -lglite_lb_common_${nothrflavour} \ + -L${gsoap_prefix}/lib -lgsoap \ + -lglite_security_gsoap_plugin_${nothrflavour} \ + ${EXT_LIBS} + endif else BKSERVER_OBJS:= ${BKSERVER_BASE_OBJS} @@ -194,7 +217,7 @@ lb_xml_parse.c: lb_xml_parse.c.T 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_prefix}/bin/soapcpp2 -w -c -p ${GSOAP_FILES_PREFIX} 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 @@ -206,7 +229,7 @@ ${GSOAP_FILES_PREFIX}H.h ${GSOAP_FILES_PREFIX}C.c ${GSOAP_FILES_PREFIX}Server.c LB.xh: ws_typemap.dat ${stagedir}/interface/LB.wsdl cp ${stagedir}/interface/LBTypes.wsdl . - ${gsoap_prefix}/bin/wsdl2h -c -t ${top_srcdir}/src/ws_typemap.dat -o $@ ${stagedir}/interface/LB.wsdl + ${gsoap_bin_prefix}/wsdl2h -c -t ${top_srcdir}/src/ws_typemap.dat -o $@ ${stagedir}/interface/LB.wsdl rm -f LBTypes.wsdl test.xml: test_xml @@ -334,7 +357,7 @@ lb_plugin.lo: lb_plugin.c jp_job_attrs.h ${COMPILE} -o $@ -c $< soap_version.h: - ${gsoap_prefix}/bin/soapcpp2 /dev/null + ${gsoap_bin_prefix}/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.lb.server/project/configure.properties.xml b/org.glite.lb.server/project/configure.properties.xml index ffe0fff..f533759 100644 --- a/org.glite.lb.server/project/configure.properties.xml +++ b/org.glite.lb.server/project/configure.properties.xml @@ -20,6 +20,12 @@ Revision history: $Log$ + Revision 1.7.2.1 2005/08/09 15:02:10 jskrabal + - build with broken gsoap 2.7.0 repository package + + Revision 1.7 2005/08/03 09:30:28 akrenek + Merged the release 1.0 branch + Revision 1.6 2005/01/21 11:27:44 jpospi completely remove gridsite.prefix and voms.prefix @@ -85,6 +91,7 @@ mysql_prefix=${with.mysql.prefix} mysql_version=${ext.mysql.version} cppunit=${with.cppunit.prefix} gsoap_prefix=${with.gsoap.prefix} +gsoap_version=${ext.gsoap.version} diff --git a/org.glite.lb.server/src/store.c.T b/org.glite.lb.server/src/store.c.T index d45db39..b2bcbc4 100644 --- a/org.glite.lb.server/src/store.c.T +++ b/org.glite.lb.server/src/store.c.T @@ -52,6 +52,7 @@ int edg_wll_StoreEvent(edg_wll_Context ctx,edg_wll_Event *e,int *seq) char *select_max,*ssrc; edg_wll_Stmt sh = NULL; int next = 0xDEAD; + int lbproxy_notreg = 0; char *now_s = NULL; ssrc = jobid = stmt = select_max = NULL; @@ -63,7 +64,11 @@ int edg_wll_StoreEvent(edg_wll_Context ctx,edg_wll_Event *e,int *seq) edg_wll_ResetError(ctx); switch (err = check_auth(ctx,e)) { case 0: break; - case ENOENT: goto clean; + case ENOENT: + if ( !ctx->isProxy ) goto clean; + edg_wll_ResetError(ctx); + lbproxy_notreg = 1; + break; case EPERM: if (!ctx->noAuth) goto clean; edg_wll_ResetError(ctx); @@ -80,8 +85,8 @@ int edg_wll_StoreEvent(edg_wll_Context ctx,edg_wll_Event *e,int *seq) jobid = edg_wlc_JobIdGetUnique(e->any.jobId); /* only REGJOB events determine job owner now */ - if (e->type == EDG_WLL_EVENT_REGJOB && - (err = store_job(ctx,e->any.jobId,userid))) goto clean; + if ( (e->type == EDG_WLL_EVENT_REGJOB || lbproxy_notreg) + && (err = store_job(ctx,e->any.jobId,userid))) goto clean; /* obtain next event sequence number */ @@ -425,7 +430,14 @@ static int check_auth(edg_wll_Context ctx,edg_wll_Event *e) ) goto clean; if (!owner) { - edg_wll_SetError(ctx,ENOENT,"job not registered"); + if ( ctx->isProxy && !e->any.seqcode ) + edg_wll_SetError(ctx, EINVAL, "Job not registered - sequence code needed"); + else + /* We have to let the calling function know what happened here + * even if it hapens inside the LB Proxy which shouldn't consider + * this as an error + */ + edg_wll_SetError(ctx, ENOENT, "job not registered"); goto clean; } diff --git a/org.glite.lb.server/src/stored_master.c b/org.glite.lb.server/src/stored_master.c index 41b7d89..748d851 100644 --- a/org.glite.lb.server/src/stored_master.c +++ b/org.glite.lb.server/src/stored_master.c @@ -15,12 +15,12 @@ #include "store.h" -static edg_wll_Context tmp_ctx; static int -gss_reader(char *buffer, int max_len) +gss_reader(void *user_data, char *buffer, int max_len) { + edg_wll_Context tmp_ctx = (edg_wll_Context)user_data; int ret, len; edg_wll_GssStatus gss_code; @@ -57,8 +57,7 @@ int edg_wll_StoreProto(edg_wll_Context ctx) edg_wll_GssStatus gss_code; edg_wll_ResetError(ctx); - tmp_ctx = ctx; - ret = read_il_data(&buf, gss_reader); + ret = read_il_data(ctx, &buf, gss_reader); if(ret < 0) return(ret); @@ -81,8 +80,9 @@ int edg_wll_StoreProto(edg_wll_Context ctx) static int -gss_plain_reader(char *buffer, int max_len) +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, @@ -103,8 +103,7 @@ int edg_wll_StoreProtoProxy(edg_wll_Context ctx) edg_wll_ResetError(ctx); - tmp_ctx = ctx; - ret = read_il_data(&buf, gss_plain_reader); + ret = read_il_data(ctx, &buf, gss_plain_reader); if ( ret < 0 ) return(ret); if ( !(ret = handle_request(ctx, buf)) ) { diff --git a/org.glite.lb/build.xml b/org.glite.lb/build.xml index 6b6f36d..6344922 100755 --- a/org.glite.lb/build.xml +++ b/org.glite.lb/build.xml @@ -20,6 +20,9 @@ Revision history: $Log$ + Revision 1.32 2005/08/03 11:58:25 akrenek + Merged the release 1.0 branch + Revision 1.31 2005/05/26 15:13:37 zurek inserted module.build.file @@ -280,6 +283,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -328,7 +385,7 @@ - + @@ -360,7 +417,7 @@ - + -- 1.8.2.3