summaryrefslogtreecommitdiff
path: root/localmailtransportupdate
blob: e3676b40579e05932f642eb8346b0ca420dd878d (plain)
  1. #!/bin/sh
  2. #
  3. # /usr/local/sbin/localmailtransportinit
  4. # Copyright 2006 Jonas Smedegaard <dr@jones.dk>
  5. #
  6. # $Id: localmailtransportupdate,v 1.9 2007-07-14 13:16:54 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. usage() {
  16. echo >&2 "Usage: $PRG [opts...] [redpill]"
  17. echo >&2
  18. echo >&2 " -r, --redpill Redpill context"
  19. echo >&2 " (default: read /etc/local-ORG/redpill)"
  20. echo >&2 " -f, --force Update without asking for confirmation"
  21. echo >&2 " -i, --init Setup postfix to use the transport map"
  22. echo >&2 " -d, --diffopts=diffopts Extra options applied to diff when"
  23. echo >&2 " comparing current and new map"
  24. echo >&2 " -h|--help This help text"
  25. exit 1
  26. }
  27. exit1() {
  28. echo >&2 "Error: $1"
  29. echo >&2 "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. echo "# NB! This file was auto-generated by $PRG"
  57. echo
  58. redpilldir="/etc/local-$redpill/"
  59. realms="$(items "$redpilldir/realms")"
  60. thisrealm="$(cat /etc/local-ORG/realm || dnsdomainname | tr '[a-z]' '[A-Z]')"
  61. for realm in $realms; do
  62. [ "$thisrealm" = "$realm" ] && continue
  63. realmdir="$redpilldir/$realm"
  64. [ -d "$realmdir" ] || continue
  65. mailhost="$(firstitem "$realmdir/mailhost")"
  66. maildomains="$(items "$realmdir/maildomains")"
  67. for maildomain in $maildomains; do
  68. echo "$maildomain relay:[$mailhost]:submission"
  69. done
  70. done
  71. }
  72. case $# in
  73. 0) if [ -z "$redpill" ]; then redpill="$(firstitem "/etc/local-ORG/redpill")"; fi;;
  74. 1) redpill="$1";;
  75. *) exit1 "Wrong number of arguments!";;
  76. esac
  77. [ -n "$redpill" ] || exit1 "Redpill context missing!"
  78. mktransportmap "$redpill" > /etc/postfix/transport.new
  79. if [ -f /etc/postfix/transport.addon ]; then
  80. cat /etc/postfix/transport.addon >> /etc/postfix/transport.new
  81. fi
  82. ( cd /etc/postfix && diff $diffopts transport transport.new )
  83. if [ "$force" = "1" ]; then
  84. do_update="y"
  85. else
  86. echo -n "Above is the intended changes. OK to update (y/N)? "
  87. read do_update
  88. fi
  89. case $do_update in
  90. y|Y)
  91. mv /etc/postfix/transport.new /etc/postfix/transport
  92. postmap /etc/postfix/transport
  93. echo >&2 "Changes applied!"
  94. ;;
  95. *)
  96. exit1 "Aborted!"
  97. ;;
  98. esac
  99. if [ "$init" = "1" ]; then
  100. postconf -e "transport_maps = hash:/etc/postfix/transport"
  101. invoke-rc.d postfix reload
  102. fi