Skip to content

Instantly share code, notes, and snippets.

@ptman
Created June 11, 2013 13:22

Revisions

  1. ptman created this gist Jun 11, 2013.
    124 changes: 124 additions & 0 deletions dhcpd.conf.erb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,124 @@
    # file managed by puppet
    <%# Copyright (c) 2013, ZenRobotics Ltd. All rights reserved. %>
    <%
    require 'ipaddr'
    raise Puppet::Error, 'Could not set up LDAP Connection: Missing ruby/ldap libraries' unless Puppet.features.ldap?

    conn = Puppet::Util::Ldap::Connection.instance
    conn.start
    connection = conn.connection
    base = Puppet.settings[:ldapbase]
    filter = '(&(objectClass=dhcpServer)(cn=%s))' % @dhcp_server_cn
    dn = nil

    connection.search(base, LDAP::LDAP_SCOPE_SUBTREE, filter,
    'dhcpServiceDN') do |server|
    dns = server.vals('dhcpServiceDN')

    if dns.nil? or dns.size != 1
    raise Puppet::Error, 'Could not find dhcpServiceDN for %s' % @dhcp_server_cn
    else
    dn = server.vals('dhcpServiceDN')[0]
    end
    end

    connection.search(dn, LDAP::LDAP_SCOPE_BASE, '(objectClass=dhcpService)',
    ['dhcpStatements', 'dhcpOption']) do |service|
    statements = service.vals('dhcpStatements')
    if !statements.nil?
    statements.each do |statement|
    -%>
    <%= statement %>;
    <%
    end # statements.each
    end # if statements

    options = service.vals('dhcpOption')
    if !options.nil?
    options.each do |option|
    -%>
    option <%= option %>;
    <%
    end # options.each
    end # if options

    connection.search(dn, LDAP::LDAP_SCOPE_SUBTREE, '(objectClass=dhcpSubnet)',
    ['cn', 'dhcpNetMask', 'dhcpStatements',
    'dhcpOption']) do |subnet|
    cn = subnet.vals('cn')[0]
    cidr = subnet.vals('dhcpNetMask')[0]
    ipaddr = IPAddr.new('0.0.0.0/' + cidr).inspect
    netmask = ipaddr[ipaddr.index('/')+1..ipaddr.index('>')-1]

    -%>
    subnet <%= cn %> netmask <%= netmask %> {
    <%
    statements = subnet.vals('dhcpStatements')
    if !statements.nil?
    statements.each do |statement|
    -%>
    <%= statement %>;
    <%
    end # statements.each
    end # if statements

    options = subnet.vals('dhcpOption')
    if !options.nil?
    options.each do |option|
    -%>
    option <%= option %>;
    <%
    end # options.each
    end # if options

    connection.search(subnet.dn, LDAP::LDAP_SCOPE_SUBTREE,
    '(objectClass=dhcpHost)', ['cn', 'dhcpHWAddress',
    'dhcpStatements', 'dhcpOption']) do |host|
    cn = host.vals('cn')[0]
    -%>
    host <%= cn %> {
    <%
    hardware = host.vals('dhcpHWAddress')
    if !hardware.nil?
    -%>
    hardware <%= hardware[0] %>;
    <%
    end # if hardware

    statements = host.vals('dhcpStatements')
    if !statements.nil?
    statements.each do |statement|
    -%>
    <%= statement %>;
    <%
    end # statements.each
    end # if statements

    options = host.vals('dhcpOption')
    if !options.nil?
    options.each do |option|
    -%>
    option <%= option %>;
    <%
    end # options.each
    end # if options
    -%>
    }
    <%
    end # host

    connection.search(subnet.dn, LDAP::LDAP_SCOPE_SUBTREE,
    '(objectClass=dhcpPool)', ['dhcpRange']) do |pool|
    range = pool.vals('dhcpRange')[0]
    -%>
    pool {
    range <%= range %>;
    }
    <%
    end # pool
    -%>
    }
    <%
    end # subnet
    end # service
    -%>