package es.tid.bgp.bgp4Peer.management; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Inet4Address; import java.net.Socket; import java.util.Enumeration; import java.util.Hashtable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import es.tid.bgp.bgp4Peer.bgp4session.BGP4SessionsInformation; import es.tid.bgp.bgp4Peer.peer.SendTopology; import es.tid.bgp.bgp4Peer.tedb.IntraTEDBS; import es.tid.tedb.DomainTEDB; import es.tid.tedb.MultiDomainTEDB; import es.tid.tedb.SimpleTEDB; import es.tid.tedb.TEDB; /** * * @author mcs * */ public class BGP4ManagementSession extends Thread { /** * The socket of the management session */ private Socket socket; /** * Logger */ private Logger log; /** * Output Stream of the managament session, to write the answers. */ private PrintStream out; /** * Topology database for interDomain Links. */ private MultiDomainTEDB multiTEDB; /** * Topology database for intradomain Links. It owns several domains. */ private Hashtable<String,TEDB> intraTEDBs; /** * The infomation of all the active sessions */ private BGP4SessionsInformation bgp4SessionsInformation; /** * Class to send the topology. It is needes to set the parameters sendTopology to true or false. */ private SendTopology sendTopology; public BGP4ManagementSession(Socket s,MultiDomainTEDB multiTEDB, Hashtable<String,TEDB> intraTEDBs,BGP4SessionsInformation bgp4SessionsInformation, SendTopology sendTopology){ this.socket=s; log=LoggerFactory.getLogger("BGP4Server"); this.multiTEDB=multiTEDB; this.intraTEDBs=intraTEDBs; this.bgp4SessionsInformation= bgp4SessionsInformation; this.sendTopology=sendTopology; } public void run(){ log.info("Starting Management session"); boolean running=true; try { out=new PrintStream(socket.getOutputStream()); } catch (IOException e) { log.warn("Management session cancelled: "+e.getMessage()); return; } try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (running) { //out.print("BGP4:>"); out.print("Available commands:\r\n"); out.print(" > show topology\r\n"); out.print(" > show sessions\r\n"); out.print(" > set traces on\r\n"); out.print(" > set traces off\r\n"); out.print(" > send topology on\r\n"); out.print(" > send topology off\r\n"); out.print(" > quit\r\n"); String command = null; try { command = br.readLine(); } catch (IOException ioe) { log.warn("IO error trying to read your command"); return; } if (command.equals("quit")) { log.info("Ending Management Session"); out.println("bye!"); try { out.close(); } catch (Exception e){ e.printStackTrace(); } try { br.close(); } catch (Exception e){ e.printStackTrace(); } return; } // else if (command.equals("help")){ // out.print("Available commands:\r\n"); // out.print(" > show topology\r\n"); // out.print(" > show sessions\r\n"); // out.print(" > set traces on\r\n"); // out.print(" > set traces off\r\n"); // out.print(" > send topology on\r\n"); // out.print(" > send topology off\r\n"); // out.print(" > quit\r\n"); // // } else if (command.equals("show sessions")){ //Print intradomain and interDomain links out.print(bgp4SessionsInformation.toString()); } else if (command.equals("show topology")){ //Print intradomain and interDomain links if (multiTEDB != null) out.println(multiTEDB.printTopology()); Enumeration<String> domainTedbs=intraTEDBs.keys(); while (domainTedbs.hasMoreElements()){ String domainID=domainTedbs.nextElement(); TEDB ted=intraTEDBs.get(domainID); if (ted instanceof DomainTEDB) { out.println("Intradomain TEDB with ID "+domainID); out.println(ted.printTopology()); } } } else if (command.equals("set traces on")) { //log.setLevel(Level.ALL); Logger log2=LoggerFactory.getLogger("BGP4Parser"); //log2.setLevel(Level.ALL); Logger log3=LoggerFactory.getLogger("BGP4Client"); //log3.setLevel(Level.ALL); out.print("traces on!\r\n"); } else if (command.equals("set traces off")) { //log.setLevel(Level.SEVERE); Logger log2=LoggerFactory.getLogger("BGP4Parser"); //log2.setLevel(Level.SEVERE); Logger log3=LoggerFactory.getLogger("BGP4Client"); //log3.setLevel(Level.SEVERE); out.print("traces off!\r\n"); } else if (command.equals("send topology on")) { sendTopology.setSendTopology(true); } else if (command.equals("send topology off")) { sendTopology.setSendTopology(false); } else{ out.print("invalid command\n"); out.print("\n"); } } } catch (Exception e) { e.printStackTrace(); return; } } }