/* Milenia Grafter Server Copyright (c) 2007-2008 by Milan Toth. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package application; /** Application class @mail milgra@milgra.com @author Milan Toth @version 20080316 Tasks of Admin Application - collect io information and send it tho admin clients - let the admins do application refresh/load/reload **/ import java.util.HashMap; import java.util.ArrayList; import com.milgra.server.Server; import com.milgra.server.api.Timer; import com.milgra.server.api.Client; import com.milgra.server.api.Wrapper; import com.milgra.server.api.LogWriter; import com.milgra.server.api.WrapperMap; import com.milgra.server.api.WrapperList; import com.milgra.server.api.IApplication; import com.milgra.server.api.EventListener; public class Application implements IApplication { // filename constants public static final String CONFIGFILE = "admin" + System.getProperty( "file.separator" ) + "config.xml"; public static final String ACCESSFILE = "admin" + System.getProperty( "file.separator" ) + "access.xml"; public static final String GRAPHSFILE = "admin" + System.getProperty( "file.separator" ) + "graphs.xml"; // timer - timer for periodic data collection // admins - container for admin clients public Timer timer; public EventListener timerListener; public HashMap < Long , AdminController > admins; // accessLog - flag indicating access logging // graphsLog - flag indicating graphs logging public boolean accessLog; public boolean graphsLog; // graphsLogger - graps log writer // accessLogger - access log writer public LogWriter graphsLogger; public LogWriter accessLogger; // reader - config xml reader // writer - config xml writer public ConfigReader reader; public ConfigWriter writer; /** * Application constructor */ public Application ( ) { System.out.println( System.currentTimeMillis() + " MilGra Admin 1.0" ); // create writer = new ConfigWriter( CONFIGFILE ); reader = new ConfigReader( CONFIGFILE ); accessLogger = new LogWriter( ACCESSFILE ); graphsLogger = new LogWriter( GRAPHSFILE ); admins = new HashMap < Long , AdminController > ( ); timerListener = new EventListener ( ) { public void onEvent ( ) { update( ); } }; timer = new Timer( 2000 , timerListener ); // set accessLogger.active = reader.accessLogging; graphsLogger.active = reader.graphsLogging; // start accessLogger.log( "Milenia Grafter Admin startup on " + System.currentTimeMillis( ) ); graphsLogger.log( "Time" + "\t" + "Band in Mbits/s" + "\t" + "Band out Mbits/s" + "\t" + "Clients" + "\t" + "Streams" + "\t" + "Socket ex." + "\t" + "Stream ex." + "\t" + "Client ex." + "\t" + "Socket th." + "\t" + "Stream th." + "\t" + "Client th." ); // start refresh timer.start( ); } public void onStart ( String nameX ) { } /** * Closes Application */ public void onClose ( ) { // System.out.println( System.currentTimeMillis( ) + " MilGraAdmin Application.onClose" ); accessLogger.log( "Milenia Grafter Admin close on " + System.currentTimeMillis( ) ); timer.finish( ); timer = null; accessLogger.close( ); graphsLogger.close( ); } /** * Client entering point * @param clientX client * @param arguments arguments */ public void onEnter ( Client clientX , WrapperList argumentsX ) { // System.out.println( System.currentTimeMillis( ) + " MilGraAdmin Application.onAdmin " + clientX.getIp( ) ); accessLogger.log( "Milenia Grafter Admin enter on " + System.currentTimeMillis() + " ip: " + clientX.getIp( ) ); // ip check boolean valid = false; if ( !reader.hasIp( ) ) valid = true; else if ( reader.hasIp( clientX.getIp( ) ) ) valid = true; if ( valid ) { // password check String user = argumentsX.getString( 0 ); String pass = argumentsX.getString( 1 ); if ( reader.userName.equals( user ) && reader.passWord.equals( pass ) ) { // create controller AdminController admin = new AdminController ( clientX , this ); admins.put( clientX.getId( ) , admin ); accessLogger.log( "Access Granted" ); clientX.accept( new Wrapper( "Access granted" ) ); } else { accessLogger.log( "Access denied." ); clientX.reject( new Wrapper( "Access denied" ) ); } } } /** * Client leaving point * @param clientX client */ public void onLeave ( Client clientX ) { // System.out.println( System.currentTimeMillis() + " MilGraAdmin Application.onLeave " + clientX.getId( ) ); accessLogger.log( "Milenia Grafter Admin leave on " + System.currentTimeMillis() + " ip: " + clientX.getId( ) ); admins.remove( clientX.getId( ) ); } /** * Invokes application load * @param applicationIdX */ public void loadApplication ( String applicationIdX ) { // System.out.println( System.currentTimeMillis() + " MilGraAdmin Application.loadApplication " + applicationIdX ); Server.getApplication( applicationIdX ); } /** * Invokes applicatoin unload * @param applicationIdX */ public void unloadApplication ( String applicationIdX ) { // System.out.println( System.currentTimeMillis() + " MilGraAdmin Application.unloadApplication " + applicationIdX ); Server.unloadApplication( applicationIdX ); } /** * Invokes applications refresh */ public void refreshApplications ( ) { // System.out.println( System.currentTimeMillis() + " MilGraAdmin Application.refreshApplications" ); Server.readApplications( ); } /** * Collects application info */ public void update ( ) { // System.out.println( System.currentTimeMillis( ) + " Server.collectApplications" ); // create int clients = 0; int streamsIn = 0; int streamsOut = 0; int allBandIn = 0; int allBandOut = 0; int clientTime = 0; int socketTime = 0; int streamTime = 0; int clientCount = 0; int socketCount = 0; int streamCount = 0; WrapperMap appData = new WrapperMap( ); WrapperMap graphData = new WrapperMap ( ); WrapperList arguments = new WrapperList( ); // collect application data synchronized ( Server.clients ) { for ( String id : Server.states.keySet( ) ) { String state = Server.states.get( id ) == true ? "running" : "stopped"; WrapperMap appInfo = new WrapperMap( ); appInfo.put( "id" , id ); appInfo.put( "state" , state ); appInfo.put( "bandin" , 0 ); appInfo.put( "bandout" , 0 ); appInfo.put( "clients" , 0 ); if ( Server.clients.containsKey( id ) ) { ArrayList < Client > clientList = Server.clients.get( id ); int bandIn = 0; int bandOut = 0; for ( Client client : clientList ) { bandIn += client.getBandIn( ); bandOut += client.getBandOut( ); clients ++; } appInfo.put( "bandin" , bandIn ); appInfo.put( "bandout" , bandOut ); appInfo.put( "clients" , clientList.size( ) ); allBandIn += bandIn; allBandOut += bandOut; } appData.put( id , appInfo ); } } // collect io data if ( Server.pools.containsKey( "socket" ) ) socketTime = Server.pools.get( "socket" ).getDelay( ); if ( Server.pools.containsKey( "client" ) ) clientTime = Server.pools.get( "client" ).getDelay( ); if ( Server.pools.containsKey( "stream" ) ) streamTime = Server.pools.get( "stream" ).getDelay( ); if ( Server.pools.containsKey( "socket" ) ) socketCount = Server.pools.get( "socket" ).getCount( ); if ( Server.pools.containsKey( "client" ) ) clientCount = Server.pools.get( "client" ).getCount( ); if ( Server.pools.containsKey( "stream" ) ) streamCount = Server.pools.get( "stream" ).getCount( ); // stream data streamsIn = Server.routers.size( ); streamsOut = Server.players.size( ); graphData.put( "bandin" , allBandIn ); graphData.put( "bandout" , allBandOut ); graphData.put( "clients" , clients ); graphData.put( "streamsin" , streamsIn ); graphData.put( "streamsout" , streamsOut ); graphData.put( "sockettime" , socketTime ); graphData.put( "streamtime" , streamTime ); graphData.put( "clienttime" , clientTime ); graphData.put( "socketcount" , socketCount ); graphData.put( "streamcount" , streamCount ); graphData.put( "clientcount" , clientCount ); // add to arguments arguments.add( appData ); arguments.add( graphData ); // send to admins for ( AdminController admin : admins.values( ) ) admin.updateData( arguments ); // log graphsLogger.log( System.currentTimeMillis( ) + "\t" + allBandIn + "\t" + allBandOut + "\t" + clients + "\t" + streamsIn + "\t" + streamsOut + "\t" + socketTime + "\t" + streamTime + "\t" + clientTime + "\t" + socketCount + "\t" + streamCount + "\t" + clientCount ); } }