package com.netifera.platform.net.wifi.internal.sniffing.daemon;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.netifera.platform.api.dispatcher.IProbeMessage;
import com.netifera.platform.api.dispatcher.MessengerException;
import com.netifera.platform.api.log.ILogger;
import com.netifera.platform.api.probe.IProbe;
import com.netifera.platform.dispatcher.StatusMessage;
import com.netifera.platform.net.daemon.sniffing.ISniffingDaemon;
import com.netifera.platform.net.daemon.sniffing.ISniffingModule;
import com.netifera.platform.net.pcap.ICaptureInterface;
import com.netifera.platform.net.sniffing.ICaptureFileInterface;
import com.netifera.platform.net.sniffing.util.ICaptureFileProgress;
import com.netifera.platform.net.wifi.internal.sniffing.daemon.probe.ModuleRecord;
import com.netifera.platform.net.wifi.internal.sniffing.daemon.probe.RequestWirelessInterfaceInformation;
import com.netifera.platform.net.wifi.internal.sniffing.daemon.probe.RequestWirelessModuleInformation;
import com.netifera.platform.net.wifi.internal.sniffing.daemon.probe.SetWirelessInterfaceEnableState;
import com.netifera.platform.net.wifi.internal.sniffing.daemon.probe.StartWifiSniffer;
import com.netifera.platform.net.wifi.internal.sniffing.daemon.probe.StopWifiSniffer;
import com.netifera.platform.net.wifi.internal.sniffing.daemon.probe.WirelessInterfaceRecord;
import com.netifera.platform.net.wifi.pcap.IWirelessCaptureInterface;
import com.netifera.platform.net.wifi.sniffing.IWifiSniffingDaemon;
public class RemoteWifiSniffingDaemon implements IWifiSniffingDaemon {
private final IProbe probe;
private final ILogger logger;
private String messengerError;
/* stub for remote sniffing daemon */
private final ISniffingDaemon sniffingDaemon;
RemoteWifiSniffingDaemon(IProbe probe, ILogger logger, ISniffingDaemon sniffingDaemon) {
this.probe = probe;
this.logger = logger;
this.sniffingDaemon = sniffingDaemon;
}
public Collection<IWirelessCaptureInterface> getWirelessInterfaces() {
final List<WirelessInterfaceRecord> interfaceRecords = getInterfaceRecords();
if(interfaceRecords == null)
return Collections.emptyList();
return new ArrayList<IWirelessCaptureInterface>(interfaceRecords);
}
private List<WirelessInterfaceRecord> getInterfaceRecords() {
final RequestWirelessInterfaceInformation response =
(RequestWirelessInterfaceInformation) exchangeMessage(new RequestWirelessInterfaceInformation());
if(response == null) {
logger.warning("Failed to get wireless interface information: " + getLastError());
return Collections.emptyList();
}
return response.getInterfaceRecords();
}
public Set<ISniffingModule> getWirelessModules() {
final List<ModuleRecord> moduleRecords = getModuleRecords();
if(moduleRecords == null)
return Collections.emptySet();
return new HashSet<ISniffingModule>(moduleRecords);
}
private List<ModuleRecord> getModuleRecords() {
final RequestWirelessModuleInformation response =
(RequestWirelessModuleInformation) exchangeMessage(new RequestWirelessModuleInformation());
if(response == null) {
logger.warning("Failed to get wireless module information: " + getLastError());
return null;
}
return response.getModuleRecords();
}
private IProbeMessage exchangeMessage(IProbeMessage message) {
try {
final IProbeMessage response = probe.getMessenger().exchangeMessage(message);
if(response instanceof StatusMessage) {
return null;
} else {
return response;
}
} catch(MessengerException e) {
messengerError = e.getMessage();
return null;
}
}
private boolean sendMessage(IProbeMessage message) {
try {
probe.getMessenger().sendMessage(message);
return true;
} catch (MessengerException e) {
messengerError = e.getMessage();
return false;
}
}
private String getLastError() {
return messengerError;
}
public void cancelCaptureFile() {
sniffingDaemon.cancelCaptureFile();
}
public ICaptureFileInterface createCaptureFileInterface(String path) {
return sniffingDaemon.createCaptureFileInterface(path);
}
public void enableInterfaces(Collection<ICaptureInterface> interfaces) {
sniffingDaemon.enableInterfaces(interfaces);
}
public void enableModules(Set<ISniffingModule> enabledModuleSet) {
sniffingDaemon.enableModules(enabledModuleSet);
}
public Collection<ICaptureInterface> getInterfaces() {
return sniffingDaemon.getInterfaces();
}
public Set<ISniffingModule> getModules() {
return sniffingDaemon.getModules();
}
public boolean isEnabled(ICaptureInterface iface) {
return sniffingDaemon.isEnabled(iface);
}
public boolean isEnabled(ISniffingModule module) {
if(module instanceof ModuleRecord) {
return ((ModuleRecord)module).isEnabled();
}
return sniffingDaemon.isEnabled(module);
}
public void runCaptureFile(long spaceId, ICaptureFileInterface iface,
ICaptureFileProgress progress) {
sniffingDaemon.runCaptureFile(spaceId, iface, progress);
}
public void setEnabled(ICaptureInterface iface, boolean enable) {
sniffingDaemon.setEnabled(iface, enable);
}
public void setWirelessEnabled(IWirelessCaptureInterface iface, boolean enable) {
final WirelessInterfaceRecord interfaceRecord = new WirelessInterfaceRecord(iface.getName(), iface.captureAvailable(), enable);
if(!sendMessage(new SetWirelessInterfaceEnableState(interfaceRecord))) {
logger.warning("Failed to enable wireless interface: " + getLastError());
}
}
public void setWirelessEnabled(ISniffingModule module, boolean enable) {
final ModuleRecord moduleRecord = new ModuleRecord(module.getName(), enable);
if(!sendMessage(new SetWirelessModuleEnableState(moduleRecord))) {
logger.warning("Failed to enable wireless sniffing module " + getLastError());
}
}
public void setEnabled(ISniffingModule module, boolean enable) {
sniffingDaemon.setEnabled(module, enable);
}
public boolean isRunning() {
return sniffingDaemon.isRunning();
}
public void start(long spaceId) {
if(!sendMessage(new StartWifiSniffer(spaceId))) {
logger.warning("Failed to start wifi sniffing daemon " + getLastError());
}
}
public void stop() {
if(!sendMessage(new StopWifiSniffer())) {
logger.warning("Failed to stop wifi sniffing daemon " + getLastError());
}
}
}