détection de traps SNMP - Java - Programmation
Marsh Posté le 01-04-2013 à 14:56:25
Sans connaître ton code personne ne pourra répondre vu que c'est toi qui l'a développé...
Marsh Posté le 01-04-2013 à 15:02:44
si tu parle de la classe qui reçoit des traps alors non c'est pas moi qui l'ai développé je l'ai trouvé sur internet j'ai oublié le site de référence mais en tout cas voila la classe:
/* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.g2.snmp.client;
import java.io.IOException;
import org.snmp4j.CommandResponder;
import org.snmp4j.CommandResponderEvent;
import org.snmp4j.CommunityTarget;
import org.snmp4j.MessageDispatcher;
import org.snmp4j.MessageDispatcherImpl;
import org.snmp4j.MessageException;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.mp.MPv1;
import org.snmp4j.mp.MPv2c;
import org.snmp4j.mp.StateReference;
import org.snmp4j.mp.StatusInformation;
import org.snmp4j.security.PrivDES;
//import org.snmp4j.security.SecurityProtocols;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.TcpAddress;
import org.snmp4j.smi.TransportIpAddress;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.transport.AbstractTransportMapping;
import org.snmp4j.transport.DefaultTcpTransportMapping;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.MultiThreadedMessageDispatcher;
import org.snmp4j.util.ThreadPool;
public class TrapReceiver implements CommandResponder {
public static void main(String[] args) {
TrapReceiver snmp4jTrapReceiver = new TrapReceiver();
try {
snmp4jTrapReceiver.listen(new UdpAddress("adresse/162" ));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Trap Listner
*/
public synchronized void listen(TransportIpAddress address)
throws IOException {
AbstractTransportMapping transport;
if (address instanceof TcpAddress) {
transport = new DefaultTcpTransportMapping((TcpAddress) address);
} else {
transport = new DefaultUdpTransportMapping((UdpAddress) address);
}
ThreadPool threadPool = ThreadPool.create("DispatcherPool", 10);
MessageDispatcher mDispathcher = new MultiThreadedMessageDispatcher(
threadPool, new MessageDispatcherImpl());
// add message processing models
mDispathcher.addMessageProcessingModel(new MPv1());
mDispathcher.addMessageProcessingModel(new MPv2c());
// add all security protocols
//SecurityProtocols.getInstance().addDefaultProtocols();
//SecurityProtocols.getInstance().addPrivacyProtocol(new PrivDES());
// Create Target
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("community" ));
Snmp snmp = new Snmp(mDispathcher, transport);
snmp.addCommandResponder(this);
transport.listen();
System.out.println("Listening on " + address);
try {
this.wait();
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
/**
* This method will be called whenever a pdu is received on the given port
* specified in the listen() method
*/
public synchronized void processPdu(CommandResponderEvent cmdRespEvent) {
System.out.println("Received PDU..." );
PDU pdu = cmdRespEvent.getPDU();
if (pdu != null) {
System.out.println("Trap Type = " + pdu.getType());
System.out.println("Variables = " + pdu.getVariableBindings());
}
}
}
Marsh Posté le 01-04-2013 à 15:07:30
Ce que je veux dire, c'est que tu développes un truc from scratch qui reçoit des traps. Tu as peut être récupéré des trucs à droite/à gauche, au final c'est toi qui fait l'intégration des différentes briques.
Bref, c'est à toi de modifier/développer la classe qui reçoit les trap pour les interpréter et derrière exécuter telle ou telle action en appelant telle ou telle fonction.
En lisant ce que tu viens de balancer, avec un minimum de logique et de notion d'anglais on voit que tu dois le faire ici
|
cette fonction déclenche un processus basique qui consiste simplement à écrire sur l'output standard le trap reçu.
Marsh Posté le 01-04-2013 à 15:08:35
Une question idiote : avant de te lancer dans le dev brut from scratch, tu as regarder s'il n'existait pas quelque chose déjà pour faire cela ou avec un minimum de modif ? Il existe plein d'outils open source pour la gestion des réseaux, je suis surpris qu'il n'existe rien déjà pour déclencher es actions en fonction de trap snmp...
Marsh Posté le 01-04-2013 à 15:13:46
je ne suis pas supposé utiliser un outil open source. je suis en stage je suis sensée developper et non pas utiliser un logiciel prêt puis l'intégrer.
de plus si j'ai posté la classe c'est pasque j'ai une exception en retour ( cannot assign address) pourtant le port 162 n'est pas utilisé sur ma machine linux.
Marsh Posté le 01-04-2013 à 15:25:45
bloomingdals a écrit : je ne suis pas supposé utiliser un outil open source. je suis en stage je suis sensée developper et non pas utiliser un logiciel prêt puis l'intégrer. |
C'est bien dommage. Les développements en interne de cette manière conduisent souvent à une solution inexploitable après que la personne l'ayant mis en place quitte l'établissement... Alors que des softs avec une infra/communauté pour le support existent... Par ailleurs sur des solutions opensource tu peux également développer pour apporter des améliorations... Bref, réinventons la roue...
bloomingdals a écrit : de plus si j'ai posté la classe c'est pasque j'ai une exception en retour ( cannot assign address) pourtant le port 162 n'est pas utilisé sur ma machine linux. |
Pourquoi ne pas l'avoir dit dès le départ ? Nous ne pouvons pas deviner tout sans aucun élément...
Le site d'origine indiquait peut être comment utiliser la classe ? Tu as mis à jour la ligne ?
snmp4jTrapReceiver.listen(new UdpAddress("adresse/162" )); |
Tu peux poster *exactement* la trace de l'erreur ?
Marsh Posté le 01-04-2013 à 15:37:26
voici le message d'erreur
java.net.BindException: Cannot assign requested address
at java.net.PlainDatagramSocketImpl.bind0(Native Method)
at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:95)
at java.net.DatagramSocket.bind(DatagramSocket.java:376)
at java.net.DatagramSocket.<init>(DatagramSocket.java:231)
at java.net.DatagramSocket.<init>(DatagramSocket.java:284)
at org.snmp4j.transport.DefaultUdpTransportMapping.<init>(Unknown Source)
at com.g2.snmp.client.TrapReceiver.listen(TrapReceiver.java:50)
at com.g2.snmp.client.TrapReceiver.main(TrapReceiver.java:35)
si je change l'adresse avec "localhost" ca donne ça (ce qui prouve que la classe n'a aucun probleme)
Listening on 127.0.0.1/162
bien sur je peu pas écouter sur le localhost puisque mon agent snmp se trouve sur le routeur
Marsh Posté le 01-04-2013 à 15:41:21
bloomingdals a écrit : voici le message d'erreur java.net.BindException: Cannot assign requested address |
Et tu essayes d'utiliser quelle adresse lorsque tu as ce message ?
Lorsque tu postes des erreurs, donne le contexte qui déclenche cette erreur... Comme je le disais, on ne peut pas tout deviner... Là on le code générique, on a le message d'erreur, on n'a pas ta conf...
bloomingdals a écrit :
bien sur je peu pas écouter sur le localhost puisque mon agent snmp se trouve sur le routeur |
Essaye 0.0.0.0 ou l'adresse de l'interface de ton serveur. Et quand tu donnes des infos ici, donne exactement la conf/code que tu as fournis sinon on ne peut pas deviner les erreurs de conf...
Marsh Posté le 01-04-2013 à 15:45:47
l'adresse que je met est 10.53.3.150/162 qui correspond à l'adresse du routeur surlequel je travaille
Marsh Posté le 01-04-2013 à 15:48:24
bloomingdals a écrit : l'adresse que je met est 10.53.3.150/162 qui correspond à l'adresse du routeur surlequel je travaille |
Nan mais c'est pas l'adresse du routeur qu'il faut mettre...
T'es dans une archi client serveur. Le serveur c'est ton code, le client c'est le routeur. Le routeur se connecte au serveur (à l'adresse que tu lui a collé dans la conf).
Si tu lances ton serveur en lui disant de binder sa socket sur une adresse qu'il ne connait pas, il te jète... C'est un peu la base.
Colle lui 0.0.0.0 qui correspond à toutes les adresses du serveur, ou alors l'adresse du serveur (celle qui est adressée sur le serveur, celle sur laquelle le routeur va taper pour envoyer ses traps...)
Marsh Posté le 01-04-2013 à 15:52:34
Ce sujet a été déplacé de la catégorie Systèmes & Réseaux Pro vers la categorie Programmation par Wolfman
Marsh Posté le 01-04-2013 à 16:00:06
j'ai cru que c'était moi le client et le routeur est mon serveur car c'est lui l'agent snmp !!
j'ai fait ce que tu m'a dit et il n'y a plus d'excéption.
merci bcp
Marsh Posté le 01-04-2013 à 16:04:29
bloomingdals a écrit : j'ai cru que c'était moi le client et le routeur est mon serveur car c'est lui l'agent snmp !! |
ça dépend de quoi on parle :
- pour le polling snmp, le client interroge le serveur pour avoir les stats, ta station de supervision interroge ton routeur.
- les traps snmp, le client envoie son message au serveur, le routeur envoie son trap à ta station de supervision.
Marsh Posté le 01-04-2013 à 16:09:27
justement!! la classe a pour nom "trap receiver" car elle écoute les trap en provenance de l'agent snmp!! je suis la station de supervision , je peux pas écouter sur mon adresse je dois écouter sur l'adresse du routeur ce qui explique pourquoi j'ai mis l'adresse du routeur au début
Marsh Posté le 01-04-2013 à 16:12:42
bloomingdals a écrit : justement!! la classe a pour nom "trap receiver" car elle écoute les trap en provenance de l'agent snmp!! je suis la station de supervision , je peux pas écouter sur mon adresse je dois écouter sur l'adresse du routeur ce qui explique pourquoi j'ai mis l'adresse du routeur au début |
Non mais ça n'a aucun sens d'écouter sur une adresse que l'on a pas...
Pour les traps SNMP, ta station de supervision écoute ce qu'on lui dit, elle est passive. Tu lui dis sur quelle adresse écouté.
Ton routeur lui parle, tu lui dis à qui parler quand il a quelque chose à dire, à remonter.
C'est comme si t'as 10 gusses dans une pièce. Si l'un veut dire quelque chose à un autre il va gueuler "hey michel, je t'envoie un trap snmp". Michel, lui fait gaffe uniquement lorsqu'on l'interpelle. Ben là c'est pareil, tu dis à ton soft d'écouter sur telle adresse, lorsque le routeur voudra parler il parlera vers cette adresse.
Pour le polling snmp, c'est exactement l'inverse. Ta station de supervision va parler vers ton routeur "hey adresse du routeur, file moi les stats de machin"
Marsh Posté le 01-04-2013 à 13:38:48
Bonjour ,
j'ai un bout de code java que je ne veux éxécuter que si un certain évènement surgit dans mon agent snmp (cet agent est installé sur un routeur distant).
j'aimerai savoir comment je pourrai détécter la trap SNMP qui correspond à cet évènement sur ma machine pour que je puisse déclencher l'exécution de mon code??
j'ai une classe java qui reçoit des trap mais je sais pas si une autre configuration est requise sur ma machine pour que les traps fonctionnent!!!
merci bcp pour votre aide