|
What this is
Other links
The source code/* * Copyright 1999-2004 The Apache Sofware Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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.tomcat.startup; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.util.Hashtable; import java.util.Properties; import org.apache.tomcat.util.IntrospectionUtils; import org.apache.tomcat.util.res.StringManager; // Depends: StringManager, resources /** * This task will stop tomcat * * @author Costin Manolache */ public class StopTomcat { static final String DEFAULT_CONFIG="conf/server.xml"; private static StringManager sm = StringManager.getManager("org.apache.tomcat.resources"); String tomcatHome=null; String host=null; int port=-1; String secret; // explicit command line params ( for port, host or secret ) boolean commandLineParams=false; String secretFile=null; String shutdown=null; String args[]; boolean help=false; boolean isAjp13=false; boolean isAjp12=false; public StopTomcat() { } // -------------------- Parameters -------------------- public void setSecretFile( String s ) { secretFile=s; commandLineParams=true; } public void setAjpid( String s ) { secretFile=s; commandLineParams=true; } public void setAjpid12( String s ) { secretFile=s; commandLineParams=true; isAjp12=true; isAjp13=false; } public void setAjpid13( String s ) { secretFile=s; commandLineParams=true; isAjp12=false; isAjp13=true; } public void setH( String s ) { tomcatHome=s; System.getProperties().put("tomcat.home", s); } public void setHome( String s ) { tomcatHome=s; System.getProperties().put("tomcat.home", s); } public void setHost( String h ) { host=h; commandLineParams=true; } public void setPort( int port ) { this.port=port; commandLineParams=true; } /** When tomcat is started, a secret ( random ) key will be generated in ajp12.id. If you run StopTomcat from the same host, it'll read the key and use it. If you run from a different host, you'll have to specify it manually */ public void setPass( String s ) { secret=s; commandLineParams=true; } public void setSecret( String s ) { secret=s; commandLineParams=true; } public void setHelp( boolean b ) { help = b; } // Generic properties / attributes public void setAttribute(String s, Object o ) { if( s.equals("args") ) setArgs((String [])o); } public void setProperty( String name, String v ) { if( !name.equals("stop") ) // unknown property help = true; } public void setAjp13( boolean b ) { isAjp13=b; isAjp12=!b; } public void setAjp12( boolean b ) { isAjp12=b; isAjp13=!b; } public void setArgs( String args[] ) { this.args=args; } // -------------------- Ant execute -------------------- public void execute() throws Exception { if( args!=null ) processArgs( args ); if( help ) { printUsage(); return; } System.out.println(sm.getString("tomcat.stop")); try { stopTomcat(); // stop serving } catch (java.net.ConnectException ex) { System.out.println(sm.getString("tomcat.connectexception")); } catch (Exception te ) { throw te; } return; } // -------------------- Implementation -------------------- void stopTomcat() throws Exception { // if a parameter isn't set, try to read it from a file if( port < 0 || host == null || secret == null ) { String tchome=getTomcatHome(); String defAjp12File=tchome + "/conf/ajp12.id"; String defAjp13File=tchome + "/conf/ajp13.id"; String ajpFile=secretFile; int portSave=port; String hostSave=host; String secretSave=secret; boolean pickAjp=(!isAjp13 && !isAjp12); // try to read unset parameters from appropriate file try { if( ajpFile==null ) { if (isAjp13) { ajpFile=defAjp13File; } else if (isAjp12) { ajpFile=defAjp12File; } else { File f=new File( defAjp13File ); if( f.exists() ) { ajpFile=defAjp13File; isAjp13=true; } else { f=new File( defAjp12File ); if( f.exists() ) { ajpFile=defAjp12File; isAjp12=true; } } } } else if( pickAjp ) { // default to ajp12 if file specifed with no protocal isAjp12=true; } if( isAjp13 ) { Properties props=new Properties(); props.load( new FileInputStream( ajpFile )); String line=props.getProperty( "port" ); if( port < 0 ) { try { port=Integer.parseInt( line ); } catch(NumberFormatException ex ) { ex.printStackTrace(); } } line=props.getProperty( "address" ); if( host==null ) host=line; line=props.getProperty( "secret" ); if( secret==null ) secret=line; shutdown=props.getProperty( "shutdown" ); // if shutdown not enabled in default ajp13 file and // picking ajp, try ajp12 default file if( shutdown==null && secretFile == null && pickAjp) { isAjp12=true; isAjp13=false; port=portSave; host=hostSave; secret=secretSave; ajpFile=defAjp12File; } } if( isAjp12 ) { BufferedReader rd=new BufferedReader ( new FileReader(ajpFile)); String line=rd.readLine(); if( port < 0 ) { try { port=Integer.parseInt( line ); } catch(NumberFormatException ex ) { ex.printStackTrace(); } } line=rd.readLine(); if( host==null ) host=line; line=rd.readLine(); if( secret==null ) secret=line; } } catch( IOException ex ) { //ex.printStackTrace(); System.out.println("Can't read " + ajpFile); // System.out.println(ex.toString()); if( ! commandLineParams ) return; } } if( "".equals( secret ) ) secret=null; System.out.println("Stopping tomcat on " + host + ":" +port +" " + secret); InetAddress address=null; if( host!=null && !"".equals( host )) { try { address=InetAddress.getByName( host ); } catch( UnknownHostException ex ) { ex.printStackTrace(); } } stopTomcat( address,port, secret ); } public String getTomcatHome() { if (tomcatHome != null) return tomcatHome; // Try to establish install and home locations String tchome=IntrospectionUtils.guessInstall("tomcat.install", "tomcat.home","stop-tomcat.jar"); // Use the "tomcat.home" property to resolve the default filename tchome = System.getProperty("tomcat.home"); if (tchome == null) { System.out.println(sm.getString("tomcat.nohome")); tchome = "."; // Assume current working directory } return tchome; } /** * This particular implementation will search for an AJP12 * connector ( that have a special stop command ). */ public void stopTomcat(InetAddress address, int portInt, String secret ) throws IOException { // use Ajp12 to stop the server... try { if (address == null) address = InetAddress.getLocalHost(); Socket socket = new Socket(address, portInt); OutputStream os=socket.getOutputStream(); if( isAjp13 ) sendAjp13Stop( os, secret ); else sendAjp12Stop( os, secret ); // Setting soLinger to 0 will help make sure the connection is // closed on NetWare. If the other side closes the connection // first, we get a SocketException so catch and ignore it try { socket.setSoLinger(true, 0); } catch (java.net.SocketException ignore) { } os.flush(); os.close(); // socket.close(); } catch(IOException ex ) { System.out.println("Error stopping Tomcat with Ajp12 on " + address + ":" + portInt + " " + ex); } } /** Small AJP12 client util */ public void sendAjp12Stop( OutputStream os, String secret ) throws IOException { byte stopMessage[]=new byte[2]; stopMessage[0]=(byte)254; stopMessage[1]=(byte)15; os.write( stopMessage ); if(secret!=null ) sendAjp12String( os, secret ); // flush the stream and give the backend a chance to read the request // and shut down before we close the socket os.flush(); try { Thread.sleep(1000); } catch (InterruptedException ignore) { } } /** Small AJP13 client util */ public void sendAjp13Stop( OutputStream os, String secret ) throws IOException { byte stopMessage[]=new byte[5]; stopMessage[0]=(byte)0x12; stopMessage[1]=(byte)0x34; int len=1; if( secret != null ) len=secret.length() + 4; // 1==shutdown cmd, 2==string len, 1=\0 stopMessage[2]= (byte) ( len/256 ); stopMessage[3]= (byte) (len % 256 ); stopMessage[4]= 7; // JK_AJP13_SHUTDOWN os.write( stopMessage ); if( secret != null ) sendAjp13String( os, secret ); // flush the stream and give the backend a chance to read the request // and shut down before we close the socket os.flush(); try { Thread.sleep(1000); } catch (InterruptedException ignore) { } } /** Small AJP12 client util */ public void sendAjp12String( OutputStream os, String s ) throws IOException { int len=s.length(); os.write( len/256 ); os.write( len%256 ); os.write( s.getBytes() );// works only for ascii } /** Small AJP13 client util */ public void sendAjp13String( OutputStream os, String s ) throws IOException { int len=s.length(); os.write( len/256 ); os.write( len%256 ); os.write( s.getBytes() );// works only for ascii os.write( (byte)0 ); } /** Process arguments - set object properties from the list of args. */ public boolean processArgs(String[] args) { try { return IntrospectionUtils.processArgs( this, args, getOptions1(), null, getOptionAliases()); } catch( Exception ex ) { ex.printStackTrace(); return false; } } static String options1[]= { "help", "stop", "ajp12", "ajp13" }; static Hashtable optionAliases=new Hashtable(); static Hashtable optionDescription=new Hashtable(); static { optionAliases.put("h", "home"); optionAliases.put("?", "help"); } public String[] getOptions1() { return options1; } public Hashtable getOptionAliases() { return optionAliases; } public static void printUsage() { System.out.println("Usage: java org.apache.tomcat.startup.StopTomcat {options}"); System.out.println(" Options are:"); System.out.println(" -ajp12 Use Ajp12 protocol for shutdown"); System.out.println(" -ajp13 Use Ajp13 protocol for shutdown"); System.out.println(" Shutdown feature of Ajp13"); System.out.println(" connector must be enabled."); System.out.println(" -ajpid file (or -secretFile file) Use this file instead of conf/ajp13.id"); System.out.println(" or conf/ajp12.id. You must set"); System.out.println(" -ajp13 option if file is from"); System.out.println(" Ajp13 connector"); System.out.println(" -help (or -?) Show this usage report"); System.out.println(" -host |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.