You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by co...@apache.org on 2002/02/07 06:09:36 UTC
cvs commit: jakarta-tomcat/src/share/org/apache/tomcat/startup StopTomcat.java
costin 02/02/06 21:09:36
Modified: src/share/org/apache/tomcat/startup StopTomcat.java
Log:
Added logic to send the shutdown command using ajp13. That means ajp12
is no longer needed if the password is enabled on ajp13.
The ajp13.id is cleaner ( i.e. a properties file ) - it can be
read from mod_jk as well ( but that's for a future version ), to
eliminate duplicated config.
Revision Changes Path
1.14 +93 -19 jakarta-tomcat/src/share/org/apache/tomcat/startup/StopTomcat.java
Index: StopTomcat.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/startup/StopTomcat.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- StopTomcat.java 16 Oct 2001 21:03:37 -0000 1.13
+++ StopTomcat.java 7 Feb 2002 05:09:36 -0000 1.14
@@ -86,6 +86,7 @@
String secretFile=null;
String args[];
boolean help=false;
+ boolean isAjp13=false;
public StopTomcat()
{
@@ -154,6 +155,10 @@
help = true;
}
+ public void setAjp13( boolean b ) {
+ isAjp13=b;
+ }
+
public void setArgs( String args[] ) {
this.args=args;
}
@@ -187,24 +192,52 @@
// read TOMCAT_HOME/conf/ajp12.id unless command line params
// specify a port/host/secret
try {
- if( secretFile==null )
- secretFile=tchome + "/conf/ajp12.id";
- BufferedReader rd=new BufferedReader
- ( new FileReader(secretFile));
- 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;
+ if( secretFile==null ) {
+ secretFile=tchome + "/conf/ajp13.id";
+ File f=new File( secretFile );
+ // if ajp13.id exists, use it
+ if( f.exists() ) {
+ isAjp13=true;
+ } else {
+ secretFile=tchome + "/conf/ajp12.id";
+ }
+ }
+
+ if( isAjp13 ) {
+ Properties props=new Properties();
+ props.load( new FileInputStream( secretFile ));
+
+ 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;
+ } else {
+ BufferedReader rd=new BufferedReader
+ ( new FileReader(secretFile));
+ 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 " + secretFile);
@@ -258,7 +291,10 @@
address = InetAddress.getLocalHost();
Socket socket = new Socket(address, portInt);
OutputStream os=socket.getOutputStream();
- sendAjp12Stop( os, secret );
+ 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
@@ -299,6 +335,32 @@
}
}
+ /** 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=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 );
+ 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 )
@@ -308,6 +370,18 @@
os.write( len/256 );
os.write( len%256 );
os.write( s.getBytes() );// works only for ascii
+ }
+
+ /** Small AJP12 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.
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>