summaryrefslogtreecommitdiff
path: root/localmailtransportupdate
blob: 77ae4b92b591f158b07d38848b7e8788245b2539 (plain)
  1. #!/bin/sh
  2. #
  3. # /usr/local/sbin/localmailtransportinit
  4. # Copyright 2006 Jonas Smedegaard <dr@jones.dk>
  5. #
  6. # $Id: localmailtransportupdate,v 1.5 2006-10-23 21:48:06 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 "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. 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. echo "# NB! This file was auto-generated by $PRG"
  57. echo
  58. redpilldir="/etc/local-$redpill/"
  59. realms="$(items "$redpilldir/realms")"
  60. for realm in $realms; do
  61. realmdir="$redpilldir/$realm"
  62. [ -d "$realmdir" ] || continue
  63. mailhost="$(firstitem "$realmdir/mailhost")"
  64. maildomains="$(items "$realmdir/maildomains")"
  65. for maildomain in $maildomains; do
  66. echo "$maildomain relay:$mailhost:submission"
  67. done
  68. done
  69. }
  70. case $# in
  71. 0) if [ -z "$redpill" ]; then redpill="$(firstitem "/etc/local-ORG/redpill")"; fi;;
  72. 1) redpill="$1";;
  73. *) exit1 "Wrong number of arguments!";;
  74. esac
  75. [ -n "$redpill" ] || exit1 "Redpill context missing!"
  76. mktransportmap "$redpill" > /etc/postfix/transport.new
  77. if [ -f /etc/postfix/transport.addon ]; then
  78. cat /etc/postfix/transport.addon >> /etc/postfix/transport.new
  79. fi
  80. ( cd /etc/postfix && diff $diffopts transport transport.new )
  81. if [ "$force" = "1" ]; then
  82. do_update="y"
  83. else
  84. echo -n "Above is the intended changes. OK to update (y/N)? "
  85. read do_update
  86. fi
  87. case $do_update in
  88. y|Y)
  89. mv /etc/postfix/transport.new /etc/postfix/transport
  90. postmap /etc/postfix/transport
  91. echo "Changes applied!"
  92. ;;
  93. *)
  94. exit1 "Aborted!"
  95. ;;
  96. esac
  97. if [ "$init" = "1" ]; then
  98. postconf -e "transport_maps = hash:/etc/postfix/transport"
  99. invoke-rc.d postfix reload
  100. fi