#       Licensed to the Apache Software Foundation (ASF) under one
#       or more contributor license agreements.  See the NOTICE file
#       distributed with this work for additional information
#       regarding copyright ownership.  The ASF licenses this file
#       to you under the Apache License, Version 2.0 (the
#       "License"); you may not use this file except in compliance
#       with the License.  You may obtain a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#       Unless required by applicable law or agreed to in writing,
#       software distributed under the License is distributed on an
#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#       KIND, either express or implied.  See the License for the
#       specific language governing permissions and limitations
#       under the License.

import os
import string
from tempfile import mkstemp
from ConfigParser import ConfigParser, NoOptionError

config = ConfigParser()

def main():
    config.read('.setup-scm-cache')
    if not config.has_section('scm'):
        config.add_section('scm')
    domain = get_value('domain', 'dc=example,dc=com')
    if config.get('start slapd', 'y') == 'y':
        run('service slapd start')
    if config.get('add base ldap schemas', 'y') == 'y':
        run('ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif')
        run('ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif')
        run('ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif')
    secret = config.get('admin password', 'secret')
    if config.get('add backend ldif', 'y') == 'y':
        add_ldif(backend_ldif, domain=domain, secret=secret)
    if config.get('add frontend ldif', 'y') == 'y':
        add_ldif(frontend_ldif, domain=domain, secret=secret)


def get_value(key, default):
    try:
        value = config.get('scm', key)
    except NoOptionError:
        value = raw_input('%s? [%s]' % key, default)
        if not value: value = default
        config.set('scm', key, value)
    return value

def run(command):
    rc = os.system(command)
    assert rc == 0
    return rc

def add_ldif(template, **values):
    fd, name = mkstemp()
    os.write(fd, template.substitute(values))
    os.close(fd)
    run('ldapadd -Y EXTERNAL -H ldapi:/// -f %s' % name)
    os.remove(name)

backend_ldif=string.Template('''
# Load dynamic backend modules
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/lib/ldap
olcModuleload: back_hdb

# Database settings
dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcSuffix: $domain
olcDbDirectory: /var/lib/ldap
olcRootDN: cn=admin,$domain
olcRootPW: $secret
olcDbConfig: set_cachesize 0 2097152 0
olcDbConfig: set_lk_max_objects 1500
olcDbConfig: set_lk_max_locks 1500
olcDbConfig: set_lk_max_lockers 1500
olcDbIndex: objectClass eq
olcLastMod: TRUE
olcDbCheckpoint: 512 30
olcAccess: to attrs=userPassword by dn="cn=admin,$domain" write by anonymous auth by self write by * none
olcAccess: to attrs=shadowLastChange by self write by * read
olcAccess: to dn.base="" by * read
olcAccess: to * by dn="cn=admin,$domain" write by * read

''')

frontend_ldif=string.Template('''
# Create top-level object in domain
dn: $domain
objectClass: top
objectClass: dcObject
objectclass: organization
o: SCM Host Organization
dc: SCM
description: SCM Host Server

# Admin user.
dn: cn=admin,$domain
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword: $secret

dn: ou=people,$domain
objectClass: organizationalUnit
ou: people

dn: ou=groups,$domain
objectClass: organizationalUnit
ou: groups
''')

if __name__ == '__main__':
    main()
