summaryrefslogtreecommitdiff
path: root/localmailtransportupdate
blob: 474750cefab4ea3d6f83b4298855382d409c6d49 (plain)
  1. #!/bin/sh
  2. #
  3. # /usr/local/sbin/localmailtransportinit
  4. # Copyright 2006 Jonas Smedegaard <dr@jones.dk>
  5. #
  6. # $Id: localmailtransportupdate,v 1.3 2006-07-28 17:38:38 jonas Exp $
  7. #
  8. # Setup postfix transport map for a redpill organisation
  9. #
  10. set -e
  11. PRG=`basename $0`
  12. TEMP=$(getopt -s sh -o r:fid:h -l redpill:,force,init,diffopts:,help -n "$PRG" -- "$@")
  13. if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
  14. eval set -- "$TEMP"
  15. function usage() {
  16. echo "Usage: $PRG [opts...] [redpill]"
  17. echo
  18. echo " -r, --redpill Redpill context"
  19. echo " (default: read /etc/local-ORG/redpill)"
  20. echo " -f, --force Update without asking for confirmation"
  21. echo " -i, --init Setup postfix to use the transport map"
  22. echo " -d, --diffopts=diffopts Extra options applied to diff when"
  23. echo " comparing current and new map"
  24. echo " -h|--help This help text"
  25. exit 1
  26. }
  27. function exit1() {
  28. echo "Error: $1"
  29. echo "Exiting..."
  30. exit 1
  31. }
  32. redpill=""
  33. force=""
  34. init=""
  35. diffopts=""
  36. while true ; do
  37. case "$1" in
  38. -f|--force) force="1"; shift;;
  39. -i|--init) init="1"; shift;;
  40. -d|--diffopts) diffopts="$1"; shift 2;;
  41. -h|--help) usage;;
  42. --) shift; break;;
  43. *) exit1 "Internal error!";;
  44. esac
  45. done
  46. firstitem() {
  47. file="$1"
  48. cat "$file" | grep -v '^#' | sed 's/#.*//' | head -n 1
  49. }
  50. items() {
  51. file="$1"
  52. cat "$file" | grep -v '^#' | sed 's/#.*//'
  53. }
  54. mktransportmap() {
  55. redpill="$1"
  56. redpilldir="/etc/local-$redpill/"
  57. realms="$(items "$redpilldir/realms")"
  58. for realm in $realms; do
  59. realmdir="$redpilldir/$realm"
  60. [ -d "$realmdir" ] || continue
  61. mailhost="$(firstitem "$realmdir/mailhost")"
  62. maildomains="$(items "$realmdir/maildomains")"
  63. for maildomain in $maildomains; do
  64. echo "$maildomain relay:$mailhost:submission"
  65. done
  66. done
  67. }
  68. case $# in
  69. 0) if [ -z "$redpill" ]; then redpill="$(firstitem "/etc/local-ORG/redpill")"; fi;;
  70. 1) redpill="$1";;
  71. *) exit1 "Wrong number of arguments!";;
  72. esac
  73. [ -n "$redpill" ] || exit1 "Redpill context missing!"
  74. mktransportmap "$redpill" > /etc/postfix/transport.new
  75. if [ -f /etc/postfix/transport.addon ]; then
  76. cat /etc/postfix/transport.addon >> /etc/postfix/transport.new
  77. fi
  78. ( cd /etc/postfix && diff $diffopts transport transport.new )
  79. if [ "$force" = "1" ]; then
  80. do_update="y"
  81. else
  82. echo -n "Above is the intended changes. OK to update (y/N)? "
  83. read do_update
  84. fi
  85. case $do_update in
  86. y|Y)
  87. mv /etc/postfix/transport.new /etc/postfix/transport
  88. postmap /etc/postfix/transport
  89. echo "Changes applied!"
  90. ;;
  91. *)
  92. exit1 "Aborted!"
  93. ;;
  94. esac
  95. if [ "$init" = "1" ]; then
  96. postconf -e "transport_maps = hash:/etc/postfix/transport"
  97. invoke-rc.d postfix reload
  98. fi