pjmakey2

ldap_dictionary

Sep 3rd, 2012
494
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 17.02 KB | None | 0 0
  1. # Pasar los esquemas ldap a una tabla relacion mysql, con la posibilidad de guardar los tipos de inputs
  2. # html y el javascript a usar para que el usuario cargue los datos, de paso hice un diccionario de acuerto
  3. # al rfc 1778, que contiene la descripcion del tipo de sintaxis de los atributos ldap
  4. # Luego guarde la misma informacion en una base de datos mongo, y en verdad paso lo que dice la documentacion de mongo,
  5. # la estructura de datos era igual a la que tenia en mi cabeza :p
  6.  
  7.  
  8. #PRIMERO VEREMOS EL TRABAJO CON MYSQL
  9. from  ldapenviroment import schemas
  10. import ldap
  11. import ldap.schema
  12. import MySQLdb
  13. import sys
  14.  
  15. SYNTAXMAP = {
  16.     '1.3.6.1.4.1.1466.115.121.1.1':['ACI Item', '<input type="text" id="aciitem" class="text-input" />'],
  17.     '1.3.6.1.4.1.1466.115.121.1.2':['Access Point','<input type="text" id="accesspoint" class="text-input" />'],
  18.     '1.3.6.1.4.1.1466.115.121.1.3':['Attribute Type Description','<input type="text" id="attributetypedescription" class="text-input" />'],
  19.     '1.3.6.1.4.1.1466.115.121.1.4':['Audio','<input type="text" id="audio" class="text-input" />'],
  20.     '1.3.6.1.4.1.1466.115.121.1.5':['Binary','<input type="text" id="binary" class="text-input" />'],
  21.     '1.3.6.1.4.1.1466.115.121.1.6':['Bit String','<input type="text" id="bitstring" class="text-input" />'],
  22.     '1.3.6.1.4.1.1466.115.121.1.7':['Boolean','<input type="text" id="boolean" class="text-input" />'],
  23.     '1.3.6.1.4.1.1466.115.121.1.8':['Certificate','<input type="text" id="certificate" class="text-input" />'],
  24.     '1.3.6.1.4.1.1466.115.121.1.9':['Certificate List', '<input type="text" id="certificatelist" class="text-input" />'],
  25.     '1.3.6.1.4.1.1466.115.121.1.10':['Certificate Pair','<input type="text" id="certificatepair" class="text-input" />'],
  26.     '1.3.6.1.4.1.1466.115.121.1.11':['Country String', '<input type="text" id="countrystring" class="text-input" />'],
  27.     '1.3.6.1.4.1.1466.115.121.1.12':['DN','<input type="text" id="dn" class="text-input" />'],
  28.     '1.3.6.1.4.1.1466.115.121.1.13':['Data Quality Syntax','<input type="text" id="dataqualitysyntax" class="text-input" />'],
  29.     '1.3.6.1.4.1.1466.115.121.1.14':['Delivery Method','<input type="text" id="deliverymethod" class="text-input" />'],
  30.     '1.3.6.1.4.1.1466.115.121.1.15':['Directory String','<input type="text" id="directorystring" class="text-input" />'],
  31.     '1.3.6.1.4.1.1466.115.121.1.48':['Supplier And Consumer','<input type="text" id="supplierandconsumer" class="text-input" />'],
  32.     '1.3.6.1.4.1.1466.115.121.1.49':['Supported Algorithm','<input type="text" id="supportedalgorithm" class="text-input" />'],
  33.     '1.3.6.1.4.1.1466.115.121.1.44':['Printable String','<input type="text" id="printablestring" class="text-input" />'],
  34.     '1.3.6.1.4.1.1466.115.121.1.45':['Subtree Specification','<input type="text" id="subtreespecification" class="text-input" />'],
  35.     '1.3.6.1.4.1.1466.115.121.1.46':['Supplier Information','<input type="text" id="supplierinformation" class="text-input" />'],
  36.     '1.3.6.1.4.1.1466.115.121.1.47':['Supplier Or Consumer','<input type="text" id="supplierorconsumer" class="text-input" />'],
  37.     '1.3.6.1.4.1.1466.115.121.1.40':['Octet String','<input type="text" id="octetstring" class="text-input" />'],
  38.     '1.3.6.1.4.1.1466.115.121.1.41':['Postal Address','<input type="text" id="postaladdress" class="text-input" />'],
  39.     '1.3.6.1.4.1.1466.115.121.1.42':['Protocol Information','<input type="text" id="protocolinformation" class="text-input" />'],
  40.     '1.3.6.1.4.1.1466.115.121.1.43':['Presentation Address','<input type="text" id="presentationaddress" class="text-input" />'],
  41.     '1.3.6.1.4.1.1466.115.121.1.39':['Other Mailbox','<input type="text" id="othermailbox" class="text-input" />'],
  42.     '1.3.6.1.4.1.1466.115.121.1.38':['OID','<input type="text" id="oid" class="text-input" />'],
  43.     '1.3.6.1.4.1.1466.115.121.1.31':['Matching Rule Use Description','<input type="text" id="matchingruleusedescription" class="text-input" />'],
  44.     '1.3.6.1.4.1.1466.115.121.1.30':['Matching Rule Description','<input type="text" id="matchingruledescription" class="text-input" />'],
  45.     '1.3.6.1.4.1.1466.115.121.1.33':['MHS OR Address','<input type="text" id="mhsoraddress" class="text-input" />'],
  46.     '1.3.6.1.4.1.1466.115.121.1.32':['Mail Preference','<input type="text" id="mailpreference" class="text-input" />'],
  47.     '1.3.6.1.4.1.1466.115.121.1.35':['Name Form Description','<input type="text" id="nameformdescription" class="text-input" />'],
  48.     '1.3.6.1.4.1.1466.115.121.1.34':['Name And Optional UID','<input type="text" id="nameandoptionaluid" class="text-input" />'],
  49.     '1.3.6.1.4.1.1466.115.121.1.37':['Object Class Description','<input type="text" id="objectclassdescription" class="text-input" />'],
  50.     '1.3.6.1.4.1.1466.115.121.1.36':['Numeric String','<input type="text" id="numericstring" class="text-input" />'],
  51.     '1.3.6.1.4.1.1466.115.121.1.53':['UTC Time','<div id="utctime"></div>'],
  52.     '1.3.6.1.4.1.1466.115.121.1.52':['Telex Number','<input type="text" id="telexnumber" class="text-input" />'],
  53.     '1.3.6.1.4.1.1466.115.121.1.51':['Teletex Terminal Identifier','<input type="text" id="teletexterminalidentifier" class="text-input" />'],
  54.     '1.3.6.1.4.1.1466.115.121.1.50':['Telephone Number','<div id="telephonenumber"></div>'],
  55.     '1.3.6.1.4.1.1466.115.121.1.57':['LDAP Schema Description','<input type="text" id="ldapschemadescription" class="text-input" />'],
  56.     '1.3.6.1.4.1.1466.115.121.1.56':['LDAP Schema Definition','<input type="text" id="ldapschemadefinition" class="text-input" />'],
  57.     '1.3.6.1.4.1.1466.115.121.1.55':['Modify Rights','<input type="text" id="modifyrights" class="text-input" />'],
  58.     '1.3.6.1.4.1.1466.115.121.1.54':['LDAP Syntax Description','<input type="text" id="ldapsyntaxdescription" class="text-input" />'],
  59.     '1.3.6.1.4.1.1466.115.121.1.58':['Substring Assertion','<input type="text" id="substringassertion" class="text-input" />'],
  60.     '1.3.6.1.4.1.1466.115.121.1.28':['JPEG','<div id="jpeg"></div>'],
  61.     '1.3.6.1.4.1.1466.115.121.1.29':['Master And Shadow Access Points','<input type="text" id="masterandshadowaccesspoints" class="text-input" />'],
  62.     '1.3.6.1.4.1.1466.115.121.1.22':['Facsimile Telephone Number','<input type="text" id="facsimiletelephonenumber" class="text-input" />'],
  63.     '1.3.6.1.4.1.1466.115.121.1.23':['Fax','<div id="fax"></div>'],
  64.     '1.3.6.1.4.1.1466.115.121.1.20':['DSE Type','<input type="text" id="dsetype" class="text-input" />'],
  65.     '1.3.6.1.4.1.1466.115.121.1.21':['Enhanced Guide','<input type="text" id="enhancedguide" class="text-input" />'],
  66.     '1.3.6.1.4.1.1466.115.121.1.26':['IA5 String','<input type="text" id="ia5string" class="text-input" />'],
  67.     '1.3.6.1.4.1.1466.115.121.1.27':['INTEGER','<div id="integer"></div>'],
  68.     '1.3.6.1.4.1.1466.115.121.1.24':['Generalized Time','<div id="generalizedtime"></div>'],
  69.     '1.3.6.1.4.1.1466.115.121.1.25':['Guide','<input type="text" id="guide" class="text-input" />'],
  70.     '1.3.6.1.4.1.1466.115.121.1.17':['DIT Structure Rule Description','<input type="text" id="ditstructureruledescription" class="text-input" />'],
  71.     '1.3.6.1.4.1.1466.115.121.1.16':['DIT Content Rule Description','<input type="text" id="ditcontentruledescription" class="text-input" />'],
  72.     '1.3.6.1.4.1.1466.115.121.1.19':['DSA Quality Syntax','<input type="text" id="dsaqualitysyntax" class="text-input" />'],
  73.     '1.3.6.1.4.1.1466.115.121.1.18':['DL Submit Permission','<input type="text" id="dlsubmitpermission" class="text-input" />'],
  74.     }
  75.  
  76.  
  77. def tosql():
  78.     ldap._trace_level = 0
  79.     ldap.set_option(ldap.OPT_DEBUG_LEVEL,0)
  80.     subschemasubentry_dn, schemas = ldap.schema.urlfetch('ldap://localhost',ldap._trace_level)
  81.  
  82.     obj = schemas.tree(ldap.schema.ObjectClass)
  83.     attr = schemas.tree(ldap.schema.AttributeType)
  84.  
  85.     cmysql = MySQLdb.connect(db='XXX', user='XXX', passwd='XXXX', host='localhost')
  86.     cursor = cmysql.cursor()
  87.     allatt= {}
  88.  
  89.     for a in obj.keys():
  90.         objc = schemas.get_obj(ldap.schema.ObjectClass, a)
  91.         if objc != None:
  92.             #insert objectclass in mysql
  93.             sqli = """insert into ldapobj (nombre,oid, jst) values (%s,%s, %s)"""
  94.             data = (objc.names[0],objc.oid,'ldaprender.%s' % objc.names[0].strip().replace('-','').lower() )
  95.             cursor.execute(sqli, data)
  96.             cmysql.commit()
  97.  
  98.             sqli = 'select id from ldapobj where nombre=%s'
  99.             data = (objc.names[0], )
  100.             cursor.execute(sqli, data)
  101.             cmysql.commit()
  102.             ret = cursor.fetchall()
  103.             id_obj = ret[0][0]
  104.  
  105.             sqli = """insert into ldapattr (nombre,oid, tipo, sintaxis, sintaxislen, htmlin, id_obj) values (%s,%s,%s,%s,%s,%s,%s)"""
  106.  
  107.             if objc.must:
  108.                 for item, obli in enumerate(objc.must):
  109.                     att = schemas.get_obj(ldap.schema.AttributeType, obli)
  110.                     if att != None:
  111.                         nsyn = SYNTAXMAP.get(att.syntax)
  112.                         lsyn = att.syntax_len
  113.                         if not nsyn:
  114.                             nsyn = ['No definido', 'No definido']
  115.                         if not lsyn:
  116.                             lsyn = '999'
  117.  
  118.                         data = (att.names[0],att.oid,'obligatorio', nsyn[0], lsyn, nsyn[-1], id_obj)
  119.                         try:
  120.                             cursor.execute(sqli, data)
  121.                             cmysql.commit()
  122.                         except Exception, e:
  123.                             print e
  124.             if objc.may:
  125.                 for item, obli in enumerate(objc.may):
  126.                     att = schemas.get_obj(ldap.schema.AttributeType, obli)
  127.                     if att != None:
  128.                         nsyn = SYNTAXMAP.get(att.syntax)
  129.                         lsyn = att.syntax_len
  130.                         if not nsyn:
  131.                             nsyn = ['No definido', 'No definido']
  132.                         if not lsyn:
  133.                             lsyn = '999'
  134.                         data = (att.names[0],att.oid,'opcional', nsyn[0], lsyn, nsyn[-1], id_obj)
  135.                         try:
  136.                             cursor.execute(sqli, data)
  137.                             cmysql.commit()
  138.                         except Exception, e:
  139.                             print e
  140.  
  141.  
  142. # Una vez hecho eso, podremos retraer informacion de esta forma.
  143.  
  144. # > select ldapattr.nombre, ldapattr.tipo, ldapattr.sintaxis, ldapobj.nombre, ldapobj.jst, ldapattr.htmlin from ldapattr, ldapobj where ldapobj.id = '74' AND ldapattr.id_obj = '74';
  145. # +---------------+-------------+------------------+--------------+-------------------------+---------------------------------------------------------------+
  146. # | nombre        | tipo        | sintaxis         | nombre       | jst                     | htmlin                                                        |
  147. # +---------------+-------------+------------------+--------------+-------------------------+---------------------------------------------------------------+
  148. # | cn            | obligatorio | No definido      | posixAccount | ldaprender.posixaccount | No definido                                                   |
  149. # | uid           | obligatorio | Directory String | posixAccount | ldaprender.posixaccount | <input type="text" id="directorystring" class="text-input" /> |
  150. # | uidNumber     | obligatorio | INTEGER          | posixAccount | ldaprender.posixaccount | <div id="integer"></div>                                      |
  151. # | gidNumber     | obligatorio | INTEGER          | posixAccount | ldaprender.posixaccount | <div id="integer"></div>                                      |
  152. # | homeDirectory | obligatorio | IA5 String       | posixAccount | ldaprender.posixaccount | <input type="text" id="ia5string" class="text-input" />       |
  153. # | userPassword  | opcional    | Octet String     | posixAccount | ldaprender.posixaccount | <input type="text" id="octetstring" class="text-input" />     |
  154. # | loginShell    | opcional    | IA5 String       | posixAccount | ldaprender.posixaccount | <input type="text" id="ia5string" class="text-input" />       |
  155. # | gecos         | opcional    | IA5 String       | posixAccount | ldaprender.posixaccount | <input type="text" id="ia5string" class="text-input" />       |
  156. # | description   | opcional    | Directory String | posixAccount | ldaprender.posixaccount | <input type="text" id="directorystring" class="text-input" /> |
  157. # +---------------+-------------+------------------+--------------+-------------------------+---------------------------------------------------------------+
  158.  
  159. #SEGUNDO LA ESTRUCTURA EN MONGO
  160. #Esto se mejora sustancialmente al usar mongodb
  161.  
  162. from  ldapenviroment import schemas
  163. import ldap
  164. import ldap.schema
  165. import sys
  166. from pymongo import Connection
  167. from pymongo.errors import ConnectionFailure
  168.  
  169. def ldaprender():
  170.     try:
  171.         c = Connection(host='localhost', port=27017)
  172.     except Exception, e:
  173.         print e
  174.         sys.exit(1)
  175.     dbh = c['netipa']
  176.     assert dbh.connection == c
  177.  
  178.     ldap._trace_level = 0
  179.     ldap.set_option(ldap.OPT_DEBUG_LEVEL,0)
  180.     subschemasubentry_dn, schemas = ldap.schema.urlfetch('ldap://localhost',ldap._trace_level)
  181.  
  182.     obj = schemas.tree(ldap.schema.ObjectClass)
  183.     attr = schemas.tree(ldap.schema.AttributeType)
  184.     allatt= {}
  185.  
  186.     for a in obj.keys():
  187.         objc = schemas.get_obj(ldap.schema.ObjectClass, a)
  188.         if objc != None:
  189.             data = (objc.names[0],objc.oid,'ldaprender.%s' % objc.names[0].strip().replace('-','').lower())
  190.             data = {'objectclass': objc.names[0].lower(),
  191.                     'oid': objc.oid,
  192.                     'render': 'ldaprender.%s' % objc.names[0].strip().replace('-','').lower()
  193.                     }
  194.  
  195.             if objc.must:
  196.                 data.update({'obligatorio': []})
  197.                 for item, obli in enumerate(objc.must):
  198.                     att = schemas.get_obj(ldap.schema.AttributeType, obli)
  199.                     if att != None:
  200.                         nsyn = SYNTAXMAP.get(att.syntax)
  201.                         lsyn = att.syntax_len
  202.                         if not nsyn:
  203.                             nsyn = ['No definido', '<input type="text" id="%s" class="text-input" />' % att.names[0].lower()]
  204.                         if not lsyn:
  205.                             lsyn = '999'
  206.                         data['obligatorio'].append({'nombre': att.names[0].lower(),'oid': att.oid,'sintaxis': nsyn[0], 'longitud': lsyn, 'html': nsyn[-1]})
  207.  
  208.             if objc.may:
  209.                 data.update({'opcional': []})
  210.                 for item, obcio in enumerate(objc.may):
  211.                     att = schemas.get_obj(ldap.schema.AttributeType, obcio)
  212.                     if att != None:
  213.                         nsyn = SYNTAXMAP.get(att.syntax)
  214.                         lsyn = att.syntax_len
  215.                         if not nsyn:
  216.                             nsyn = ['No definido', '<input type="text" id="%s" class="text-input" />' % att.names[0].lower()]
  217.                         if not lsyn:
  218.                             lsyn = '999'
  219.                         # data = (att.names[0],att.oid,'opcional', nsyn[0], lsyn, nsyn[-1], id_obj)
  220.                         data['opcional'].append({'nombre': att.names[0].lower(),'oid': att.oid,'sintaxis': nsyn[0], 'longitud': lsyn, 'html': nsyn[-1]})
  221.             try:
  222.                 dbh.ldaprenders.insert(data, safe=True)
  223.                 print 'entro'
  224.             except Exception, e:
  225.                 print e
  226.  
  227. # Luego el acceso a los valores necesitados es mucho mas comodo
  228.  
  229. #  db.ldaprenders.find({'objectclass': 'posixgroup'}).next()
  230. # {
  231. #     "_id" : ObjectId("5042d8ee4b15d50b575f3ffa"),
  232. #     "render" : "ldaprender.posixgroup",
  233. #     "objectclass" : "posixgroup",
  234. #     "oid" : "1.3.6.1.1.1.2.2",
  235. #     "opcional" : [
  236. #         {
  237. #             "nombre" : "userpassword",
  238. #             "oid" : "2.5.4.35",
  239. #             "html" : "<input type=\"text\" id=\"octetstring\" class=\"text-input\" />",
  240. #             "sintaxis" : "Octet String",
  241. #             "longitud" : NumberLong(128)
  242. #         },
  243. #         {
  244. #             "nombre" : "memberuid",
  245. #             "oid" : "1.3.6.1.1.1.1.12",
  246. #             "html" : "<input type=\"text\" id=\"ia5string\" class=\"text-input\" />",
  247. #             "sintaxis" : "IA5 String",
  248. #             "longitud" : "999"
  249. #             },
  250. #         {
  251. #             "nombre" : "description",
  252. #             "oid" : "2.5.4.13",
  253. #             "html" : "<input type=\"text\" id=\"directorystring\" class=\"text-input\" />",
  254. #             "sintaxis" : "Directory String",
  255. #             "longitud" : NumberLong(1024)
  256. #             }
  257. #         ],
  258. #     "obligatorio" : [
  259. #         {
  260. #             "nombre" : "cn",
  261. #             "oid" : "2.5.4.3",
  262. #             "html" : "<input type=\"text\" id=\"cn\" class=\"text-input\" />",
  263. #             "sintaxis" : "No definido",
  264. #             "longitud" : "999"
  265. #             },
  266. #         {
  267. #             "nombre" : "gidnumber",
  268. #             "oid" : "1.3.6.1.1.1.1.1",
  269. #             "html" : "<div id=\"integer\"></div>",
  270. #             "sintaxis" : "INTEGER",
  271. #             "longitud" : "999"
  272. #             }
  273. #         ]
  274. # }
  275. # happy coding
Advertisement
Add Comment
Please, Sign In to add comment