1 // ========================================================================
2 // Copyright 2003-2005 Mort Bay Consulting Pty. Ltd.
3 // ------------------------------------------------------------------------
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 // http://www.apache.org/licenses/LICENSE-2.0
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 // ========================================================================
14
15 package org.mortbay.start;
16 import java.io.InputStreamReader;
17 import java.io.LineNumberReader;
18 import java.net.InetAddress;
19 import java.net.ServerSocket;
20 import java.net.Socket;
21
22 /*-------------------------------------------*/
23 /** Monitor thread.
24 * This thread listens on the port specified by the STOP.PORT system parameter
25 * (defaults to -1 for not listening) for request authenticated with the key given by the STOP.KEY
26 * system parameter (defaults to "mortbay") for admin requests.
27 * <p>
28 * If the stop port is set to zero, then a random port is assigned and the port number
29 * is printed to stdout.
30 * <p>
31 * Commands "stop" and * "status" are currently supported.
32 *
33 */
34 public class Monitor extends Thread
35 {
36 private int _port = Integer.getInteger("STOP.PORT", -1).intValue();
37 private String _key = System.getProperty("STOP.KEY", null);
38
39 ServerSocket _socket;
40
41 Monitor()
42 {
43 try
44 {
45 if(_port<0)
46 return;
47 setDaemon(true);
48 setName("StopMonitor");
49 _socket=new ServerSocket(_port,1,InetAddress.getByName("127.0.0.1"));
50 if (_port==0)
51 {
52 _port=_socket.getLocalPort();
53 System.out.println(_port);
54 }
55
56 if (_key==null)
57 {
58 _key=Long.toString((long)(Long.MAX_VALUE*Math.random()+this.hashCode()+System.currentTimeMillis()),36);
59 System.out.println("-DSTOP.KEY="+_key);
60 }
61 }
62 catch(Exception e)
63 {
64 if (Main._debug)
65 e.printStackTrace();
66 else
67 System.err.println(e.toString());
68 }
69 if (_socket!=null)
70 this.start();
71 else
72 System.err.println("WARN: Not listening on monitor port: "+_port);
73 }
74
75 public void run()
76 {
77 while (true)
78 {
79 Socket socket=null;
80 try{
81 socket=_socket.accept();
82
83 LineNumberReader lin=
84 new LineNumberReader(new InputStreamReader(socket.getInputStream()));
85 String key=lin.readLine();
86 if (!_key.equals(key))
87 continue;
88
89 String cmd=lin.readLine();
90 if (Main._debug) System.err.println("command="+cmd);
91 if ("stop".equals(cmd))
92 {
93 try {socket.close();}catch(Exception e){e.printStackTrace();}
94 try {_socket.close();}catch(Exception e){e.printStackTrace();}
95 System.exit(0);
96 }
97 else if ("status".equals(cmd))
98 {
99 socket.getOutputStream().write("OK\r\n".getBytes());
100 socket.getOutputStream().flush();
101 }
102 }
103 catch(Exception e)
104 {
105 if (Main._debug)
106 e.printStackTrace();
107 else
108 System.err.println(e.toString());
109 }
110 finally
111 {
112 if (socket!=null)
113 {
114 try{socket.close();}catch(Exception e){}
115 }
116 socket=null;
117 }
118 }
119 }
120
121 /** Start a Monitor.
122 * This static method starts a monitor that listens for admin requests.
123 */
124 public static void monitor()
125 {
126 new Monitor();
127 }
128
129 }