3 # Configure Exim4 for GForge
4 # Christian Bayle, Roland Mas, debian-sf (GForge for Debian)
5 # Converted to Exim4 by Guillem Jover
9 if [ $(id -u) != 0 ] ; then
10 echo "You must be root to run this, please enter passwd"
15 # Handle the three configuration setups
17 cfg_exim4=/etc/exim4/exim4.conf
18 cfg_exim4_templ=/etc/exim4/exim4.conf.template
19 cfg_exim4_split_main=/etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs
20 cfg_exim4_split_router=/etc/exim4/conf.d/router/01_gforge_forwards
22 cfg_exim4_main="$cfg_exim4_templ $cfg_exim4_split_main"
23 cfg_exim4_router="$cfg_exim4_templ"
25 if [ -e $cfg_exim4 ]; then
26 cfg_exim4_main="$cfg_exim4_main $cfg_exim4"
27 cfg_exim4_router="$cfg_exim4_router $cfg_exim4"
30 cfg_aliases=/etc/aliases
31 cfg_aliases_gforge=$cfg_aliases.gforge-new
33 pattern=$(basename $0).XXXXXX
40 cp -a $cfg_aliases $cfg_aliases_gforge
42 # Redirect "noreply" mail to the bit bucket (if need be)
43 noreply_to_bitbucket=$(forge_get_config noreply_to_bitbucket)
44 if [ "$noreply_to_bitbucket" != "no" ] ; then
45 if ! grep -q "^noreply:" $cfg_aliases_gforge; then
46 echo "### Next line inserted by GForge install" >> $cfg_aliases_gforge
47 echo "noreply: :blackhole:" >> $cfg_aliases_gforge
51 # Redirect "gforge" mail to the site admin
52 server_admin=$(forge_get_config admin_email)
53 if ! grep -q "^gforge:" $cfg_aliases_gforge; then
54 echo "### Next line inserted by GForge install" >> $cfg_aliases_gforge
55 echo "gforge: $server_admin" >> $cfg_aliases_gforge
59 # Modify exim4 configurations
61 # First, get the list of local domains right
63 for m in $cfg_exim4_main; do
64 cfg_gforge_main=$m.gforge-new
65 tmp1=$(mktemp /tmp/$pattern)
67 cp -a $m $cfg_gforge_main
70 require ("/usr/share/gforge/lib/include.pl") ;
72 while (($l = <>) !~ /^\s*domainlist\s*local_domains/) {
74 $seen_gf_domains = 1 if ($l =~ /\s*GFORGE_DOMAINS=/);
75 $seen_pg_servers = 1 if ($l =~ m,hide pgsql_servers = .*./var/run/postgresql/.s.PGSQL.5432..*/${sys_dbuser}_mta,);
77 print "hide pgsql_servers = (/var/run/postgresql/.s.PGSQL.5432)/mail/Debian-exim/bogus:(/var/run/postgresql/.s.PGSQL.5432)/$sys_dbname/${sys_dbuser}_mta/${sys_dbuser}_mta\n" unless $seen_pg_servers;
78 print "GFORGE_DOMAINS=$sys_users_host:$sys_lists_host\n" unless $seen_gf_domains;
80 $l .= ":GFORGE_DOMAINS" unless ($l =~ /^[^#]*GFORGE_DOMAINS/);
82 while (<>) { print; };
83 ' < $cfg_gforge_main > $tmp1
85 cat $tmp1 > $cfg_gforge_main
89 # Second, insinuate our forwarding rules in the directors section
92 require ("/usr/share/gforge/lib/include.pl") ;
94 my $gf_block = "# BEGIN GFORGE BLOCK -- DO NOT EDIT #
95 # You may move this block around to accomodate your local needs as long as you
96 # keep it in the Directors Configuration section (between the second and the
97 # third occurences of a line containing only the word \"end\")
100 domains = $sys_users_host
102 file_transport = address_file
103 data = \${lookup pgsql {select email from mta_users where login=".chr(39)."\$local_part".chr(39)."}{\$value}}
107 forward_for_gforge_lists:
108 domains = $sys_lists_host
110 pipe_transport = address_pipe
111 data = \${lookup pgsql {select post_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
115 forward_for_gforge_lists_owner:
116 domains = $sys_lists_host
117 local_part_suffix = -owner
119 pipe_transport = address_pipe
120 data = \${lookup pgsql {select owner_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
124 forward_for_gforge_lists_request:
125 domains = $sys_lists_host
126 local_part_suffix = -request
128 pipe_transport = address_pipe
129 data = \${lookup pgsql {select request_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
133 forward_for_gforge_lists_admin:
134 domains = $sys_lists_host
135 local_part_suffix = -admin
137 pipe_transport = address_pipe
138 data = \${lookup pgsql {select admin_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
142 forward_for_gforge_lists_bounces:
143 domains = $sys_lists_host
144 local_part_suffix = -bounces : -bounces+*
146 pipe_transport = address_pipe
147 data = \${lookup pgsql {select bounces_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
151 forward_for_gforge_lists_confirm:
152 domains = $sys_lists_host
153 local_part_suffix = -confirm : -confirm+*
155 pipe_transport = address_pipe
156 data = \${lookup pgsql {select confirm_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
160 forward_for_gforge_lists_join:
161 domains = $sys_lists_host
162 local_part_suffix = -join
164 pipe_transport = address_pipe
165 data = \${lookup pgsql {select join_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
169 forward_for_gforge_lists_leave:
170 domains = $sys_lists_host
171 local_part_suffix = -leave
173 pipe_transport = address_pipe
174 data = \${lookup pgsql {select leave_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
178 forward_for_gforge_lists_subscribe:
179 domains = $sys_lists_host
180 local_part_suffix = -subscribe
182 pipe_transport = address_pipe
183 data = \${lookup pgsql {select subscribe_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
187 forward_for_gforge_lists_unsubscribe:
188 domains = $sys_lists_host
189 local_part_suffix = -unsubscribe
191 pipe_transport = address_pipe
192 data = \${lookup pgsql {select unsubscribe_address from mta_lists where list_name=".chr(39)."\$local_part".chr(39)."}{\$value}}
199 ' > $cfg_exim4_split_router
201 for r in $cfg_exim4_router; do
204 cfg_gforge_router=$r.gforge-new
205 tmp1=$(mktemp /tmp/$pattern)
207 cp -a $cfg_gforge_router $tmp1
210 $routerfname = shift ;
211 open ROUTERS, $routerfname || die $!;
212 my @gf_block = <ROUTERS>;
217 last if /^\s*begin\s*routers\s*$/;
220 my $gf_block_done = 0;
223 last if /^\s*begin\s*$/;
224 if (/^# BEGIN GFORGE BLOCK -- DO NOT EDIT #/) {
226 push @line_buf, @gf_block unless $gf_block_done;
229 push @line_buf, $_ unless $in_gf_block;
230 $in_gf_block = 0 if /^# END GFORGE BLOCK #/;
233 print @gf_block unless $gf_block_done;
235 while (<>) { print; };
236 ' $cfg_exim4_split_router < $tmp1 > $cfg_gforge_router
244 [ -x /usr/bin/newaliases ] && newaliases
245 invoke-rc.d exim4 restart
249 tmp1=$(mktemp /tmp/$pattern)
251 cp -a $cfg_aliases $cfg_aliases_gforge
253 grep -v "^gforge:" $cfg_aliases_gforge > $tmp1
254 # Redirect "noreply" mail to the bit bucket (if need be)
255 noreply_to_bitbucket=$(forge_get_config noreply_to_bitbucket)
256 if [ "$noreply_to_bitbucket" != "no" ] ; then
257 grep -v "^noreply:" $tmp1 > $cfg_aliases_gforge
259 cat $tmp1 > $cfg_aliases_gforge
264 for m in $cfg_exim4_main; do
265 cfg_gforge_main=$m.gforge-new
266 tmp1=$(mktemp /tmp/$pattern)
270 # First, replace the list of local domains
273 last if /^\s*domainlist\s*local_domains/;
274 print unless /\s*GFORGE_DOMAINS=/;
277 /^(\s*domainlist\s*local_domains\s*=\s*)(\S+)/;
278 my $l = $1 . join (":", grep(!/GFORGE_DOMAINS/, (split ":", $2)));
280 while (<>) { print; };
281 ' < $tmp1 > $cfg_gforge_main
286 if [ -f $cfg_exim4_split_router ]
288 mv $cfg_exim4_split_router $cfg_exim4_split_router.gforge-new
291 for r in $cfg_exim4_router; do
292 cfg_gforge_router=$r.gforge-new
293 tmp1=$(mktemp /tmp/$pattern)
295 cp -a $cfg_gforge_router $tmp1
297 # Second, kill our forwarding rules
301 last if /^\s*begin\s*routers\s*$/;
305 last if /^\s*begin\s*$/;
306 $in_gf_block = 1 if /^# BEGIN GFORGE BLOCK -- DO NOT EDIT #/;
307 print unless $in_gf_block;
308 $in_gf_block = 0 if /^# END GFORGE BLOCK #/;
311 while (<>) { print; };
312 ' < $tmp1 > $cfg_gforge_router
322 echo "Usage: $0 {configure|configure-files|purge|purge-files}"