openship 0.4.4 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. package/README.md +2 -24
  2. package/dist/bare-2HYDXQEH.js +23 -0
  3. package/dist/{bowser-MFQA6OS4.js → bowser-O3AEA6AN.js} +5 -1
  4. package/dist/{chunk-KD7VO4LG.js → chunk-2ZLR7ULL.js} +255 -65
  5. package/dist/{chunk-YHXCHW7Q.js → chunk-3JQTL4R4.js} +236 -99
  6. package/dist/{chunk-E77LJWJK.js → chunk-4TJC4JZQ.js} +20 -9
  7. package/dist/{chunk-YL67EWYZ.js → chunk-4Z5QO7N6.js} +6 -2
  8. package/dist/{chunk-WJPCBU7Z.js → chunk-5FNIWBFI.js} +10 -6
  9. package/dist/{chunk-Y37KHU7L.js → chunk-5MZ624VX.js} +5 -0
  10. package/dist/{chunk-QKFRZNKN.js → chunk-6APIPIJY.js} +8 -4
  11. package/dist/{chunk-JZLNHGLW.js → chunk-6APULWSU.js} +153 -133
  12. package/dist/{chunk-F4DFVG6Q.js → chunk-6B5YCFFV.js} +8 -4
  13. package/dist/{chunk-XVSAUO2I.js → chunk-AVIB7CT7.js} +5 -1
  14. package/dist/{chunk-TEYJYSMT.js → chunk-C5OHTYEF.js} +12 -6
  15. package/dist/{chunk-7UOB5GGQ.js → chunk-DYPH4HCI.js} +5 -0
  16. package/dist/{chunk-XIFRMKYT.js → chunk-EI575GHN.js} +6 -2
  17. package/dist/{chunk-4CQWT2WL.js → chunk-FPRHYBY2.js} +5 -0
  18. package/dist/chunk-FQGJZ2HS.js +248 -0
  19. package/dist/{chunk-JR2OCMJA.js → chunk-FRNAR33O.js} +6 -2
  20. package/dist/{chunk-JUJBBF5U.js → chunk-FXTBHTWY.js} +362 -42
  21. package/dist/chunk-ILFETZOM.js +131 -0
  22. package/dist/{chunk-5ZCKQ2MI.js → chunk-IXCHURVK.js} +7 -3
  23. package/dist/{chunk-6ERIMTBC.js → chunk-JYGD5WSN.js} +5 -0
  24. package/dist/{chunk-4VNS5WPM.js → chunk-KI2EY3WB.js} +4 -0
  25. package/dist/{chunk-3U4SPZD5.js → chunk-L2VOGB2X.js} +7 -104
  26. package/dist/{chunk-NB2VEIWG.js → chunk-MZ2WEHHY.js} +7 -3
  27. package/dist/{chunk-BUBSSKO6.js → chunk-O6ZZF52V.js} +5 -1
  28. package/dist/{chunk-LBFH7THC.js → chunk-OWED2GRM.js} +5 -1
  29. package/dist/{chunk-4MG3BVHE.js → chunk-OXWDY22G.js} +6 -2
  30. package/dist/{chunk-4FABQGQP.js → chunk-Q2CIRAOK.js} +5 -0
  31. package/dist/{chunk-4LEL3H2Z.js → chunk-RPHRPFEH.js} +5 -0
  32. package/dist/{chunk-46YJFP4S.js → chunk-SQ77DZOI.js} +1728 -1484
  33. package/dist/{chunk-S6DSRLNE.js → chunk-TGIINPVM.js} +15 -2
  34. package/dist/{chunk-U2DPZSXA.js → chunk-TYVME3XD.js} +9 -1
  35. package/dist/{chunk-HFYDYK4D.js → chunk-V6AN6XLZ.js} +18 -6
  36. package/dist/{chunk-ZKJOFWBJ.js → chunk-VDMQJHPI.js} +38 -15
  37. package/dist/{chunk-E6W2JMMU.js → chunk-VFINNTUL.js} +22 -1
  38. package/dist/{chunk-OJE6YWPQ.js → chunk-VWPEKOH6.js} +6 -2
  39. package/dist/{chunk-5N7VUGL6.js → chunk-W73X43R7.js} +6 -2
  40. package/dist/cloud-7QYOGF7F.js +11 -0
  41. package/dist/cloud-ZSKOS4GY.js +30 -0
  42. package/dist/detect-SH4FHFBI.js +36 -0
  43. package/dist/{dist-L3MPOWCA.js → dist-IQJ6H6UZ.js} +6 -2
  44. package/dist/{dist-es-KE56MWYO.js → dist-es-5DY7K32L.js} +9 -5
  45. package/dist/dist-es-JSTDUS7Q.js +26 -0
  46. package/dist/{dist-es-GTAMF674.js → dist-es-OSNJBLXB.js} +8 -4
  47. package/dist/{dist-es-NRZIQY5B.js → dist-es-RYHIPOTN.js} +17 -13
  48. package/dist/{dist-es-XQCOTGC7.js → dist-es-VNKHQVIB.js} +7 -3
  49. package/dist/{dist-es-WZCR7DHQ.js → dist-es-WV4AMOII.js} +11 -7
  50. package/dist/{dist-es-ZW3HFQUM.js → dist-es-X3B5QYKB.js} +9 -5
  51. package/dist/docker-U7AF5PTA.js +16 -0
  52. package/dist/docker-edge-executor-VHW3JPJS.js +13 -0
  53. package/dist/edge-import-V5CBA47C.js +45 -0
  54. package/dist/ensure-container-edge-CMYROUSI.js +33 -0
  55. package/dist/{event-streams-7LGDL56D.js → event-streams-EHRAKL75.js} +7 -3
  56. package/dist/executor-YPT6RH6O.js +30 -0
  57. package/dist/index.d.ts +2 -1
  58. package/dist/index.js +258 -245
  59. package/dist/{loadSso-N273C5I7.js → loadSso-46FQRIZS.js} +13 -9
  60. package/dist/local-executor-V7U5VOZW.js +12 -0
  61. package/dist/nginx-2GTRUIDE.js +24 -0
  62. package/dist/noop-FMMFG2EZ.js +11 -0
  63. package/dist/{openresty-lua-HAO4EUDY.js → openresty-lua-4WLGDSER.js} +13 -3
  64. package/dist/server/engine/ChangeLog +2289 -0
  65. package/dist/server/engine/Documentations +5 -0
  66. package/dist/server/engine/LICENSE +674 -0
  67. package/dist/server/engine/README.md +34 -0
  68. package/dist/server/engine/conf/amavisd +150 -0
  69. package/dist/server/engine/conf/clamav +71 -0
  70. package/dist/server/engine/conf/core +632 -0
  71. package/dist/server/engine/conf/dovecot +151 -0
  72. package/dist/server/engine/conf/fail2ban +72 -0
  73. package/dist/server/engine/conf/global +698 -0
  74. package/dist/server/engine/conf/iredapd +52 -0
  75. package/dist/server/engine/conf/logwatch +28 -0
  76. package/dist/server/engine/conf/postfix +97 -0
  77. package/dist/server/engine/conf/postgresql +93 -0
  78. package/dist/server/engine/conf/spamassassin +39 -0
  79. package/dist/server/engine/dialog/config_via_dialog.sh +258 -0
  80. package/dist/server/engine/dialog/optional_components.sh +122 -0
  81. package/dist/server/engine/dialog/pgsql_config.sh +52 -0
  82. package/dist/server/engine/dialog/virtual_domain_config.sh +94 -0
  83. package/dist/server/engine/functions/amavisd.sh +267 -0
  84. package/dist/server/engine/functions/backend.sh +85 -0
  85. package/dist/server/engine/functions/clamav.sh +100 -0
  86. package/dist/server/engine/functions/cleanup.sh +393 -0
  87. package/dist/server/engine/functions/dovecot.sh +583 -0
  88. package/dist/server/engine/functions/fail2ban.sh +209 -0
  89. package/dist/server/engine/functions/iredapd.sh +356 -0
  90. package/dist/server/engine/functions/optional_components.sh +24 -0
  91. package/dist/server/engine/functions/packages.sh +522 -0
  92. package/dist/server/engine/functions/packages_freebsd.sh +179 -0
  93. package/dist/server/engine/functions/postfix.sh +457 -0
  94. package/dist/server/engine/functions/postgresql.sh +239 -0
  95. package/dist/server/engine/functions/spamassassin.sh +49 -0
  96. package/dist/server/engine/functions/system_accounts.sh +128 -0
  97. package/dist/server/engine/iRedMail.sh +144 -0
  98. package/dist/server/engine/pkgs/get_all.sh +338 -0
  99. package/dist/server/engine/pkgs/pkgs.freebsd.sha256 +3 -0
  100. package/dist/server/engine/pkgs/pkgs.openbsd.sha256 +6 -0
  101. package/dist/server/engine/pkgs/pkgs.sha256 +1 -0
  102. package/dist/server/engine/samples/amavisd/amavisd.conf +677 -0
  103. package/dist/server/engine/samples/amavisd/amavisd.mysql +278 -0
  104. package/dist/server/engine/samples/amavisd/amavisd.pgsql +253 -0
  105. package/dist/server/engine/samples/amavisd/amavisd.schema +942 -0
  106. package/dist/server/engine/samples/amavisd/default_spam_policy.sql +46 -0
  107. package/dist/server/engine/samples/dovecot/dovecot-2.4-mariadb.conf +758 -0
  108. package/dist/server/engine/samples/dovecot/dovecot-2.4-openldap.conf +767 -0
  109. package/dist/server/engine/samples/dovecot/dovecot-2.4-pgsql.conf +762 -0
  110. package/dist/server/engine/samples/dovecot/dovecot-last-login.conf +50 -0
  111. package/dist/server/engine/samples/dovecot/dovecot-ldap.conf +21 -0
  112. package/dist/server/engine/samples/dovecot/dovecot-share-folder.conf +22 -0
  113. package/dist/server/engine/samples/dovecot/dovecot-sql.conf +28 -0
  114. package/dist/server/engine/samples/dovecot/dovecot-used-quota.conf +13 -0
  115. package/dist/server/engine/samples/dovecot/dovecot.conf +484 -0
  116. package/dist/server/engine/samples/dovecot/dovecot.sieve +7 -0
  117. package/dist/server/engine/samples/dovecot/dovecot2-quota-warning.sh +38 -0
  118. package/dist/server/engine/samples/dovecot/sql/imap_share_folder.mysql +16 -0
  119. package/dist/server/engine/samples/dovecot/sql/last_login.mysql +12 -0
  120. package/dist/server/engine/samples/dovecot/sql/used_quota.mysql +26 -0
  121. package/dist/server/engine/samples/dovecot/systemd/override.conf +3 -0
  122. package/dist/server/engine/samples/fail2ban/action.d/banned_db.conf +9 -0
  123. package/dist/server/engine/samples/fail2ban/bin/fail2ban_banned_db +268 -0
  124. package/dist/server/engine/samples/fail2ban/fail2ban.local +17 -0
  125. package/dist/server/engine/samples/fail2ban/filter.d/dovecot.iredmail.conf +5 -0
  126. package/dist/server/engine/samples/fail2ban/filter.d/postfix-pregreet.iredmail.conf +16 -0
  127. package/dist/server/engine/samples/fail2ban/filter.d/postfix.iredmail.conf +18 -0
  128. package/dist/server/engine/samples/fail2ban/filter.d/roundcube.iredmail.conf +9 -0
  129. package/dist/server/engine/samples/fail2ban/jail.d/dovecot.local +8 -0
  130. package/dist/server/engine/samples/fail2ban/jail.d/nginx-http-auth.local +8 -0
  131. package/dist/server/engine/samples/fail2ban/jail.d/postfix-pregreet.local +9 -0
  132. package/dist/server/engine/samples/fail2ban/jail.d/postfix.local +8 -0
  133. package/dist/server/engine/samples/fail2ban/jail.d/roundcube.local +9 -0
  134. package/dist/server/engine/samples/fail2ban/jail.d/sogo.local +8 -0
  135. package/dist/server/engine/samples/fail2ban/jail.d/sshd.local +8 -0
  136. package/dist/server/engine/samples/fail2ban/jail.local +6 -0
  137. package/dist/server/engine/samples/fail2ban/openbsd/rc +27 -0
  138. package/dist/server/engine/samples/fail2ban/sql/fail2ban.mysql +49 -0
  139. package/dist/server/engine/samples/fail2ban/sql/fail2ban.pgsql +48 -0
  140. package/dist/server/engine/samples/firewall/firewalld/services/ssh.xml +6 -0
  141. package/dist/server/engine/samples/firewall/firewalld/zones/iredmail.xml +15 -0
  142. package/dist/server/engine/samples/firewall/iptables/ip6tables.init.debian +362 -0
  143. package/dist/server/engine/samples/firewall/iptables/ip6tables.rules +53 -0
  144. package/dist/server/engine/samples/firewall/iptables/iptables.init.debian +363 -0
  145. package/dist/server/engine/samples/firewall/iptables/iptables.rules +54 -0
  146. package/dist/server/engine/samples/firewall/nftables.conf +58 -0
  147. package/dist/server/engine/samples/freebsd/newsyslog.conf.d/dovecot.conf +3 -0
  148. package/dist/server/engine/samples/freebsd/newsyslog.conf.d/iredapd.conf +1 -0
  149. package/dist/server/engine/samples/freebsd/newsyslog.conf.d/mlmmjadmin.conf +1 -0
  150. package/dist/server/engine/samples/freebsd/newsyslog.conf.d/php-fpm.conf +2 -0
  151. package/dist/server/engine/samples/freebsd/newsyslog.conf.d/slapd.conf +1 -0
  152. package/dist/server/engine/samples/freebsd/syslog.d/dovecot.conf +2 -0
  153. package/dist/server/engine/samples/freebsd/syslog.d/fail2ban.conf +2 -0
  154. package/dist/server/engine/samples/freebsd/syslog.d/iredapd.conf +2 -0
  155. package/dist/server/engine/samples/freebsd/syslog.d/mlmmjadmin.conf +2 -0
  156. package/dist/server/engine/samples/freebsd/syslog.d/php-fpm.conf +2 -0
  157. package/dist/server/engine/samples/freebsd/syslog.d/slapd.conf +2 -0
  158. package/dist/server/engine/samples/iredmail/iredmail.mysql +491 -0
  159. package/dist/server/engine/samples/iredmail/iredmail.pgsql +465 -0
  160. package/dist/server/engine/samples/iredmail/iredmail.schema +456 -0
  161. package/dist/server/engine/samples/iredmail/used_quota_triggers_dovecot_2.3.pgsql +40 -0
  162. package/dist/server/engine/samples/iredmail/used_quota_triggers_dovecot_2.4.pgsql +18 -0
  163. package/dist/server/engine/samples/logrotate/dovecot +13 -0
  164. package/dist/server/engine/samples/logrotate/iredapd +13 -0
  165. package/dist/server/engine/samples/logrotate/mlmmjadmin +13 -0
  166. package/dist/server/engine/samples/logrotate/openldap +19 -0
  167. package/dist/server/engine/samples/logrotate/php-fpm +13 -0
  168. package/dist/server/engine/samples/openbsd/ldapd.conf +58 -0
  169. package/dist/server/engine/samples/openbsd/pf.conf +28 -0
  170. package/dist/server/engine/samples/postfix/command_filter.pcre +3 -0
  171. package/dist/server/engine/samples/postfix/freebsd/mailer.conf +9 -0
  172. package/dist/server/engine/samples/postfix/helo_access.pcre +180 -0
  173. package/dist/server/engine/samples/postfix/ldap/catchall_maps.cf +11 -0
  174. package/dist/server/engine/samples/postfix/ldap/recipient_bcc_maps_domain.cf +11 -0
  175. package/dist/server/engine/samples/postfix/ldap/recipient_bcc_maps_user.cf +11 -0
  176. package/dist/server/engine/samples/postfix/ldap/relay_domains.cf +11 -0
  177. package/dist/server/engine/samples/postfix/ldap/sender_bcc_maps_domain.cf +11 -0
  178. package/dist/server/engine/samples/postfix/ldap/sender_bcc_maps_user.cf +11 -0
  179. package/dist/server/engine/samples/postfix/ldap/sender_dependent_relayhost_maps_domain.cf +11 -0
  180. package/dist/server/engine/samples/postfix/ldap/sender_dependent_relayhost_maps_user.cf +11 -0
  181. package/dist/server/engine/samples/postfix/ldap/sender_login_maps.cf +11 -0
  182. package/dist/server/engine/samples/postfix/ldap/transport_maps_domain.cf +11 -0
  183. package/dist/server/engine/samples/postfix/ldap/transport_maps_user.cf +11 -0
  184. package/dist/server/engine/samples/postfix/ldap/virtual_alias_maps.cf +11 -0
  185. package/dist/server/engine/samples/postfix/ldap/virtual_group_maps.cf +11 -0
  186. package/dist/server/engine/samples/postfix/ldap/virtual_group_members_maps.cf +11 -0
  187. package/dist/server/engine/samples/postfix/ldap/virtual_mailbox_domains.cf +11 -0
  188. package/dist/server/engine/samples/postfix/ldap/virtual_mailbox_maps.cf +12 -0
  189. package/dist/server/engine/samples/postfix/main.cf +282 -0
  190. package/dist/server/engine/samples/postfix/main.cf.amavisd +7 -0
  191. package/dist/server/engine/samples/postfix/main.cf.dovecot +8 -0
  192. package/dist/server/engine/samples/postfix/main.cf.ldap +39 -0
  193. package/dist/server/engine/samples/postfix/main.cf.mlmmj +5 -0
  194. package/dist/server/engine/samples/postfix/main.cf.mysql +39 -0
  195. package/dist/server/engine/samples/postfix/main.cf.pgsql +39 -0
  196. package/dist/server/engine/samples/postfix/main.cf.postscreen +30 -0
  197. package/dist/server/engine/samples/postfix/master.cf +87 -0
  198. package/dist/server/engine/samples/postfix/mysql/catchall_maps.cf +5 -0
  199. package/dist/server/engine/samples/postfix/mysql/domain_alias_catchall_maps.cf +5 -0
  200. package/dist/server/engine/samples/postfix/mysql/domain_alias_maps.cf +5 -0
  201. package/dist/server/engine/samples/postfix/mysql/recipient_bcc_maps_domain.cf +5 -0
  202. package/dist/server/engine/samples/postfix/mysql/recipient_bcc_maps_user.cf +5 -0
  203. package/dist/server/engine/samples/postfix/mysql/relay_domains.cf +5 -0
  204. package/dist/server/engine/samples/postfix/mysql/sender_bcc_maps_domain.cf +5 -0
  205. package/dist/server/engine/samples/postfix/mysql/sender_bcc_maps_user.cf +5 -0
  206. package/dist/server/engine/samples/postfix/mysql/sender_dependent_relayhost_maps.cf +6 -0
  207. package/dist/server/engine/samples/postfix/mysql/sender_login_maps.cf +5 -0
  208. package/dist/server/engine/samples/postfix/mysql/transport_maps_domain.cf +5 -0
  209. package/dist/server/engine/samples/postfix/mysql/transport_maps_maillist.cf +5 -0
  210. package/dist/server/engine/samples/postfix/mysql/transport_maps_user.cf +5 -0
  211. package/dist/server/engine/samples/postfix/mysql/virtual_alias_maps.cf +5 -0
  212. package/dist/server/engine/samples/postfix/mysql/virtual_mailbox_domains.cf +5 -0
  213. package/dist/server/engine/samples/postfix/mysql/virtual_mailbox_maps.cf +5 -0
  214. package/dist/server/engine/samples/postfix/pgsql/catchall_maps.cf +5 -0
  215. package/dist/server/engine/samples/postfix/pgsql/domain_alias_catchall_maps.cf +5 -0
  216. package/dist/server/engine/samples/postfix/pgsql/domain_alias_maps.cf +5 -0
  217. package/dist/server/engine/samples/postfix/pgsql/recipient_bcc_maps_domain.cf +5 -0
  218. package/dist/server/engine/samples/postfix/pgsql/recipient_bcc_maps_user.cf +5 -0
  219. package/dist/server/engine/samples/postfix/pgsql/relay_domains.cf +5 -0
  220. package/dist/server/engine/samples/postfix/pgsql/sender_bcc_maps_domain.cf +5 -0
  221. package/dist/server/engine/samples/postfix/pgsql/sender_bcc_maps_user.cf +5 -0
  222. package/dist/server/engine/samples/postfix/pgsql/sender_dependent_relayhost_maps.cf +6 -0
  223. package/dist/server/engine/samples/postfix/pgsql/sender_login_maps.cf +5 -0
  224. package/dist/server/engine/samples/postfix/pgsql/transport_maps_domain.cf +5 -0
  225. package/dist/server/engine/samples/postfix/pgsql/transport_maps_maillist.cf +5 -0
  226. package/dist/server/engine/samples/postfix/pgsql/transport_maps_user.cf +5 -0
  227. package/dist/server/engine/samples/postfix/pgsql/virtual_alias_maps.cf +5 -0
  228. package/dist/server/engine/samples/postfix/pgsql/virtual_mailbox_domains.cf +5 -0
  229. package/dist/server/engine/samples/postfix/pgsql/virtual_mailbox_maps.cf +5 -0
  230. package/dist/server/engine/samples/postfix/postscreen_access.cidr +6 -0
  231. package/dist/server/engine/samples/postgresql/sql/add_first_domain_and_user.sql +34 -0
  232. package/dist/server/engine/samples/postgresql/sql/grant_permissions.sql +14 -0
  233. package/dist/server/engine/samples/postgresql/sql/init_vmail_db.sql +15 -0
  234. package/dist/server/engine/samples/rsyslog.d/1-iredmail-dovecot.conf +23 -0
  235. package/dist/server/engine/samples/rsyslog.d/1-iredmail-fail2ban.conf +2 -0
  236. package/dist/server/engine/samples/rsyslog.d/1-iredmail-iredapd.conf +12 -0
  237. package/dist/server/engine/samples/rsyslog.d/1-iredmail-mlmmjadmin.conf +12 -0
  238. package/dist/server/engine/samples/rsyslog.d/1-iredmail-openldap.conf +2 -0
  239. package/dist/server/engine/samples/rsyslog.d/1-iredmail-phpfpm.conf +3 -0
  240. package/dist/server/engine/samples/spamassassin/local.cf +186 -0
  241. package/dist/server/engine/samples/spamassassin/razor.conf +1 -0
  242. package/dist/server/engine/samples/systemd/clamd.service.d/override.conf +2 -0
  243. package/dist/server/engine/samples/systemd/mariadb.service.d/override.conf +3 -0
  244. package/dist/server/engine/samples/systemd/slapd.service.d/override.conf +6 -0
  245. package/dist/server/engine/samples/yum/CentOS-Linux-AppStream.repo +6 -0
  246. package/dist/server/engine/samples/yum/CentOS-Linux-PowerTools.repo +6 -0
  247. package/dist/server/engine/samples/yum/CentOS-Stream-AppStream.repo +7 -0
  248. package/dist/server/engine/samples/yum/CentOS-Stream-PowerTools.repo +7 -0
  249. package/dist/server/engine/samples/yum/symas-openldap.repo +6 -0
  250. package/dist/server/engine/tools/add_enabled_service.py +60 -0
  251. package/dist/server/engine/tools/backup_mysql.sh +238 -0
  252. package/dist/server/engine/tools/backup_openldap.sh +230 -0
  253. package/dist/server/engine/tools/backup_pgsql.sh +217 -0
  254. package/dist/server/engine/tools/backup_sogo.sh +156 -0
  255. package/dist/server/engine/tools/create_mail_user_OpenLDAP.py +335 -0
  256. package/dist/server/engine/tools/create_mail_user_OpenLDAP.sh +287 -0
  257. package/dist/server/engine/tools/create_mail_user_SQL.sh +127 -0
  258. package/dist/server/engine/tools/enable_postscreen.sh +144 -0
  259. package/dist/server/engine/tools/fail2ban_unban_ip.sh +39 -0
  260. package/dist/server/engine/tools/find_sasl_login_ip.sh +20 -0
  261. package/dist/server/engine/tools/find_top_sasl_usernames.sh +28 -0
  262. package/dist/server/engine/tools/generate_ssl_keys.sh +85 -0
  263. package/dist/server/engine/tools/kill_high_cpu_sogo_process.sh +32 -0
  264. package/dist/server/engine/tools/ldap_assign_user_to_groups.py +151 -0
  265. package/dist/server/engine/tools/ldap_move_members_to_another_group.py +129 -0
  266. package/dist/server/engine/tools/migrate_sql_alias_table.py +177 -0
  267. package/dist/server/engine/update/0.9.8/amavisd.mysql +29 -0
  268. package/dist/server/engine/update/0.9.8/amavisd.pgsql +39 -0
  269. package/dist/server/engine/update/0.9.8/iredmail.mysql +53 -0
  270. package/dist/server/engine/update/0.9.8/iredmail.pgsql +61 -0
  271. package/dist/server/engine/update/0.9.9/iredmail.mysql +2 -0
  272. package/dist/server/engine/update/0.9.9/iredmail.pgsql +2 -0
  273. package/dist/server/engine/update/1.0/iredmail.mysql +2 -0
  274. package/dist/server/engine/update/1.0/iredmail.pgsql +2 -0
  275. package/dist/server/engine/update/1.2/last_login.mysql +16 -0
  276. package/dist/server/engine/update/1.4.0/iredmail.mysql +22 -0
  277. package/dist/server/engine/update/1.4.0/iredmail.pgsql +20 -0
  278. package/dist/server/engine/update/1.4.1/iredmail.mysql +3 -0
  279. package/dist/server/engine/update/1.4.1/iredmail.pgsql +3 -0
  280. package/dist/server/engine/update/1.4.1/sogo.mysql +11 -0
  281. package/dist/server/engine/update/1.4.1/sogo.pgsql +30 -0
  282. package/dist/server/engine/update/1.4.1/update-ldap.py +66 -0
  283. package/dist/server/engine/update/1.4.2/iredmail.mysql +9 -0
  284. package/dist/server/engine/update/1.4.2/iredmail.pgsql +9 -0
  285. package/dist/server/engine/update/1.4.2/sogo.pgsql +30 -0
  286. package/dist/server/engine/update/1.6.0/sogo_view.pgsql +27 -0
  287. package/dist/server/engine/update/1.6.3/iredmail.mysql +1 -0
  288. package/dist/server/engine/update/1.7.0/fail2ban.mysql +11 -0
  289. package/dist/server/engine/update/1.7.0/fail2ban.pgsql +12 -0
  290. package/dist/server/engine/update/1.7.1/amavisd.mysql +1 -0
  291. package/dist/server/engine/update/1.7.2/vmail.mysql +30 -0
  292. package/dist/server/engine/update/1.7.3/deleted_mailboxes.mysql +43 -0
  293. package/dist/server/engine/update/1.7.3/iredadmin.mysql +26 -0
  294. package/dist/server/engine/update/1.7.3/vmail.mysql +79 -0
  295. package/dist/server/engine/update/1.7.3/vmail.pgsql +9 -0
  296. package/dist/server/engine/update/README.md +1 -0
  297. package/dist/server/engine/update/ldap/README.md +40 -0
  298. package/dist/server/engine/update/ldap/update-ldap-dovecot-2.3.py +69 -0
  299. package/dist/server/index.js +55574 -53675
  300. package/dist/server/migrations/0071_gh_device_token.sql +3 -0
  301. package/dist/server/migrations/0072_gh_device_token_method.sql +1 -0
  302. package/dist/server/migrations/meta/_journal.json +14 -0
  303. package/dist/setup-HQIZLUOJ.js +20 -0
  304. package/dist/{signin-DR462ERO.js → signin-ITOPKKUB.js} +13 -9
  305. package/dist/{sso-oidc-VBZLJUK5.js → sso-oidc-NON2PD7Y.js} +13 -9
  306. package/dist/{sts-EJLZ4Z77.js → sts-HHFFSAY2.js} +12 -8
  307. package/package.json +1 -1
  308. package/dist/bare-ITM45QBX.js +0 -18
  309. package/dist/cloud-JMPHO3CW.js +0 -7
  310. package/dist/cloud-W5G6YXAY.js +0 -24
  311. package/dist/dist-es-4C322O5D.js +0 -22
  312. package/dist/docker-3FVJMFC3.js +0 -12
  313. package/dist/docker-edge-executor-ZIWAZWPL.js +0 -9
  314. package/dist/edge-import-Y34YL6JK.js +0 -39
  315. package/dist/executor-J7BHW5HF.js +0 -26
  316. package/dist/nginx-YZWKYKQU.js +0 -16
  317. package/dist/noop-RRNCIUI5.js +0 -7
  318. package/dist/setup-5X3WEEHA.js +0 -14
