org.jgroups.tests.Probe Maven / Gradle / Ivy
Go to download
This artifact provides a single jar that contains all classes required to use remote Jakarta Enterprise Beans and Jakarta Messaging, including
all dependencies. It is intended for use by those not using maven, maven users should just import the Jakarta Enterprise Beans and
Jakarta Messaging BOM's instead (shaded JAR's cause lots of problems with maven, as it is very easy to inadvertently end up
with different versions on classes on the class path).
package org.jgroups.tests;
import org.jgroups.util.StackType;
import org.jgroups.util.Util;
import java.net.*;
import java.util.*;
/**
* Discovers all UDP-based members running on a certain mcast address
* @author Bela Ban
* Date: Jun 2, 2003
* Time: 4:35:29 PM
*/
public class Probe {
MulticastSocket mcast_sock;
volatile boolean running=true;
final Set senders=new HashSet<>();
public Probe() {
}
public void start(List addrs, InetAddress bind_addr, int port, int ttl,
final long timeout, List query, String match,
boolean weed_out_duplicates, String passcode) throws Exception {
for(InetAddress addr: addrs) {
boolean unicast_dest=addr != null && !addr.isMulticastAddress();
if(unicast_dest) {
Collection targets=getPhysicalAddresses(addr, bind_addr, port, timeout);
if(targets.isEmpty()) {
System.err.println("Found no valid hosts - terminating");
return;
}
for(InetAddress target : targets)
sendRequest(target, bind_addr, port, ttl, query, passcode);
}
else
sendRequest(addr, bind_addr, port, ttl, query, passcode);
}
new Thread() {
public void run() {
Util.sleep(timeout);
mcast_sock.close();
running=false;
}
}.start();
int matched=0, not_matched=0, count=0;
String response;
while(running) {
byte[] buf=new byte[70000];
DatagramPacket rsp=new DatagramPacket(buf, 0, buf.length);
try {
mcast_sock.receive(rsp);
}
catch(Throwable t) {
System.out.println("\n");
break;
}
byte[] data=rsp.getData();
response=new String(data, 0, rsp.getLength());
if(weed_out_duplicates && checkDuplicateResponse(response))
continue;
count++;
if(matches(response, match)) {
matched++;
System.out.println("\n#" + count + " (" + rsp.getLength() + " bytes):\n" + response);
}
else
not_matched++;
}
System.out.println("\n" + count + " responses (" + matched + " matches, " + not_matched + " non matches)");
}
protected static Collection getPhysicalAddresses(InetAddress addr, InetAddress bind_addr,
int port, final long timeout) throws Exception {
final DatagramSocket sock=new DatagramSocket(new InetSocketAddress(bind_addr, 0));
byte[] payload="addrs".getBytes();
DatagramPacket probe=new DatagramPacket(payload, 0, payload.length, addr, port);
sock.send(probe);
new Thread() {
public void run() {
Util.sleep(timeout);
sock.close();
}
}.start();
Collection retval=new ArrayList<>();
long end_time=System.currentTimeMillis() + timeout;
while(System.currentTimeMillis() < end_time) {
byte[] buf=new byte[70000];
DatagramPacket rsp=new DatagramPacket(buf, 0, buf.length);
try {
sock.receive(rsp);
}
catch(Throwable t) {
break;
}
byte[] data=rsp.getData();
String response=new String(data, 0, rsp.getLength());
if(response != null && response.startsWith("addrs=")) {
response=response.substring("addrs=".length()).trim();
List rsps=Util.parseStringList(response,",");
for(String tmp: rsps) {
int index=tmp.indexOf(':');
if(index != -1)
tmp=tmp.substring(0, index);
retval.add(InetAddress.getByName(tmp));
}
return retval;
}
}
return retval;
}
protected void sendRequest(InetAddress addr, InetAddress bind_addr, int port, int ttl,
List query, String passcode) throws Exception {
if(mcast_sock == null) {
mcast_sock=new MulticastSocket();
mcast_sock.setTimeToLive(ttl);
if(bind_addr != null)
mcast_sock.setInterface(bind_addr);
}
StringBuilder request=new StringBuilder();
byte[] authenticationDigest = null;
if(passcode != null){
long t1 = (new Date()).getTime();
double q1 = Math.random();
authenticationDigest = Util.createAuthenticationDigest(passcode, t1, q1);
}
for(int i=0; i < query.size(); i++) {
request.append(query.get(i)).append(" ");
}
byte[] queryPayload = request.toString().getBytes();
byte[] payload = queryPayload;
if (authenticationDigest != null) {
payload = new byte[authenticationDigest.length + queryPayload.length];
System.arraycopy(authenticationDigest, 0, payload, 0, authenticationDigest.length);
System.arraycopy(queryPayload, 0, payload, authenticationDigest.length, queryPayload.length);
}
DatagramPacket probe=new DatagramPacket(payload, 0, payload.length, addr, port);
mcast_sock.send(probe);
System.out.println("\n-- sending probe on " + addr + ':' + port + '\n');
}
private boolean checkDuplicateResponse(String response) {
int index=response.indexOf("local_addr");
if(index != -1) {
String addr=parseAddress(response.substring(index+1 + "local_addr".length()));
return senders.add(addr) == false;
}
return false;
}
private static String parseAddress(String response) {
StringTokenizer st=new StringTokenizer(response);
return st.nextToken();
}
private static boolean matches(String response, String match) {
if(response == null)
return false;
if(match == null)
return true;
int index=response.indexOf(match);
return index > -1;
}
public static void main(String[] args) {
InetAddress bind_addr=null;
List addrs=new ArrayList<>();
int port=0;
int ttl=32;
long timeout=500;
final String DEFAULT_DIAG_ADDR="224.0.75.75";
final String DEFAULT_DIAG_ADDR_IPv6="ff0e::0:75:75";
final int DEFAULT_DIAG_PORT=7500;
List query=new ArrayList<>();
String match=null;
boolean weed_out_duplicates=false;
String passcode=null;
try {
for(int i=0; i < args.length; i++) {
if("-addr".equals(args[i])) {
addrs.add(InetAddress.getByName(args[++i]));
continue;
}
if("-bind_addr".equals(args[i])) {
bind_addr=InetAddress.getByName(args[++i]);
continue;
}
if("-port".equals(args[i])) {
port=Integer.parseInt(args[++i]);
continue;
}
if("-ttl".equals(args[i])) {
ttl=Integer.parseInt(args[++i]);
continue;
}
if("-timeout".equals(args[i])) {
timeout=Long.parseLong(args[++i]);
continue;
}
if("-match".equals(args[i])) {
match=args[++i];
continue;
}
if("-weed_out_duplicates".equals(args[i])) {
weed_out_duplicates=true;
continue;
}
if("-passcode".equals(args[i])) {
passcode=args[++i];
continue;
}
if("-cluster".equals(args[i])) {
String cluster=args[++i];
query.add("cluster=" + cluster);
continue;
}
/* if("-node".equals(args[i])) {
String node=args[++i];
query.add("node=" + node);
continue;
}*/
if("-help".equals(args[i]) || "-h".equals(args[i]) || "--help".equals(args[i])) {
help();
return;
}
query.add(args[i]);
}
Probe p=new Probe();
if(addrs.isEmpty()) {
StackType stack_type=Util.getIpStackType();
boolean ipv6=stack_type == StackType.IPv6;
InetAddress addr=ipv6? InetAddress.getByName(DEFAULT_DIAG_ADDR_IPv6) : InetAddress.getByName(DEFAULT_DIAG_ADDR);
addrs.add(addr);
}
if(port == 0)
port=DEFAULT_DIAG_PORT;
p.start(addrs, bind_addr, port, ttl, timeout, query, match, weed_out_duplicates, passcode);
}
catch(Throwable t) {
t.printStackTrace();
}
}
static void help() {
System.out.println("Probe [-help] [-addr ] [-bind_addr ] " +
"[-port ] [-ttl ] [-timeout ] [-passcode ] [-weed_out_duplicates] " +
"[-cluster regexp-pattern] [-match pattern] [key[=value]]*\n\n" +
"Examples:\n" +
"probe.sh keys // dumps all valid commands\n" +
"probe.sh jmx=NAKACK // dumps JMX info about all NAKACK protocols\n" +
"probe.sh op=STABLE.runMessageGarbageCollection // invokes the method in all STABLE protocols\n" +
"probe.sh jmx=UDP.oob,thread_pool // dumps all attrs of UDP starting with oob* or thread_pool*\n" +
"probe.sh jmx=FLUSH.bypass=true\n");
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy