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