PageRenderTime 26ms CodeModel.GetById 16ms RepoModel.GetById 2ms app.codeStats 0ms

/iRedMail/tools/create_mail_user_OpenLDAP.sh

https://bitbucket.org/dineshkummarc/iredmail
Shell | 282 lines | 160 code | 40 blank | 82 comment | 12 complexity | a2062ee520d68e9fc083b6f05fd491b0 MD5 | raw file
  1. #!/usr/bin/env bash
  2. # Author: Zhang Huangbin (zhb _at_ iredmail.org)
  3. # Purpose: Add new OpenLDAP user for postfix mail server.
  4. # Project: iRedMail (http://www.iredmail.org/)
  5. # --------------------------- WARNING ------------------------------
  6. # This script only works under iRedMail >= 0.3.3 due to ldap schema
  7. # changes.
  8. # ------------------------------------------------------------------
  9. # --------------------------- USAGE --------------------------------
  10. # Please change variables below to fit your env:
  11. # - In 'Global Setting' section:
  12. # * STORAGE_BASE_DIRECTORY
  13. #
  14. # - In 'LDAP Setting' section:
  15. # * LDAP_SUFFIX
  16. # * BINDDN
  17. # * BINDPW
  18. # * QUOTA
  19. #
  20. # - In 'Virtual Domains & Users' section:
  21. # * QUOTA
  22. # * TRANSPORT
  23. # * CRYPT_MECH # SSHA is recommended.
  24. # * DEFAULT_PASSWD
  25. # * USE_DEFAULT_PASSWD
  26. # * USE_NAME_AS_PASSWD
  27. #
  28. # - Pure-FTPd integration:
  29. # * PUREFTPD_INTEGRATION # <- set to 'YES' if you want to integrate it.
  30. # * FTP_STORAGE_BASE_DIRECTORY # <- directory used to store FTP data.
  31. #
  32. # - Optional variables:
  33. # * SEND_WELCOME_MSG
  34. # ------------------------------------------------------------------
  35. # Source functions.
  36. . ../conf/global
  37. . ../conf/core
  38. # ----------------------------------------------
  39. # ------------ Global Setting ------------------
  40. # ----------------------------------------------
  41. # Storage base directory used to store users' mail.
  42. # mailbox of LDAP user will be:
  43. # ${STORAGE_BASE_DIRECTORY}/${DOMAIN_NAME}/${USERNAME}/
  44. # Such as:
  45. # /var/vmail/vmail1/iredmail.org/zhb/
  46. # -------------------|===========|-----|
  47. # STORAGE_BASE_DIRECTORY|DOMAIN_NAME|USERNAME
  48. #
  49. STORAGE_BASE_DIRECTORY="/var/vmail/vmail1"
  50. # ------------------------------------------------------------------
  51. # -------------------------- LDAP Setting --------------------------
  52. # ------------------------------------------------------------------
  53. LDAP_SUFFIX="dc=example,dc=com"
  54. # Setting 'BASE_DN'.
  55. BASE_DN="o=domains,${LDAP_SUFFIX}"
  56. # Setting 'DOMAIN_NAME' and DOMAIN_DN':
  57. # * DOMAIN will be used in mail address: ${USERNAME}@${DOMAIN}
  58. # * DOMAIN_DN will be used in LDAP dn.
  59. DOMAIN_NAME="$1"
  60. DOMAIN_DN="domainName=${DOMAIN_NAME}"
  61. OU_USER_DN="ou=Users"
  62. # ---------- rootdn of LDAP Server ----------
  63. # Setting rootdn of LDAP.
  64. BINDDN="cn=Manager,${LDAP_SUFFIX}"
  65. # Setting rootpw of LDAP.
  66. BINDPW='passwd'
  67. # ---------- Virtual Domains & Users --------------
  68. # Set default quota for LDAP users: 104857600 = 100M
  69. QUOTA='1048576000'
  70. # Default MTA Transport (Defined in postfix master.cf).
  71. TRANSPORT='dovecot'
  72. # Password setting.
  73. CRYPT_MECH='SSHA' # MD5, SSHA. SSHA is recommended.
  74. DEFAULT_PASSWD='888888'
  75. USE_DEFAULT_PASSWD='NO'
  76. USE_NAME_AS_PASSWD='YES'
  77. # ------------------------------------------------------------------
  78. # -------------------- Pure-FTPd Integration -----------------------
  79. # ------------------------------------------------------------------
  80. # Add objectClass and attributes for pure-ftpd integration.
  81. # Note: You must inlucde pureftpd.schema in OpenLDAP slapd.conf first.
  82. PUREFTPD_INTEGRATION='NO'
  83. FTP_STORAGE_BASE_DIRECTORY='/home/ftp'
  84. # ------------------------------------------------------------------
  85. # ------------------------- Welcome Msg ----------------------------
  86. # ------------------------------------------------------------------
  87. # Send a welcome mail after user created.
  88. SEND_WELCOME_MSG='NO'
  89. # Set welcome mail info.
  90. WELCOME_MSG_SUBJECT="Welcome!"
  91. WELCOME_MSG_BODY="Welcome, new user."
  92. # -------------------------------------------
  93. # ----------- End Global Setting ------------
  94. # -------------------------------------------
  95. # Time stamp, will be appended in maildir.
  96. DATE="$(date +%Y.%m.%d.%H.%M.%S)"
  97. STORAGE_BASE="$(dirname ${STORAGE_BASE_DIRECTORY})"
  98. STORAGE_NODE="$(basename ${STORAGE_BASE_DIRECTORY})"
  99. add_new_domain()
  100. {
  101. domain="$(echo ${1} | tr '[A-Z]' '[a-z]')"
  102. ldapsearch -x -D "${BINDDN}" -w "${BINDPW}" -b "${BASE_DN}" | grep "domainName: ${domain}" >/dev/null
  103. if [ X"$?" != X"0" ]; then
  104. echo "Add new domain: ${domain}."
  105. ldapadd -x -D "${BINDDN}" -w "${BINDPW}" <<EOF
  106. dn: ${DOMAIN_DN},${BASE_DN}
  107. objectClass: mailDomain
  108. domainName: ${domain}
  109. mtaTransport: ${TRANSPORT}
  110. accountStatus: active
  111. enabledService: mail
  112. EOF
  113. else
  114. :
  115. fi
  116. ldapadd -x -D "${BINDDN}" -w "${BINDPW}" <<EOF
  117. dn: ${OU_USER_DN},${DOMAIN_DN},${BASE_DN}
  118. objectClass: organizationalUnit
  119. objectClass: top
  120. ou: Users
  121. EOF
  122. ldapadd -x -D "${BINDDN}" -w "${BINDPW}" <<EOF
  123. dn: ou=Groups,${DOMAIN_DN},${BASE_DN}
  124. objectClass: organizationalUnit
  125. objectClass: top
  126. ou: Groups
  127. EOF
  128. ldapadd -x -D "${BINDDN}" -w "${BINDPW}" <<EOF
  129. dn: ou=Aliases,${DOMAIN_DN},${BASE_DN}
  130. objectClass: organizationalUnit
  131. objectClass: top
  132. ou: Aliases
  133. EOF
  134. ldapadd -x -D "${BINDDN}" -w "${BINDPW}" <<EOF
  135. dn: ou=Externals,${DOMAIN_DN},${BASE_DN}
  136. objectClass: organizationalUnit
  137. objectClass: top
  138. ou: Externals
  139. EOF
  140. }
  141. add_new_user()
  142. {
  143. USERNAME="$(echo $1 | tr [A-Z] [a-z])"
  144. MAIL="$( echo $2 | tr [A-Z] [a-z])"
  145. # Create template LDIF file for this new user and add it.
  146. # If you do *NOT* want to keep rootpw in script, use '-W' instead of
  147. # '-w "${BINDPW}".
  148. maildir="$( hash_domain ${DOMAIN_NAME})/$( hash_maildir ${USERNAME} )"
  149. # Generate user password.
  150. if [ X"${USE_DEFAULT_PASSWD}" == X"YES" ]; then
  151. PASSWD="$(slappasswd -h {${CRYPT_MECH}} -s ${DEFAULT_PASSWD})"
  152. else
  153. PASSWD="$(slappasswd -h {${CRYPT_MECH}} -s ${USERNAME})"
  154. fi
  155. if [ X"${PUREFTPD_INTEGRATION}" == X"YES" ]; then
  156. LDIF_PUREFTPD_USER="objectClass: PureFTPdUser
  157. FTPStatus: enabled
  158. FTPQuotaFiles: 50
  159. FTPQuotaMBytes: 10
  160. FTPDownloadBandwidth: 50
  161. FTPUploadBandwidth: 50
  162. FTPDownloadRatio: 5
  163. FTPUploadRatio: 1
  164. FTPHomeDir: ${FTP_STORAGE_BASE_DIRECTORY}/${maildir}/ftp/
  165. "
  166. else
  167. LDIF_PUREFTPD_USER=''
  168. fi
  169. ldapadd -x -D "${BINDDN}" -w "${BINDPW}" <<EOF
  170. dn: mail=${MAIL},${OU_USER_DN},${DOMAIN_DN},${BASE_DN}
  171. objectClass: inetOrgPerson
  172. objectClass: shadowAccount
  173. objectClass: amavisAccount
  174. objectClass: mailUser
  175. objectClass: top
  176. accountStatus: active
  177. storageBaseDirectory: ${STORAGE_BASE}
  178. homeDirectory: ${STORAGE_BASE_DIRECTORY}/${maildir}
  179. mailMessageStore: ${STORAGE_NODE}/${maildir}
  180. mail: ${MAIL}
  181. mailQuota: ${QUOTA}
  182. userPassword: ${PASSWD}
  183. cn: ${USERNAME}
  184. sn: ${USERNAME}
  185. givenName: ${USERNAME}
  186. uid: ${USERNAME}
  187. shadowLastChange: 0
  188. amavisLocal: true
  189. enabledService: internal
  190. enabledService: doveadm
  191. enabledService: lib-storage
  192. enabledService: mail
  193. enabledService: pop3
  194. enabledService: pop3secured
  195. enabledService: imap
  196. enabledService: imapsecured
  197. enabledService: managesieve
  198. enabledService: managesievesecured
  199. enabledService: sieve
  200. enabledService: sievesecured
  201. enabledService: smtp
  202. enabledService: deliver
  203. enabledService: lda
  204. enabledService: forward
  205. enabledService: senderbcc
  206. enabledService: recipientbcc
  207. enabledService: shadowaddress
  208. enabledService: displayedInGlobalAddressBook
  209. ${LDIF_PUREFTPD_USER}
  210. EOF
  211. }
  212. send_welcome_mail()
  213. {
  214. MAIL="$1"
  215. echo "Send a welcome mail to new user: ${MAIL}"
  216. echo "${WELCOME_MSG_BODY}" | mail -s "${WELCOME_MSG_SUBJECT}" ${MAIL}
  217. }
  218. usage()
  219. {
  220. echo "Usage:"
  221. echo -e "\t$0 DOMAIN USERNAME"
  222. echo -e "\t$0 DOMAIN USER1 USER2 USER3..."
  223. }
  224. if [ $# -lt 2 ]; then
  225. usage
  226. else
  227. # Promopt to check settings.
  228. [ X"${LDAP_SUFFIX}" == X"dc=example,dc=com" ] && echo "You should change 'LDAP_SUFFIX' in $0."
  229. # Get domain name.
  230. DOMAIN_NAME="$1"
  231. shift 1
  232. add_new_domain ${DOMAIN_NAME}
  233. for i in $@
  234. do
  235. USERNAME="$i"
  236. MAIL="${USERNAME}@${DOMAIN_NAME}"
  237. # Add new user in LDAP.
  238. add_new_user ${USERNAME} ${MAIL}
  239. # Send welcome msg to new user.
  240. [ X"${SEND_WELCOME_MSG}" == X"YES" ] && send_welcome_mail ${MAIL}
  241. done
  242. fi