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