/*
* Copyright 2011 Future Systems
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.krakenapps.portmon.impl;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.krakenapps.api.Script;
import org.krakenapps.api.ScriptArgument;
import org.krakenapps.api.ScriptContext;
import org.krakenapps.api.ScriptUsage;
import org.krakenapps.portmon.PortEventListener;
import org.krakenapps.portmon.PortMonitor;
import org.krakenapps.portmon.PortStatus;
public class PortMonitorScript implements Script {
private PortMonitor monitor;
private ScriptContext context;
public PortMonitorScript(PortMonitor monitor) {
this.monitor = monitor;
}
@Override
public void setScriptContext(ScriptContext context) {
this.context = context;
}
public void tcpTargets(String[] args) {
context.println("Tcp Monitoring Targets");
context.println("------------------------");
for (InetSocketAddress target : monitor.getTcpTargets()) {
PortStatus status = monitor.getTcpPortStatus(target);
context.println(target + " => " + status.toString());
}
}
@ScriptUsage(description = "add tcp monitoring target", arguments = {
@ScriptArgument(name = "host", type = "string", description = "target hostname or ip"),
@ScriptArgument(name = "port", type = "int", description = "target tcp port") })
public void addTcpTarget(String[] args) {
try {
InetAddress ip = InetAddress.getByName(args[0]);
int port = Integer.parseInt(args[1]);
if (port < 1 || port > 65535)
throw new NumberFormatException();
monitor.addTcpTarget(new InetSocketAddress(ip, port));
context.println("target added");
} catch (NumberFormatException e) {
context.println("invalid port number");
} catch (UnknownHostException e) {
context.println("unknown host");
}
}
@ScriptUsage(description = "remove tcp monitoring target", arguments = {
@ScriptArgument(name = "host", type = "string", description = "target hostname or ip"),
@ScriptArgument(name = "port", type = "int", description = "target tcp port") })
public void removeTcpTarget(String[] args) {
try {
InetAddress ip = InetAddress.getByName(args[0]);
int port = Integer.parseInt(args[1]);
if (port < 1 || port > 65535)
throw new NumberFormatException();
monitor.removeTcpTarget(new InetSocketAddress(ip, port));
context.println("target removed");
} catch (NumberFormatException e) {
context.println("invalid port number");
} catch (UnknownHostException e) {
context.println("unknown host");
}
}
public void trace(String[] args) {
PortScanTracer tracer = new PortScanTracer();
monitor.addListener(tracer);
try {
while (true) {
context.readLine();
}
} catch (InterruptedException e) {
context.println("interrupted");
} finally {
monitor.removeListener(tracer);
}
}
private class PortScanTracer implements PortEventListener {
@Override
public void onConnect(InetSocketAddress target, int connectTime) {
SimpleDateFormat dateFormat = new SimpleDateFormat("[HH:mm:ss]");
context.printf("%s %s connected, elapsed time %d\n", dateFormat.format(new Date()), target, connectTime);
}
@Override
public void onConnectRefused(InetSocketAddress target, int timeout, IOException e) {
SimpleDateFormat dateFormat = new SimpleDateFormat("[HH:mm:ss]");
context.printf("%s %s connect refused, timeout %d\n", dateFormat.format(new Date()), target, timeout);
}
}
}