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.27
Committed: Thu Mar 21 17:44:51 2002 UTC (22 years, 2 months ago) by tdb
Branch: MAIN
Changes since 1.26: +62 -33 lines
Log Message:
Initial work on host authentication for the server. Until I can get ihost
doing it's side of the host authentication I can't really test any further.
It seems to work, as in it filters data which isn't authenticated when told
to do so in the config :)

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