1 // ========================================================================
2 // Copyright (c) 2003-2009 Mort Bay Consulting Pty. Ltd.
3 // ------------------------------------------------------------------------
4 // All rights reserved. This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v1.0
6 // and Apache License v2.0 which accompanies this distribution.
7 // The Eclipse Public License is available at
8 // http://www.eclipse.org/legal/epl-v10.html
9 // The Apache License v2.0 is available at
10 // http://www.opensource.org/licenses/apache2.0.php
11 // You may elect to redistribute this code under either of these licenses.
12 // ========================================================================
13
14 package org.eclipse.jetty.start;
15 import java.io.InputStreamReader;
16 import java.io.LineNumberReader;
17 import java.net.InetAddress;
18 import java.net.ServerSocket;
19 import java.net.Socket;
20
21 /*-------------------------------------------*/
22 /** Monitor thread.
23 * This thread listens on the port specified by the STOP.PORT system parameter
24 * (defaults to -1 for not listening) for request authenticated with the key given by the STOP.KEY
25 * system parameter (defaults to "eclipse") for admin requests.
26 * <p>
27 * If the stop port is set to zero, then a random port is assigned and the port number
28 * is printed to stdout.
29 * <p>
30 * Commands "stop" and * "status" are currently supported.
31 *
32 */
33 public class Monitor extends Thread
34 {
35 private int _port = Integer.getInteger("STOP.PORT", -1).intValue();
36 private String _key = System.getProperty("STOP.KEY", null);
37
38 ServerSocket _socket;
39
40 Monitor()
41 {
42 try
43 {
44 if(_port<0)
45 return;
46 setDaemon(true);
47 setName("StopMonitor");
48 _socket=new ServerSocket(_port,1,InetAddress.getByName("127.0.0.1"));
49 if (_port==0)
50 {
51 _port=_socket.getLocalPort();
52 System.out.println(_port);
53 }
54
55 if (_key==null)
56 {
57 _key=Long.toString((long)(Long.MAX_VALUE*Math.random()+this.hashCode()+System.currentTimeMillis()),36);
58 System.out.println("-DSTOP.KEY="+_key);
59 }
60 }
61 catch(Exception e)
62 {
63 if (Main._debug)
64 e.printStackTrace();
65 else
66 System.err.println(e.toString());
67 }
68 if (_socket!=null)
69 this.start();
70 else
71 System.err.println("WARN: Not listening on monitor port: "+_port);
72 }
73
74 public void run()
75 {
76 while (true)
77 {
78 Socket socket=null;
79 try{
80 socket=_socket.accept();
81
82 LineNumberReader lin=
83 new LineNumberReader(new InputStreamReader(socket.getInputStream()));
84 String key=lin.readLine();
85 if (!_key.equals(key))
86 continue;
87
88 String cmd=lin.readLine();
89 if (Main._debug) System.err.println("command="+cmd);
90 if ("stop".equals(cmd))
91 {
92 try {socket.close();}catch(Exception e){e.printStackTrace();}
93 try {_socket.close();}catch(Exception e){e.printStackTrace();}
94 System.exit(0);
95 }
96 else if ("status".equals(cmd))
97 {
98 socket.getOutputStream().write("OK\r\n".getBytes());
99 socket.getOutputStream().flush();
100 }
101 }
102 catch(Exception e)
103 {
104 if (Main._debug)
105 e.printStackTrace();
106 else
107 System.err.println(e.toString());
108 }
109 finally
110 {
111 if (socket!=null)
112 {
113 try{socket.close();}catch(Exception e){}
114 }
115 socket=null;
116 }
117 }
118 }
119
120 /** Start a Monitor.
121 * This static method starts a monitor that listens for admin requests.
122 */
123 public static void monitor()
124 {
125 new Monitor();
126 }
127
128 }