xref: /minix3/external/bsd/dhcp/dist/contrib/ldap/dhcpd-conf-to-ldap (revision 83ee113ee0d94f3844d44065af2311604e9a30ad)
1*83ee113eSDavid van Moolenbroek#!/usr/bin/perl -w
2*83ee113eSDavid van Moolenbroek
3*83ee113eSDavid van Moolenbroek# Brian Masney <masneyb@gftp.org>
4*83ee113eSDavid van Moolenbroek# To use this script, set your base DN below. Then run
5*83ee113eSDavid van Moolenbroek# ./dhcpd-conf-to-ldap.pl < /path-to-dhcpd-conf/dhcpd.conf > output-file
6*83ee113eSDavid van Moolenbroek# The output of this script will generate entries in LDIF format. You can use
7*83ee113eSDavid van Moolenbroek# the slapadd command to add these entries into your LDAP server. You will
8*83ee113eSDavid van Moolenbroek# definately want to double check that your LDAP entries are correct before
9*83ee113eSDavid van Moolenbroek# you load them into LDAP.
10*83ee113eSDavid van Moolenbroek
11*83ee113eSDavid van Moolenbroek# This script does not do much error checking. Make sure before you run this
12*83ee113eSDavid van Moolenbroek# that the DHCP server doesn't give any errors about your config file
13*83ee113eSDavid van Moolenbroek
14*83ee113eSDavid van Moolenbroek# FailOver notes:
15*83ee113eSDavid van Moolenbroek#   Failover is disabled by default, since it may need manually intervention.
16*83ee113eSDavid van Moolenbroek#   You can try the '--use=failover' option to see what happens :-)
17*83ee113eSDavid van Moolenbroek#
18*83ee113eSDavid van Moolenbroek#   If enabled, the failover pool references will be written to LDIF output.
19*83ee113eSDavid van Moolenbroek#   The failover configs itself will be added to the dhcpServer statements
20*83ee113eSDavid van Moolenbroek#   and not to the dhcpService object (since this script uses only one and
21*83ee113eSDavid van Moolenbroek#   it may be usefull to have multiple service containers in failover mode).
22*83ee113eSDavid van Moolenbroek#   Further, this script does not check if primary or secondary makes sense,
23*83ee113eSDavid van Moolenbroek#   it simply converts what it gets...
24*83ee113eSDavid van Moolenbroek
25*83ee113eSDavid van Moolenbroekuse Net::Domain qw(hostname hostfqdn hostdomain);
26*83ee113eSDavid van Moolenbroekuse Getopt::Long;
27*83ee113eSDavid van Moolenbroek
28*83ee113eSDavid van Moolenbroekmy $domain = hostdomain();           # your.domain
29*83ee113eSDavid van Moolenbroekmy $basedn = "dc=".$domain;
30*83ee113eSDavid van Moolenbroek   $basedn =~ s/\./,dc=/g;           # dc=your,dc=domain
31*83ee113eSDavid van Moolenbroekmy $server = hostname();             # hostname (nodename)
32*83ee113eSDavid van Moolenbroekmy $dhcpcn = 'DHCP Config';          # CN of DHCP config tree
33*83ee113eSDavid van Moolenbroekmy $dhcpdn = "cn=$dhcpcn, $basedn";  # DHCP config tree DN
34*83ee113eSDavid van Moolenbroekmy $second = '';                     # secondary server DN / hostname
35*83ee113eSDavid van Moolenbroekmy $i_conf = '';                     # dhcp.conf file to read or stdin
36*83ee113eSDavid van Moolenbroekmy $o_ldif = '';                     # output ldif file name or stdout
37*83ee113eSDavid van Moolenbroekmy @use    = ();                     # extended flags (failover)
38*83ee113eSDavid van Moolenbroek
39*83ee113eSDavid van Moolenbroeksub usage($;$)
40*83ee113eSDavid van Moolenbroek{
41*83ee113eSDavid van Moolenbroek  my $rc = shift;
42*83ee113eSDavid van Moolenbroek  my $err= shift;
43*83ee113eSDavid van Moolenbroek
44*83ee113eSDavid van Moolenbroek  print STDERR "Error: $err\n\n" if(defined $err);
45*83ee113eSDavid van Moolenbroek  print STDERR <<__EOF_USAGE__;
46*83ee113eSDavid van Moolenbroekusage:
47*83ee113eSDavid van Moolenbroek  $0 [options] < dhcpd.conf > dhcpd.ldif
48*83ee113eSDavid van Moolenbroek
49*83ee113eSDavid van Moolenbroekoptions:
50*83ee113eSDavid van Moolenbroek
51*83ee113eSDavid van Moolenbroek  --basedn  "dc=your,dc=domain"        ("$basedn")
52*83ee113eSDavid van Moolenbroek
53*83ee113eSDavid van Moolenbroek  --dhcpdn  "dhcp config DN"           ("$dhcpdn")
54*83ee113eSDavid van Moolenbroek
55*83ee113eSDavid van Moolenbroek  --server  "dhcp server name"         ("$server")
56*83ee113eSDavid van Moolenbroek
57*83ee113eSDavid van Moolenbroek  --second  "secondary server or DN"   ("$second")
58*83ee113eSDavid van Moolenbroek
59*83ee113eSDavid van Moolenbroek  --conf    "/path/to/dhcpd.conf"      (default is stdin)
60*83ee113eSDavid van Moolenbroek  --ldif    "/path/to/output.ldif"     (default is stdout)
61*83ee113eSDavid van Moolenbroek
62*83ee113eSDavid van Moolenbroek  --use     "extended features"        (see source comments)
63*83ee113eSDavid van Moolenbroek__EOF_USAGE__
64*83ee113eSDavid van Moolenbroek  exit($rc);
65*83ee113eSDavid van Moolenbroek}
66*83ee113eSDavid van Moolenbroek
67*83ee113eSDavid van Moolenbroek
68*83ee113eSDavid van Moolenbroeksub next_token
69*83ee113eSDavid van Moolenbroek{
70*83ee113eSDavid van Moolenbroek  local ($lowercase) = @_;
71*83ee113eSDavid van Moolenbroek  local ($token, $newline);
72*83ee113eSDavid van Moolenbroek
73*83ee113eSDavid van Moolenbroek  do
74*83ee113eSDavid van Moolenbroek    {
75*83ee113eSDavid van Moolenbroek      if (!defined ($line) || length ($line) == 0)
76*83ee113eSDavid van Moolenbroek        {
77*83ee113eSDavid van Moolenbroek          $line = <>;
78*83ee113eSDavid van Moolenbroek          return undef if !defined ($line);
79*83ee113eSDavid van Moolenbroek          chop $line;
80*83ee113eSDavid van Moolenbroek          $line_number++;
81*83ee113eSDavid van Moolenbroek          $token_number = 0;
82*83ee113eSDavid van Moolenbroek        }
83*83ee113eSDavid van Moolenbroek
84*83ee113eSDavid van Moolenbroek      $line =~ s/#.*//;
85*83ee113eSDavid van Moolenbroek      $line =~ s/^\s+//;
86*83ee113eSDavid van Moolenbroek      $line =~ s/\s+$//;
87*83ee113eSDavid van Moolenbroek    }
88*83ee113eSDavid van Moolenbroek  while (length ($line) == 0);
89*83ee113eSDavid van Moolenbroek
90*83ee113eSDavid van Moolenbroek  if (($token, $newline) = $line =~ /^(.*?)\s+(.*)/)
91*83ee113eSDavid van Moolenbroek    {
92*83ee113eSDavid van Moolenbroek      if ($token =~ /^"/) {
93*83ee113eSDavid van Moolenbroek       #handle quoted token
94*83ee113eSDavid van Moolenbroek       if ($token !~ /"\s*$/)
95*83ee113eSDavid van Moolenbroek       {
96*83ee113eSDavid van Moolenbroek         ($tok, $newline)  = $newline =~ /([^"]+")(.*)/;
97*83ee113eSDavid van Moolenbroek         $token .= " $tok";
98*83ee113eSDavid van Moolenbroek        }
99*83ee113eSDavid van Moolenbroek      }
100*83ee113eSDavid van Moolenbroek      $line = $newline;
101*83ee113eSDavid van Moolenbroek    }
102*83ee113eSDavid van Moolenbroek  else
103*83ee113eSDavid van Moolenbroek    {
104*83ee113eSDavid van Moolenbroek      $token = $line;
105*83ee113eSDavid van Moolenbroek      $line = '';
106*83ee113eSDavid van Moolenbroek    }
107*83ee113eSDavid van Moolenbroek  $token_number++;
108*83ee113eSDavid van Moolenbroek
109*83ee113eSDavid van Moolenbroek  $token =~ y/[A-Z]/[a-z]/ if $lowercase;
110*83ee113eSDavid van Moolenbroek
111*83ee113eSDavid van Moolenbroek  return ($token);
112*83ee113eSDavid van Moolenbroek}
113*83ee113eSDavid van Moolenbroek
114*83ee113eSDavid van Moolenbroek
115*83ee113eSDavid van Moolenbroeksub remaining_line
116*83ee113eSDavid van Moolenbroek{
117*83ee113eSDavid van Moolenbroek  local ($block) = shift || 0;
118*83ee113eSDavid van Moolenbroek  local ($tmp, $str);
119*83ee113eSDavid van Moolenbroek
120*83ee113eSDavid van Moolenbroek  $str = "";
121*83ee113eSDavid van Moolenbroek  while (defined($tmp = next_token (0)))
122*83ee113eSDavid van Moolenbroek    {
123*83ee113eSDavid van Moolenbroek      $str .= ' ' if !($str eq "");
124*83ee113eSDavid van Moolenbroek      $str .= $tmp;
125*83ee113eSDavid van Moolenbroek      last if $tmp =~ /;\s*$/;
126*83ee113eSDavid van Moolenbroek      last if($block and $tmp =~ /\s*[}{]\s*$/);
127*83ee113eSDavid van Moolenbroek    }
128*83ee113eSDavid van Moolenbroek
129*83ee113eSDavid van Moolenbroek  $str =~ s/;$//;
130*83ee113eSDavid van Moolenbroek  return ($str);
131*83ee113eSDavid van Moolenbroek}
132*83ee113eSDavid van Moolenbroek
133*83ee113eSDavid van Moolenbroek
134*83ee113eSDavid van Moolenbroeksub
135*83ee113eSDavid van Moolenbroekadd_dn_to_stack
136*83ee113eSDavid van Moolenbroek{
137*83ee113eSDavid van Moolenbroek  local ($dn) = @_;
138*83ee113eSDavid van Moolenbroek
139*83ee113eSDavid van Moolenbroek  $current_dn = "$dn, $current_dn";
140*83ee113eSDavid van Moolenbroek}
141*83ee113eSDavid van Moolenbroek
142*83ee113eSDavid van Moolenbroek
143*83ee113eSDavid van Moolenbroeksub
144*83ee113eSDavid van Moolenbroekremove_dn_from_stack
145*83ee113eSDavid van Moolenbroek{
146*83ee113eSDavid van Moolenbroek  $current_dn =~ s/^.*?,\s*//;
147*83ee113eSDavid van Moolenbroek}
148*83ee113eSDavid van Moolenbroek
149*83ee113eSDavid van Moolenbroek
150*83ee113eSDavid van Moolenbroeksub
151*83ee113eSDavid van Moolenbroekparse_error
152*83ee113eSDavid van Moolenbroek{
153*83ee113eSDavid van Moolenbroek  print "Parse error on line number $line_number at token number $token_number\n";
154*83ee113eSDavid van Moolenbroek  exit (1);
155*83ee113eSDavid van Moolenbroek}
156*83ee113eSDavid van Moolenbroek
157*83ee113eSDavid van Moolenbroek
158*83ee113eSDavid van Moolenbroeksub
159*83ee113eSDavid van Moolenbroekprint_entry
160*83ee113eSDavid van Moolenbroek{
161*83ee113eSDavid van Moolenbroek  return if (scalar keys %curentry == 0);
162*83ee113eSDavid van Moolenbroek
163*83ee113eSDavid van Moolenbroek  if (!defined ($curentry{'type'}))
164*83ee113eSDavid van Moolenbroek    {
165*83ee113eSDavid van Moolenbroek      $hostdn = "cn=$server, $basedn";
166*83ee113eSDavid van Moolenbroek      print "dn: $hostdn\n";
167*83ee113eSDavid van Moolenbroek      print "cn: $server\n";
168*83ee113eSDavid van Moolenbroek      print "objectClass: top\n";
169*83ee113eSDavid van Moolenbroek      print "objectClass: dhcpServer\n";
170*83ee113eSDavid van Moolenbroek      print "dhcpServiceDN: $current_dn\n";
171*83ee113eSDavid van Moolenbroek      if(grep(/FaIlOvEr/i, @use))
172*83ee113eSDavid van Moolenbroek        {
173*83ee113eSDavid van Moolenbroek          foreach my $fo_peer (keys %failover)
174*83ee113eSDavid van Moolenbroek            {
175*83ee113eSDavid van Moolenbroek              next if(scalar(@{$failover{$fo_peer}}) <= 1);
176*83ee113eSDavid van Moolenbroek              print "dhcpStatements: failover peer $fo_peer { ",
177*83ee113eSDavid van Moolenbroek                    join('; ', @{$failover{$fo_peer}}), "; }\n";
178*83ee113eSDavid van Moolenbroek            }
179*83ee113eSDavid van Moolenbroek        }
180*83ee113eSDavid van Moolenbroek      print "\n";
181*83ee113eSDavid van Moolenbroek
182*83ee113eSDavid van Moolenbroek      print "dn: $current_dn\n";
183*83ee113eSDavid van Moolenbroek      print "cn: $dhcpcn\n";
184*83ee113eSDavid van Moolenbroek      print "objectClass: top\n";
185*83ee113eSDavid van Moolenbroek      print "objectClass: dhcpService\n";
186*83ee113eSDavid van Moolenbroek      if (defined ($curentry{'options'}))
187*83ee113eSDavid van Moolenbroek        {
188*83ee113eSDavid van Moolenbroek          print "objectClass: dhcpOptions\n";
189*83ee113eSDavid van Moolenbroek        }
190*83ee113eSDavid van Moolenbroek      print "dhcpPrimaryDN: $hostdn\n";
191*83ee113eSDavid van Moolenbroek      if(grep(/FaIlOvEr/i, @use) and ($second ne ''))
192*83ee113eSDavid van Moolenbroek        {
193*83ee113eSDavid van Moolenbroek          print "dhcpSecondaryDN: $second\n";
194*83ee113eSDavid van Moolenbroek        }
195*83ee113eSDavid van Moolenbroek    }
196*83ee113eSDavid van Moolenbroek  elsif ($curentry{'type'} eq 'subnet')
197*83ee113eSDavid van Moolenbroek    {
198*83ee113eSDavid van Moolenbroek      print "dn: $current_dn\n";
199*83ee113eSDavid van Moolenbroek      print "cn: " . $curentry{'ip'} . "\n";
200*83ee113eSDavid van Moolenbroek      print "objectClass: top\n";
201*83ee113eSDavid van Moolenbroek      print "objectClass: dhcpSubnet\n";
202*83ee113eSDavid van Moolenbroek      if (defined ($curentry{'options'}))
203*83ee113eSDavid van Moolenbroek        {
204*83ee113eSDavid van Moolenbroek          print "objectClass: dhcpOptions\n";
205*83ee113eSDavid van Moolenbroek        }
206*83ee113eSDavid van Moolenbroek
207*83ee113eSDavid van Moolenbroek      print "dhcpNetMask: " . $curentry{'netmask'} . "\n";
208*83ee113eSDavid van Moolenbroek      if (defined ($curentry{'ranges'}))
209*83ee113eSDavid van Moolenbroek        {
210*83ee113eSDavid van Moolenbroek          foreach $statement (@{$curentry{'ranges'}})
211*83ee113eSDavid van Moolenbroek            {
212*83ee113eSDavid van Moolenbroek              print "dhcpRange: $statement\n";
213*83ee113eSDavid van Moolenbroek            }
214*83ee113eSDavid van Moolenbroek        }
215*83ee113eSDavid van Moolenbroek    }
216*83ee113eSDavid van Moolenbroek  elsif ($curentry{'type'} eq 'shared-network')
217*83ee113eSDavid van Moolenbroek    {
218*83ee113eSDavid van Moolenbroek      print "dn: $current_dn\n";
219*83ee113eSDavid van Moolenbroek      print "cn: " . $curentry{'descr'} . "\n";
220*83ee113eSDavid van Moolenbroek      print "objectClass: top\n";
221*83ee113eSDavid van Moolenbroek      print "objectClass: dhcpSharedNetwork\n";
222*83ee113eSDavid van Moolenbroek      if (defined ($curentry{'options'}))
223*83ee113eSDavid van Moolenbroek        {
224*83ee113eSDavid van Moolenbroek          print "objectClass: dhcpOptions\n";
225*83ee113eSDavid van Moolenbroek        }
226*83ee113eSDavid van Moolenbroek    }
227*83ee113eSDavid van Moolenbroek  elsif ($curentry{'type'} eq 'group')
228*83ee113eSDavid van Moolenbroek    {
229*83ee113eSDavid van Moolenbroek      print "dn: $current_dn\n";
230*83ee113eSDavid van Moolenbroek      print "cn: group", $curentry{'idx'}, "\n";
231*83ee113eSDavid van Moolenbroek      print "objectClass: top\n";
232*83ee113eSDavid van Moolenbroek      print "objectClass: dhcpGroup\n";
233*83ee113eSDavid van Moolenbroek      if (defined ($curentry{'options'}))
234*83ee113eSDavid van Moolenbroek        {
235*83ee113eSDavid van Moolenbroek          print "objectClass: dhcpOptions\n";
236*83ee113eSDavid van Moolenbroek        }
237*83ee113eSDavid van Moolenbroek    }
238*83ee113eSDavid van Moolenbroek  elsif ($curentry{'type'} eq 'host')
239*83ee113eSDavid van Moolenbroek    {
240*83ee113eSDavid van Moolenbroek      print "dn: $current_dn\n";
241*83ee113eSDavid van Moolenbroek      print "cn: " . $curentry{'host'} . "\n";
242*83ee113eSDavid van Moolenbroek      print "objectClass: top\n";
243*83ee113eSDavid van Moolenbroek      print "objectClass: dhcpHost\n";
244*83ee113eSDavid van Moolenbroek      if (defined ($curentry{'options'}))
245*83ee113eSDavid van Moolenbroek        {
246*83ee113eSDavid van Moolenbroek          print "objectClass: dhcpOptions\n";
247*83ee113eSDavid van Moolenbroek        }
248*83ee113eSDavid van Moolenbroek
249*83ee113eSDavid van Moolenbroek      if (defined ($curentry{'hwaddress'}))
250*83ee113eSDavid van Moolenbroek        {
251*83ee113eSDavid van Moolenbroek          $curentry{'hwaddress'} =~ y/[A-Z]/[a-z]/;
252*83ee113eSDavid van Moolenbroek          print "dhcpHWAddress: " . $curentry{'hwaddress'} . "\n";
253*83ee113eSDavid van Moolenbroek        }
254*83ee113eSDavid van Moolenbroek    }
255*83ee113eSDavid van Moolenbroek  elsif ($curentry{'type'} eq 'pool')
256*83ee113eSDavid van Moolenbroek    {
257*83ee113eSDavid van Moolenbroek      print "dn: $current_dn\n";
258*83ee113eSDavid van Moolenbroek      print "cn: pool", $curentry{'idx'}, "\n";
259*83ee113eSDavid van Moolenbroek      print "objectClass: top\n";
260*83ee113eSDavid van Moolenbroek      print "objectClass: dhcpPool\n";
261*83ee113eSDavid van Moolenbroek      if (defined ($curentry{'options'}))
262*83ee113eSDavid van Moolenbroek        {
263*83ee113eSDavid van Moolenbroek          print "objectClass: dhcpOptions\n";
264*83ee113eSDavid van Moolenbroek        }
265*83ee113eSDavid van Moolenbroek
266*83ee113eSDavid van Moolenbroek      if (defined ($curentry{'ranges'}))
267*83ee113eSDavid van Moolenbroek        {
268*83ee113eSDavid van Moolenbroek          foreach $statement (@{$curentry{'ranges'}})
269*83ee113eSDavid van Moolenbroek            {
270*83ee113eSDavid van Moolenbroek              print "dhcpRange: $statement\n";
271*83ee113eSDavid van Moolenbroek            }
272*83ee113eSDavid van Moolenbroek        }
273*83ee113eSDavid van Moolenbroek    }
274*83ee113eSDavid van Moolenbroek  elsif ($curentry{'type'} eq 'class')
275*83ee113eSDavid van Moolenbroek    {
276*83ee113eSDavid van Moolenbroek      print "dn: $current_dn\n";
277*83ee113eSDavid van Moolenbroek      print "cn: " . $curentry{'class'} . "\n";
278*83ee113eSDavid van Moolenbroek      print "objectClass: top\n";
279*83ee113eSDavid van Moolenbroek      print "objectClass: dhcpClass\n";
280*83ee113eSDavid van Moolenbroek      if (defined ($curentry{'options'}))
281*83ee113eSDavid van Moolenbroek        {
282*83ee113eSDavid van Moolenbroek          print "objectClass: dhcpOptions\n";
283*83ee113eSDavid van Moolenbroek        }
284*83ee113eSDavid van Moolenbroek    }
285*83ee113eSDavid van Moolenbroek  elsif ($curentry{'type'} eq 'subclass')
286*83ee113eSDavid van Moolenbroek    {
287*83ee113eSDavid van Moolenbroek      print "dn: $current_dn\n";
288*83ee113eSDavid van Moolenbroek      print "cn: " . $curentry{'subclass'} . "\n";
289*83ee113eSDavid van Moolenbroek      print "objectClass: top\n";
290*83ee113eSDavid van Moolenbroek      print "objectClass: dhcpSubClass\n";
291*83ee113eSDavid van Moolenbroek      if (defined ($curentry{'options'}))
292*83ee113eSDavid van Moolenbroek        {
293*83ee113eSDavid van Moolenbroek          print "objectClass: dhcpOptions\n";
294*83ee113eSDavid van Moolenbroek        }
295*83ee113eSDavid van Moolenbroek      print "dhcpClassData: " . $curentry{'class'} . "\n";
296*83ee113eSDavid van Moolenbroek    }
297*83ee113eSDavid van Moolenbroek
298*83ee113eSDavid van Moolenbroek  if (defined ($curentry{'statements'}))
299*83ee113eSDavid van Moolenbroek    {
300*83ee113eSDavid van Moolenbroek      foreach $statement (@{$curentry{'statements'}})
301*83ee113eSDavid van Moolenbroek        {
302*83ee113eSDavid van Moolenbroek          print "dhcpStatements: $statement\n";
303*83ee113eSDavid van Moolenbroek        }
304*83ee113eSDavid van Moolenbroek    }
305*83ee113eSDavid van Moolenbroek
306*83ee113eSDavid van Moolenbroek  if (defined ($curentry{'options'}))
307*83ee113eSDavid van Moolenbroek    {
308*83ee113eSDavid van Moolenbroek      foreach $statement (@{$curentry{'options'}})
309*83ee113eSDavid van Moolenbroek        {
310*83ee113eSDavid van Moolenbroek          print "dhcpOption: $statement\n";
311*83ee113eSDavid van Moolenbroek        }
312*83ee113eSDavid van Moolenbroek    }
313*83ee113eSDavid van Moolenbroek
314*83ee113eSDavid van Moolenbroek  print "\n";
315*83ee113eSDavid van Moolenbroek  undef (%curentry);
316*83ee113eSDavid van Moolenbroek}
317*83ee113eSDavid van Moolenbroek
318*83ee113eSDavid van Moolenbroek
319*83ee113eSDavid van Moolenbroeksub parse_netmask
320*83ee113eSDavid van Moolenbroek{
321*83ee113eSDavid van Moolenbroek  local ($netmask) = @_;
322*83ee113eSDavid van Moolenbroek  local ($i);
323*83ee113eSDavid van Moolenbroek
324*83ee113eSDavid van Moolenbroek  if ((($a, $b, $c, $d) = $netmask =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) != 4)
325*83ee113eSDavid van Moolenbroek    {
326*83ee113eSDavid van Moolenbroek      parse_error ();
327*83ee113eSDavid van Moolenbroek    }
328*83ee113eSDavid van Moolenbroek
329*83ee113eSDavid van Moolenbroek  $num = (($a & 0xff) << 24) |
330*83ee113eSDavid van Moolenbroek         (($b & 0xff) << 16) |
331*83ee113eSDavid van Moolenbroek         (($c & 0xff) << 8) |
332*83ee113eSDavid van Moolenbroek          ($d & 0xff);
333*83ee113eSDavid van Moolenbroek
334*83ee113eSDavid van Moolenbroek  for ($i=1; $i<=32 && $num & (1 << (32 - $i)); $i++)
335*83ee113eSDavid van Moolenbroek    {
336*83ee113eSDavid van Moolenbroek    }
337*83ee113eSDavid van Moolenbroek  $i--;
338*83ee113eSDavid van Moolenbroek
339*83ee113eSDavid van Moolenbroek  return ($i);
340*83ee113eSDavid van Moolenbroek}
341*83ee113eSDavid van Moolenbroek
342*83ee113eSDavid van Moolenbroek
343*83ee113eSDavid van Moolenbroeksub parse_subnet
344*83ee113eSDavid van Moolenbroek{
345*83ee113eSDavid van Moolenbroek  local ($ip, $tmp, $netmask);
346*83ee113eSDavid van Moolenbroek
347*83ee113eSDavid van Moolenbroek  print_entry () if %curentry;
348*83ee113eSDavid van Moolenbroek
349*83ee113eSDavid van Moolenbroek  $ip = next_token (0);
350*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($ip);
351*83ee113eSDavid van Moolenbroek
352*83ee113eSDavid van Moolenbroek  $tmp = next_token (1);
353*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($tmp);
354*83ee113eSDavid van Moolenbroek  parse_error () if !($tmp eq 'netmask');
355*83ee113eSDavid van Moolenbroek
356*83ee113eSDavid van Moolenbroek  $tmp = next_token (0);
357*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($tmp);
358*83ee113eSDavid van Moolenbroek  $netmask = parse_netmask ($tmp);
359*83ee113eSDavid van Moolenbroek
360*83ee113eSDavid van Moolenbroek  $tmp = next_token (0);
361*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($tmp);
362*83ee113eSDavid van Moolenbroek  parse_error () if !($tmp eq '{');
363*83ee113eSDavid van Moolenbroek
364*83ee113eSDavid van Moolenbroek  add_dn_to_stack ("cn=$ip");
365*83ee113eSDavid van Moolenbroek  $curentry{'type'} = 'subnet';
366*83ee113eSDavid van Moolenbroek  $curentry{'ip'} = $ip;
367*83ee113eSDavid van Moolenbroek  $curentry{'netmask'} = $netmask;
368*83ee113eSDavid van Moolenbroek  $cursubnet = $ip;
369*83ee113eSDavid van Moolenbroek  $curcounter{$ip} = { pool  => 0, group => 0 };
370*83ee113eSDavid van Moolenbroek}
371*83ee113eSDavid van Moolenbroek
372*83ee113eSDavid van Moolenbroek
373*83ee113eSDavid van Moolenbroeksub parse_shared_network
374*83ee113eSDavid van Moolenbroek{
375*83ee113eSDavid van Moolenbroek  local ($descr, $tmp);
376*83ee113eSDavid van Moolenbroek
377*83ee113eSDavid van Moolenbroek  print_entry () if %curentry;
378*83ee113eSDavid van Moolenbroek
379*83ee113eSDavid van Moolenbroek  $descr = next_token (0);
380*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($descr);
381*83ee113eSDavid van Moolenbroek
382*83ee113eSDavid van Moolenbroek  $tmp = next_token (0);
383*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($tmp);
384*83ee113eSDavid van Moolenbroek  parse_error () if !($tmp eq '{');
385*83ee113eSDavid van Moolenbroek
386*83ee113eSDavid van Moolenbroek  add_dn_to_stack ("cn=$descr");
387*83ee113eSDavid van Moolenbroek  $curentry{'type'} = 'shared-network';
388*83ee113eSDavid van Moolenbroek  $curentry{'descr'} = $descr;
389*83ee113eSDavid van Moolenbroek}
390*83ee113eSDavid van Moolenbroek
391*83ee113eSDavid van Moolenbroek
392*83ee113eSDavid van Moolenbroeksub parse_host
393*83ee113eSDavid van Moolenbroek{
394*83ee113eSDavid van Moolenbroek  local ($descr, $tmp);
395*83ee113eSDavid van Moolenbroek
396*83ee113eSDavid van Moolenbroek  print_entry () if %curentry;
397*83ee113eSDavid van Moolenbroek
398*83ee113eSDavid van Moolenbroek  $host = next_token (0);
399*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($host);
400*83ee113eSDavid van Moolenbroek
401*83ee113eSDavid van Moolenbroek  $tmp = next_token (0);
402*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($tmp);
403*83ee113eSDavid van Moolenbroek  parse_error () if !($tmp eq '{');
404*83ee113eSDavid van Moolenbroek
405*83ee113eSDavid van Moolenbroek  add_dn_to_stack ("cn=$host");
406*83ee113eSDavid van Moolenbroek  $curentry{'type'} = 'host';
407*83ee113eSDavid van Moolenbroek  $curentry{'host'} = $host;
408*83ee113eSDavid van Moolenbroek}
409*83ee113eSDavid van Moolenbroek
410*83ee113eSDavid van Moolenbroek
411*83ee113eSDavid van Moolenbroeksub parse_group
412*83ee113eSDavid van Moolenbroek{
413*83ee113eSDavid van Moolenbroek  local ($descr, $tmp);
414*83ee113eSDavid van Moolenbroek
415*83ee113eSDavid van Moolenbroek  print_entry () if %curentry;
416*83ee113eSDavid van Moolenbroek
417*83ee113eSDavid van Moolenbroek  $tmp = next_token (0);
418*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($tmp);
419*83ee113eSDavid van Moolenbroek  parse_error () if !($tmp eq '{');
420*83ee113eSDavid van Moolenbroek
421*83ee113eSDavid van Moolenbroek  my $idx;
422*83ee113eSDavid van Moolenbroek  if(exists($curcounter{$cursubnet})) {
423*83ee113eSDavid van Moolenbroek    $idx = ++$curcounter{$cursubnet}->{'group'};
424*83ee113eSDavid van Moolenbroek  } else {
425*83ee113eSDavid van Moolenbroek    $idx = ++$curcounter{''}->{'group'};
426*83ee113eSDavid van Moolenbroek  }
427*83ee113eSDavid van Moolenbroek
428*83ee113eSDavid van Moolenbroek  add_dn_to_stack ("cn=group".$idx);
429*83ee113eSDavid van Moolenbroek  $curentry{'type'} = 'group';
430*83ee113eSDavid van Moolenbroek  $curentry{'idx'} = $idx;
431*83ee113eSDavid van Moolenbroek}
432*83ee113eSDavid van Moolenbroek
433*83ee113eSDavid van Moolenbroek
434*83ee113eSDavid van Moolenbroeksub parse_pool
435*83ee113eSDavid van Moolenbroek{
436*83ee113eSDavid van Moolenbroek  local ($descr, $tmp);
437*83ee113eSDavid van Moolenbroek
438*83ee113eSDavid van Moolenbroek  print_entry () if %curentry;
439*83ee113eSDavid van Moolenbroek
440*83ee113eSDavid van Moolenbroek  $tmp = next_token (0);
441*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($tmp);
442*83ee113eSDavid van Moolenbroek  parse_error () if !($tmp eq '{');
443*83ee113eSDavid van Moolenbroek
444*83ee113eSDavid van Moolenbroek  my $idx;
445*83ee113eSDavid van Moolenbroek  if(exists($curcounter{$cursubnet})) {
446*83ee113eSDavid van Moolenbroek    $idx = ++$curcounter{$cursubnet}->{'pool'};
447*83ee113eSDavid van Moolenbroek  } else {
448*83ee113eSDavid van Moolenbroek    $idx = ++$curcounter{''}->{'pool'};
449*83ee113eSDavid van Moolenbroek  }
450*83ee113eSDavid van Moolenbroek
451*83ee113eSDavid van Moolenbroek  add_dn_to_stack ("cn=pool".$idx);
452*83ee113eSDavid van Moolenbroek  $curentry{'type'} = 'pool';
453*83ee113eSDavid van Moolenbroek  $curentry{'idx'} = $idx;
454*83ee113eSDavid van Moolenbroek}
455*83ee113eSDavid van Moolenbroek
456*83ee113eSDavid van Moolenbroek
457*83ee113eSDavid van Moolenbroeksub parse_class
458*83ee113eSDavid van Moolenbroek{
459*83ee113eSDavid van Moolenbroek  local ($descr, $tmp);
460*83ee113eSDavid van Moolenbroek
461*83ee113eSDavid van Moolenbroek  print_entry () if %curentry;
462*83ee113eSDavid van Moolenbroek
463*83ee113eSDavid van Moolenbroek  $class = next_token (0);
464*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($class);
465*83ee113eSDavid van Moolenbroek
466*83ee113eSDavid van Moolenbroek  $tmp = next_token (0);
467*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($tmp);
468*83ee113eSDavid van Moolenbroek  parse_error () if !($tmp eq '{');
469*83ee113eSDavid van Moolenbroek
470*83ee113eSDavid van Moolenbroek  $class =~ s/\"//g;
471*83ee113eSDavid van Moolenbroek  add_dn_to_stack ("cn=$class");
472*83ee113eSDavid van Moolenbroek  $curentry{'type'} = 'class';
473*83ee113eSDavid van Moolenbroek  $curentry{'class'} = $class;
474*83ee113eSDavid van Moolenbroek}
475*83ee113eSDavid van Moolenbroek
476*83ee113eSDavid van Moolenbroek
477*83ee113eSDavid van Moolenbroeksub parse_subclass
478*83ee113eSDavid van Moolenbroek{
479*83ee113eSDavid van Moolenbroek  local ($descr, $tmp);
480*83ee113eSDavid van Moolenbroek
481*83ee113eSDavid van Moolenbroek  print_entry () if %curentry;
482*83ee113eSDavid van Moolenbroek
483*83ee113eSDavid van Moolenbroek  $class = next_token (0);
484*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($class);
485*83ee113eSDavid van Moolenbroek
486*83ee113eSDavid van Moolenbroek  $subclass = next_token (0);
487*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($subclass);
488*83ee113eSDavid van Moolenbroek
489*83ee113eSDavid van Moolenbroek  $tmp = next_token (0);
490*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($tmp);
491*83ee113eSDavid van Moolenbroek  parse_error () if !($tmp eq '{');
492*83ee113eSDavid van Moolenbroek
493*83ee113eSDavid van Moolenbroek  add_dn_to_stack ("cn=$subclass");
494*83ee113eSDavid van Moolenbroek  $curentry{'type'} = 'subclass';
495*83ee113eSDavid van Moolenbroek  $curentry{'class'} = $class;
496*83ee113eSDavid van Moolenbroek  $curentry{'subclass'} = $subclass;
497*83ee113eSDavid van Moolenbroek}
498*83ee113eSDavid van Moolenbroek
499*83ee113eSDavid van Moolenbroek
500*83ee113eSDavid van Moolenbroeksub parse_hwaddress
501*83ee113eSDavid van Moolenbroek{
502*83ee113eSDavid van Moolenbroek  local ($type, $hw, $tmp);
503*83ee113eSDavid van Moolenbroek
504*83ee113eSDavid van Moolenbroek  $type = next_token (1);
505*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($type);
506*83ee113eSDavid van Moolenbroek
507*83ee113eSDavid van Moolenbroek  $hw = next_token (1);
508*83ee113eSDavid van Moolenbroek  parse_error () if !defined ($hw);
509*83ee113eSDavid van Moolenbroek  $hw =~ s/;$//;
510*83ee113eSDavid van Moolenbroek
511*83ee113eSDavid van Moolenbroek  $curentry{'hwaddress'} = "$type $hw";
512*83ee113eSDavid van Moolenbroek}
513*83ee113eSDavid van Moolenbroek
514*83ee113eSDavid van Moolenbroek
515*83ee113eSDavid van Moolenbroeksub parse_range
516*83ee113eSDavid van Moolenbroek{
517*83ee113eSDavid van Moolenbroek  local ($tmp, $str);
518*83ee113eSDavid van Moolenbroek
519*83ee113eSDavid van Moolenbroek  $str = remaining_line ();
520*83ee113eSDavid van Moolenbroek
521*83ee113eSDavid van Moolenbroek  if (!($str eq ''))
522*83ee113eSDavid van Moolenbroek    {
523*83ee113eSDavid van Moolenbroek      $str =~ s/;$//;
524*83ee113eSDavid van Moolenbroek      push (@{$curentry{'ranges'}}, $str);
525*83ee113eSDavid van Moolenbroek    }
526*83ee113eSDavid van Moolenbroek}
527*83ee113eSDavid van Moolenbroek
528*83ee113eSDavid van Moolenbroek
529*83ee113eSDavid van Moolenbroeksub parse_statement
530*83ee113eSDavid van Moolenbroek{
531*83ee113eSDavid van Moolenbroek  local ($token) = shift;
532*83ee113eSDavid van Moolenbroek  local ($str);
533*83ee113eSDavid van Moolenbroek
534*83ee113eSDavid van Moolenbroek  if ($token eq 'option')
535*83ee113eSDavid van Moolenbroek    {
536*83ee113eSDavid van Moolenbroek      $str = remaining_line ();
537*83ee113eSDavid van Moolenbroek      push (@{$curentry{'options'}}, $str);
538*83ee113eSDavid van Moolenbroek    }
539*83ee113eSDavid van Moolenbroek  elsif($token eq 'failover')
540*83ee113eSDavid van Moolenbroek    {
541*83ee113eSDavid van Moolenbroek      $str = remaining_line (1); # take care on block
542*83ee113eSDavid van Moolenbroek      if($str =~ /[{]/)
543*83ee113eSDavid van Moolenbroek        {
544*83ee113eSDavid van Moolenbroek          my ($peername, @statements);
545*83ee113eSDavid van Moolenbroek
546*83ee113eSDavid van Moolenbroek          parse_error() if($str !~ /^\s*peer\s+(.+?)\s+[{]\s*$/);
547*83ee113eSDavid van Moolenbroek          parse_error() if(($peername = $1) !~ /^\"?[^\"]+\"?$/);
548*83ee113eSDavid van Moolenbroek
549*83ee113eSDavid van Moolenbroek          #
550*83ee113eSDavid van Moolenbroek          # failover config block found:
551*83ee113eSDavid van Moolenbroek          # e.g. 'failover peer "some-name" {'
552*83ee113eSDavid van Moolenbroek          #
553*83ee113eSDavid van Moolenbroek          if(not grep(/FaIlOvEr/i, @use))
554*83ee113eSDavid van Moolenbroek            {
555*83ee113eSDavid van Moolenbroek              print STDERR "Warning: Failover config 'peer $peername' found!\n";
556*83ee113eSDavid van Moolenbroek              print STDERR "         Skipping it, since failover disabled!\n";
557*83ee113eSDavid van Moolenbroek              print STDERR "         You may try out --use=failover option.\n";
558*83ee113eSDavid van Moolenbroek            }
559*83ee113eSDavid van Moolenbroek
560*83ee113eSDavid van Moolenbroek          until($str =~ /[}]/ or $str eq "")
561*83ee113eSDavid van Moolenbroek            {
562*83ee113eSDavid van Moolenbroek                $str = remaining_line (1);
563*83ee113eSDavid van Moolenbroek                # collect all statements, except ending '}'
564*83ee113eSDavid van Moolenbroek                push(@statements, $str) if($str !~ /[}]/);
565*83ee113eSDavid van Moolenbroek            }
566*83ee113eSDavid van Moolenbroek          $failover{$peername} = [@statements];
567*83ee113eSDavid van Moolenbroek        }
568*83ee113eSDavid van Moolenbroek      else
569*83ee113eSDavid van Moolenbroek        {
570*83ee113eSDavid van Moolenbroek          #
571*83ee113eSDavid van Moolenbroek          # pool reference to failover config is fine
572*83ee113eSDavid van Moolenbroek          # e.g. 'failover peer "some-name";'
573*83ee113eSDavid van Moolenbroek          #
574*83ee113eSDavid van Moolenbroek          if(not grep(/FaIlOvEr/i, @use))
575*83ee113eSDavid van Moolenbroek            {
576*83ee113eSDavid van Moolenbroek              print STDERR "Warning: Failover reference '$str' found!\n";
577*83ee113eSDavid van Moolenbroek              print STDERR "         Skipping it, since failover disabled!\n";
578*83ee113eSDavid van Moolenbroek              print STDERR "         You may try out --use=failover option.\n";
579*83ee113eSDavid van Moolenbroek            }
580*83ee113eSDavid van Moolenbroek          else
581*83ee113eSDavid van Moolenbroek            {
582*83ee113eSDavid van Moolenbroek              push (@{$curentry{'statements'}}, $token. " " . $str);
583*83ee113eSDavid van Moolenbroek            }
584*83ee113eSDavid van Moolenbroek        }
585*83ee113eSDavid van Moolenbroek    }
586*83ee113eSDavid van Moolenbroek  elsif($token eq 'zone')
587*83ee113eSDavid van Moolenbroek    {
588*83ee113eSDavid van Moolenbroek      $str = $token;
589*83ee113eSDavid van Moolenbroek      while($str !~ /}$/) {
590*83ee113eSDavid van Moolenbroek        $str .= ' ' . next_token (0);
591*83ee113eSDavid van Moolenbroek      }
592*83ee113eSDavid van Moolenbroek      push (@{$curentry{'statements'}}, $str);
593*83ee113eSDavid van Moolenbroek    }
594*83ee113eSDavid van Moolenbroek  elsif($token =~ /^(authoritative)[;]*$/)
595*83ee113eSDavid van Moolenbroek    {
596*83ee113eSDavid van Moolenbroek      push (@{$curentry{'statements'}}, $1);
597*83ee113eSDavid van Moolenbroek    }
598*83ee113eSDavid van Moolenbroek  else
599*83ee113eSDavid van Moolenbroek    {
600*83ee113eSDavid van Moolenbroek      $str = $token . " " . remaining_line ();
601*83ee113eSDavid van Moolenbroek      push (@{$curentry{'statements'}}, $str);
602*83ee113eSDavid van Moolenbroek    }
603*83ee113eSDavid van Moolenbroek}
604*83ee113eSDavid van Moolenbroek
605*83ee113eSDavid van Moolenbroek
606*83ee113eSDavid van Moolenbroekmy $ok = GetOptions(
607*83ee113eSDavid van Moolenbroek    'basedn=s'      => \$basedn,
608*83ee113eSDavid van Moolenbroek    'dhcpdn=s'      => \$dhcpdn,
609*83ee113eSDavid van Moolenbroek    'server=s'      => \$server,
610*83ee113eSDavid van Moolenbroek    'second=s'      => \$second,
611*83ee113eSDavid van Moolenbroek    'conf=s'        => \$i_conf,
612*83ee113eSDavid van Moolenbroek    'ldif=s'        => \$o_ldif,
613*83ee113eSDavid van Moolenbroek    'use=s'         => \@use,
614*83ee113eSDavid van Moolenbroek    'h|help|usage'  => sub { usage(0); },
615*83ee113eSDavid van Moolenbroek);
616*83ee113eSDavid van Moolenbroek
617*83ee113eSDavid van Moolenbroekunless($server =~ /^\w+/)
618*83ee113eSDavid van Moolenbroek  {
619*83ee113eSDavid van Moolenbroek    usage(1, "invalid server name '$server'");
620*83ee113eSDavid van Moolenbroek  }
621*83ee113eSDavid van Moolenbroekunless($basedn =~ /^\w+=[^,]+/)
622*83ee113eSDavid van Moolenbroek  {
623*83ee113eSDavid van Moolenbroek    usage(1, "invalid base dn '$basedn'");
624*83ee113eSDavid van Moolenbroek  }
625*83ee113eSDavid van Moolenbroek
626*83ee113eSDavid van Moolenbroekif($dhcpdn =~ /^cn=([^,]+)/i)
627*83ee113eSDavid van Moolenbroek  {
628*83ee113eSDavid van Moolenbroek    $dhcpcn = "$1";
629*83ee113eSDavid van Moolenbroek  }
630*83ee113eSDavid van Moolenbroek$second = '' if not defined $second;
631*83ee113eSDavid van Moolenbroekunless($second eq '' or $second =~ /^cn=[^,]+\s*,\s*\w+=[^,]+/i)
632*83ee113eSDavid van Moolenbroek  {
633*83ee113eSDavid van Moolenbroek    if($second =~ /^cn=[^,]+$/i)
634*83ee113eSDavid van Moolenbroek      {
635*83ee113eSDavid van Moolenbroek        # relative DN 'cn=name'
636*83ee113eSDavid van Moolenbroek        $second = "$second, $basedn";
637*83ee113eSDavid van Moolenbroek      }
638*83ee113eSDavid van Moolenbroek    elsif($second =~ /^\w+/)
639*83ee113eSDavid van Moolenbroek      {
640*83ee113eSDavid van Moolenbroek        # assume hostname only
641*83ee113eSDavid van Moolenbroek        $second = "cn=$second, $basedn";
642*83ee113eSDavid van Moolenbroek      }
643*83ee113eSDavid van Moolenbroek    else
644*83ee113eSDavid van Moolenbroek      {
645*83ee113eSDavid van Moolenbroek        usage(1, "invalid secondary '$second'")
646*83ee113eSDavid van Moolenbroek      }
647*83ee113eSDavid van Moolenbroek  }
648*83ee113eSDavid van Moolenbroek
649*83ee113eSDavid van Moolenbroekusage(1) unless($ok);
650*83ee113eSDavid van Moolenbroek
651*83ee113eSDavid van Moolenbroekif($i_conf ne "" and -f $i_conf)
652*83ee113eSDavid van Moolenbroek  {
653*83ee113eSDavid van Moolenbroek    if(not open(STDIN, '<', $i_conf))
654*83ee113eSDavid van Moolenbroek      {
655*83ee113eSDavid van Moolenbroek        print STDERR "Error: can't open conf file '$i_conf': $!\n";
656*83ee113eSDavid van Moolenbroek        exit(1);
657*83ee113eSDavid van Moolenbroek      }
658*83ee113eSDavid van Moolenbroek  }
659*83ee113eSDavid van Moolenbroekif($o_ldif ne "")
660*83ee113eSDavid van Moolenbroek  {
661*83ee113eSDavid van Moolenbroek    if(-e $o_ldif)
662*83ee113eSDavid van Moolenbroek      {
663*83ee113eSDavid van Moolenbroek        print STDERR "Error: output ldif name '$o_ldif' already exists!\n";
664*83ee113eSDavid van Moolenbroek        exit(1);
665*83ee113eSDavid van Moolenbroek      }
666*83ee113eSDavid van Moolenbroek    if(not open(STDOUT, '>', $o_ldif))
667*83ee113eSDavid van Moolenbroek      {
668*83ee113eSDavid van Moolenbroek        print STDERR "Error: can't open ldif file '$o_ldif': $!\n";
669*83ee113eSDavid van Moolenbroek        exit(1);
670*83ee113eSDavid van Moolenbroek      }
671*83ee113eSDavid van Moolenbroek  }
672*83ee113eSDavid van Moolenbroek
673*83ee113eSDavid van Moolenbroek
674*83ee113eSDavid van Moolenbroekprint STDERR "Creating LDAP Configuration with the following options:\n";
675*83ee113eSDavid van Moolenbroekprint STDERR "\tBase DN: $basedn\n";
676*83ee113eSDavid van Moolenbroekprint STDERR "\tDHCP DN: $dhcpdn\n";
677*83ee113eSDavid van Moolenbroekprint STDERR "\tServer DN: cn=$server, $basedn\n";
678*83ee113eSDavid van Moolenbroekprint STDERR "\tSecondary DN: $second\n"
679*83ee113eSDavid van Moolenbroek             if(grep(/FaIlOvEr/i, @use) and $second ne '');
680*83ee113eSDavid van Moolenbroekprint STDERR "\n";
681*83ee113eSDavid van Moolenbroek
682*83ee113eSDavid van Moolenbroekmy $token;
683*83ee113eSDavid van Moolenbroekmy $token_number = 0;
684*83ee113eSDavid van Moolenbroekmy $line_number = 0;
685*83ee113eSDavid van Moolenbroekmy %curentry;
686*83ee113eSDavid van Moolenbroekmy $cursubnet = '';
687*83ee113eSDavid van Moolenbroekmy %curcounter = ( '' => { pool => 0, group => 0 } );
688*83ee113eSDavid van Moolenbroek
689*83ee113eSDavid van Moolenbroek$current_dn = "$dhcpdn";
690*83ee113eSDavid van Moolenbroek$curentry{'descr'} = $dhcpcn;
691*83ee113eSDavid van Moolenbroek$line = '';
692*83ee113eSDavid van Moolenbroek%failover = ();
693*83ee113eSDavid van Moolenbroek
694*83ee113eSDavid van Moolenbroekwhile (($token = next_token (1)))
695*83ee113eSDavid van Moolenbroek  {
696*83ee113eSDavid van Moolenbroek    if ($token eq '}')
697*83ee113eSDavid van Moolenbroek      {
698*83ee113eSDavid van Moolenbroek        print_entry () if %curentry;
699*83ee113eSDavid van Moolenbroek        if($current_dn =~ /.+?,\s*${dhcpdn}$/) {
700*83ee113eSDavid van Moolenbroek          # don't go below dhcpdn ...
701*83ee113eSDavid van Moolenbroek          remove_dn_from_stack ();
702*83ee113eSDavid van Moolenbroek        }
703*83ee113eSDavid van Moolenbroek      }
704*83ee113eSDavid van Moolenbroek    elsif ($token eq 'subnet')
705*83ee113eSDavid van Moolenbroek      {
706*83ee113eSDavid van Moolenbroek        parse_subnet ();
707*83ee113eSDavid van Moolenbroek        next;
708*83ee113eSDavid van Moolenbroek      }
709*83ee113eSDavid van Moolenbroek    elsif ($token eq 'shared-network')
710*83ee113eSDavid van Moolenbroek      {
711*83ee113eSDavid van Moolenbroek        parse_shared_network ();
712*83ee113eSDavid van Moolenbroek        next;
713*83ee113eSDavid van Moolenbroek      }
714*83ee113eSDavid van Moolenbroek    elsif ($token eq 'class')
715*83ee113eSDavid van Moolenbroek      {
716*83ee113eSDavid van Moolenbroek        parse_class ();
717*83ee113eSDavid van Moolenbroek        next;
718*83ee113eSDavid van Moolenbroek      }
719*83ee113eSDavid van Moolenbroek    elsif ($token eq 'subclass')
720*83ee113eSDavid van Moolenbroek      {
721*83ee113eSDavid van Moolenbroek        parse_subclass ();
722*83ee113eSDavid van Moolenbroek        next;
723*83ee113eSDavid van Moolenbroek      }
724*83ee113eSDavid van Moolenbroek    elsif ($token eq 'pool')
725*83ee113eSDavid van Moolenbroek      {
726*83ee113eSDavid van Moolenbroek        parse_pool ();
727*83ee113eSDavid van Moolenbroek        next;
728*83ee113eSDavid van Moolenbroek      }
729*83ee113eSDavid van Moolenbroek    elsif ($token eq 'group')
730*83ee113eSDavid van Moolenbroek      {
731*83ee113eSDavid van Moolenbroek        parse_group ();
732*83ee113eSDavid van Moolenbroek        next;
733*83ee113eSDavid van Moolenbroek      }
734*83ee113eSDavid van Moolenbroek    elsif ($token eq 'host')
735*83ee113eSDavid van Moolenbroek      {
736*83ee113eSDavid van Moolenbroek        parse_host ();
737*83ee113eSDavid van Moolenbroek        next;
738*83ee113eSDavid van Moolenbroek      }
739*83ee113eSDavid van Moolenbroek    elsif ($token eq 'hardware')
740*83ee113eSDavid van Moolenbroek      {
741*83ee113eSDavid van Moolenbroek        parse_hwaddress ();
742*83ee113eSDavid van Moolenbroek        next;
743*83ee113eSDavid van Moolenbroek      }
744*83ee113eSDavid van Moolenbroek    elsif ($token eq 'range')
745*83ee113eSDavid van Moolenbroek      {
746*83ee113eSDavid van Moolenbroek        parse_range ();
747*83ee113eSDavid van Moolenbroek        next;
748*83ee113eSDavid van Moolenbroek      }
749*83ee113eSDavid van Moolenbroek    else
750*83ee113eSDavid van Moolenbroek      {
751*83ee113eSDavid van Moolenbroek        parse_statement ($token);
752*83ee113eSDavid van Moolenbroek        next;
753*83ee113eSDavid van Moolenbroek      }
754*83ee113eSDavid van Moolenbroek  }
755*83ee113eSDavid van Moolenbroek
756*83ee113eSDavid van Moolenbroekclose(STDIN)  if($i_conf);
757*83ee113eSDavid van Moolenbroekclose(STDOUT) if($o_ldif);
758*83ee113eSDavid van Moolenbroek
759*83ee113eSDavid van Moolenbroekprint STDERR "Done.\n";
760*83ee113eSDavid van Moolenbroek
761