Commit 48c35a4b7123ab787e4aae3c74b060f751b7ef5c
1 parent
4216f9fb
Exists in
master
and in
90 other branches
email relay configuration
Showing
12 changed files
with
156 additions
and
12 deletions
Show diff stats
config/roles/email_server.rb
config/roles/server.rb
config/roles/social_server.rb
| ... | ... | @@ -0,0 +1,48 @@ |
| 1 | +include_recipe 'email' | |
| 2 | + | |
| 3 | +# smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem | |
| 4 | +# smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key | |
| 5 | + | |
| 6 | +postfix_config = { | |
| 7 | + | |
| 8 | + myhostname: node['config']['relay_hostname'], | |
| 9 | + | |
| 10 | + relay_domains: [ | |
| 11 | + node['config']['lists_hostname'], | |
| 12 | + node['config']['external_hostname'], | |
| 13 | + ].join(', '), | |
| 14 | + | |
| 15 | + transport_maps: 'hash:/etc/postfix/transport', | |
| 16 | + | |
| 17 | + mynetworks: '127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 ' + node['peers'].values.sort.join(' '), | |
| 18 | + | |
| 19 | +} | |
| 20 | + | |
| 21 | +execute 'postfix:relay:config' do | |
| 22 | + command postfix_config.map { |k,v| "postconf #{k}='#{v}'" }.join(' ; ') | |
| 23 | + notifies :reload, 'service[postfix]' | |
| 24 | +end | |
| 25 | + | |
| 26 | +execute 'postfix:interfaces:all' do | |
| 27 | + command "postconf inet_interfaces=all" | |
| 28 | + notifies :restart, 'service[postfix]' | |
| 29 | + not_if { system('grep -q "inet_interfaces\s*=\s*all" /etc/postfix/main.cf') } | |
| 30 | +end | |
| 31 | + | |
| 32 | +transport = { | |
| 33 | + node['config']['lists_hostname'] => node['peers']['integration'], | |
| 34 | + node['config']['external_hostname'] => node['peers']['integration'], | |
| 35 | +} | |
| 36 | + | |
| 37 | +file '/etc/postfix/transport' do | |
| 38 | + owner 'root' | |
| 39 | + group 'root' | |
| 40 | + mode 0644 | |
| 41 | + content transport.map { |domain,ip| "#{domain}\tsmtp:[#{ip}]\n" }.join | |
| 42 | + notifies :run, 'execute[transport:postmap]' | |
| 43 | +end | |
| 44 | + | |
| 45 | +execute 'transport:postmap' do | |
| 46 | + command "postmap /etc/postfix/transport" | |
| 47 | + action :nothing | |
| 48 | +end | ... | ... |
cookbooks/mailman/recipes/default.rb
| ... | ... | @@ -22,15 +22,17 @@ service 'mailman' do |
| 22 | 22 | supports :restart => true |
| 23 | 23 | end |
| 24 | 24 | |
| 25 | -package 'postfix' | |
| 26 | -package 'mailx' # for testing, etc | |
| 27 | - | |
| 28 | -execute 'postfix-config' do | |
| 25 | +execute 'postfix:config' do | |
| 29 | 26 | command [ |
| 30 | 27 | "postconf relay_domains=#{node['config']['lists_hostname']}", |
| 31 | 28 | "postconf transport_maps=hash:/etc/postfix/transport", |
| 32 | 29 | ].join(' && ') |
| 33 | - only_if { !system('grep', node['config']['lists_hostname'], '/etc/postfix/main.cf') } | |
| 30 | + notifies :reload, 'service[postfix]' | |
| 31 | +end | |
| 32 | + | |
| 33 | +execute 'postfix:interfaces' do | |
| 34 | + command "postconf inet_interfaces=\"$(cat /etc/hostname), localhost\"" | |
| 35 | + not_if { system('postconf inet_interfaces | grep -q \'=\s*localhost\s*$\'') } | |
| 34 | 36 | notifies :restart, 'service[postfix]' |
| 35 | 37 | end |
| 36 | 38 | |
| ... | ... | @@ -69,6 +71,3 @@ ruby_block 'configure-mailman-transport' do |
| 69 | 71 | only_if { !system('grep', '^mailman', '/etc/postfix/master.cf')} |
| 70 | 72 | end |
| 71 | 73 | |
| 72 | -service 'postfix' do | |
| 73 | - action [:enable, :reload] | |
| 74 | -end | ... | ... |
nodes.yaml
| ... | ... | @@ -14,6 +14,7 @@ vagrant@integration: |
| 14 | 14 | email_subject_prefix: '[spb]' |
| 15 | 15 | lists_hostname: listas.softwarepublico.dev |
| 16 | 16 | lists_admin: paulo@softwarelivre.org |
| 17 | + relay_hostname: relay.softwarepublico.dev | |
| 17 | 18 | peers: &PEERS |
| 18 | 19 | integration: 10.10.10.2 |
| 19 | 20 | email: 10.10.10.3 | ... | ... |
| ... | ... | @@ -0,0 +1,21 @@ |
| 1 | +#!/bin/sh | |
| 2 | + | |
| 3 | +set -eu | |
| 4 | + | |
| 5 | +to="$1" | |
| 6 | + | |
| 7 | +waited=0 | |
| 8 | + | |
| 9 | +while [ $waited -lt 10 ]; do | |
| 10 | + if (sudo postqueue -p | grep -q "$to"); then | |
| 11 | + sudo postqueue -p | grep -c "$to" | |
| 12 | + exit | |
| 13 | + fi | |
| 14 | + sleep 1 | |
| 15 | + waited=$(($waited + 1)) | |
| 16 | +done | |
| 17 | + | |
| 18 | +echo "E: no message for $to arrived at the mail realy" >&2 | |
| 19 | +echo 0 | |
| 20 | +exit 1 | |
| 21 | + | ... | ... |
| ... | ... | @@ -0,0 +1,44 @@ |
| 1 | +. $(dirname $0)/test_helper.sh | |
| 2 | + | |
| 3 | +test_inbound_mail() { | |
| 4 | + run_on integration create-list mylist foo@example.com | |
| 5 | + | |
| 6 | + # sending FROM EMAIL RELAY HOST | |
| 7 | + run_on email send-email foo@example.com mylist@listas.softwarepublico.dev | |
| 8 | + | |
| 9 | + messages=$(run_on integration wait-for-messages mylist) | |
| 10 | + | |
| 11 | + run_on integration remove-list mylist | |
| 12 | + | |
| 13 | + assertEquals 'Message arrives at the mailing list' '1' "$messages" | |
| 14 | +} | |
| 15 | + | |
| 16 | +_test_outbound_email() { | |
| 17 | + machine="$1" | |
| 18 | + | |
| 19 | + run_on email clear-email-queue | |
| 20 | + | |
| 21 | + run_on $machine send-email sender@example.com receiver@example.com | |
| 22 | + | |
| 23 | + messages=$(run_on email wait-for-email-to receiver@example.com) | |
| 24 | + | |
| 25 | + run_on email clear-email-queue | |
| 26 | + | |
| 27 | + assertEquals 'Message delivered through relay' 1 "$messages" | |
| 28 | +} | |
| 29 | + | |
| 30 | +test_outbound_email_integration() { | |
| 31 | + _test_outbound_email integration | |
| 32 | +} | |
| 33 | +test_outbound_email_database() { | |
| 34 | + _test_outbound_email database | |
| 35 | +} | |
| 36 | +test_outbound_email_social() { | |
| 37 | + _test_outbound_email social | |
| 38 | +} | |
| 39 | +test_outbound_email_reverseproxy() { | |
| 40 | + _test_outbound_email reverseproxy | |
| 41 | +} | |
| 42 | + | |
| 43 | +. shunit2 | |
| 44 | + | ... | ... |