#!/usr/bin/python # # Dinko Korunic 'kreator', 2005. # cmung2aai.py # script for CMUNG to AAI conversion # # Copyright (C) 2005 Dinko Korunic, InfoMAR d.o.o. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2 of the License, or (at your # option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Usage: mind the ugliness, it did its job. Documentation? Use the source, # Luke ;-) import sys, sre, time, base64, binascii localno = 1 privileges = { 'A': 'djelatnik', 'B': 'djelatnik', 'C': 'djelatnik', 'D': 'djelatnik', 'E': 'vanjski suradnik', 'F': 'student', 'G': 'djelatnik', 'H': 'ucenik', 'I': 'korisnik usluge', 'J': 'korisnik usluge' } missing = {} def load_missing(u = None): if u: try: fd = file(u, 'r') except IOError: return dn_re = sre.compile('^dn: (.+)$') global missing for line in fd: result = dn_re.match(line) if result: missing[result.group(1)] = 1 fd.close() def ldif_out(u = {}): if u: global localno global privileges global missing if not missing.has_key(u['dn']): return localno += 1 givenname = None if sre.match('^[a-zA-Z\-_\ ]+$', u['cn']): givenname = ''.join([' ', u['cn'].split()[0]]) else: try: givenname = base64.decodestring(u['cn']).split()[0] if sre.match('^[a-zA-Z\-_]+$', givenname): givenname = ''.join([' ', givenname]) else: givenname = base64.encodestring(givenname)[:-1] givenname = ''.join([': ', givenname]) except binascii.Error: givenname = ''.join([' ', u['cn'].split()[0]]) uniqid = ''.join([u['carnetuniq'].split('.')[0], '@fsb.hr']) cmustatid = privileges[u['cmustatid']] print 'dn: %s' % u['dn'] print 'objectClass: person' print 'objectClass: organizationalPerson' print 'objectClass: inetOrgPerson' print 'objectClass: hrEduPerson' print 'o: Sveuciliste u Zagrebu, Fakultet strojarstva i brodogradnje' print 'hrEduPersonHomeOrg: fsb.hr' print 'postalAddress: Ivana Lucica 5, HR-10002 Zagreb' try: print 'l:%s' % u['l'] except KeyError: print 'l: Zagreb' print 'cn:%s' % u['cn'] print 'givenName:%s' % givenname print 'sn:%s' % u['sn'] print 'ou: (FSB)' try: print 'mail: %s' % u['mail'] except KeyError: print 'mail: %s' % uniqid print 'labeledURI: (http://www.fsb.hr/) Home Page' print 'uid: %s' % u['uid'] print 'hrEduPersonUniqueID: %s' % uniqid print 'hrEduPersonPrimaryAffiliation: %s' % cmustatid print 'hrEduPersonAffiliation: %s' % cmustatid print 'hrEduPersonExpireDate: NONE' print 'userPassword:: %s' % u['userpass'] print 'telephoneNumber: %s' % u['telephonenum'] print 'facsimileTelephoneNumber: %s' % u['facsimiletel'] print 'mobile: %s' % u['mobile'] print 'hrEduPersonUniqueNumber: LOCAL_NO: %04d' % localno print 'roomNumber: %s' % u['roomnumber'] print def main(): ldif_attrs = { 'dn': '^dn: (uid=\w+,dc=\w+,dc=\w+)$', 'mail': '^mail: (.+@.+)$', 'uid': '^uid: (\w+)$', 'cn': '^cn:(:? .+)$', 'sn': '^sn:(:? .+)$', 'l': '^l:(:? .+)$', 'labeleduri': '^labeledURI: (.+)$', 'uid': '^uid: (\w+)$', 'cmustatid': '^CMUstatID: (\w)$', 'userpass': '^userPassword:: (.+)$', 'telephonenum': '^telephoneNumber: (.+)$', 'facsimiletel': '^facsimileTelephoneNumber: (.+)$', 'mobile': '^mobile: (.+)$', 'carnetperson': '^CARNetPersonId: (.+)$', 'roomnumber': '^roomNumber: (.+)$', 'carnetuniq': '^CARNetuniqueName: (.+)$' } for k, v in ldif_attrs.iteritems(): ldif_attrs[k] = sre.compile(v) new_uid = {} for line in sys.stdin: for k, v in ldif_attrs.iteritems(): result = v.match(line) if result: if k == 'dn': ldif_out(new_uid) new_uid = {} new_uid[k] = result.group(1) ldif_out(new_uid) if __name__ == '__main__': load_missing('lista-missing-aai.txt') main()