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.40
Committed: Sun Aug 1 10:41:05 2004 UTC (19 years, 9 months ago) by tdb
Branch: MAIN
Changes since 1.39: +3 -3 lines
Log Message:
Catch a lot of old URL's and update them. Also remove a couple of old files
that aren't used.

File Contents

# Content
1 /*
2 * i-scream central monitoring system
3 * http://www.i-scream.org
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.39 2003/02/28 13:03:57 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.39 $";
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 // try for IP
105 getInBound("IP");
106 _socketOut.println(_socket.getInetAddress().getHostAddress());
107
108 // get properties
109 String reqProperty = getInBound();
110 while(!reqProperty.equals("ENDCONFIG")) {
111 // get the property
112 try {
113 String returnedProperty = cp.getProperty(configName, "Host."+reqProperty);
114 _socketOut.println(returnedProperty);
115 } catch (PropertyNotFoundException e) {
116 _socketOut.println("ERROR");
117 }
118 // get the next request
119 reqProperty = _socketIn.readLine();
120 }
121 _logger.write(toString(), Logger.SYSMSG, "configured host");
122 _socketOut.println("OK");
123
124 // get filter reference
125 getInBound("FILTER");
126 // send info
127 String filterList = cp.getProperty(configName, "Host.filter");
128 FilterInfo filterInfoRef = null;
129 String filter = null;
130 StringTokenizer st = new StringTokenizer(filterList, ";");
131 while (filterInfoRef==null && st.hasMoreTokens()) {
132 filter = st.nextToken();
133 _logger.write(toString(), Logger.DEBUG, " looking for filter- " + filter);
134 try {
135 filterInfoRef = FilterInfoHelper.narrow(ReferenceManager.getInstance().getCORBARef("iscream.FilterInfo\\." + filter));
136 } catch (ComponentCORBAException e) {
137 _logger.write(toString(), Logger.DEBUG, " unable to find filter- " + filter);
138 }
139 }
140
141 // hopefully we found a filter
142 if(filterInfoRef != null) {
143 _logger.write(toString(), Logger.DEBUG, " found filter- " + filter);
144 try {
145 // tell the host about it...
146 _socketOut.println(filterInfoRef.getHostName() + ";"
147 + filterInfoRef.getUDPPort());
148 }
149 catch(org.omg.CORBA.COMM_FAILURE e) {
150 // failed to talk to filter, lets signal an error
151 _socketOut.println("ERROR");
152 throw new IOException("error communicating with filter - " + e);
153 }
154 }
155 else {
156 // ...or throw a wobbly (and tell the host!)
157 _socketOut.println("ERROR");
158 throw new IOException("unable to find filter for host");
159 }
160
161 }
162 else if(cmd.equals("CHECKCONFIG")) {
163 // respond to CHECKCONFIG
164 _socketOut.println("OK");
165
166 // try for {filelist}
167 String filelist = getInBound();
168 _socketOut.println("OK");
169
170 // try for {lastModified}
171 String lastModified = getInBound();
172 long lastmod;
173 try {
174 lastmod = Long.parseLong(lastModified);
175 }
176 catch(NumberFormatException e) {
177 _socketOut.println("ERROR");
178 throw new IOException("Last Modified invalid: " + e);
179 }
180
181 // check to see if a config update has happen
182 boolean newConfig = _configManager.isModified(filelist, lastmod);
183 if(newConfig) {
184 // new config !
185 _socketOut.println("EXPIRED");
186 }
187 else {
188 // nothing has changed
189 _socketOut.println("OK");
190 }
191 }
192 else {
193 _socketOut.println("ERROR");
194 }
195 // get the next command
196 cmd = getInBound();
197 }
198 // respond to END
199 _socketOut.println("OK");
200
201 } catch (Exception e) {
202 _logger.write(toString(), Logger.ERROR, "ERROR - " + e);
203 }
204
205 // Disconnect streams & socket
206 try {
207 _socketIn.close();
208 _socketOut.close();
209 _socket.close();
210 } catch (IOException e) {
211 _logger.write(toString(), Logger.ERROR, "exception on socket close");
212 }
213 _logger.write(toString(), Logger.SYSMSG, "finished");
214 }
215
216 /**
217 * Overrides the {@link java.lang.Object#toString() Object.toString()}
218 * method to provide clean logging (every class should have this).
219 *
220 * This uses the uk.org.iscream.cms.util.NameFormat class
221 * to format the toString()
222 *
223 * @return the name of this class and its CVS revision
224 */
225 public String toString() {
226 return FormatName.getName(
227 _name,
228 getClass().getName(),
229 REVISION);
230 }
231
232 //---PRIVATE METHODS---
233
234 private String getInBound(String expected) throws IOException {
235 // grab the input
236 String inBound = getInBound();
237 // check if it's what we're expecting
238 if(!inBound.equals(expected)) {
239 _socketOut.println("ERROR");
240 throw new IOException("protocol error - expected:"+expected+" got:" + inBound);
241 }
242 // it should be ok then
243 return inBound;
244 }
245
246 private String getInBound() throws IOException {
247 // grab the input
248 String inBound = _socketIn.readLine();
249 // check for null's, likely disconnection
250 if(inBound == null) {
251 throw new IOException("got null from host, maybe it died");
252 }
253 // it's a valid message it seems
254 return inBound;
255 }
256
257 //---ACCESSOR/MUTATOR METHODS---
258
259 //---ATTRIBUTES---
260
261 /**
262 * This holds a reference to the
263 * system logger that is being used.
264 */
265 private Logger _logger = ReferenceManager.getInstance().getLogger();
266
267 /**
268 * A reference to the Configuration Manager the system is using
269 */
270 private ConfigurationManager _configManager = ReferenceManager.getInstance().getCM();
271
272 /**
273 * This is the friendly identifier of the
274 * component this class is running in.
275 * eg, a Filter may be called "filter1",
276 * If this class does not have an owning
277 * component, a name from the configuration
278 * can be placed here. This name could also
279 * be changed to null for utility classes.
280 */
281 private String _name = FilterManager.NAME;
282
283 /**
284 * The socket this class uses
285 */
286 private Socket _socket;
287
288 /**
289 * Used for the input stream of this socket
290 */
291 private BufferedReader _socketIn;
292
293 /**
294 * Used for the output stream of this socket
295 */
296 private PrintWriter _socketOut;
297
298 //---STATIC ATTRIBUTES---
299
300 }