package com.netifera.platform.net.internal.services.detection;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.netifera.platform.net.services.detection.INetworkServiceDetector;
import com.netifera.platform.net.services.detection.INetworkServiceDetectorService;
import com.netifera.platform.util.patternmatching.IPattern;
import com.netifera.platform.util.patternmatching.Regex;
abstract class NetworkServiceDetectorService implements INetworkServiceDetectorService {
protected final Map<String, ArrayList<INetworkServiceDetector>> detectors = new HashMap<String, ArrayList<INetworkServiceDetector>>();
protected static List<IPattern> genericOSDetectors;
protected static List<IPattern> genericArchDetectors;
static {
// operating systems
genericOSDetectors = new ArrayList<IPattern>();
Regex regex = Regex.caseInsensitive(".*((sunos|solaris|linux|macosx|osx|darwin|(net|free|open)bsd) [\\w.]+).*");
regex.add(1, "os");
genericOSDetectors.add(regex);
regex = Regex.caseInsensitive(".*(sunos|solaris|macosx|darwin|(net|free|open)bsd).*");
regex.add(1, "os");
genericOSDetectors.add(regex);
regex = Regex.caseInsensitive(".*(red hat|redhat|centos|fedora|debian|ubuntu|gentoo|mandriva|knopixx|slackware|suse).*");
regex.add("os", "Linux");
regex.add(1, "distribution");
genericOSDetectors.add(regex);
regex = Regex.caseInsensitive(".*((windows.nt|windows.200.|windows |win(32|2k|nt|200.)|cygwin) (version )?[\\w.]+).*");
regex.add(1, "os");
regex.add("arch", "i386"); // FIXME some NT run alpha
genericOSDetectors.add(regex);
regex = Regex.caseInsensitive(".*(windows.nt|windows.200.|windows |for windows|win(32|2k|nt|200.)|cygwin).*");
regex.add(1, "os");
regex.add("arch", "i386"); // FIXME some NT run alpha
genericOSDetectors.add(regex);
// architectures:
genericArchDetectors = new ArrayList<IPattern>();
//regex = Regex.caseInsensitive(".*x86_64.*"); // + (amd64|em64t)
//regex.add("arch", "x86_64");
//genericArchDetectors.add(regex);
regex = Regex.caseInsensitive(".*(i386|x86|i86(pc|xen|xpv)).*"); // FIXME mingw32?
regex.add("arch", "i386"); // FIXME x86_64
genericArchDetectors.add(regex);
regex = Regex.caseInsensitive(".*(amd64|em64t).*");
regex.add("arch", "AMD64");
genericArchDetectors.add(regex);
regex = Regex.caseInsensitive(".*(powerpc|ppc(32|64)).*");
regex.add("arch", "PowerPC");
genericArchDetectors.add(regex);
regex = Regex.caseInsensitive(".*(sparc|sun4[muv]).*");
regex.add("arch", "SPARC");
genericArchDetectors.add(regex);
regex = Regex.caseInsensitive(".*(pa.?risc|hppa).*");
regex.add("arch", "HPPA");
genericArchDetectors.add(regex);
// TODO very common arm/mips on embedded devices
}
protected void addDetector(INetworkServiceDetector detector) {
ArrayList<INetworkServiceDetector> list;
if (detectors.containsKey(detector.getProtocol())) {
list = detectors.get(detector.getProtocol());
} else {
list = new ArrayList<INetworkServiceDetector>();
detectors.put(detector.getProtocol(), list);
}
list.add(detector);
}
public Map<String,String> detect(String protocol, int port,
ByteBuffer triggerBuffer, ByteBuffer responseBuffer) {
String triggerString = "";
if (triggerBuffer != null)
triggerString = stringFromByteBuffer(triggerBuffer);
String responseString = stringFromByteBuffer(responseBuffer);
return detect(protocol, port, triggerString, responseString);
}
private String stringFromByteBuffer(ByteBuffer buffer) {
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
try {
return new String(bytes, "ISO-8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException("Unsupported encoding: ISO-8859-1");
}
}
protected boolean isPrintable(String s) {
return !s.matches("[\\x00-\\x09\\x0b\\x0c\\x0e-\\x1f]");
}
}