ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/server/uk/org/iscream/cms/server/filter/TCPReaderInit.java
Revision: 1.26
Committed: Thu Mar 21 13:01:21 2002 UTC (22 years, 2 months ago) by tdb
Branch: MAIN
Changes since 1.25: +4 -4 lines
Log Message:
Made the ACL's dynamic where appropriate. This isn't perfect, the ACL will
only get reloaded after the next connection. This is because the check is
done in the main while loop, and will only get done before a new thread is
spawned to deal with a connection. It will have the desired effect though,
I hope :)

File Contents

# Content
1 //---PACKAGE DECLARATION---
2 package uk.org.iscream.cms.server.filter;
3
4 //---IMPORTS---
5 import uk.org.iscream.cms.server.core.*;
6 import uk.org.iscream.cms.server.filter.*;
7 import uk.org.iscream.cms.server.componentmanager.*;
8 import java.net.Socket;
9 import java.io.InputStream;
10 import java.io.OutputStream;
11 import java.io.IOException;
12 import java.io.*;
13 import uk.org.iscream.cms.server.util.*;
14
15 /**
16 * This provides Host heartbeat functionality
17 *
18 * @author $Author: tdb $
19 * @version $Id: TCPReaderInit.java,v 1.25 2001/05/29 17:02:35 tdb Exp $
20 */
21 class TCPReaderInit extends Thread {
22
23 //---FINAL ATTRIBUTES---
24
25 /**
26 * The current CVS revision of this class
27 */
28 public final String REVISION = "$Revision: 1.25 $";
29
30 //---STATIC METHODS---
31
32 //---CONSTRUCTORS---
33
34 /**
35 * Construct a new TCPReaderInit.
36 *
37 * @param socket the Socket to which the host is connected
38 * @param queue the Queue to which we'll add data
39 * @throws IOException if something goes badly wrong
40 */
41 public TCPReaderInit(Socket socket, Queue queue) throws IOException {
42 // set the Thread name
43 setName("filter.TCPReaderInit");
44
45 _socket = socket;
46 _queue = queue;
47 // setup the reader & writer
48 _socketIn = new BufferedReader(new InputStreamReader(_socket.getInputStream()));
49 _socketOut = new PrintWriter(_socket.getOutputStream(), true);
50 _logger.write(toString(), Logger.SYSINIT, "created");
51 }
52
53 //---PUBLIC METHODS---
54
55 /**
56 * Main run method. Will communicate with the host, inform it
57 * if any updates to it's configuration are needed, and send
58 * a heartbeat packet into the system.
59 */
60 public void run() {
61 try {
62 //variables
63 String filelist = "";
64 String lastModified = "";
65 String inBound = "";
66
67 // try for HEARTBEAT
68 getInBound("HEARTBEAT");
69 _socketOut.println("OK");
70
71 // try for CONFIG
72 getInBound("CONFIG");
73 _socketOut.println("OK");
74
75 // try for {filelist}
76 filelist = getInBound();
77 _socketOut.println("OK");
78
79 // try for {lastModified}
80 lastModified = getInBound();
81 // check to see if a config update has happen
82 boolean newConfig = _configManager.isModified(filelist, Long.parseLong(lastModified));
83 if(newConfig) {
84 // new config !
85 _socketOut.println("ERROR");
86 }
87 else {
88 // nothing has changed
89 _socketOut.println("OK");
90 }
91
92 // try for CONFIG
93 getInBound("ENDHEARTBEAT");
94 _socketOut.println("OK");
95
96 // work out some information for our heartbeat packet
97 String date = new Long(System.currentTimeMillis()/((long) 1000)).toString(); //seconds
98 String hostname = _socket.getInetAddress().getHostName().toLowerCase();
99 String ipadd = _socket.getInetAddress().getHostAddress();
100
101 // run the service checks for this host
102 _logger.write(toString(), Logger.DEBUG, "Running service checks");
103 String checks = PluginServiceCheckManager.getInstance().runServiceChecks(hostname);
104
105 // build the heartbeat packet
106 String xml = "<packet type=\"heartbeat\" machine_name=\""+hostname+"\" date=\""+date+"\" ip=\""+ipadd+"\">" + checks + "</packet>";
107
108 // get it to be sent on
109 _queue.add(xml);
110
111 } catch (Exception e) {
112 _logger.write(toString(), Logger.ERROR, "ERROR: " + e);
113 }
114
115 // Disconnect streams & socket
116 try {
117 _socketIn.close();
118 _socketOut.close();
119 _socket.close();
120 } catch (IOException e) {
121 _logger.write(toString(), Logger.ERROR, "exception on socket close");
122 }
123 _logger.write(toString(), Logger.DEBUG, "finished");
124 }
125
126 /**
127 * Overrides the {@link java.lang.Object#toString() Object.toString()}
128 * method to provide clean logging (every class should have this).
129 *
130 * This uses the uk.org.iscream.cms.server.util.NameFormat class
131 * to format the toString()
132 *
133 * @return the name of this class and its CVS revision
134 */
135 public String toString() {
136 return FormatName.getName(
137 _name,
138 getClass().getName(),
139 REVISION);
140 }
141
142 //---PRIVATE METHODS---
143
144 private String getInBound(String expected) throws IOException {
145 // grab the input
146 String inBound = getInBound();
147 // check if it's what we're expecting
148 if(!inBound.equals(expected)) {
149 throw new IOException("protocol error from "+_socket.getInetAddress().getHostName()+" - expected:"+expected+" got:" + inBound);
150 }
151 // it should be ok then
152 return inBound;
153 }
154
155 private String getInBound() throws IOException {
156 // grab the input
157 String inBound = _socketIn.readLine();
158 // check for null's, likely disconnection
159 if(inBound == null) {
160 throw new IOException("got null from host, maybe it died");
161 }
162 // it's a valid message it seems
163 return inBound;
164 }
165
166 //---ACCESSOR/MUTATOR METHODS---
167
168 //---ATTRIBUTES---
169
170 /**
171 * A reference to the configuration manager
172 */
173 ConfigurationManager _configManager = ReferenceManager.getInstance().getCM();
174
175 /**
176 * This is the friendly identifier of the
177 * component this class is running in.
178 * eg, a Filter may be called "filter1",
179 * If this class does not have an owning
180 * component, a name from the configuration
181 * can be placed here. This name could also
182 * be changed to null for utility classes.
183 */
184 private String _name = FilterMain.NAME;
185
186 /**
187 * This holds a reference to the
188 * system logger that is being used.
189 */
190 private Logger _logger = ReferenceManager.getInstance().getLogger();
191
192 /**
193 * The socket we are talking on
194 */
195 Socket _socket;
196
197 /**
198 * The input from the socket
199 */
200 BufferedReader _socketIn;
201
202 /**
203 * The output from the socket
204 */
205 PrintWriter _socketOut;
206
207 /**
208 * A reference to our Queue
209 */
210 Queue _queue;
211 //---STATIC ATTRIBUTES---
212
213 }