costin 2003/02/27 21:02:24
Modified: jk/native2/common jk_worker_status.c
Log:
Few more improvements to allow easier parsing on the java side.
jkstatus now supports 4 new operations:
lst -> will list all the beans ( well - C beans ) and the attributes ( get and set )
dmp -> will display all attributes for one or more beans ( using a prefix )
get -> returns exactly one attribute value
set -> set one attribute. Some attributes have side effect - so this is also used
as invoke()
( like in SNMP world )
Revision Changes Path
1.34 +224 -107 jakarta-tomcat-connectors/jk/native2/common/jk_worker_status.c
Index: jk_worker_status.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_worker_status.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- jk_worker_status.c 17 Feb 2003 02:09:58 -0000 1.33
+++ jk_worker_status.c 28 Feb 2003 05:02:24 -0000 1.34
@@ -414,7 +414,196 @@
}
s->jkprintf( env,s , "</table>\n" );
}
-
+
+static int JK_METHOD jk2_worker_status_list(jk_env_t *env,
+ jk_worker_t *w,
+ jk_ws_service_t *s)
+{
+ char *cName=s->query_string + 4;
+ int i;
+ int qryLen=0;
+ int exact=1;
+
+ /* Dump all attributes for the beans */
+ if( strcmp( cName, "*" )==0 ) {
+ *cName='\0';
+ qryLen=0;
+ } else {
+ qryLen=strlen( cName );
+ }
+ if( qryLen >0 ) {
+ if( cName[strlen(cName)] == '*' ) {
+ printf("Exact match off %s\n", cName );
+ cName[strlen(cName)]='\0';
+ exact=0;
+ }
+ }
+ for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
+ char *name=env->_objects->nameAt( env, env->_objects, i );
+ jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i );
+ char **getAtt=mbean->getAttributeInfo;
+ char **setAtt=mbean->setAttributeInfo;
+
+ /* That's a bad name, created for backward compat. It should be
deprecated.. */
+ if( strchr( name, ':' )==NULL )
+ continue;
+
+ /* Prefix */
+ if( ! exact && qryLen != 0 && strncmp( name, cName, qryLen )!= 0 )
+ continue;
+
+ /* Exact */
+ if( exact && qryLen != 0 && strcmp( name, cName )!= 0 )
+ continue;
+
+ if( mbean==NULL )
+ continue;
+ s->jkprintf(env, s, "N:%s:%s\n", mbean->type, name);
+
+ while( getAtt != NULL && *getAtt != NULL && **getAtt!='\0' ) {
+ s->jkprintf(env, s, "G:%s:%s\n", name, *getAtt);
+ getAtt++;
+ }
+
+ while( setAtt != NULL && *setAtt != NULL && **setAtt!='\0' ) {
+ s->jkprintf(env, s, "S:%s:%s\n", name, *setAtt);
+ setAtt++;
+ }
+
+ }
+ return JK_OK;
+}
+
+static int JK_METHOD jk2_worker_status_dmp(jk_env_t *env,
+ jk_worker_t *w,
+ jk_ws_service_t *s)
+{
+ char *cName=s->query_string + 4;
+ int i;
+ int qryLen=0;
+ int exact=1;
+
+ /* Dump all attributes for the beans */
+ if( strcmp( cName, "*" )==0 ) {
+ *cName='\0';
+ qryLen=0;
+ } else {
+ qryLen=strlen( cName );
+ }
+ if( qryLen >0 ) {
+ if( cName[strlen(cName)] == '*' ) {
+ printf("Exact match off %s\n", cName );
+ cName[strlen(cName)]='\0';
+ exact=0;
+ }
+ }
+ for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
+ char *name=env->_objects->nameAt( env, env->_objects, i );
+ jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i );
+ char **getAtt=mbean->getAttributeInfo;
+ char **setAtt=mbean->setAttributeInfo;
+
+ /* That's a bad name, created for backward compat. It should be
deprecated.. */
+ if( strchr( name, ':' )==NULL )
+ continue;
+
+ /* Prefix */
+ if( ! exact && qryLen != 0 && strncmp( name, cName, qryLen )!= 0 )
+ continue;
+
+ /* Exact */
+ if( exact && qryLen != 0 && strcmp( name, cName )!= 0 )
+ continue;
+
+ if( mbean==NULL )
+ continue;
+ s->jkprintf(env, s, "P:%s:%s:%lp\n", mbean->type, name, mbean->object );
+
+ while( getAtt != NULL && *getAtt != NULL && **getAtt!='\0' ) {
+ char *attName=*getAtt;
+ char *val=mbean->getAttribute(env, mbean, *getAtt );
+ s->jkprintf(env, s, "G:%s:%s:%s\n", name, *getAtt, (val==NULL)? "NULL":
val);
+ getAtt++;
+ }
+ }
+ return JK_OK;
+}
+
+static int JK_METHOD jk2_worker_status_get(jk_env_t *env,
+ jk_worker_t *w,
+ jk_ws_service_t *s)
+{
+ char *cName=s->query_string + 4;
+ char *attName=rindex(cName, ':' );
+ int i;
+
+ if( attName == NULL ) {
+ s->jkprintf( env, s, "ERROR: no attribute value found %s\n", cName);
+ return JK_OK;
+ }
+ *attName='\0';
+ attName++;
+
+ for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
+ char *name=env->_objects->nameAt( env, env->_objects, i );
+ jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i );
+
+ if( mbean==NULL )
+ continue;
+
+ if( strcmp( name, cName ) == 0 &&
+ mbean->getAttribute != NULL ) {
+ void *result=mbean->getAttribute( env, mbean, attName );
+ s->jkprintf( env, s, "OK:%s:%s", cName, attName );
+ s->jkprintf( env, s, "%s", result );
+ return JK_OK;
+ }
+ }
+ s->jkprintf( env, s, "ERROR: mbean not found %s\n", cName );
+ return JK_OK;
+}
+
+static int JK_METHOD jk2_worker_status_set(jk_env_t *env,
+ jk_worker_t *w,
+ jk_ws_service_t *s)
+{
+ char *cName=s->query_string + 4;
+ char *attVal=rindex(cName, ':' );
+ char *attName;
+ int i;
+
+ if( attVal == NULL ) {
+ s->jkprintf( env, s, "ERROR: no attribute value found %s\n", cName);
+ return JK_OK;
+ }
+ *attVal='\0';
+ attVal++;
+
+ attName=rindex( cName, ':' );
+ if( attName == NULL ) {
+ s->jkprintf( env, s, "ERROR: attribute name not found\n", cName);
+ return JK_OK;
+ }
+ *attName='\0';
+ attName++;
+ for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
+ char *name=env->_objects->nameAt( env, env->_objects, i );
+ jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i );
+
+ if( mbean==NULL )
+ continue;
+
+ if( strcmp( name, cName ) == 0 &&
+ mbean->setAttribute != NULL ) {
+ int res=mbean->setAttribute( env, mbean, attName, attVal );
+ s->jkprintf( env, s, "OK:%s:%s:%d", cName, attName, res );
+ return JK_OK;
+ }
+ }
+ s->jkprintf( env, s, "ERROR: mbean not found %s\n", cName );
+ return JK_OK;
+}
+
static int JK_METHOD jk2_worker_status_service(jk_env_t *env,
jk_worker_t *w,
jk_ws_service_t *s)
@@ -441,119 +630,47 @@
if( strcmp( s->query_string, "scoreboard.reset" ) == 0 ) {
jk2_worker_status_resetScoreboard(env, s, s->workerEnv );
+ s->jkprintf(env, s, "Scoreboard reset\n" );
}
- if( strncmp( s->query_string, "get=", 4) == 0 ) {
- /* Get a jmx-like attribute. Very inefficient ( only one attribute per req
) - but it doesn't
- happen too often. We should do a POST */
- char *cName=s->query_string + 4;
- char *attName=rindex(cName, ':' );
- int i;
+ /* Reset the scoreboard */
+ if( strncmp( s->query_string, "rst=",4 ) == 0 ) {
+ jk2_worker_status_resetScoreboard(env, s, s->workerEnv );
+ s->jkprintf(env, s, "Scoreboard reset\n" );
+ return JK_OK;
+ }
+
+ /* Increment the scoreboard version counter, reload */
+ if( strncmp( s->query_string, "rld=",4 ) == 0 ) {
+ jk_shm_t *shm=w->workerEnv->shm;
- if( attName == NULL ) {
- s->jkprintf( env, s, "ERROR: no attribute found %s\n", cName);
- return JK_OK;
- }
- *attName='\0';
- attName++;
- for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
- char *name=env->_objects->nameAt( env, env->_objects, i );
- jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i );
-
- if( mbean==NULL )
- continue;
-
- if( strcmp( name, cName ) == 0 &&
- mbean->getAttribute != NULL ) {
- char *value=mbean->getAttribute( env, mbean, attName );
- if( value!=NULL && (*value != '\0') ) {
- s->jkprintf( env, s, "%s", value );
- } else {
- s->jkprintf( env, s, "NULL" );
- }
- return JK_OK;
- }
- }
- s->jkprintf( env, s, "ERROR: attribute not found %s %s", cName, attName );
+ /* Update the scoreboard's version - all other
+ jk2 processes will see this and update
+ */
+ if( shm!=NULL && shm->head!=NULL )
+ shm->head->lbVer++;
+ s->jkprintf(env, s, "Updated config version to %d\n", shm->head->lbVer );
return JK_OK;
}
- if( strncmp( s->query_string, "qry=", 4) == 0 ) {
- char *cName=s->query_string + 4;
- int i,j;
-
- if( *cName== '\0' ) {
- /* No string - list all components */
- for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
- char *name=env->_objects->nameAt( env, env->_objects, i );
- jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i );
- char **getAtt=mbean->getAttributeInfo;
- char **setAtt=mbean->setAttributeInfo;
-
- if( mbean==NULL )
- continue;
-
- s->jkprintf(env, s, "%s %s\n", name, mbean->type );
- }
- } else {
- /* List all attributes of an object */
-
- for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
- char *name=env->_objects->nameAt( env, env->_objects, i );
- jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i );
- char **getAtt=mbean->getAttributeInfo;
- char **setAtt=mbean->setAttributeInfo;
-
- if( mbean==NULL || getAtt==NULL )
- continue;
-
- if( strcmp( name, cName ) == 0 ) {
- while( getAtt != NULL && *getAtt != NULL && **getAtt!='\0' ) {
- char *attName=*getAtt;
- char *val=mbean->getAttribute(env, mbean, *getAtt );
- s->jkprintf(env, s, "%s %s %s\n", name, *getAtt,
(val==NULL)? "NULL": val);
- getAtt++;
- }
- }
- }
- }
- return JK_OK;
+
+ /** list all mbeans and their attributes */
+ if( strncmp( s->query_string, "lst=", 4) == 0 ) {
+ return jk2_worker_status_list(env, w, s);
+ }
+
+ /** Dump multiple attributes */
+ if( strncmp( s->query_string, "dmp=", 4) == 0 ) {
+ return jk2_worker_status_dmp(env, w, s);
}
+
+ /** Get a single attribute. This also works for attributes that are not listed
in getAtt **/
+ if( strncmp( s->query_string, "get=", 4) == 0 ) {
+ return jk2_worker_status_get(env, w, s);
+ }
+
+ /** Set an attribute. Works for attributes that are not listed in setAtt **/
if( strncmp( s->query_string, "set=", 4) == 0 ) {
- char *cName=s->query_string + 4;
- char *attVal=rindex(cName, ':' );
- char *attName;
- int i;
-
- if( attVal == NULL ) {
- s->jkprintf( env, s, "ERROR: no attribute value found %s\n", cName);
- return JK_OK;
- }
- *attVal='\0';
- attVal++;
-
- attName=rindex( cName, ':' );
- if( attName == NULL ) {
- s->jkprintf( env, s, "ERROR: attribute name not found\n", cName);
- return JK_OK;
- }
- *attName='\0';
- attName++;
- for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
- char *name=env->_objects->nameAt( env, env->_objects, i );
- jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i );
-
- if( mbean==NULL )
- continue;
-
- if( strcmp( name, cName ) == 0 &&
- mbean->getAttribute != NULL ) {
- int res=mbean->setAttribute( env, mbean, attName, attVal );
- s->jkprintf( env, s, "%d", res );
- return JK_OK;
- }
- }
- s->jkprintf( env, s, "ERROR: mbean not found %d\n", cName );
- return JK_OK;
+ return jk2_worker_status_set(env, w, s);
}
w->workerEnv->config->update( env, w->workerEnv->config, &didUpdate );
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]