ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/server/uk/org/iscream/cms/server/filtermanager/HostInit.java
Revision: 1.38
Committed: Thu Feb 27 18:03:58 2003 UTC (21 years, 2 months ago) by tdb
Branch: MAIN
Changes since 1.37: +3 -2 lines
Log Message:
Now sends error when something unexpected is received before disconnecting.

File Contents

# Content
1 /*
2 * i-scream central monitoring system
3 * http://www.i-scream.org.uk
4 * Copyright (C) 2000-2002 i-scream
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 */
20
21 //---PACKAGE DECLARATION---
22 package uk.org.iscream.cms.server.filtermanager;
23
24 //---IMPORTS---
25 import uk.org.iscream.cms.server.core.*;
26 import uk.org.iscream.cms.server.filter.*;
27 import uk.org.iscream.cms.util.*;
28 import uk.org.iscream.cms.server.componentmanager.*;
29 import java.net.*;
30 import java.io.*;
31 import java.util.*;
32
33 /**
34 * Handles setting up a host.
35 * This class provides a host with appropriate configuration
36 * and a reference to a Filter to which it should pass data.
37 *
38 * @author $Author: tdb $
39 * @version $Id: HostInit.java,v 1.37 2003/02/27 17:04:24 tdb Exp $
40 */
41 class HostInit extends Thread {
42
43 //---FINAL ATTRIBUTES---
44
45 /**
46 * The current CVS revision of this class
47 */
48 public final String REVISION = "$Revision: 1.37 $";
49
50 //---STATIC METHODS---
51
52 //---CONSTRUCTORS---
53
54 /**
55 * Construct a new HostInit.
56 *
57 * @param socket The socket to which the host is connected
58 */
59 public HostInit(Socket socket) throws IOException {
60 // set the Thread name
61 setName("filtermanager.HostInit");
62
63 _socket = socket;
64 // setup reader & writer
65 _socketIn = new BufferedReader(new InputStreamReader(_socket.getInputStream()));
66 _socketOut = new PrintWriter(_socket.getOutputStream(), true);
67 _logger.write(toString(), Logger.SYSINIT, "created");
68 }
69
70 //---PUBLIC METHODS---
71
72 /**
73 * Main method in this class, which handles communicating with
74 * the host to determine it's setup.
75 */
76 public void run() {
77 // get a hook on the config proxy
78 ConfigurationProxy cp = ConfigurationProxy.getInstance();
79 // this is our config name
80 String configName = "Host." + _socket.getInetAddress().getHostName().toLowerCase();
81 try {
82 // look for a command:
83 // STARTCONFIG - to get a configuration
84 // CHECKCONFIG - to check a configuration
85 // END - to finish
86 String cmd = getInBound();
87 while(!cmd.equals("END")) {
88 if(cmd.equals("STARTCONFIG")) {
89 // respond to STARTCONFIG
90 _socketOut.println("OK");
91
92 // try for LASTMODIFIED
93 getInBound("LASTMODIFIED");
94 _socketOut.println(cp.getLastModified(configName));
95
96 // try for FILELIST
97 getInBound("FILELIST");
98 _socketOut.println(cp.getFileList(configName));
99
100 // try for FQDN
101 getInBound("FQDN");
102 _socketOut.println(_socket.getInetAddress().getHostName().toLowerCase());
103
104 // get properties
105 String reqProperty = getInBound();
106 while(!reqProperty.equals("ENDCONFIG")) {
107 // get the property
108 try {
109 String returnedProperty = cp.getProperty(configName, "Host."+reqProperty);
110 _socketOut.println(returnedProperty);
111 } catch (PropertyNotFoundException e) {
112 _socketOut.println("ERROR");
113 }
114 // get the next request
115 reqProperty = _socketIn.readLine();
116 }
117 _logger.write(toString(), Logger.SYSMSG, "configured host");
118 _socketOut.println("OK");
119
120 // get filter reference
121 getInBound("FILTER");
122 // send info
123 String filterList = cp.getProperty(configName, "Host.filter");
124 FilterInfo filterInfoRef = null;
125 String filter = null;
126 StringTokenizer st = new StringTokenizer(filterList, ";");
127 while (filterInfoRef==null && st.hasMoreTokens()) {
128 filter = st.nextToken();
129 _logger.write(toString(), Logger.DEBUG, " looking for filter- " + filter);
130 try {
131 filterInfoRef = FilterInfoHelper.narrow(ReferenceManager.getInstance().getCORBARef("iscream.FilterInfo\\." + filter));
132 } catch (ComponentCORBAException e) {
133 _logger.write(toString(), Logger.DEBUG, " unable to find filter- " + filter);
134 }
135 }
136
137 // hopefully we found a filter
138 if(filterInfoRef != null) {
139 _logger.write(toString(), Logger.DEBUG, " found filter- " + filter);
140 try {
141 // tell the host about it...
142 _socketOut.println(filterInfoRef.getHostName() + ";"
143 + filterInfoRef.getUDPPort());
144 }
145 catch(org.omg.CORBA.COMM_FAILURE e) {
146 // failed to talk to filter, lets signal an error
147 _socketOut.println("ERROR");
148 throw new IOException("error communicating with filter - " + e);
149 }
150 }
151 else {
152 // ...or throw a wobbly (and tell the host!)
153 _socketOut.println("ERROR");
154 throw new IOException("unable to find filter for host");
155 }
156
157 }
158 else if(cmd.equals("CHECKCONFIG")) {
159 // respond to CHECKCONFIG
160 _socketOut.println("OK");
161
162 // try for {filelist}
163 String filelist = getInBound();
164 _socketOut.println("OK");
165
166 // try for {lastModified}
167 String lastModified = getInBound();
168 long lastmod;
169 try {
170 lastmod = Long.parseLong(lastModified);
171 }
172 catch(NumberFormatException e) {
173 _socketOut.println("ERROR");
174 throw new IOException("Last Modified invalid: " + e);
175 }
176
177 // check to see if a config update has happen
178 boolean newConfig = _configManager.isModified(filelist, lastmod);
179 if(newConfig) {
180 // new config !
181 _socketOut.println("EXPIRED");
182 }
183 else {
184 // nothing has changed
185 _socketOut.println("OK");
186 }
187 }
188 else {
189 _socketOut.println("ERROR");
190 }
191 // get the next command
192 cmd = getInBound();
193 }
194 // respond to END
195 _socketOut.println("OK");
196
197 } catch (Exception e) {
198 _logger.write(toString(), Logger.ERROR, "ERROR - " + e);
199 }
200
201 // Disconnect streams & socket
202 try {
203 _socketIn.close();
204 _socketOut.close();
205 _socket.close();
206 } catch (IOException e) {
207 _logger.write(toString(), Logger.ERROR, "exception on socket close");
208 }
209 _logger.write(toString(), Logger.SYSMSG, "finished");
210 }
211
212 /**
213 * Overrides the {@link java.lang.Object#toString() Object.toString()}
214 * method to provide clean logging (every class should have this).
215 *
216 * This uses the uk.org.iscream.cms.util.NameFormat class
217 * to format the toString()
218 *
219 * @return the name of this class and its CVS revision
220 */
221 public String toString() {
222 return FormatName.getName(
223 _name,
224 getClass().getName(),
225 REVISION);
226 }
227
228 //---PRIVATE METHODS---
229
230 private String getInBound(String expected) throws IOException {
231 // grab the input
232 String inBound = getInBound();
233 // check if it's what we're expecting
234 if(!inBound.equals(expected)) {
235 _socketOut.println("ERROR");
236 throw new IOException("protocol error - expected:"+expected+" got:" + inBound);
237 }
238 // it should be ok then
239 return inBound;
240 }
241
242 private String getInBound() throws IOException {
243 // grab the input
244 String inBound = _socketIn.readLine();
245 // check for null's, likely disconnection
246 if(inBound == null) {
247 throw new IOException("got null from host, maybe it died");
248 }
249 // it's a valid message it seems
250 return inBound;
251 }
252
253 //---ACCESSOR/MUTATOR METHODS---
254
255 //---ATTRIBUTES---
256
257 /**
258 * This holds a reference to the
259 * system logger that is being used.
260 */
261 private Logger _logger = ReferenceManager.getInstance().getLogger();
262
263 /**
264 * A reference to the Configuration Manager the system is using
265 */
266 private ConfigurationManager _configManager = ReferenceManager.getInstance().getCM();
267
268 /**
269 * This is the friendly identifier of the
270 * component this class is running in.
271 * eg, a Filter may be called "filter1",
272 * If this class does not have an owning
273 * component, a name from the configuration
274 * can be placed here. This name could also
275 * be changed to null for utility classes.
276 */
277 private String _name = FilterManager.NAME;
278
279 /**
280 * The socket this class uses
281 */
282 private Socket _socket;
283
284 /**
285 * Used for the input stream of this socket
286 */
287 private BufferedReader _socketIn;
288
289 /**
290 * Used for the output stream of this socket
291 */
292 private PrintWriter _socketOut;
293
294 //---STATIC ATTRIBUTES---
295
296 }