5 # Configure Exim4 for GForge
6 # Christian Bayle, Roland Mas, debian-sf (GForge for Debian)
7 # Converted to Exim4 by Guillem Jover
11 if [ $(id -u) != 0 ] ; then
12 echo "You must be root to run this, please enter passwd"
17 # Handle the three configuration setups
19 cfg_exim4=/etc/exim4/exim4.conf
20 cfg_exim4_templ=/etc/exim4/exim4.conf.template
21 cfg_exim4_split_main=/etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs
22 cfg_exim4_split_router=/etc/exim4/conf.d/router/01_gforge_forwards
24 cfg_exim4_main="$cfg_exim4_templ $cfg_exim4_split_main"
25 cfg_exim4_router="$cfg_exim4_templ"
27 if [ -e $cfg_exim4 ]; then
28 cfg_exim4_main="$cfg_exim4_main $cfg_exim4"
29 cfg_exim4_router="$cfg_exim4_router $cfg_exim4"
32 cfg_aliases=/etc/aliases
33 cfg_aliases_gforge=$cfg_aliases.gforge-new
35 pattern=$(basename $0).XXXXXX
42 cp -a $cfg_aliases $cfg_aliases_gforge
44 # Redirect "noreply" mail to the bit bucket (if need be)
45 noreply_to_bitbucket=$(perl -e'require "/etc/gforge/local.pl"; print "$noreply_to_bitbucket\n";')
46 if [ "$noreply_to_bitbucket" = "true" ] ; then
47 if ! grep -q "^noreply:" $cfg_aliases_gforge; then
48 echo "### Next line inserted by GForge install" >> $cfg_aliases_gforge
49 echo "noreply: /dev/null" >> $cfg_aliases_gforge
53 # Redirect "gforge" mail to the site admin
54 server_admin=$(perl -e'require "/etc/gforge/local.pl"; print "$server_admin\n";')
55 if ! grep -q "^gforge:" $cfg_aliases_gforge; then
56 echo "### Next line inserted by GForge install" >> $cfg_aliases_gforge
57 echo "gforge: $server_admin" >> $cfg_aliases_gforge
61 # Modify exim4 configurations
63 # First, get the list of local domains right
65 for m in $cfg_exim4_main; do
66 cfg_gforge_main=$m.gforge-new
67 tmp1=$(mktemp /tmp/$pattern)
69 cp -a $m $cfg_gforge_main
72 require ("/etc/gforge/local.pl") ;
74 while (($l = <>) !~ /^\s*domainlist\s*local_domains/) {
76 $seen_gf_domains = 1 if ($l =~ /\s*GFORGE_DOMAINS=/);
77 $seen_pg_servers = 1 if ($l =~ m,hide pgsql_servers = $sys_dbhost.*/gforge_mta,);
79 print "hide pgsql_servers = $sys_dbhost/$sys_dbname/gforge_mta/gforge_mta\n" unless $seen_pg_servers;
80 print "GFORGE_DOMAINS=$sys_users_host:$sys_lists_host\n" unless $seen_gf_domains;
82 $l .= ":GFORGE_DOMAINS" unless ($l =~ /^[^#]*GFORGE_DOMAINS/);
84 while (<>) { print; };
85 ' < $cfg_gforge_main > $tmp1
87 cat $tmp1 > $cfg_gforge_main
91 # Second, insinuate our forwarding rules in the directors section
94 require ("/etc/gforge/local.pl") ;
96 my $gf_block = "# BEGIN GFORGE BLOCK -- DO NOT EDIT #
97 # You may move this block around to accomodate your local needs as long as you
98 # keep it in the Directors Configuration section (between the second and the
99 # third occurences of a line containing only the word \"end\")
102 domains = $sys_users_host
104 file_transport = address_file
105 data = \${lookup pgsql {select email from mta_users where login=".chr(39)."\$local_part".chr(39)."}{\$value}}
109 forward_for_gforge_lists:
110 domains = $sys_lists_host
112 pipe_transport = address_pipe
113 data = \${lookup pgsql {select post_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
117 forward_for_gforge_lists_owner:
118 domains = $sys_lists_host
119 local_part_suffix = -owner
121 pipe_transport = address_pipe
122 data = \${lookup pgsql {select owner_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
126 forward_for_gforge_lists_request:
127 domains = $sys_lists_host
128 local_part_suffix = -request
130 pipe_transport = address_pipe
131 data = \${lookup pgsql {select request_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
135 forward_for_gforge_lists_admin:
136 domains = $sys_lists_host
137 local_part_suffix = -admin
139 pipe_transport = address_pipe
140 data = \${lookup pgsql {select admin_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
144 forward_for_gforge_lists_bounces:
145 domains = $sys_lists_host
146 local_part_suffix = -bounces
148 pipe_transport = address_pipe
149 data = \${lookup pgsql {select bounces_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
153 forward_for_gforge_lists_confirm:
154 domains = $sys_lists_host
155 local_part_suffix = -confirm
157 pipe_transport = address_pipe
158 data = \${lookup pgsql {select confirm_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
162 forward_for_gforge_lists_join:
163 domains = $sys_lists_host
164 local_part_suffix = -join
166 pipe_transport = address_pipe
167 data = \${lookup pgsql {select join_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
171 forward_for_gforge_lists_leave:
172 domains = $sys_lists_host
173 local_part_suffix = -leave
175 pipe_transport = address_pipe
176 data = \${lookup pgsql {select leave_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
180 forward_for_gforge_lists_subscribe:
181 domains = $sys_lists_host
182 local_part_suffix = -subscribe
184 pipe_transport = address_pipe
185 data = \${lookup pgsql {select subscribe_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
189 forward_for_gforge_lists_unsubscribe:
190 domains = $sys_lists_host
191 local_part_suffix = -unsubscribe
193 pipe_transport = address_pipe
194 data = \${lookup pgsql {select unsubscribe_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
201 ' > $cfg_exim4_split_router
203 for r in $cfg_exim4_router; do
206 cfg_gforge_router=$r.gforge-new
207 tmp1=$(mktemp /tmp/$pattern)
209 cp -a $cfg_gforge_router $tmp1
212 $routerfname = shift ;
213 open ROUTERS, $routerfname || die $!;
214 my @gf_block = <ROUTERS>;
219 last if /^\s*begin\s*routers\s*$/;
222 my $gf_block_done = 0;
225 last if /^\s*begin\s*$/;
226 if (/^# BEGIN GFORGE BLOCK -- DO NOT EDIT #/) {
228 push @line_buf, @gf_block unless $gf_block_done;
231 push @line_buf, $_ unless $in_gf_block;
232 $in_gf_block = 0 if /^# END GFORGE BLOCK #/;
235 print @gf_block unless $gf_block_done;
237 while (<>) { print; };
238 ' $cfg_exim4_split_router < $tmp1 > $cfg_gforge_router
246 [ -x /usr/bin/newaliases ] && newaliases
247 invoke-rc.d exim4 restart
251 tmp1=$(mktemp /tmp/$pattern)
253 cp -a $cfg_aliases $cfg_aliases_gforge
255 grep -v "^gforge:" $cfg_aliases_gforge > $tmp1
256 # Redirect "noreply" mail to the bit bucket (if need be)
257 noreply_to_bitbucket=$(perl -e'require "/etc/gforge/local.pl"; print "$noreply_to_bitbucket\n";')
258 if [ "$noreply_to_bitbucket" = "true" ] ; then
259 grep -v "^noreply:" $tmp1 > $cfg_aliases_gforge
261 cat $tmp1 > $cfg_aliases_gforge
266 for m in $cfg_exim4_main; do
267 cfg_gforge_main=$m.gforge-new
268 tmp1=$(mktemp /tmp/$pattern)
272 # First, replace the list of local domains
275 last if /^\s*domainlist\s*local_domains/;
276 print unless /\s*GFORGE_DOMAINS=/;
279 /^(\s*domainlist\s*local_domains\s*=\s*)(\S+)/;
280 my $l = $1 . join (":", grep(!/GFORGE_DOMAINS/, (split ":", $2)));
282 while (<>) { print; };
283 ' < $tmp1 > $cfg_gforge_main
288 if [ -f $cfg_exim4_split_router ]
290 mv $cfg_exim4_split_router $cfg_exim4_split_router.gforge-new
293 for r in $cfg_exim4_router; do
294 cfg_gforge_router=$r.gforge-new
295 tmp1=$(mktemp /tmp/$pattern)
297 cp -a $cfg_gforge_router $tmp1
299 # Second, kill our forwarding rules
303 last if /^\s*begin\s*routers\s*$/;
307 last if /^\s*begin\s*$/;
308 $in_gf_block = 1 if /^# BEGIN GFORGE BLOCK -- DO NOT EDIT #/;
309 print unless $in_gf_block;
310 $in_gf_block = 0 if /^# END GFORGE BLOCK #/;
313 while (<>) { print; };
314 ' < $tmp1 > $cfg_gforge_router
324 echo "Usage: $0 {configure|configure-files|purge|purge-files}"