diff options
author | hongbotian <hongbo.tianhongbo@huawei.com> | 2015-11-30 02:41:33 -0500 |
---|---|---|
committer | hongbotian <hongbo.tianhongbo@huawei.com> | 2015-11-30 02:43:36 -0500 |
commit | 9401f816dd0d9d550fe98a8507224bde51c4b847 (patch) | |
tree | 94f2d7a7893a787bafdca8b5ef063ea316938874 /rubbos/app/tomcat-connectors-1.2.32-src/jkstatus/src/share/org/apache/jk/status/JkStatusTask.java | |
parent | e8ec7aa8e38a93f5b034ac74cebce5de23710317 (diff) |
upload tomcat
JIRA: BOTTLENECK-7
Change-Id: I875d474869efd76ca203c30b60ebc0c3ee606d0e
Signed-off-by: hongbotian <hongbo.tianhongbo@huawei.com>
Diffstat (limited to 'rubbos/app/tomcat-connectors-1.2.32-src/jkstatus/src/share/org/apache/jk/status/JkStatusTask.java')
-rw-r--r-- | rubbos/app/tomcat-connectors-1.2.32-src/jkstatus/src/share/org/apache/jk/status/JkStatusTask.java | 735 |
1 files changed, 735 insertions, 0 deletions
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/jkstatus/src/share/org/apache/jk/status/JkStatusTask.java b/rubbos/app/tomcat-connectors-1.2.32-src/jkstatus/src/share/org/apache/jk/status/JkStatusTask.java new file mode 100644 index 00000000..73d11eab --- /dev/null +++ b/rubbos/app/tomcat-connectors-1.2.32-src/jkstatus/src/share/org/apache/jk/status/JkStatusTask.java @@ -0,0 +1,735 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.apache.jk.status; + +import java.util.Iterator; +import java.util.List; + +import org.apache.catalina.ant.BaseRedirectorHelperTask; +import org.apache.tomcat.util.IntrospectionUtils; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; + +/** + * Ant task that implements the show <code>/jkstatus</code> command, supported + * by the mod_jk status (1.2.13) application. + * + * @author Peter Rossbach + * @version $Revision: 752644 $ + * @since 5.5.10 + */ +public class JkStatusTask extends BaseRedirectorHelperTask { + + /** + * The descriptive information about this implementation. + */ + private static final String info = "org.apache.jk.status.JkStatusTask/1.2"; + + /** + * Store status as <code>resultProperty</code> prefix. + */ + protected String resultproperty; + + /** + * Echo status at ant console + */ + protected boolean echo = false; + + /** + * The login password for the <code>mod_jk status</code> page. + */ + protected String password = null; + + /** + * The URL of the <code>mod_jk status</code> page to be used. + */ + protected String url = "http://localhost:80/jkstatus"; + + /** + * The login username for the <code>mod_jk status</code> page. + */ + protected String username = null; + + private String errorProperty; + + private String worker; + + private String loadbalancer; + + /** + * Return descriptive information about this implementation and the + * corresponding version number, in the format + * <code><description>/<version></code>. + */ + public String getInfo() { + + return (info); + + } + + public String getPassword() { + return (this.password); + } + + public void setPassword(String password) { + this.password = password; + } + + public String getUrl() { + return (this.url); + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUsername() { + return (this.username); + } + + public void setUsername(String username) { + this.username = username; + } + + /** + * @return Returns the echo. + */ + public boolean isEcho() { + return echo; + } + + /** + * @param echo + * The echo to set. + */ + public void setEcho(boolean echo) { + this.echo = echo; + } + + /** + * @return Returns the resultproperty. + */ + public String getResultproperty() { + return resultproperty; + } + + /** + * @param resultproperty + * The resultproperty to set. + */ + public void setResultproperty(String resultproperty) { + this.resultproperty = resultproperty; + } + + /** + * @return Returns the loadbalancer. + */ + public String getLoadbalancer() { + return loadbalancer; + } + /** + * @param loadbalancer The loadbalancer to set. + */ + public void setLoadbalancer(String loadbalancer) { + this.loadbalancer = loadbalancer; + } + /** + * @return Returns the worker. + */ + public String getWorker() { + return worker; + } + /** + * @param worker The worker to set. + */ + public void setWorker(String worker) { + this.worker = worker; + } + // --------------------------------------------------------- Public Methods + + /** + * Get jkstatus from server. + * + * @exception BuildException + * if a validation error occurs + */ + public void execute() throws BuildException { + + if (url == null) { + throw new BuildException("Must specify an 'url'"); + } + boolean isWorkerOnly = worker != null && !"".equals(worker); + boolean isLoadbalancerOnly = loadbalancer != null + && !"".equals(loadbalancer); + + StringBuffer error = new StringBuffer(); + try { + JkStatusAccessor accessor = new JkStatusAccessor(); + JkStatus status = accessor.status(url, username, password); + if (status.result != null && !"OK".equals(status.result.type) ) { + if (getErrorProperty() != null) { + getProject().setNewProperty(errorProperty, status.result.message); + } + if (isFailOnError()) { + throw new BuildException(status.result.message); + } else { + handleErrorOutput(status.result.message); + return; + } + + } + + if (!isWorkerOnly && !isLoadbalancerOnly) { + JkServer server = status.getServer(); + JkSoftware software = status.getSoftware(); + JkResult result = status.getResult(); + if (resultproperty != null) { + createProperty(server, "server", "name"); + createProperty(server, "server", "port"); + createProperty(software, "web_server"); + createProperty(software, "jk_version"); + createProperty(result, "result", "type"); + createProperty(result, "result", "message"); + } + if (isEcho()) { + handleOutput("server name=" + server.getName() + ":" + + server.getPort() + " - " + software.getWeb_server() + " - " + software.getJk_version()); + } + } + List balancers = status.getBalancers(); + for (Iterator iter = balancers.iterator(); iter.hasNext();) { + JkBalancer balancer = (JkBalancer) iter.next(); + String balancerIndex = null; + if (isLoadbalancerOnly) { + if (loadbalancer.equals(balancer.getName())) { + if (resultproperty != null) { + setPropertyBalancerOnly(balancer); + } + echoBalancer(balancer); + return; + } + } else { + if (!isWorkerOnly) { + if (resultproperty != null) { + if ( balancer.getId() >= 0) + balancerIndex = Integer.toString(balancer.getId()); + else + balancerIndex = balancer.getName() ; + + setPropertyBalancer(balancer,balancerIndex); + } + echoBalancer(balancer); + } + List members = balancer.getBalancerMembers(); + for (Iterator iterator = members.iterator(); iterator + .hasNext();) { + JkBalancerMember member = (JkBalancerMember) iterator + .next(); + if (isWorkerOnly) { + if (worker.equals(member.getName())) { + if (resultproperty != null) { + setPropertyWorkerOnly(balancer, member); + } + echoWorker(member); + return; + } + } else { + if (resultproperty != null) { + setPropertyWorker(null, member); + } + echoWorker(member); + if (member.getStatus() != null && !"OK".equals(member.getStatus())) { + error.append(" worker name=" + member.getName() + + " status=" + member.getStatus() + + " host=" + member.getAddress()); + } + if (member.getState() != null && + !("OK".equals(member.getState()) || + "N/A".equals(member.getState()) || + "OK/IDLE".equals(member.getState())) ){ + error.append(" worker name=" + member.getName() + + " state=" + member.getState() + + " host=" + member.getAddress()); + } + } + } + if (!isWorkerOnly) { + if (resultproperty != null && members.size() > 0) { + getProject().setNewProperty( + resultproperty + "." + + balancer.getName() + ".length", + Integer.toString(members.size())); + } + List mappings = balancer.getBalancerMappings(); + int j = 0; + String mapIndex ; + if( balancerIndex != null ) + mapIndex = balancerIndex + ".map" ; + else + mapIndex = "map" ; + for (Iterator iterator = mappings.iterator(); iterator + .hasNext(); j++) { + JkBalancerMapping mapping = (JkBalancerMapping) iterator + .next(); + if (resultproperty != null) { + String stringIndex2 ; + if( mapping.getId() >= 0) { + stringIndex2 = Integer.toString(mapping.getId()) ; + } else { + stringIndex2 = Integer.toString(j); + } + createProperty(mapping, mapIndex, + stringIndex2, "type"); + createProperty(mapping, mapIndex, + stringIndex2, "uri"); + createProperty(mapping, mapIndex, + stringIndex2, "context"); + createProperty(mapping, mapIndex, + stringIndex2, "source"); + } + if (isEcho()) { + String mappingOut ; + + if(mapping.source != null) { + mappingOut = + "balancer name=" + + balancer.getName() + " mappingtype=" + + mapping.getType() + " uri=" + + mapping.getUri() + " source=" + + mapping.getSource() ; + } else { + mappingOut = "balancer name=" + + balancer.getName() + " mappingtype=" + + mapping.getType() + " uri=" + + mapping.getUri() + " context=" + + mapping.getContext() ; + } + handleOutput(mappingOut); + } + } + if (resultproperty != null && mappings.size() > 0) { + getProject().setNewProperty( + resultproperty + "." + + mapIndex + ".length", + Integer.toString(mappings.size())); + } + } + } + } + if (!isWorkerOnly && !isLoadbalancerOnly) { + if (resultproperty != null && balancers.size() > 0) { + getProject().setNewProperty( + resultproperty + ".length", + Integer.toString(balancers.size())); + } + } + } catch (Throwable t) { + error.append(t.getMessage()); + if (getErrorProperty() != null) { + getProject().setNewProperty(errorProperty, error.toString()); + } + if (isFailOnError()) { + throw new BuildException(t); + } else { + handleErrorOutput(t.getMessage()); + return; + } + } + if (error.length() != 0) { + if (getErrorProperty() != null) { + getProject().setNewProperty(errorProperty, error.toString()); + } + if (isFailOnError()) { + // exception should be thrown only if failOnError == true + // or error line will be logged twice + throw new BuildException(error.toString()); + } + } + + } + + /** + * @param member + */ + private void echoWorker(JkBalancerMember member) { + if (isEcho()) { + StringBuffer state = new StringBuffer("worker name=") ; + state.append( member.getName()) ; + if(member.getStatus() != null) { + state.append(" status="); + state.append(member.getStatus()); + } + if(member.getState() != null) { + state.append(" state="); + state.append(member.getState()) ; + } + state.append(" host="); + state.append(member.getAddress()); + handleOutput(state.toString()); + } + } + + /** + * @param balancer + */ + private void echoBalancer(JkBalancer balancer) { + if (isEcho()) { + handleOutput("balancer name=" + balancer.getName() + " type=" + + balancer.getType()); + } + } + + /** + * @param balancer + */ + private void setPropertyBalancerOnly(JkBalancer balancer) { + String prefix = resultproperty + "." + balancer.getName(); + if(balancer.getId() >= 0 ) { + getProject().setNewProperty(prefix + ".id", + Integer.toString(balancer.getId())); + } + getProject().setNewProperty(prefix + ".type", balancer.getType()); + getProject().setNewProperty(prefix + ".stick_session", + Boolean.toString(balancer.isSticky_session())); + getProject().setNewProperty(prefix + ".sticky_session_force", + Boolean.toString(balancer.isSticky_session_force())); + getProject().setNewProperty(prefix + ".retries", + Integer.toString(balancer.getRetries())); + getProject().setNewProperty(prefix + ".recover_time", + Integer.toString(balancer.getRecover_time())); + getProject().setNewProperty(prefix + ".method", + balancer.getMethod()); + getProject().setNewProperty(prefix + ".good", + Integer.toString(balancer.getGood())); + getProject().setNewProperty(prefix + ".degraded", + Integer.toString(balancer.getDegraded())); + getProject().setNewProperty(prefix + ".bad", + Integer.toString(balancer.getBad())); + getProject().setNewProperty(prefix + ".busy", + Integer.toString(balancer.getBusy())); + getProject().setNewProperty(prefix + ".map_count", + Integer.toString(balancer.getMap_count())); + getProject().setNewProperty(prefix + ".member_count", + Integer.toString(balancer.getMember_count())); + getProject().setNewProperty(prefix + ".max_busy", + Integer.toString(balancer.getMax_busy())); + getProject().setNewProperty(prefix + ".time_to_maintenance_min", + Integer.toString(balancer.getTime_to_maintenance_min())); + getProject().setNewProperty(prefix + ".time_to_maintenance_max", + Integer.toString(balancer.getTime_to_maintenance_max())); + getProject().setNewProperty(prefix + ".lock", + balancer.getLock()); + + } + + /** + * @param balancer + * @param balancerIndex + */ + private void setPropertyBalancer(JkBalancer balancer,String balancerIndex) { + if(balancer.id >= 0) { + createProperty(balancer, balancerIndex, "id"); + } + + createProperty(balancer, balancerIndex, "name"); + createProperty(balancer, balancerIndex, "type"); + createProperty(balancer, balancerIndex, "sticky_session"); + createProperty(balancer, balancerIndex, "sticky_session_force"); + createProperty(balancer, balancerIndex, "retries"); + createProperty(balancer, balancerIndex, "recover_time"); + if(balancer.getMethod() != null) { + createProperty(balancer, balancerIndex, "method"); + } + if(balancer.getLock() != null) { + createProperty(balancer, balancerIndex, "lock"); + } + if(balancer.getGood() >= 0) { + createProperty(balancer, balancerIndex, "good"); + } + if(balancer.getDegraded() >= 0) { + createProperty(balancer, balancerIndex, "degraded"); + } + if(balancer.getBad() >= 0) { + createProperty(balancer, balancerIndex, "bad"); + } + if(balancer.getBusy() >= 0) { + createProperty(balancer, balancerIndex, "busy"); + } + if(balancer.getMax_busy() >= 0) { + createProperty(balancer, balancerIndex, "max_busy"); + } + if(balancer.getMember_count() >=0) { + createProperty(balancer, balancerIndex, "member_count"); + } + if(balancer.getMap_count() >=0) { + createProperty(balancer, balancerIndex, "map_count"); + } + if(balancer.getTime_to_maintenance_min() >=0) { + createProperty(balancer, balancerIndex, "time_to_maintenance_min"); + } + if(balancer.getTime_to_maintenance_max() >=0) { + createProperty(balancer, balancerIndex, "time_to_maintenance_max"); + } + } + + /** + * @param balancerIndex + * @param member + */ + private void setPropertyWorker(String balancerIndex, JkBalancerMember member) { + String workerIndex ; + if(member.getId() >= 0) { + workerIndex = Integer.toString(member.getId()); + createProperty(member, balancerIndex, workerIndex, "id"); + createProperty(member, balancerIndex, workerIndex, "name"); + } else { + workerIndex = member.getName(); + } + createProperty(member, balancerIndex, workerIndex, "type"); + createProperty(member, balancerIndex, workerIndex, "host"); + createProperty(member, balancerIndex, workerIndex, "port"); + createProperty(member, balancerIndex, workerIndex, "address"); + if(member.getJvm_route() != null) { + createProperty(member, balancerIndex, workerIndex, "jvm_route"); + } + if(member.getRoute() != null) { + createProperty(member, balancerIndex, workerIndex, "route"); + } + if(member.getStatus() != null) { + createProperty(member, balancerIndex, workerIndex, "status"); + } + if(member.getActivation() != null) { + createProperty(member, balancerIndex, workerIndex, "activation"); + } + if(member.getState() != null) { + createProperty(member, balancerIndex, workerIndex, "state"); + } + createProperty(member, balancerIndex, workerIndex, "lbfactor"); + createProperty(member, balancerIndex, workerIndex, "lbvalue"); + if(member.getLbmult() >= 0) { + createProperty(member, balancerIndex, workerIndex, "lbmult"); + } + createProperty(member, balancerIndex, workerIndex, "elected"); + createProperty(member, balancerIndex, workerIndex, "readed"); + createProperty(member, balancerIndex, workerIndex, "busy"); + if(member.getMax_busy() >= 0) { + createProperty(member, balancerIndex, workerIndex, "max_busy"); + } + createProperty(member, balancerIndex, workerIndex, "transferred"); + createProperty(member, balancerIndex, workerIndex, "errors"); + if(member.getClient_errors() >= 0) { + createProperty(member, balancerIndex, workerIndex, "client_errors"); + } + if(member.getDistance() >= 0) { + createProperty(member, balancerIndex, workerIndex, "distance"); + } + if (member.getDomain() != null) { + createProperty(member, balancerIndex, workerIndex, "domain"); + } else { + getProject().setNewProperty(resultproperty + "." + balancerIndex + "." + workerIndex + + ".domain", ""); + } + if (member.getRedirect() != null) { + createProperty(member, balancerIndex, workerIndex, "redirect"); + } else { + getProject().setNewProperty(resultproperty + "." + balancerIndex + "." + workerIndex + + ".redirect", ""); + } + } + + /** + * @param balancer + * @param member + */ + private void setPropertyWorkerOnly(JkBalancer balancer, + JkBalancerMember member) { + //String prefix = resultproperty + "." + balancer.getName() + "." + member.getName(); + String prefix = resultproperty + "." + member.getName(); + Project currentProject = getProject(); + if ( balancer.getId() >= 0) { + currentProject.setNewProperty(prefix + ".lb.id", + Integer.toString(balancer.getId())); + } + //currentProject.setNewProperty(prefix + ".lb.name", balancer.getName()); + if( member.getId() >= 0) { + currentProject.setNewProperty(prefix + ".id", + Integer.toString(member.getId())); + } + currentProject.setNewProperty(prefix + ".type", member.getType()); + if (member.getJvm_route() != null) { + currentProject.setNewProperty(prefix + ".jvm_route", member.getJvm_route()); + } + if (member.getRoute() != null) { + currentProject.setNewProperty(prefix + ".route", member.getRoute()); + } + if (member.getStatus() != null) { + currentProject.setNewProperty(prefix + ".status", member.getStatus()); + } + if (member.getActivation() != null) { + currentProject.setNewProperty(prefix + ".activation", member.getActivation()); + } + if (member.getState() != null) { + currentProject.setNewProperty(prefix + ".state", member.getState()); + } + currentProject.setNewProperty(prefix + ".host", member.getHost()); + currentProject.setNewProperty(prefix + ".address", member.getAddress()); + currentProject.setNewProperty(prefix + ".port", + Integer.toString(member.getPort())); + currentProject.setNewProperty(prefix + ".lbfactor", + Integer.toString(member.getLbfactor())); + currentProject.setNewProperty(prefix + ".lbvalue", + Long.toString(member.getLbvalue())); + if(member.getLbmult() >= 0) { + currentProject.setNewProperty(prefix + ".lbmult", + Long.toString(member.getLbmult())); + } + currentProject.setNewProperty(prefix + ".elected", + Long.toString(member.getElected())); + currentProject.setNewProperty(prefix + ".readed", + Long.toString(member.getReaded())); + currentProject.setNewProperty(prefix + ".transferred", + Long.toString(member.getTransferred())); + currentProject.setNewProperty(prefix + ".busy", + Integer.toString(member.getBusy())); + if(member.getMax_busy() >= 0) { + currentProject.setNewProperty(prefix + ".max_busy", + Long.toString(member.getMax_busy())); + } + currentProject.setNewProperty(prefix + ".errors", + Long.toString(member.getErrors())); + if(member.getClient_errors() >= 0) { + currentProject.setNewProperty(prefix + ".client_errors", + Long.toString(member.getClient_errors())); + } + if(member.getDistance() >= 0) { + currentProject.setNewProperty(prefix + ".distance", + Integer.toString(member.getDistance())); + } + if (member.getDomain() != null) { + currentProject.setNewProperty(prefix + ".domain", member.getDomain()); + } else { + currentProject.setNewProperty(prefix + ".domain", ""); + } + if (member.getRedirect() != null) { + currentProject.setNewProperty(prefix + ".redirect", + member.getRedirect()); + } else { + currentProject.setNewProperty(prefix + ".redirect", ""); + } + if(member.getTime_to_recover() >= 0) { + currentProject.setNewProperty(prefix + ".time_to_recover", + Integer.toString(member.getTime_to_recover())); + } + if(member.getTime_to_recover_min() >= 0) { + currentProject.setNewProperty(prefix + ".time_to_recover_min", + Integer.toString(member.getTime_to_recover_min())); + } + if(member.getTime_to_recover_max() >= 0) { + currentProject.setNewProperty(prefix + ".time_to_recover_max", + Integer.toString(member.getTime_to_recover_max())); + currentProject.setNewProperty(prefix + ".time_to_recover", + (Integer.toString((member.getTime_to_recover_min() + + member.getTime_to_recover_max()) / 2))); + } + + } + + /* + * Set ant property for save error state + * + * @see org.apache.catalina.ant.BaseRedirectorHelperTask#setErrorProperty(java.lang.String) + */ + public void setErrorProperty(String arg0) { + errorProperty = arg0; + super.setErrorProperty(arg0); + } + + /** + * @return Returns the errorProperty. + */ + public String getErrorProperty() { + return errorProperty; + } + + protected void createProperty(Object result, String attribute) { + createProperty(result, null, null, attribute); + } + + protected void createProperty(Object result, String arraymark, + String attribute) { + createProperty(result, arraymark, null, attribute); + } + + /** + * create result as property with name from attribute resultproperty + */ + protected void createProperty(Object result, String arraymark, + String arraymark2, String attribute) { + if (resultproperty != null) { + Object value = IntrospectionUtils.getProperty(result, attribute); + if (value != null ) { + StringBuffer propertyname = new StringBuffer(resultproperty); + + if (result instanceof JkBalancer) { + if (arraymark != null) { + propertyname.append("."); + propertyname.append(arraymark); + } + } else if (result instanceof JkServer) { + if (arraymark != null) { + propertyname.append("."); + propertyname.append(arraymark); + } + } else if (result instanceof JkSoftware) { + if (arraymark != null) { + propertyname.append("."); + propertyname.append(arraymark); + } + } else if (result instanceof JkResult) { + if (arraymark != null) { + propertyname.append("."); + propertyname.append(arraymark); + } + } else if (result instanceof JkBalancerMember) { + if (arraymark != null) { + propertyname.append("."); + propertyname.append(arraymark); + } + if (arraymark2 != null) { + propertyname.append("."); + propertyname.append(arraymark2); + } + } else if (result instanceof JkBalancerMapping) { + if (arraymark != null) { + propertyname.append("."); + propertyname.append(arraymark); + } + if (arraymark2 != null) { + propertyname.append("."); + propertyname.append(arraymark2); + } + } + propertyname.append("."); + propertyname.append(attribute); + getProject().setNewProperty(propertyname.toString(), + value.toString()); + } + } + } + +} |