#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import grp
from argparse import ArgumentParser
from optparse import OptionParser
#from scribe.ldapconf import GROUP_DN, BRANCHE_GROUP_ETAB, EtabStr
from samba.samdb import SamDB
from samba.auth import system_session
from samba import getopt
import ldb
from configobj import ConfigObj

conffile = "/etc/eole/ldapconf.conf"
dico = ConfigObj(conffile)

class EtabStr(str):
    def __mod__(self, dico):
        dico.setdefault('etab', num_etab)
        if dico['etab'] is None:
            dico['etab'] = num_etab
        return str.__mod__(self, dico)
num_etab = str(dico['numero_etab'])
acad = str(dico['nom_academie'])
SUFFIX = dico.get('suffix', 'o=gouv,c=fr')
RACINE = "ou=%s,ou=education,%s" % (acad, SUFFIX)
BRANCHE_ETAB = "ou=%%(etab)s,%s" % (RACINE)
BRANCHE_GROUP_ETAB = "ou=local,ou=groupes,%s" % BRANCHE_ETAB
GROUP_DN = EtabStr("cn=%%(cn)s,%s" % BRANCHE_GROUP_ETAB)


def new_group(name):
    parse = OptionParser()
    lp = getopt.SambaOptions(parse).get_loadparm()
    creds = getopt.CredentialsOptions(parse).get_credentials(lp)
    samdb = SamDB(session_info=system_session(), credentials=creds, lp=lp)
    group_dn = EtabStr(BRANCHE_GROUP_ETAB) % {}
    samdb.newgroup(groupname=name, groupou=group_dn[:- (len(samdb.domain_dn()) + 1)])
    gid = grp.getgrnam(name).gr_gid
    ldif = """
dn: {group_dn}
changeType: modify
add: objectClass
objectClass: posixGroup
add: gidNumber
gidNumber: {gid}
add: objectClass
objectClass: sambaGroupMapping
""".format(group_dn=GROUP_DN % {'cn': name}, gid=gid)
    samdb.modify_ldif(ldif)


if __name__ == '__main__':
    parser = ArgumentParser()
    parser.add_argument('-a', help='Créer un RID', action='store_true')
    parser.add_argument('name')
    args = parser.parse_args()
    if not args.a:
      raise Exception('-a mandatory')
    new_group(args.name)

