001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 *
019 */
020 package org.apache.directory.server.dhcp.store;
021
022
023 import java.net.InetAddress;
024 import java.net.UnknownHostException;
025 import java.util.ArrayList;
026 import java.util.HashMap;
027 import java.util.Hashtable;
028 import java.util.Iterator;
029 import java.util.List;
030 import java.util.Map;
031
032 import javax.naming.Context;
033 import javax.naming.NamingEnumeration;
034 import javax.naming.NamingException;
035 import javax.naming.directory.Attribute;
036 import javax.naming.directory.Attributes;
037 import javax.naming.directory.DirContext;
038 import javax.naming.directory.InitialDirContext;
039 import javax.naming.directory.SearchControls;
040 import javax.naming.directory.SearchResult;
041
042 import org.apache.directory.server.dhcp.DhcpException;
043 import org.apache.directory.server.dhcp.messages.HardwareAddress;
044 import org.apache.directory.server.dhcp.options.OptionsField;
045 import org.apache.directory.server.dhcp.service.Lease;
046 import org.apache.directory.shared.ldap.constants.SchemaConstants;
047
048
049 /**
050 * Very simple dummy/proof-of-concept implementation of a DhcpStore.
051 *
052 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
053 * @version $Rev: 545042 $, $Date: 2007-06-06 22:32:01 -0500 (Mi, 06 Jun 2007) $
054 */
055 public class SimpleDhcpStore extends AbstractDhcpStore
056 {
057 // private static final String DEFAULT_INITIAL_CONTEXT_FACTORY =
058 // "org.apache.directory.server.core.jndi.CoreContextFactory";
059
060 // a map of current leases
061 private Map leases = new HashMap();
062
063 private List subnets = new ArrayList();
064
065
066 public SimpleDhcpStore()
067 {
068 try
069 {
070 subnets.add( new Subnet( InetAddress.getByName( "192.168.168.0" ),
071 InetAddress.getByName( "255.255.255.0" ), InetAddress.getByName( "192.168.168.159" ), InetAddress
072 .getByName( "192.168.168.179" ) ) );
073 }
074 catch ( UnknownHostException e )
075 {
076 throw new RuntimeException( "Can't init", e );
077 }
078 }
079
080
081 protected DirContext getContext() throws NamingException
082 {
083 Hashtable env = new Hashtable();
084 env.put( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
085 // env.put( Context.INITIAL_CONTEXT_FACTORY,
086 // DEFAULT_INITIAL_CONTEXT_FACTORY );
087 env.put( Context.PROVIDER_URL, "ldap://localhost:389/dc=tcat,dc=test" );
088
089 return new InitialDirContext( env );
090 }
091
092
093 /**
094 * @param hardwareAddress
095 * @param existingLease
096 * @return Lease
097 */
098 protected Lease findExistingLease( HardwareAddress hardwareAddress, Lease existingLease )
099 {
100 if ( leases.containsKey( hardwareAddress ) )
101 existingLease = ( Lease ) leases.get( hardwareAddress );
102 return existingLease;
103 }
104
105
106 /**
107 * @param hardwareAddress
108 * @return Host
109 * @throws DhcpException
110 */
111 protected Host findDesignatedHost( HardwareAddress hardwareAddress ) throws DhcpException
112 {
113 try
114 {
115 DirContext ctx = getContext();
116
117 try
118 {
119 String filter = "(&(objectclass=ipHost)(objectclass=ieee802Device)(macaddress={0}))";
120 SearchControls sc = new SearchControls();
121 sc.setCountLimit( 1 );
122 sc.setSearchScope( SearchControls.SUBTREE_SCOPE );
123 NamingEnumeration ne = ctx.search( "", filter, new Object[]
124 { hardwareAddress.toString() }, sc );
125
126 if ( ne.hasMoreElements() )
127 {
128 SearchResult sr = ( SearchResult ) ne.next();
129 Attributes att = sr.getAttributes();
130 Attribute ipHostNumberAttribute = att.get( "iphostnumber" );
131
132 if ( ipHostNumberAttribute != null )
133 {
134 InetAddress clientAddress = InetAddress.getByName( ( String ) ipHostNumberAttribute.get() );
135 Attribute cnAttribute = att.get( SchemaConstants.CN_AT );
136
137 return new Host( cnAttribute != null ? ( String ) cnAttribute.get() : "unknown", clientAddress,
138 hardwareAddress );
139 }
140 }
141 }
142 catch ( Exception e )
143 {
144 throw new DhcpException( "Can't lookup lease", e );
145 }
146 finally
147 {
148 ctx.close();
149 }
150 }
151 catch ( NamingException e )
152 {
153 throw new DhcpException( "Can't lookup lease", e );
154 }
155
156 return null;
157 }
158
159
160 /**
161 * Find the subnet for the given client address.
162 *
163 * @param clientAddress
164 * @return Subnet
165 */
166 protected Subnet findSubnet( InetAddress clientAddress )
167 {
168 for ( Iterator i = subnets.iterator(); i.hasNext(); )
169 {
170 Subnet subnet = ( Subnet ) i.next();
171 if ( subnet.contains( clientAddress ) )
172 return subnet;
173 }
174 return null;
175 }
176
177
178 /*
179 * @see org.apache.directory.server.dhcp.store.AbstractDhcpStore#updateLease(org.apache.directory.server.dhcp.service.Lease)
180 */
181 public void updateLease( Lease lease )
182 {
183 leases.put( lease.getHardwareAddress(), lease );
184 }
185
186
187 /*
188 * @see org.apache.directory.server.dhcp.store.AbstractDhcpStore#getOptions(org.apache.directory.server.dhcp.store.DhcpConfigElement)
189 */
190 protected OptionsField getOptions( DhcpConfigElement element )
191 {
192 // we don't have groups, classes, etc. yet.
193 return element.getOptions();
194 }
195
196
197 /*
198 * @see org.apache.directory.server.dhcp.store.AbstractDhcpStore#getProperties(org.apache.directory.server.dhcp.store.DhcpConfigElement)
199 */
200 protected Map getProperties( DhcpConfigElement element )
201 {
202 // we don't have groups, classes, etc. yet.
203 return element.getProperties();
204 }
205 }