/* * 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.captiveportal.impl; import java.io.IOException; import java.net.InetAddress; import java.util.List; import java.util.Map; import org.krakenapps.api.Script; import org.krakenapps.api.ScriptArgument; import org.krakenapps.api.ScriptContext; import org.krakenapps.api.ScriptUsage; import org.krakenapps.captiveportal.CaptivePortal; import org.krakenapps.pcap.decoder.ethernet.MacAddress; import org.krakenapps.pcap.live.PcapDeviceManager; import org.krakenapps.pcap.live.PcapDeviceMetadata; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CaptivePortalScript implements Script { private final Logger logger = LoggerFactory.getLogger(CaptivePortalScript.class.getName()); private CaptivePortal portal; private ScriptContext context; public CaptivePortalScript(CaptivePortal portal) { this.portal = portal; } @Override public void setScriptContext(ScriptContext context) { this.context = context; } public void redirectip(String[] args) { InetAddress ip = portal.getRedirectAddress(); if (ip != null) context.println(ip); else context.println("not set"); } @ScriptUsage(description = "set redirect ip address", arguments = { @ScriptArgument(name = "redirect ip", type = "string", description = "redirect ip address") }) public void setredirectip(String[] args) { try { portal.setRedirectAddress(InetAddress.getByName(args[0])); context.println("set"); } catch (Exception e) { context.println(e.getMessage()); logger.error("kraken captive portal: cannot set redirect ip", e); } } public void arpcache(String[] args) { context.println("ARP Cache"); context.println("-------------"); Map<InetAddress, MacAddress> m = portal.getArpCache(); for (InetAddress ip : m.keySet()) { context.println("ip=" + ip.getHostAddress() + ", mac=" + m.get(ip)); } } @ScriptUsage(description = "set poison interval", arguments = { @ScriptArgument(name = "interval", type = "int", description = "poision interval in milliseconds") }) public void setpoisoninterval(String[] args) { try { portal.setPoisonInterval(Integer.valueOf(args[0])); context.println("set"); } catch (Exception e) { context.println(e.getMessage()); } } @ScriptUsage(description = "get poison interval") public void poisoninterval(String[] args) { context.println(portal.getPoisonInterval() + "ms"); } @ScriptUsage(description = "set gateway ip", arguments = { @ScriptArgument(name = "gateway ip", type = "string", description = "gateway ip address") }) public void setgateway(String[] args) { try { InetAddress ip = InetAddress.getByName(args[0]); portal.setGatewayAddress(ip); context.println("set"); } catch (Exception e) { context.println(e.getMessage()); } } @ScriptUsage(description = "get gateway ip") public void gateway(String[] args) { context.println(portal.getGatewayAddress()); } @ScriptUsage(description = "set pcap device name") public void setdevice(String[] args) { try { int i = 1; List<PcapDeviceMetadata> metadatas = PcapDeviceManager.getDeviceMetadataList(); for (PcapDeviceMetadata metadata : metadatas) { context.println("[" + (i++) + "] " + metadata); } context.print("select? "); String line = context.readLine(); int num = Integer.valueOf(line); if (num < 0 || num > metadatas.size()) { context.println("invalid number"); return; } PcapDeviceMetadata selected = metadatas.get(num - 1); portal.setPcapDeviceName(selected.getName()); context.println("set"); } catch (NumberFormatException e) { context.println("invalid number"); } catch (Exception e) { context.println(e.getMessage()); } } @ScriptUsage(description = "get pcap device name") public void device(String[] args) { String name = portal.getPcapDeviceName(); if (name == null) context.println("not set"); else context.println(name); } @ScriptUsage(description = "set mirroring mode", arguments = { @ScriptArgument(name = "mirroring mode", type = "string", description = "true or false") }) public void setmirroring(String[] args) { try { portal.setMirroringMode(Boolean.parseBoolean(args[0])); context.println("set"); } catch (Exception e) { context.println(e.getMessage()); } } @ScriptUsage(description = "get mirroring mode") public void mirroring(String[] args) { context.println(portal.getMirroringMode()); } public void targets(String[] args) { context.println("Quarantined Hosts"); context.println("-------------------"); for (InetAddress target : portal.getQuarantinedHosts()) { context.println(target.getHostAddress()); } } @ScriptUsage(description = "quarantine new host ip", arguments = { @ScriptArgument(name = "target ip address") }) public void quarantine(String[] args) { try { InetAddress address = InetAddress.getByName(args[0]); portal.quarantineHost(address); context.println("set"); } catch (Exception e) { context.println(e.getMessage()); logger.error("kraken captive portal: cannot quarantine host " + args[0], e); } } @ScriptUsage(description = "unquarantine host ip", arguments = { @ScriptArgument(name = "target ip address") }) public void unquarantine(String[] args) { try { InetAddress address = InetAddress.getByName(args[0]); portal.unquarantineHost(address); context.println("unset"); } catch (Exception e) { context.println(e.getMessage()); logger.error("kraken captive portal: cannot unquarantine host " + args[0], e); } } public void spoof(String[] args) { try { portal.spoof(); } catch (IOException e) { context.println(e.getMessage()); } } }