/*
* 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.dhcp.msgbus;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Requires;
import org.krakenapps.dhcp.DhcpOptionCode;
import org.krakenapps.dhcp.DhcpServer;
import org.krakenapps.dhcp.MacAddress;
import org.krakenapps.dhcp.model.DhcpFilter;
import org.krakenapps.dhcp.model.DhcpIpGroup;
import org.krakenapps.dhcp.model.DhcpIpLease;
import org.krakenapps.dhcp.model.DhcpIpReservation;
import org.krakenapps.dhcp.model.DhcpOptionConfig;
import org.krakenapps.msgbus.MsgbusException;
import org.krakenapps.msgbus.Response;
import org.krakenapps.msgbus.Request;
import org.krakenapps.msgbus.handler.MsgbusMethod;
import org.krakenapps.msgbus.handler.MsgbusPlugin;
@Component(name = "dhcp-plugin")
@MsgbusPlugin
public class DhcpPlugin {
@Requires
private DhcpServer server;
@MsgbusMethod
public void groups(Request req, Response resp) {
List<DhcpIpGroup> groups = server.getIpGroups();
resp.put("groups", marshal(groups));
}
@MsgbusMethod
public void createGroup(Request req, Response resp) {
try {
DhcpIpGroup group = buildIpGroup(req);
InetAddress subnet = InetAddress.getByName(req.getString("subnet"));
InetAddress serverIp = InetAddress.getByName(req.getString("server_ip"));
InetAddress router = InetAddress.getByName(req.getString("router"));
InetAddress dns = InetAddress.getByName(req.getString("dns"));
int leaseDuration = req.getInteger("lease_duration");
server.createIpGroup(group);
server.createGroupOption(new DhcpOptionConfig(group.getName(), 1, subnet.getHostAddress()));
server.createGroupOption(new DhcpOptionConfig(group.getName(), 54, serverIp.getHostAddress()));
server.createGroupOption(new DhcpOptionConfig(group.getName(), 3, router.getHostAddress()));
server.createGroupOption(new DhcpOptionConfig(group.getName(), 6, dns.getHostAddress()));
server.createGroupOption(new DhcpOptionConfig(group.getName(), 51, Integer.toString(leaseDuration)));
} catch (UnknownHostException e) {
throw new MsgbusException("0", e.getMessage());
}
}
@MsgbusMethod
public void updateGroup(Request req, Response resp) {
try {
DhcpIpGroup group = buildIpGroup(req);
server.updateIpGroup(group);
} catch (UnknownHostException e) {
throw new MsgbusException("0", e.getMessage());
}
}
private DhcpIpGroup buildIpGroup(Request req) throws UnknownHostException {
DhcpIpGroup group = new DhcpIpGroup();
group.setName(req.getString("name"));
group.setFrom(InetAddress.getByName(req.getString("from")));
group.setTo(InetAddress.getByName(req.getString("to")));
return group;
}
@MsgbusMethod
public void removeGroup(Request req, Response resp) {
String name = req.getString("name");
server.removeIpGroup(name);
}
@MsgbusMethod
public void groupConfigs(Request req, Response resp) {
String name = req.getString("name");
List<DhcpOptionConfig> configs = server.getGroupOptions(name);
resp.put("configs", marshal(configs));
}
@MsgbusMethod
public void createGroupConfigs(Request req, Response resp) {
String groupName = req.getString("group_name");
int type = req.getInteger("type");
String value = req.getString("value");
server.createGroupOption(new DhcpOptionConfig(groupName, type, value));
}
@MsgbusMethod
public void removeGroupConfigs(Request req, Response resp) {
int id = req.getInteger("id");
server.removeGroupOption(id);
}
@MsgbusMethod
public void offers(Request req, Response resp) {
List<DhcpIpLease> offers = server.getIpOffers();
resp.put("offers", marshal(offers));
}
@MsgbusMethod
public void leases(Request req, Response resp) {
for (DhcpIpGroup group : server.getIpGroups()) {
String groupName = group.getName();
List<DhcpIpLease> leases = server.getIpLeases(groupName);
resp.put(groupName, marshal(leases));
}
}
@MsgbusMethod
public void purgeLease(Request req, Response resp) {
try {
String target = req.getString("target");
if (target.equals("all"))
server.purgeIpLease();
else
server.purgeIpLease(InetAddress.getByName(target));
} catch (UnknownHostException e) {
throw new MsgbusException("0", e.getMessage());
}
}
@MsgbusMethod
public void reservations(Request req, Response resp) {
String groupName = req.getString("group_name");
List<DhcpIpReservation> reservations = server.getIpReservations(groupName);
resp.put("reservations", marshal(reservations));
}
@MsgbusMethod
public void reserve(Request req, Response resp) {
try {
String groupName = req.getString("group_name");
InetAddress ip = InetAddress.getByName(req.getString("ip"));
MacAddress mac = new MacAddress(req.getString("mac_address"));
String hostName = req.getString("host_name");
server.reserve(new DhcpIpReservation(groupName, ip, mac, hostName));
} catch (UnknownHostException e) {
throw new MsgbusException("0", e.getMessage());
}
}
@MsgbusMethod
public void unreserve(Request req, Response resp) {
try {
String groupName = req.getString("group_name");
InetAddress ip = InetAddress.getByName(req.getString("ip"));
server.unreserve(new DhcpIpReservation(groupName, ip, null, null));
} catch (UnknownHostException e) {
throw new MsgbusException("0", e.getMessage());
}
}
@MsgbusMethod
public void filters(Request req, Response resp) {
List<DhcpFilter> allows = server.getAllowFilters();
List<DhcpFilter> blocks = server.getBlockFilters();
resp.put("allows", marshal(allows));
resp.put("blocks", marshal(blocks));
}
@MsgbusMethod
public void allow(Request req, Response resp) {
MacAddress mac = new MacAddress(req.getString("mac_address"));
String description = req.getString("description");
server.createFilter(new DhcpFilter(mac, description, true));
}
@MsgbusMethod
public void block(Request req, Response resp) {
MacAddress mac = new MacAddress(req.getString("mac_address"));
String description = req.getString("description");
server.createFilter(new DhcpFilter(mac, description, false));
}
@MsgbusMethod
public void removeFilter(Request req, Response resp) {
String mac = req.getString("mac_address");
server.removeFilter(new MacAddress(mac));
}
@MsgbusMethod
public void options(Request req, Response resp) {
List<DhcpOptionCode> options = Arrays.asList(DhcpOptionCode.values());
resp.put("options", marshal(options));
}
private List<Object> marshal(Collection<?> objs) {
List<Object> l = new ArrayList<Object>();
for (Object obj : objs) {
if (obj instanceof DhcpIpGroup)
l.add(marshal((DhcpIpGroup) obj));
else if (obj instanceof DhcpOptionConfig)
l.add(marshal((DhcpOptionConfig) obj));
else if (obj instanceof DhcpIpLease)
l.add(marshal((DhcpIpLease) obj));
else if (obj instanceof DhcpIpReservation)
l.add(marshal((DhcpIpReservation) obj));
else if (obj instanceof DhcpFilter)
l.add(marshal((DhcpFilter) obj));
else if (obj instanceof DhcpOptionCode)
l.add(marshal((DhcpOptionCode) obj));
}
return l;
}
private Map<String, Object> marshal(DhcpIpGroup group) {
Map<String, Object> m = new HashMap<String, Object>();
m.put("name", group.getName());
m.put("description", group.getDescription());
m.put("from", group.getFrom().getHostAddress());
m.put("to", group.getTo().getHostAddress());
return m;
}
private Map<String, Object> marshal(DhcpOptionConfig obj) {
Map<String, Object> m = new HashMap<String, Object>();
m.put("id", obj.getId());
m.put("group_name", obj.getGroupName());
m.put("type", obj.getType());
m.put("value", obj.getValue());
m.put("ordinal", obj.getOrdinal());
return m;
}
private Map<String, Object> marshal(DhcpIpLease obj) {
SimpleDateFormat dateFormat = new SimpleDateFormat();
Map<String, Object> m = new HashMap<String, Object>();
m.put("group_name", obj.getGroupName());
m.put("ip", obj.getIp().getHostAddress());
m.put("mac_address", obj.getMac().toString());
m.put("host_name", obj.getHostName());
m.put("expire", dateFormat.format(obj.getExpire()));
m.put("created", dateFormat.format(obj.getCreated()));
m.put("updated", dateFormat.format(obj.getUpdated()));
return m;
}
private Map<String, Object> marshal(DhcpIpReservation obj) {
Map<String, Object> m = new HashMap<String, Object>();
m.put("group_name", obj.getGroupName());
m.put("host_name", obj.getHostName());
m.put("ip", obj.getIp().getHostAddress());
m.put("mac_address", obj.getMac().toString());
return m;
}
private Map<String, Object> marshal(DhcpFilter obj) {
Map<String, Object> m = new HashMap<String, Object>();
m.put("mac_address", obj.getMac().toString());
m.put("description", obj.getDescription());
m.put("allow", obj.isAllow());
return m;
}
private Map<String, Object> marshal(DhcpOptionCode obj) {
Map<String, Object> m = new HashMap<String, Object>();
m.put("code", obj.code());
m.put("name", obj.name());
m.put("class", obj.getValueType() != null ? obj.getValueType().getName() : null);
return m;
}
}