PageRenderTime 48ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/iRedMail/tools/create_mail_user_OpenLDAP.sh

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