--- projects/cms/source/host/java/Config.java 2000/11/27 19:49:00 1.1 +++ projects/cms/source/host/java/Config.java 2001/03/19 17:38:41 1.8 @@ -1,141 +1,265 @@ +//---PACKAGE DECLARATION--- + +//---IMPORTS--- + import java.net.*; import java.util.*; import java.io.*; +/** + * Configurator object for the JavaHost + * Will connect to the filter manager and collect its specific + * configuration + * + * @author $Author: ab11 $ + * @version $Id: Config.java,v 1.8 2001/03/19 17:38:41 ab11 Exp $ + */ class Config { - private String lastModified; - private int numProperties; - private Hashtable myProperties; - private String filterName; - private int filterUDPPort; - private int filterTCPPort; - private ArrayList aList; - private BufferedReader socketIn; - private PrintWriter socketOut; - +//---FINAL ATTRIBUTES--- - public Config( String serverName, int serverPort ){ - // takes in the master config settings and creates a connection with - // this computer, and downloads all the values listed in config.values.txt - // which should be in the local directory - - // read in from the file. - try { - BufferedReader inFile = new BufferedReader(new FileReader("config.values.txt")); - aList = new ArrayList(); - numProperties = 0; - String tmpIn = inFile.readLine(); - while ( tmpIn != null ){ - aList.add(tmpIn); - numProperties++; - tmpIn = inFile.readLine(); - } - } - catch ( FileNotFoundException e ){ - // do something - } - catch ( IOException e ){ - // do something - } - - // do the funky jibble - connect(serverName, serverPort); - - - } +//---STATIC METHODS--- - private void connect( String serverName, int serverPort ){ - Socket mySocket; - - // might throw a UnknownHostException - try { - mySocket = new Socket(serverName, serverPort ); - // ok we have our socket connected ok. grab their input and output streams - socketIn = new BufferedReader(new InputStreamReader(mySocket.getInputStream())); - socketOut = new PrintWriter(mySocket.getOutputStream()); - - - if (sendCommand("STARTCONFIG") == "OK"){ - // everything is fine - sendCommand("LASTMODIFIED"); - sendCommand("FILELIST"); - - // get all the properties - for ( int i = 0; i < numProperties; i++ ){ - String property = (String) aList.get(i); - myProperties.put(property, sendCommand(property)); - } - - sendCommand("ENDCONFIG"); - String filter_data = sendCommand("FILTER"); - StringTokenizer tok = new StringTokenizer(filter_data,";"); - filterName = tok.nextToken(); - filterUDPPort = Integer.parseInt(tok.nextToken()); - filterTCPPort = Integer.parseInt(tok.nextToken()); - - sendCommand("END"); - - } +//---CONSTRUCTORS--- + + public Config( String serverName, int serverPort ){ + // takes in the master config settings and creates a connection with + // this computer, and downloads all the values listed in config.values.txt + // which should be in the local directory + + // read in from the file. + try { + System.out.println("Reading Config file"); + BufferedReader inFile = new BufferedReader(new FileReader("config.values.txt")); + aList = new ArrayList(); + numProperties = 0; + String tmpIn = inFile.readLine(); + while ( tmpIn != null ){ + aList.add(numProperties, tmpIn); + numProperties++; + tmpIn = inFile.readLine(); + } + System.out.println("Added "+numProperties+" properties"); + } + catch ( FileNotFoundException e ){ + // do something + System.out.println("Config file not found"); + } + catch ( IOException e ){ + // do something + } + + myProperties = new HashMap(); + configChanged = false; - // close the socket - mySocket.close(); + // time in seconds before first retry + filterManagerRetryTime = 10; + + // do the funky jibble + connect(serverName, serverPort); + } + +//---PUBLIC METHODS--- + + public InetAddress getFilterName(){ + // will return the most recent IP address (if it is dynamic for whatever reason) + try { + return InetAddress.getByName(filterName); + } + catch ( UnknownHostException e ){ + // do something + return null; + } + + } + + /** + * Used to retrieve the port to send UDP packets to on the filter + * + * @return an integer corresponding to the UDP port of the filter + */ + public int getFilterUDPPort(){ + + return filterUDPPort; + } + + /** + * Used to retrieve the port to send TCP heartbeats to on the filter + * + * @return an integer corresponding to the TCP of the filter + */ + public int getFilterTCPPort(){ + + return filterTCPPort; + } + + /** + * Used to get the hostname of the filter we are to talk to. + * + * @return a string representing the hostname of the filter + */ + public String getProperty( String name ){ + + if ( myProperties.containsKey(name) ){ + // its in there, may return ERROR + return (String) myProperties.get(name); + } + else + { + // can't have been in the config.values.txt file! + return "ERROR"; + } + } + + +//---PRIVATE METHODS--- + + private void connect( String serverName, int serverPort ){ + Socket mySocket; + configChanged = false; + + System.out.println("Establishing connection with filter manager"); + + // might throw a UnknownHostException + try { + mySocket = new Socket( serverName, serverPort ); + // ok we have our socket connected ok. grab their input and output streams + socketIn = new BufferedReader(new InputStreamReader(mySocket.getInputStream())); + socketOut = new PrintWriter(mySocket.getOutputStream()); + + if (sendCommand("STARTCONFIG").equals("OK")){ + // everything is fine + // sendCommand("LASTMODIFIED"); + lastModified = sendCommand("LASTMODIFIED"); + + fileList = sendCommand("FILELIST"); + + fQDN = sendCommand("FQDN"); + // get all the properties + if ( numProperties > 0 ){ + // sendCommand("CONFIG"); + for ( int i = 0; i < numProperties; i++ ){ + String property = (String) aList.get(i); + myProperties.put(property, sendCommand(property)); + } + } + + sendCommand("ENDCONFIG"); + String filter_data = sendCommand("FILTER"); + StringTokenizer tok = new StringTokenizer(filter_data,";"); + filterName = tok.nextToken(); + filterUDPPort = Integer.parseInt(tok.nextToken()); + filterTCPPort = Integer.parseInt(tok.nextToken()); + + sendCommand("END"); + + } + + + // close the socket + mySocket.close(); + System.out.println("Completed communication with filter manager"); + + } + catch ( UnknownHostException e ){ + // what to do + System.out.println("Host not found"); + } + catch ( IOException e ){ + // what to do + System.out.println("Unable to read from socket, might not be open"); + System.out.println("Retrying in "+filterManagerRetryTime+" seconds"); + configChanged = true; + try { + Thread.sleep(filterManagerRetryTime*1000); + } + catch( InterruptedException f ){ + System.out.println("Sleep interrupted"); + } + filterManagerRetryTime = filterManagerRetryTime * 2; + // warning this WILL cause a stack overflow after a while.. + // need to fix it. + connect(serverName, serverPort); + } + + } // connect + + + public void sendHeartBeat(){ + Socket mySocket; + try { + + mySocket = new Socket( filterName, filterTCPPort ); + // ok we have our socket connected ok. grab their input and output streams + socketIn = new BufferedReader(new InputStreamReader(mySocket.getInputStream())); + socketOut = new PrintWriter(mySocket.getOutputStream()); + + + if ( sendCommand("HEARTBEAT").equals("OK") ){ + if ( sendCommand("CONFIG").equals("OK") ){ + sendCommand(fileList); + if ( sendCommand(lastModified).equals("ERROR") ){ + // config has changed + configChanged = true; + } + sendCommand("ENDHEARTBEAT"); + } + } } - catch ( UnknownHostException e ){ - // what to do - } - catch ( IOException e ){ - // what to do - } - - } // connect + catch ( UnknownHostException e ){ + // what to do + System.out.println("Host not found"); + } + catch ( IOException e ){ + // what to do + System.out.println("Unable to read from socket, might not be open"); + System.out.println("Re-establishing contact with filter manager"); + configChanged = true; + } + } - public InetAddress getFilterName(){ - // will return the most recient IP address (if it is dynamic for whatever reason - try { - return InetAddress.getByName(filterName); - } - catch ( UnknownHostException e ){ - // do something - return null; - } - - } - - public int getFilterUDPPort(){ - - return filterUDPPort; - } - - public int getFilterTCPPort(){ - - return filterTCPPort; - } + private String sendCommand(String command){ + + // System.out.println("Writing command: "+command); + socketOut.println(command); + socketOut.flush(); + try { + String response = socketIn.readLine(); + // System.out.println("Got: "+response); + return response; + } + catch ( IOException e ){ + // something went wrong + System.out.println("Error recieving response"); + return "ERROR"; + } + } - public String getProperty( String name ){ - - if ( myProperties.containsKey(name) ){ - // its in there, may return ERROR - return (String) myProperties.get(name); - } - else - { - // can't have been in the config.values.txt file! - return "ERROR"; - } - } - - private String sendCommand(String command){ - - socketOut.println(command); - try { - return socketIn.readLine(); - } - catch ( IOException e ){ - // something went wrong - return "ERROR"; - } - } +//---ACCESSOR/MUTATOR METHODS--- + + public boolean reloadConfig(){ + return configChanged; + } + +//---ATTRIBUTES--- + + private boolean configChanged; + private String lastModified; + private String fileList; + private String fQDN; + private int numProperties; + private HashMap myProperties; + private String filterName; + private int filterUDPPort; + private int filterTCPPort; + private ArrayList aList; + private BufferedReader socketIn; + private PrintWriter socketOut; + private int filterManagerRetryTime; + + + +//---STATIC ATTRIBUTES--- -} // class \ No newline at end of file +} // class