1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.server.dns;
21
22
23 import java.io.IOException;
24
25 import org.apache.directory.server.dns.protocol.DnsProtocolHandler;
26 import org.apache.directory.server.dns.store.RecordStore;
27 import org.apache.directory.server.dns.store.jndi.JndiRecordStoreImpl;
28 import org.apache.directory.server.protocol.shared.DirectoryBackedService;
29 import org.apache.directory.server.protocol.shared.transport.Transport;
30 import org.apache.directory.server.protocol.shared.transport.UdpTransport;
31 import org.apache.mina.core.service.IoAcceptor;
32 import org.apache.mina.transport.socket.DatagramAcceptor;
33 import org.apache.mina.transport.socket.DatagramSessionConfig;
34 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38
39
40
41
42
43
44 public class DnsServer extends DirectoryBackedService
45 {
46 private static final long serialVersionUID = 6943138644427163149L;
47
48
49 private static final Logger LOG = LoggerFactory.getLogger( DnsServer.class );
50
51
52 private static final int DEFAULT_IP_PORT = 53;
53
54
55 private static final String SERVICE_PID_DEFAULT = "org.apache.directory.server.dns";
56
57
58 private static final String SERVICE_NAME_DEFAULT = "ApacheDS DNS Service";
59
60
61
62
63
64 public DnsServer()
65 {
66 super.setServiceId( SERVICE_PID_DEFAULT );
67 super.setServiceName( SERVICE_NAME_DEFAULT );
68 }
69
70
71
72
73
74 public void start() throws IOException
75 {
76 RecordStore store = new JndiRecordStoreImpl( getSearchBaseDn(), getSearchBaseDn(), getDirectoryService() );
77
78 if ( ( transports == null ) || transports.isEmpty() )
79 {
80
81
82 UdpTransportol/shared/transport/UdpTransport.html#UdpTransport">UdpTransport transport = new UdpTransport( DEFAULT_IP_PORT );
83 setTransports( transport );
84
85 DatagramAcceptor acceptor = transport.getAcceptor();
86
87
88 acceptor.setHandler( new DnsProtocolHandler( this, store ) );
89
90
91 acceptor.getSessionConfig().setReuseAddress( true );
92
93
94 acceptor.bind();
95 }
96 else
97 {
98 for ( Transport transport : transports )
99 {
100
101 IoAcceptor acceptor = transport.getAcceptor();
102
103
104 acceptor.setHandler( new DnsProtocolHandler( this, store ) );
105
106 if ( transport instanceof UdpTransport )
107 {
108
109 ( ( DatagramSessionConfig ) acceptor.getSessionConfig() ).setReuseAddress( true );
110 }
111 else
112 {
113
114 acceptor.setCloseOnDeactivation( false );
115
116
117 ( ( NioSocketAcceptor ) acceptor ).setReuseAddress( true );
118
119
120 ( ( NioSocketAcceptor ) acceptor ).getSessionConfig().setTcpNoDelay( true );
121 }
122
123
124 acceptor.bind();
125 }
126 }
127
128 LOG.info( "DNS service started." );
129 }
130
131
132 public void stop()
133 {
134 for ( Transport transport : getTransports() )
135 {
136 IoAcceptor acceptor = transport.getAcceptor();
137
138 if ( acceptor != null )
139 {
140 acceptor.dispose();
141 }
142 }
143
144 LOG.info( "DNS service stopped." );
145 }
146
147
148
149
150
151 public String toString()
152 {
153 StringBuilder sb = new StringBuilder();
154
155 sb.append( "DNSServer[" ).append( getServiceName() ).append( "], listening on :" ).append( '\n' );
156
157 if ( getTransports() != null )
158 {
159 for ( Transport transport : getTransports() )
160 {
161 sb.append( " " ).append( transport ).append( '\n' );
162 }
163 }
164
165 return sb.toString();
166 }
167 }