summaryrefslogtreecommitdiff
path: root/localmkpostfixvirtual
blob: 0328b097401e4a8bb3fad805015551af062a6144 (plain)
  1. #!/bin/bash
  2. # Generate virtual file for postfix
  3. #
  4. # Each user should have space-separated hints like "mailname1@ mailname2@gid1 mailname3@gid2"
  5. # stored in the "Other" field (using chfn).
  6. #
  7. # The user of each mailgroup should have hints like "@domain1 @domain2" for each hosted domain
  8. # stored in the "Other" field (using chfn).
  9. #TODO: reuse getent requests (drastically improves speed with multiple domains)
  10. function get_fullname_field() { getent passwd $1 | awk -F: '{print $5}' | awk -F, '{print $1}'; }
  11. function get_roomnumber_field() { getent passwd $1 | awk -F: '{print $5}' | awk -F, '{print $2}'; }
  12. function get_other_field() { getent passwd $1 | awk -F: '{print $5}' | awk -F, '{print $5}'; }
  13. function get_groups() { groups $1 | sed -e 's/^.*: //' -e "s/\( \+\|^\)$1\( \+\|$\)/\1/"; }
  14. function get_domain() { echo $1 | egrep "^@[\.[:alnum:]]+$" | sed -e 's/@//'; }
  15. function get_account() { echo $1 | egrep "^[\.[:alnum:]]+@($gid)?$" | sed -e 's/@.*//'; }
  16. loop=""
  17. for gid in $@; do
  18. for maildomainchunk in `get_other_field $gid`; do
  19. for maildomain in `get_domain $maildomainchunk`; do
  20. if [ $loop ]; then
  21. echo
  22. echo "##################################################################"
  23. echo
  24. fi
  25. loop=true
  26. echo "$maildomain VIRTUAL"
  27. echo "postmaster@$maildomain root"
  28. echo
  29. mailusers=""
  30. for mailgroup in `get_roomnumber_field $gid`; do
  31. mailusers="$mailusers `members $mailgroup`"
  32. done
  33. # for uid in `members $gid | sort`; do
  34. for uid in `echo $mailusers | tsort | uniq | sort`; do
  35. echo "# `get_fullname_field $uid` (`get_groups $uid`)"
  36. uid_seen=""
  37. for mailaccountchunk in `get_other_field $uid`; do
  38. for mailaccount in `get_account $mailaccountchunk`; do
  39. echo "$mailaccount@$maildomain $uid"
  40. uid_seen=true
  41. done
  42. done
  43. if [ ! $uid_seen ]; then
  44. echo "#WARNING: No addresses for $uid"
  45. fi
  46. echo
  47. done
  48. done
  49. done
  50. done