@@ -0,0 +1,156 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Author: Zhang Huangbin (zhb@iredmail.org)
4
+ # Purpose: Backup SOGo database with `sogo-tool` command.
5
+ # You can run this script manually or via crontab (recommended).
6
+ #
7
+ # Backing up SOGo data by dumping SQL database to a plain SQL file is not ideal
8
+ # because:
9
+ #
10
+ # - it's hard to restore single user's data
11
+ # - if SOGo changes some SQL structure, it's hard to restore all data.
12
+ #
13
+ # This script does backup with 'sogo-tool backup' command to avoid issues
14
+ # mentioned above, it stores each user's data in a single file, so you can
15
+ # restore a single user's data or all users data with 'sogo-tool restore'.
16
+
17
+ # Required commands:
18
+ #
19
+ # + sogo-tool
20
+ # + tar
21
+ # + bzip2
22
+
23
+ # USAGE
24
+ #
25
+ # * It stores backup copies under '/var/vmail/backup/sogo' by default,
26
+ # feel free to change it with variable BACKUP_ROOTDIR below.
27
+ #
28
+ # * If you want to log a message in iRedAdmin database (`iredadmin.log`),
29
+ # please specify correct MySQL username in variable MYSQL_USER, and
30
+ # write the same MySQL username and password in file /root/.my.cnf.
31
+ #
32
+ # * Add crontab job for root user:
33
+ #
34
+ # # crontab -e -u root
35
+ # 1 4 * * * bash /var/vmail/backup/backup_sogo.sh
36
+
37
+ # Keep backup for how many days. Defaults to 90 days.
38
+ export KEEP_DAYS='90'
39
+
40
+ # Where to store backup copies.
41
+ export BACKUP_ROOTDIR='/var/vmail/backup'
42
+
43
+ # MySQL username. Root user is required to dump all databases.
44
+ export MYSQL_USER='root'
45
+
46
+ # ~/.my.cnf
47
+ export MYSQL_DOT_MY_CNF='/root/.my.cnf'
48
+
49
+ export CMD_MYSQL="mysql --defaults-file=${MYSQL_DOT_MY_CNF} -u${MYSQL_USER}"
50
+
51
+ #########################################################
52
+ # You do *NOT* need to modify below lines.
53
+ #########################################################
54
+ # FreeBSD has 'sogo-tool' in different directory.
55
+ export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin:/usr/local/GNUstep/Local/Tools/Admin:$PATH
56
+
57
+ # Commands.
58
+ export CMD_DATE='/bin/date'
59
+ export CMD_DU='du -sh'
60
+ export CMD_COMPRESS='bzip2 -9'
61
+ export COMPRESS_SUFFIX='bz2'
62
+
63
+ # Path to sogo-tool command.
64
+ export CMD_SOGO_TOOL='sogo-tool'
65
+
66
+ # Date.
67
+ export YEAR="$(${CMD_DATE} +%Y)"
68
+ export MONTH="$(${CMD_DATE} +%m)"
69
+ export DAY="$(${CMD_DATE} +%d)"
70
+ export TIME="$(${CMD_DATE} +%H-%M-%S)"
71
+ export TIMESTAMP="${YEAR}-${MONTH}-${DAY}-${TIME}"
72
+
73
+ # Pre-defined backup status
74
+ export BACKUP_SUCCESS='YES'
75
+
76
+ # Define, check, create directories.
77
+ export BACKUP_DIR="${BACKUP_ROOTDIR}/sogo/${YEAR}/${MONTH}/${DAY}"
78
+
79
+ # Find the old backup which should be removed.
80
+ export REMOVE_OLD_BACKUP='YES'
81
+
82
+ export KERNEL="$(uname -s)"
83
+ if [[ X"${KERNEL}" == X'Linux' ]]; then
84
+ shift_year=$(date --date="${KEEP_DAYS} days ago" "+%Y")
85
+ shift_month=$(date --date="${KEEP_DAYS} days ago" "+%m")
86
+ shift_day=$(date --date="${KEEP_DAYS} days ago" "+%d")
87
+ elif [[ X"${KERNEL}" == X'FreeBSD' ]]; then
88
+ shift_year=$(date -j -v-${KEEP_DAYS}d "+%Y")
89
+ shift_month=$(date -j -v-${KEEP_DAYS}d "+%m")
90
+ shift_day=$(date -j -v-${KEEP_DAYS}d "+%d")
91
+ elif [[ X"${KERNEL}" == X'OpenBSD' ]]; then
92
+ epoch_seconds_now="$(date +%s)"
93
+ epoch_shift="$((${KEEP_DAYS} * 86400))"
94
+ epoch_seconds_old="$((epoch_seconds_now - epoch_shift))"
95
+
96
+ shift_year=$(date -r ${epoch_seconds_old} "+%Y")
97
+ shift_month=$(date -r ${epoch_seconds_old} "+%m")
98
+ shift_day=$(date -r ${epoch_seconds_old} "+%d")
99
+ else
100
+ export REMOVE_OLD_BACKUP='NO'
101
+ fi
102
+
103
+ export REMOVED_BACKUP="${BACKUP_ROOTDIR}/sogo/${shift_year}/${shift_month}/${shift_day}.tar.bz2"
104
+ export REMOVED_BACKUP_MONTH_DIR="${BACKUP_ROOTDIR}/sogo/${shift_year}/${shift_month}"
105
+ export REMOVED_BACKUP_YEAR_DIR="${BACKUP_ROOTDIR}/sogo/${shift_year}"
106
+
107
+ # Check and create directories.
108
+ if [ ! -d ${BACKUP_DIR} ]; then
109
+ mkdir -p ${BACKUP_DIR} 2>/dev/null
110
+ chown -R root ${BACKUP_DIR}
111
+ chmod -R 0700 ${BACKUP_DIR}
112
+ fi
113
+
114
+ # Backup
115
+ echo "* Backup all users' data under ${BACKUP_DIR}"
116
+ ${CMD_SOGO_TOOL} backup ${BACKUP_DIR} ALL
117
+
118
+ dir_name="$(dirname ${BACKUP_DIR})"
119
+ base_name="$(basename ${BACKUP_DIR})"
120
+
121
+ if ls ${BACKUP_DIR} | grep -i '[a-z0-9]' &>/dev/null; then
122
+ # Backup is not empty.
123
+ chown -R root ${BACKUP_DIR}
124
+ chmod -R 0700 ${BACKUP_DIR}
125
+
126
+ # Get original size of backup files
127
+ original_size="$(${CMD_DU} ${BACKUP_DIR} | awk '{print $1}')"
128
+
129
+ # Compress the directory.
130
+ echo "* Compress backup files."
131
+ cd ${dir_name} &&\
132
+ tar cjf ${base_name}.tar.bz2 ${base_name} && \
133
+ chown root ${base_name}.tar.bz2 && \
134
+ chmod 0400 ${base_name}.tar.bz2 && \
135
+ rm -rf ${base_name}
136
+
137
+ compressed_size="$(${CMD_DU} ${base_name}.tar.bz2 | awk '{print $1}')"
138
+ if [ -n X"${MYSQL_USER}" -a -f ${MYSQL_DOT_MY_CNF} ]; then
139
+ sql_log_msg="INSERT INTO log (event, loglevel, msg, admin, ip, timestamp) VALUES ('backup', 'info', 'SOGo data. size: ${compressed_size} (original: ${original_size})', 'cron_backup_sogo', '127.0.0.1', UTC_TIMESTAMP());"
140
+ ${CMD_MYSQL} iredadmin -e "${sql_log_msg}"
141
+ fi
142
+ else
143
+ echo "* Backup is empty, remove temporary backup directory: ${BACKUP_DIR}."
144
+ rm -rf ${BACKUP_DIR} &>/dev/null
145
+ fi
146
+
147
+ if [ X"${REMOVE_OLD_BACKUP}" == X'YES' -a -f ${REMOVED_BACKUP} ]; then
148
+ echo -e "* Old backup found. Deleting: ${REMOVED_BACKUP}."
149
+ rm -rf ${REMOVED_BACKUP} &>/dev/null
150
+
151
+ # Try to remove empty directory.
152
+ rmdir ${REMOVED_BACKUP_MONTH_DIR} 2>/dev/null
153
+ rmdir ${REMOVED_BACKUP_YEAR_DIR} 2>/dev/null
154
+ fi
155
+
156
+ exit 0
@@ -0,0 +1,335 @@
1
+ #!/usr/bin/env python3
2
+ # encoding: utf-8
3
+
4
+ # Author: Zhang Huangbin <zhb _at_ iredmail.org>
5
+ # Purpose: Add new OpenLDAP user for postfix mail server.
6
+ # Project: iRedMail (http://www.iredmail.org/)
7
+
8
+ # --------------------------- WARNING ------------------------------
9
+ # This script only works under iRedMail >= 0.4.0 due to ldap schema
10
+ # changes.
11
+ # ------------------------------------------------------------------
12
+
13
+ # ---------------------------- USAGE -------------------------------
14
+ # Put your user list in a csv format file, e.g. users.csv, and then
15
+ # import users listed in the file:
16
+ #
17
+ # $ python3 create_mail_user_OpenLDAP.py users.csv
18
+ #
19
+ # ------------------------------------------------------------------
20
+
21
+ # ------------------------- SETTINGS -------------------------------
22
+ # LDAP server address.
23
+ LDAP_URI = 'ldap://127.0.0.1:389'
24
+
25
+ # LDAP base dn.
26
+ BASEDN = 'o=domains,dc=example,dc=com'
27
+
28
+ # Bind dn/password
29
+ BINDDN = 'cn=Manager,dc=example,dc=com'
30
+ BINDPW = 'password'
31
+
32
+ # Storage base directory.
33
+ STORAGE_BASE_DIRECTORY = '/var/vmail/vmail1'
34
+
35
+ # Append timestamp in maildir path.
36
+ APPEND_TIMESTAMP_IN_MAILDIR = True
37
+
38
+ # Get base directory and storage node.
39
+ std = STORAGE_BASE_DIRECTORY.rstrip('/').split('/')
40
+ STORAGE_NODE = std.pop()
41
+
42
+ # Hashed maildir: True, False.
43
+ # Example:
44
+ # domain: domain.ltd,
45
+ # user: zhang (zhang@domain.ltd)
46
+ #
47
+ # - hashed: d/do/domain.ltd/z/zh/zha/zhang/
48
+ # - normal: domain.ltd/zhang/
49
+ HASHED_MAILDIR = True
50
+
51
+ # Default password schemes.
52
+ # Multiple passwords are supported if you separate schemes with '+'.
53
+ # For example: 'SSHA+NTLM', 'CRAM-MD5+SSHA', 'CRAM-MD5+SSHA+MD5'.
54
+ DEFAULT_PASSWORD_SCHEME = 'SSHA512'
55
+
56
+ # Do not prefix password scheme name in password hash.
57
+ HASHES_WITHOUT_PREFIXED_PASSWORD_SCHEME = ['NTLM']
58
+ # ------------------------------------------------------------------
59
+
60
+ import os
61
+ import sys
62
+ import time
63
+ import datetime
64
+ from subprocess import Popen, PIPE
65
+ from typing import List, Dict
66
+ import re
67
+
68
+ try:
69
+ import ldif
70
+ except ImportError:
71
+ print("""
72
+ Error: You don't have python-ldap installed, Please install it first.
73
+
74
+ You can install it like this:
75
+
76
+ - On RHEL/CentOS 5.x:
77
+
78
+ $ sudo yum install python-ldap
79
+
80
+ - On Debian & Ubuntu:
81
+
82
+ $ sudo apt install python-ldap
83
+ """)
84
+ sys.exit()
85
+
86
+
87
+ def usage():
88
+ print("""
89
+ CSV file format:
90
+
91
+ domain name, username, password, [common name], [quota_in_bytes], [groups]
92
+
93
+ Example #1:
94
+ iredmail.org, zhang, plain_password, Zhang Huangbin, 104857600, group1:group2
95
+ Example #2:
96
+ iredmail.org, zhang, plain_password, Zhang Huangbin, ,
97
+ Example #3:
98
+ iredmail.org, zhang, plain_password, , 104857600, group1:group2
99
+
100
+ Note:
101
+ - Domain name, username and password are REQUIRED, others are optional:
102
+ + common name.
103
+ * It will be the same as username if it's empty.
104
+ * Non-ascii character is allowed in this field, they will be
105
+ encoded automaticly. Such as Chinese, Korea, Japanese, etc.
106
+ + quota. It will be 0 (unlimited quota) if it's empty.
107
+ + groups.
108
+ * valid group name (hr@a.cn): hr
109
+ * incorrect group name: hr@a.cn
110
+ * Do *NOT* include domain name in group name, it will be
111
+ appended automaticly.
112
+ * Multiple groups must be seperated by colon.
113
+ - Leading and trailing Space will be ignored.
114
+ """)
115
+
116
+
117
+ def __str2bytes(s) -> bytes:
118
+ """Convert `s` from string to bytes."""
119
+ if isinstance(s, bytes):
120
+ return s
121
+ elif isinstance(s, str):
122
+ return s.encode()
123
+ elif isinstance(s, (int, float)):
124
+ return str(s).encode()
125
+ else:
126
+ return bytes(s)
127
+
128
+ def __attr_ldif(attr, value, default=None) -> List:
129
+ """Generate a list of LDIF data with given attribute name and value.
130
+ Returns empty list if no valid value.
131
+
132
+ Value is properly handled with str/bytes/list/tuple/set types, and
133
+ converted to list of bytes at the end.
134
+
135
+ To generate ldif list with ldap modification like `ldap.MOD_REPLACE`,
136
+ please use function `mod_replace()` instead.
137
+ """
138
+ _ldif = []
139
+ v = value or default
140
+ if v:
141
+ if isinstance(value, (list, tuple, set)):
142
+ lst = []
143
+ for i in v:
144
+ # Avoid duplicate element.
145
+ if i in lst:
146
+ continue
147
+
148
+ if isinstance(i, bytes):
149
+ lst.append(i)
150
+ else:
151
+ lst.append(__str2bytes(i))
152
+
153
+ _ldif = [(attr, lst)]
154
+ else:
155
+ _ldif = [(attr, [__str2bytes(v)])]
156
+
157
+ return _ldif
158
+
159
+
160
+ def __attrs_ldif(kvs: Dict) -> List:
161
+ lst = []
162
+ for (k, v) in kvs.items():
163
+ lst += __attr_ldif(k, v)
164
+
165
+ return lst
166
+
167
+
168
+ # Return list of modification operation.
169
+ def mail_to_user_dn(mail):
170
+ """Convert email address to ldap dn of normail mail user."""
171
+ if mail.count('@') != 1:
172
+ return ''
173
+
174
+ user, domain = mail.split('@')
175
+
176
+ # User DN format.
177
+ # mail=user@domain.ltd,domainName=domain.ltd,[LDAP_BASEDN]
178
+ dn = 'mail=%s,ou=Users,domainName=%s,%s' % (mail, domain, BASEDN)
179
+
180
+ return dn
181
+
182
+
183
+ def generate_password_with_doveadmpw(plain_password, scheme=None):
184
+ """Generate password hash with `doveadm pw` command.
185
+ Return SSHA instead if no 'doveadm' command found or other error raised."""
186
+ if not scheme:
187
+ scheme = DEFAULT_PASSWORD_SCHEME
188
+
189
+ scheme = scheme.upper()
190
+ p = str(plain_password).strip()
191
+
192
+ pp = Popen(['doveadm', 'pw', '-s', scheme, '-p', p], stdout=PIPE)
193
+ pw = pp.communicate()[0]
194
+
195
+ if scheme in HASHES_WITHOUT_PREFIXED_PASSWORD_SCHEME:
196
+ pw.lstrip('{' + scheme + '}')
197
+
198
+ # remove '\n'
199
+ pw = pw.strip()
200
+
201
+ return pw
202
+
203
+ def get_days_of_today():
204
+ """Return number of days since 1970-01-01."""
205
+ today = datetime.date.today()
206
+
207
+ try:
208
+ return (datetime.date(today.year, today.month, today.day) - datetime.date(1970, 1, 1)).days
209
+ except:
210
+ return 0
211
+
212
+ def ldif_mailuser(domain, username, passwd, cn, quota, groups=''):
213
+ # Append timestamp in maildir path
214
+ DATE = time.strftime('%Y.%m.%d.%H.%M.%S')
215
+ TIMESTAMP_IN_MAILDIR = ''
216
+ if APPEND_TIMESTAMP_IN_MAILDIR:
217
+ TIMESTAMP_IN_MAILDIR = '-%s' % DATE
218
+
219
+ if quota == '':
220
+ quota = '0'
221
+
222
+ # Remove SPACE in username.
223
+ username = str(username).lower().strip().replace(' ', '')
224
+
225
+ if cn == '':
226
+ cn = username
227
+
228
+ mail = username + '@' + domain
229
+ dn = mail_to_user_dn(mail)
230
+
231
+ # Get group list.
232
+ if groups.strip() != '':
233
+ groups = groups.strip().split(':')
234
+ for i in range(len(groups)):
235
+ groups[i] = groups[i] + '@' + domain
236
+
237
+ maildir_domain = str(domain).lower()
238
+ if HASHED_MAILDIR is True:
239
+ str1 = str2 = str3 = username[0]
240
+ if len(username) >= 3:
241
+ str2 = username[1]
242
+ str3 = username[2]
243
+ elif len(username) == 2:
244
+ str2 = str3 = username[1]
245
+
246
+ maildir_user = "%s/%s/%s/%s%s/" % (str1, str2, str3, username, TIMESTAMP_IN_MAILDIR, )
247
+ mailMessageStore = maildir_domain + '/' + maildir_user
248
+ else:
249
+ mailMessageStore = "%s/%s%s/" % (domain, username, TIMESTAMP_IN_MAILDIR)
250
+
251
+ homeDirectory = STORAGE_BASE_DIRECTORY + '/' + mailMessageStore
252
+
253
+ _ldif = __attrs_ldif({
254
+ 'objectClass': ['inetOrgPerson', 'mailUser', 'shadowAccount', 'amavisAccount'],
255
+ 'mail': mail,
256
+ 'userPassword': generate_password_with_doveadmpw(passwd),
257
+ 'mailQuota': quota,
258
+ 'cn': cn,
259
+ 'sn': username,
260
+ 'uid': username,
261
+ 'homeDirectory': homeDirectory,
262
+ 'accountStatus': 'active',
263
+ 'enabledService': ['internal', 'doveadm', 'lib-storage',
264
+ 'indexer-worker', 'dsync', 'quota-status',
265
+ 'mail',
266
+ 'smtp', 'smtpsecured', 'smtptls',
267
+ 'pop3', 'pop3secured', 'pop3tls',
268
+ 'imap', 'imapsecured', 'imaptls',
269
+ 'managesieve', 'managesievesecured', 'managesievetls',
270
+ 'sieve', 'sievesecured', 'sievetls',
271
+ 'deliver', 'lda', 'lmtp', 'forward',
272
+ 'senderbcc', 'recipientbcc',
273
+ 'sogo', 'sogowebmail', 'sogocalendar', 'sogoactivesync',
274
+ 'shadowaddress',
275
+ 'displayedInGlobalAddressBook'],
276
+ 'memberOfGroup': groups,
277
+ # shadowAccount integration.
278
+ 'shadowLastChange': get_days_of_today(),
279
+ # Amavisd integration.
280
+ 'amavisLocal': 'TRUE',
281
+ })
282
+
283
+ return dn, _ldif
284
+
285
+
286
+ if len(sys.argv) != 2 or len(sys.argv) > 2:
287
+ print("""Usage: $ python3 %s users.csv""" % sys.argv[0])
288
+ usage()
289
+ sys.exit()
290
+ else:
291
+ CSV = sys.argv[1]
292
+ if not os.path.exists(CSV):
293
+ print("Error: file not exist:", CSV)
294
+ sys.exit()
295
+
296
+ ldif_file = CSV + '.ldif'
297
+
298
+ # Remove exist LDIF file.
299
+ if os.path.exists(ldif_file):
300
+ print("< INFO > Remove exist file:", ldif_file)
301
+ os.remove(ldif_file)
302
+
303
+ # Read user list.
304
+ userList = open(CSV, 'rb')
305
+
306
+ # Convert to LDIF format.
307
+ for entry in userList.readlines():
308
+ entry = entry.decode().rstrip()
309
+ domain, username, passwd, cn, quota, groups = re.split(r'\s?,\s?', entry)
310
+ dn, data = ldif_mailuser(domain, username, passwd, cn, quota, groups)
311
+
312
+ # Write LDIF data.
313
+ result = open(ldif_file, 'a')
314
+ ldif_writer = ldif.LDIFWriter(result)
315
+ ldif_writer.unparse(dn, data)
316
+
317
+
318
+ ldif_file_path = os.path.abspath(ldif_file)
319
+ print("< INFO > User data are stored in %s, you can verify it before importing it." % ldif_file_path)
320
+ print("< INFO > You can import it with below command:")
321
+ print("ldapadd -x -D %s -W -f %s" % (BINDDN, ldif_file_path))
322
+
323
+ # Prompt to import user data.
324
+ """
325
+ answer = raw_input("Would you like to import them now? [y|N]").lower().strip()
326
+
327
+ if answer == 'y':
328
+ # Import data.
329
+ conn = ldap.initialize(LDAP_URI)
330
+ conn.set_option(ldap.OPT_PROTOCOL_VERSION, 3) # Use LDAP v3
331
+ conn.bind_s(BINDDN, BINDPW)
332
+ conn.unbind()
333
+ else:
334
+ pass
335
+ """