package dmg.protocols.snmp ;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
*
*
* @author Patrick Fuhrmann
* @version 0.1, 15 Feb 1998
*/
public class Snmp
extends Frame
implements ActionListener, Runnable {
private static final long serialVersionUID = 3331772305941422667L;
private MenuBar _menuBar ;
private Menu _editMenu , _fileMenu , _widthMenu ;
private MenuItem _editEditItem ;
private MenuItem _fileExitItem ;
private TextField _hostText ;
private TextField _communityText ;
private TextField _portText ;
private TextField _oidText ;
private TextField _valueText ;
private TextField _messageText ;
private Choice _typeChoice ;
private TextArea _outputText ;
private Button _nextButton ;
private Button _getButton ;
private Button _clearButton ;
private Button _walkButton ;
private Button _stopButton ;
private Button _resetButton ;
private Button _systemButton ;
private Thread _receiverThread , _senderThread ;
private DatagramSocket _socket;
private boolean _isNext;
private int _requestId = 100 ;
private SnmpOID _argOID ;
private InetAddress _argHost ;
private int _argPort ;
private SnmpOctetString _argCommunity ;
private int _walk;
private int _id;
private int _special;
private final Object _sendLock = new Object() ;
private final Object _receiveLock = new Object() ;
private SnmpRequest _request;
private SnmpRequest _result;
private boolean _sending;
public Snmp( String [] args ){
String frameName = args.length < 1 ? "Snmp" : args[0] ;
setTitle( frameName ) ;
installMenu();
_hostText = new TextField("oho") ;
_portText = new TextField("161" ) ;
_communityText = new TextField("public") ;
_oidText = new TextField("1.3.6.1.2.1.1.1" ) ;
_oidText.setBackground( Color.orange ) ;
_valueText = new TextField("" ) ;
_valueText.setBackground( Color.blue ) ;
_valueText.setForeground( Color.yellow ) ;
_messageText = new TextField("") ;
_messageText.setForeground(Color.red);
_typeChoice = new Choice() ;
_typeChoice.add( "TimeTicks" ) ;
_typeChoice.add( "OctetString" ) ;
_typeChoice.add( "Integer" ) ;
_typeChoice.add( "IpNumber" ) ;
_typeChoice.add( "OID" ) ;
_outputText = new TextArea( 15 , 100 ) ;
_outputText.setFont( new Font("Monospaced" , Font.BOLD , 12 ) ) ;
_nextButton = new Button( "Next" ) ;
_getButton = new Button( "Get" ) ;
_clearButton = new Button( "Clear" ) ;
_walkButton = new Button( "Walk" ) ;
_stopButton = new Button( "Stop" ) ;
_resetButton = new Button( "Reset OID" ) ;
_systemButton = new Button( "System" ) ;
_nextButton.addActionListener( this ) ;
_getButton.addActionListener( this ) ;
_clearButton.addActionListener( this ) ;
_walkButton.addActionListener( this ) ;
_stopButton.addActionListener( this ) ;
_resetButton.addActionListener( this ) ;
_systemButton.addActionListener( this ) ;
setLayout( new BorderLayout(0,1) ) ;
Panel buttonPanel = new Panel( new GridLayout(0,1) ) ;
buttonPanel.add( _clearButton ) ;
buttonPanel.add( _resetButton ) ;
buttonPanel.add( _getButton ) ;
buttonPanel.add( _nextButton ) ;
buttonPanel.add( _walkButton ) ;
buttonPanel.add( _stopButton ) ;
buttonPanel.add( _systemButton ) ;
Panel actionPanel = new Panel( new GridLayout(0,3) ) ;
add( actionPanel , "North" ) ;
add( _outputText , "Center" ) ;
add( buttonPanel , "West" ) ;
add( _messageText , "South" ) ;
Label hostLabel = new Label("Host") ;
Label portLabel = new Label("Port") ;
Label communityLabel = new Label("Community");
Label oidLabel = new Label("ObjectIdentifier");
Label valueLabel = new Label("ObjectValue");
Label typeLabel = new Label("ObjectType");
actionPanel.add( hostLabel ) ;
actionPanel.add( portLabel ) ;
actionPanel.add( communityLabel ) ;
actionPanel.add( _hostText ) ;
actionPanel.add( _portText ) ;
actionPanel.add( _communityText ) ;
actionPanel.add( oidLabel ) ;
actionPanel.add( valueLabel ) ;
actionPanel.add( typeLabel ) ;
actionPanel.add( _oidText ) ;
actionPanel.add( _valueText ) ;
actionPanel.add( _typeChoice ) ;
pack();
setVisible(true);
try{
_socket = new DatagramSocket() ;
}catch( SocketException e ){}
_receiverThread = new Thread(this);
_receiverThread.start();
_senderThread = new Thread(this);
_senderThread.start();
}
private void installMenu(){
_menuBar = new MenuBar() ;
_fileMenu = new Menu( "File" ) ;
_fileMenu.add( _fileExitItem = new MenuItem( "Exit" ) );
_fileExitItem.addActionListener( this ) ;
_fileExitItem.setActionCommand( "exit" ) ;
_editMenu = new Menu( "Edit" ) ;
_editMenu.add( _editEditItem = new MenuItem( "Edit Topology" ) );
_editEditItem.addActionListener( this ) ;
_editEditItem.setActionCommand( "edit" ) ;
_widthMenu = new Menu( "Options" ) ;
_menuBar.add( _fileMenu ) ;
// _menuBar.add( _editMenu ) ;
_menuBar.add( _widthMenu ) ;
setMenuBar( _menuBar ) ;
}
public String _cut( String in ){
int x = in.lastIndexOf('.') ;
if( x < 0 ) {
return in;
}
if( x == (in.length()-1) ) {
return in;
}
String s = in.substring(x+1) ;
if( ! s.startsWith("Snmp") ) {
return s;
}
return s.substring(4) ;
}
@Override
public void actionPerformed( ActionEvent event ){
String s = event.getActionCommand() ;
_messageText.setText("");
_special = 0 ;
switch (s) {
case "exit":
System.exit(0);
case "System":
_isNext = false;
_special = 1;
_walk = 0;
_next();
break;
case "Get":
_isNext = false;
_walk = 0;
_next();
break;
case "Next":
_isNext = true;
_walk = 0;
_next();
break;
case "Walk":
_isNext = true;
_walk = 100000;
_next();
break;
case "Stop":
stopSending();
break;
case "Reset OID":
_oidText.setText("1.3.6.1.2.1.1.1.0");
break;
case "Clear":
_outputText.setText("");
break;
}
}
@Override
public void run(){
if( Thread.currentThread() == _senderThread ){
while(true){
synchronized( _sendLock ){
while(!_sending) {
try {
_sendLock.wait();
} catch (InterruptedException e) {
}
}
}
say("Transmission initialized\n");
while(true){ // just to do internal walk
byte [] b = _request.getSnmpBytes() ;
SnmpRequest result;
DatagramPacket packet = new DatagramPacket(
b , b.length , _argHost , _argPort ) ;
synchronized( _receiveLock ){
_result = null ;
_id = _request.getRequestID().intValue() ;
for( int i = 0 ; (i<3) && ( _result == null ) ; i++ ){
try{
say("Sending ..." + packet + '\n');
_socket.send( packet ) ;
say("Send Ready; Waiting\n");
_receiveLock.wait(3000) ;
say("Wait Ready\n");
}catch(Exception iei){
esay("Exception in send : "+iei ) ;
}
if( ! _sending ) {
break;
}
}
if( ( _result == null ) || ( ! _sending ) ){
_id = 0 ;
snmpAnswer( null ) ;
break;
}
result = _result ;
_result = null ;
_id = 0 ;
}
_request = snmpAnswer( result ) ;
if( _request == null ) {
break;
}
}
_sending = false ;
}
}else if( Thread.currentThread() == _receiverThread ){
while( true ){
try{
byte [] b = new byte[2048] ;
DatagramPacket p = new DatagramPacket( b , b.length ) ;
_socket.receive( p ) ;
synchronized( _receiveLock ){
say("Data received\n");
if( _id == 0 ) {
continue;
}
SnmpObject snmp = SnmpObject.generate(
p.getData(),0,
p.getLength());
SnmpRequest request = new SnmpRequest( snmp ) ;
// say( "Request\n"+request ) ;
if( _id != request.getRequestID().intValue() ) {
continue;
}
_result = request ;
_receiveLock.notifyAll() ;
}
}catch( Exception ee ){
esay("Exception \n" + ee) ;
}
}
}
}
static final String [] __sysAll = {
"System Description" ,
"System Object ID " ,
"System Uptime " ,
"System Contact " ,
"System Name " ,
"System Location " ,
"System Services " } ;
private SnmpRequest snmpAnswer( SnmpRequest request ){
if( request == null ) {
return null;
}
SnmpOID oid = request.varBindOIDAt(0) ;
SnmpObject value = request.varBindValueAt(0);
String cls = _cut( value.getClass().getName() ) ;
int errorStatus = request.getErrorStatus().intValue() ;
if( errorStatus != 0 ){
_outputText.append(oid + ": Error status = " + errorStatus +
" Error index = " +
request.getErrorIndex().intValue() + '\n') ;
return null ;
}
if( _special == 0 ){
_typeChoice.select( cls ) ;
_valueText.setText( value.toString() ) ;
_outputText.append(oid + ": (" + cls + ") :" + value + '\n') ;
_oidText.setText( oid.toString() ) ;
}else if( _special == 1 ){
if( request.varBindListSize() < 7 ){
_outputText.setText(
"not enought system infos received : "+
request.varBindListSize() ) ;
return null ;
}
StringBuilder sb = new StringBuilder() ;
for( int i= 0 ; i < 7 ; i++ ) {
sb.append(__sysAll[i]).append(" : ")
.append(request.varBindValueAt(i)).append('\n');
}
_outputText.setText( sb.toString() ) ;
return null ;
}
int type = _isNext ? SnmpObjectHeader.GetNextRequest :
SnmpObjectHeader.GetRequest ;
request =
new SnmpRequest(
_argCommunity ,
new SnmpInteger( _requestId++ ) ,
type ) ;
request.addVarBind( oid , new SnmpNull() ) ;
_walk-- ;
// say( request.toString() ) ;
return _walk > 0 ? request : null ;
}
private boolean _getArguments(){
try{
_argOID = new SnmpOID( _oidText.getText() ) ;
_argHost = InetAddress.getByName( _hostText.getText() ) ;
_argPort = Integer.parseInt(_portText.getText());
_argCommunity = new SnmpOctetString( _communityText.getText() ) ;
return true ;
}catch( Exception ie ){
_outputText.append( "Exception : "+ie ) ;
return false ;
}
}
private boolean sendRequest( SnmpRequest request ){
synchronized( _sendLock ){
if( _sending ) {
return false;
}
_sending = true ;
_request = request ;
say("Notifying sender\n");
_sendLock.notifyAll() ;
}
return true ;
}
private void stopSending(){
synchronized( _sendLock ){
if( ! _sending ) {
return;
}
_sending = false ;
_sendLock.notifyAll();
}
}
private void _next(){
say("Preparing Request\n") ;
if( ! _getArguments() ){
esay( "Argument error" ) ;
return ;
}
say("Host : " + _argHost + '\n') ;
say("Port : " + _argPort + '\n') ;
say("OID : " + _argOID + '\n') ;
say("Community : " + _argCommunity + '\n') ;
int type = _isNext ? SnmpObjectHeader.GetNextRequest :
SnmpObjectHeader.GetRequest ;
SnmpRequest request ;
if( _special == 1 ){
request =
new SnmpRequest(
_argCommunity ,
new SnmpInteger( _requestId++ ) ,
SnmpObjectHeader.GetRequest ) ;
request.addVarBind( new SnmpOID("1.3.6.1.2.1.1.1.0") , new SnmpNull() ) ;
request.addVarBind( new SnmpOID("1.3.6.1.2.1.1.2.0") , new SnmpNull() ) ;
request.addVarBind( new SnmpOID("1.3.6.1.2.1.1.3.0") , new SnmpNull() ) ;
request.addVarBind( new SnmpOID("1.3.6.1.2.1.1.4.0") , new SnmpNull() ) ;
request.addVarBind( new SnmpOID("1.3.6.1.2.1.1.5.0") , new SnmpNull() ) ;
request.addVarBind( new SnmpOID("1.3.6.1.2.1.1.6.0") , new SnmpNull() ) ;
request.addVarBind( new SnmpOID("1.3.6.1.2.1.1.7.0") , new SnmpNull() ) ;
}else{
request =
new SnmpRequest(
_argCommunity ,
new SnmpInteger( _requestId++ ) ,
type ) ;
request.addVarBind( _argOID , new SnmpNull() ) ;
}
// say( "Sending\n"+request.toString() ) ;
if( ! sendRequest( request ) ){
_messageText.setText( "Send Action still Locked" ) ;
}
}
private void say( String text ){
System.out.print( text ) ;
}
private void esay( String text ){
_messageText.setText( text ) ;
}
public static void main( String [] args ){
new Snmp( args ) ;
}
}