generate_init_ldif.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. #DATA
  2. main_init = """# init.ldif
  3. ##########
  4. #
  5. # Table of Content
  6. #
  7. ##########
  8. # Корневая запись (базовый DN)
  9. ## ROOT DN
  10. # All ou
  11. ## UID FOR HANDLERS
  12. ## UID FOR OU=USERS
  13. # All cn
  14. ## CN FOR OU=GROUP
  15. # Все пользователи
  16. ##########
  17. #
  18. # ROOT-DB
  19. #
  20. ##########
  21. dn: dc=ldap,dc=sharix,dc=ru
  22. objectClass: dcObject
  23. objectClass: organization
  24. dc: ldap
  25. o: Sharix LDAP Server
  26. """
  27. extra_test_users = """
  28. dn: uid=11111111111,ou=users,dc=ldap,dc=sharix,dc=ru
  29. objectClass: sharixAccount
  30. uid: 11111111111
  31. cn: Django Admin
  32. sn: First
  33. #maybe set the same for all for the beggining? Now for testing - let's make it like Django main admin password
  34. userPassword: {ARGON2}$argon2id$v=19$m=65536,t=3,p=1$85j887FtSxU4NRVTLx2Tiw$AE/HdQ9y446Vl9zdiKMXgDLID3D43pYC+ZleNiy/bMs
  35. givenName: Admin
  36. displayName: Django Admin
  37. mail: test@sharix-app.org
  38. jpegPhoto: 0
  39. telephoneNumber: 11111111111
  40. """
  41. uid_django_user="""
  42. dn: uid=django_tickets,ou=apps,dc=ldap,dc=sharix,dc=ru
  43. objectClass: handlerAccount
  44. uid: django_tickets
  45. cn: django_tickets
  46. displayName: Django Tickets
  47. sn: notificator
  48. #maybe set the same for all for the beggining? Or make it like apikey? Now for testing - let's make it like Django main admin password
  49. userPassword: {ARGON2}$argon2id$v=19$m=65536,t=3,p=1$8kx90bsuQRoLoQ3F4Uh+Pw$PboqW5EPEfzQlFh3uDeWoXP8rXs7v510fwQgtoA2Lew
  50. """
  51. extra_groups = """
  52. dn: cn=django_admin,ou=groups,dc=ldap,dc=sharix,dc=ru
  53. objectClass: groupOfNames
  54. cn: django_admin
  55. description: Group for Django Admins
  56. member: uid=11111111111,ou=users,dc=ldap,dc=sharix,dc=ru
  57. """
  58. extra_apps = """
  59. dn: cn=django,ou=apps,dc=ldap,dc=sharix,dc=ru
  60. objectClass: groupOfNames
  61. cn: django
  62. description: Group for Django users
  63. member: cn=django_tickets,ou=apps,dc=ldap,dc=sharix,dc=ru
  64. dn: cn=ejabberd,ou=apps,dc=ldap,dc=sharix,dc=ru
  65. objectClass: groupOfNames
  66. cn: ejabberd
  67. description: Group for Ejabberd users
  68. member: cn=11111111111,ou=users,dc=ldap,dc=sharix,dc=ru
  69. dn: cn=local,ou=apps,dc=ldap,dc=sharix,dc=ru
  70. objectClass: groupOfNames
  71. cn: local
  72. description: Group for Local users
  73. member: cn=11111111111,ou=users,dc=ldap,dc=sharix,dc=ru
  74. dn: cn=mail,ou=apps,dc=ldap,dc=sharix,dc=ru
  75. objectClass: groupOfNames
  76. cn: mail
  77. description: Group for Mail users
  78. member: cn=11111111111,ou=users,dc=ldap,dc=sharix,dc=ru
  79. """
  80. handlers = [
  81. ("open_access_request_pending", "ACCREQ pending"),
  82. ("open_access_request_accepted", "ACCREQ accepted"),
  83. ("open_access_request_declined", "ACCREQ declined"),
  84. ("open_neg_request_pending", "NEGREQ pending"),
  85. ("open_neg_request_accepted", "NEGERQ accepted"),
  86. ("open_neg_request_declined", "NEGREQ declined"),
  87. ("open_st_request_new", "STREQ new"),
  88. ("open_st_request_reopened", "STREQ reopened"),
  89. ("open_st_request_assigned", "STREQ assigned"),
  90. ("open_st_request_inprocess", "STREQ inprocess"),
  91. ("open_st_request_wontfix", "STREQ wontfix"),
  92. ("open_st_request_done", "STREQ done"),
  93. ]
  94. groups = [
  95. ('METASERVICE-ADMIN' , 21),
  96. ('METASERVICE-SUPERVISOR' , 22),
  97. ('METASERVICE-SUPPORT' , 23),
  98. ('METASERVICE-TECHSUPPORT', 24),
  99. ('PARTNER-ADMIN' , 31),
  100. ('PARTNER-SUPERVISOR' , 32),
  101. ('PARTNER-SUPPORT' , 33),
  102. ('PARTNER-TECHSUPPORT' , 34),
  103. ('METASERVICE-PROVIDER' , 41),
  104. ('METASERVICE-CLIENT' , 51),
  105. ('METASERVICE-GUEST' , 61),
  106. ]
  107. groups_dict = dict(groups)
  108. test_users = [
  109. ('METASERVICE-ADMIN' , 'Metaservice', 'Admin' , 1),
  110. ('METASERVICE-SUPERVISOR' , 'Metaservice', 'Supervisor' , 3),
  111. ('METASERVICE-SUPPORT' , 'Metaservice', 'Support' , 3),
  112. ('METASERVICE-TECHSUPPORT', 'Metaservice', 'TechSupport', 3),
  113. ('PARTNER-ADMIN' , 'Parter' , 'Admin' , 1),
  114. ('PARTNER-SUPERVISOR' , 'Parter' , 'Supervisor' , 3),
  115. ('PARTNER-SUPPORT' , 'Parter' , 'Support' , 3),
  116. ('PARTNER-TECHSUPPORT' , 'Parter' , 'TechSupport', 3),
  117. ('METASERVICE-PROVIDER' , 'Metaservice', 'Provider' , 3),
  118. ('METASERVICE-CLIENT' , 'Metaservice', 'Client' , 3),
  119. ('METASERVICE-GUEST' , 'Metaservice', 'Guest' , 3),
  120. ]
  121. test_users_dict = {user[0]: user[3] for user in test_users}
  122. ous = [
  123. ("users" , "Подразделение для пользователей"),
  124. ("groups" , "Подразделение для групп (опционально)"),
  125. ("apps" , "Подразделение для классификации обработчиков и приложений (опционально)"),
  126. ("appgroups", "Подразделение с аккаунтами приложений с их описанием и может быть apikey"),
  127. ]
  128. # SUPPORT FUNCTIONS
  129. def int_to_roman(num):
  130. val = [
  131. 1000, 900, 500, 400,
  132. 100, 90, 50, 40,
  133. 10, 9, 5, 4,
  134. 1
  135. ]
  136. syms = [
  137. "M", "CM", "D", "CD",
  138. "C", "XC", "L", "XL",
  139. "X", "IX", "V", "IV",
  140. "I"
  141. ]
  142. roman_num = ""
  143. i = 0
  144. while num > 0:
  145. for _ in range(num // val[i]):
  146. roman_num += syms[i]
  147. num -= val[i]
  148. i += 1
  149. return roman_num
  150. def get_handlers_txt():
  151. txt = ""
  152. for name, display_name in handlers:
  153. HANDLERS_PASSWORD = "{ARGON2}$argon2id$v=19$m=65536,t=3,p=1$8kx90bsuQRoLoQ3F4Uh+Pw$PboqW5EPEfzQlFh3uDeWoXP8rXs7v510fwQgtoA2Lew"
  154. txt +=f"""dn: uid={name},ou=apps,dc=ldap,dc=sharix,dc=ru
  155. objectClass: handlerAccount
  156. uid: {name}
  157. cn: {name}
  158. sn: handler
  159. displayName: {display_name}
  160. #maybe set the same for all for the beggining? Or make it like apikey? Now for testing - let's make it like Django main admin password
  161. userPassword: {HANDLERS_PASSWORD}
  162. """
  163. return txt
  164. def get_users_txt():
  165. USERS_PASSWORD = "{ARGON2}$argon2id$v=19$m=65536,t=3,p=1$8kx90bsuQRoLoQ3F4Uh+Pw$PboqW5EPEfzQlFh3uDeWoXP8rXs7v510fwQgtoA2Lew"
  166. txt = ""
  167. for group_name, place, role, count in test_users:
  168. for i in range(1, count + 1):
  169. phone_number=f"{groups_dict[group_name]}0{i}"
  170. uid = phone_number
  171. cn = place
  172. sn = f"{int_to_roman(i)}"
  173. givenName = role
  174. displayName = f"{place} {role} {int_to_roman(i)}"
  175. # TODO: Почта для разных пользователей
  176. # mail = f"test-{group_name.lower()}-{i}@domain.org"
  177. mail = "test@sharix-app.org"
  178. telephoneNumber = phone_number
  179. user_entry = f"""
  180. dn: uid={uid},ou=users,dc=ldap,dc=sharix,dc=ru
  181. objectClass: sharixAccount
  182. uid: {uid}
  183. cn: {cn}
  184. sn: {sn}
  185. userPassword: {USERS_PASSWORD}
  186. givenName: {givenName}
  187. displayName: {displayName}
  188. mail: {mail}
  189. jpegPhoto: 0
  190. telephoneNumber: {telephoneNumber}
  191. """
  192. txt += user_entry
  193. return txt
  194. def get_groups_txt():
  195. txt = ""
  196. for group, uid in groups:
  197. txt += f"""
  198. dn: cn={group},ou=groups,dc=ldap,dc=sharix,dc=ru
  199. objectClass: groupOfNames
  200. cn: {group}
  201. description: Group for {group.replace("-", " ").title()}
  202. """
  203. count = test_users_dict[group]
  204. for i in range(1, count + 1):
  205. user_id=f"{uid}0{i}"
  206. txt += f"member: uid={user_id},ou=users,dc=ldap,dc=sharix,dc=ru\n"
  207. return txt
  208. def get_ou_txt():
  209. return "\n".join(
  210. f"""# {desc}
  211. dn: ou={name},dc=ldap,dc=sharix,dc=ru
  212. objectClass: organizationalUnit
  213. ou: {name}
  214. """ for name, desc in ous
  215. )
  216. def get_group_handlers():
  217. return """
  218. dn: cn=handlers,ou=apps,dc=ldap,dc=sharix,dc=ru
  219. objectClass: groupOfNames
  220. cn: handlers
  221. description: Group for Handlers
  222. """ + "\n".join([
  223. f"member: cn={name},ou=handlers,dc=ldap,dc=sharix,dc=ru"
  224. for name, _ in handlers
  225. ])
  226. # OUTPUT ldiff file
  227. print(main_init)
  228. print("""
  229. ##########
  230. #
  231. # OU
  232. #
  233. ##########
  234. """)
  235. print(get_ou_txt())
  236. print("""
  237. ##########
  238. #
  239. # UID FOR Django tickets module app user
  240. #
  241. ##########
  242. """)
  243. print(uid_django_user)
  244. print("""
  245. ##########
  246. #
  247. # UID FOR HANDLERS
  248. #
  249. ##########
  250. """)
  251. print(get_handlers_txt())
  252. print("""
  253. ##########
  254. #
  255. # UID FOR OU=USERS
  256. #
  257. ##########
  258. """)
  259. print(get_users_txt())
  260. print("""
  261. ##########
  262. #
  263. # Extra UID FOR OU=USERS
  264. #
  265. ##########
  266. """)
  267. print(extra_test_users)
  268. print("""
  269. ##########
  270. #
  271. # CN FOR OU=GROUP
  272. #
  273. ##########
  274. """)
  275. print(get_groups_txt())
  276. print(extra_groups)
  277. print(
  278. """
  279. ##########
  280. #
  281. # CN FOR OU=APPS
  282. #
  283. ##########
  284. """)
  285. print(get_group_handlers())
  286. print(extra_apps)