Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
slapos
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Léo-Paul Géneau
slapos
Commits
aa9ce4e7
Commit
aa9ce4e7
authored
Apr 20, 2023
by
Joanne Hugé
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mail-server: add mail-server with dovecot and postfix
parent
ee26003f
Changes
20
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
866 additions
and
0 deletions
+866
-0
component/dovecot/buildout.cfg
component/dovecot/buildout.cfg
+29
-0
component/lua/buildout.cfg
component/lua/buildout.cfg
+24
-0
software/mail-server/README.md
software/mail-server/README.md
+5
-0
software/mail-server/buildout.hash.cfg
software/mail-server/buildout.hash.cfg
+42
-0
software/mail-server/dovecot-passdb.jinja2.lua
software/mail-server/dovecot-passdb.jinja2.lua
+14
-0
software/mail-server/dovecot.jinja2.conf
software/mail-server/dovecot.jinja2.conf
+88
-0
software/mail-server/instance-default-input-schema.json
software/mail-server/instance-default-input-schema.json
+14
-0
software/mail-server/instance-default-output-schema.json
software/mail-server/instance-default-output-schema.json
+23
-0
software/mail-server/instance-default.cfg.in
software/mail-server/instance-default.cfg.in
+306
-0
software/mail-server/instance.cfg.in
software/mail-server/instance.cfg.in
+46
-0
software/mail-server/postfix_main.jinja2.cf
software/mail-server/postfix_main.jinja2.cf
+55
-0
software/mail-server/postfix_master.jinja2.cf
software/mail-server/postfix_master.jinja2.cf
+30
-0
software/mail-server/postfix_virtual.jinja2
software/mail-server/postfix_virtual.jinja2
+1
-0
software/mail-server/postfix_vmailbox.jinja2
software/mail-server/postfix_vmailbox.jinja2
+1
-0
software/mail-server/software.cfg
software/mail-server/software.cfg
+45
-0
software/mail-server/software.cfg.json
software/mail-server/software.cfg.json
+14
-0
software/mail-server/test/README.md
software/mail-server/test/README.md
+1
-0
software/mail-server/test/setup.py
software/mail-server/test/setup.py
+51
-0
software/mail-server/test/test.py
software/mail-server/test/test.py
+70
-0
software/slapos-sr-testing/software.cfg
software/slapos-sr-testing/software.cfg
+7
-0
No files found.
component/dovecot/buildout.cfg
0 → 100644
View file @
aa9ce4e7
# Dovecot
# https://doc.dovecot.org/
[buildout]
extends =
../lua/buildout.cfg
../openssl/buildout.cfg
../zlib/buildout.cfg
[dovecot]
recipe = slapos.recipe.cmmi
url = https://dovecot.org/releases/2.3/dovecot-2.3.20.tar.gz
md5sum = b8add62d0311dcc95ac25b379e8ba043
location = @@LOCATION@@
configure-options =
--enable-maintainer-mode
--prefix=${:location}
--exec-prefix=${:location}
--with-systemd=no
--with-lua=yes
--with-libcrypto=${openssl:location}
environment =
PATH=${pkgconfig:location}/bin:%(PATH)s
PKG_CONFIG_PATH=${lua:location}/lib/pkgconfig
LUA_LIBS=-L${lua:location}/lib -Wl,-rpath=${lua:location}/lib -llua -lm
LUA_CFLAGS=-I${lua:location}/include
LDFLAGS=-L${openssl:location}/lib -Wl,-rpath=${openssl:location}/lib -L${zlib:location}/lib -Wl,-rpath=${zlib:location}/lib
make-targets = install
post-install = cp -r ${:location}/share/doc/dovecot/example-config/* ${:location}/etc/dovecot/
component/lua/buildout.cfg
View file @
aa9ce4e7
...
...
@@ -28,3 +28,27 @@ pc =
Version: $${version}
Libs: -L$${libdir} -llua
Cflags: -I$${includedir}
[lua5.2]
recipe = slapos.recipe.cmmi
shared = true
url = http://www.lua.org/ftp/lua-5.2.3.tar.gz
md5sum = dc7f94ec6ff15c985d2d6ad0f1b35654
configure-command = true
make-options =
"$(uname -sr 2>/dev/null|grep -Eq '^Linux' && echo linux || echo posix)"
MYCFLAGS="-I${readline:location}/include -fPIC"
MYLDFLAGS="-L${readline:location}/lib -Wl,-rpath=${readline:location}/lib"
INSTALL_TOP=@@LOCATION@@
post-install =
mkdir -p %(location)s/lib/pkgconfig
{
make pc INSTALL_TOP=%(location)s
echo '%(pc)s'
} > %(location)s/lib/pkgconfig/lua.pc
pc =
Name: Lua
Description: Lua language engine
Version: $${version}
Libs: -L$${libdir} -llua
Cflags: -I$${includedir}
software/mail-server/README.md
0 → 100644
View file @
aa9ce4e7
# mail-server
-
Local IMAP / SMTP mail server using Dovecot and Postfix
-
Runs on port 10143 and 10025
-
Designed to be deployed on 4G / 5G base stations such as ORS
software/mail-server/buildout.hash.cfg
0 → 100644
View file @
aa9ce4e7
# THIS IS NOT A BUILDOUT FILE, despite purposedly using a compatible syntax.
# The only allowed lines here are (regexes):
# - "^#" comments, copied verbatim
# - "^[" section beginings, copied verbatim
# - lines containing an "=" sign which must fit in the following categorie.
# - "^\s*filename\s*=\s*path\s*$" where "path" is relative to this file
# Copied verbatim.
# - "^\s*hashtype\s*=.*" where "hashtype" is one of the values supported
# by the re-generation script.
# Re-generated.
# - other lines are copied verbatim
# Substitution (${...:...}), extension ([buildout] extends = ...) and
# section inheritance (< = ...) are NOT supported (but you should really
# not need these here).
[template]
filename = instance.cfg.in
md5sum = 7ab3b606972e1b338d28fc1374617835
[template-default]
_update_hash_filename_ = instance-default.cfg.in
md5sum = 123a56ab69723d869bc52169fa5d530b
[dovecot.jinja2.conf]
_update_hash_filename_ = dovecot.jinja2.conf
md5sum = a1f695cb881e9be680b7b8a597a4b0c9
[dovecot-passdb.jinja2.lua]
_update_hash_filename_ = dovecot-passdb.jinja2.lua
md5sum = 060107ee6ad0eb9092529bc2bd1ee52f
[postfix_main.jinja2.cf]
_update_hash_filename_ = postfix_main.jinja2.cf
md5sum = e3b2b86282816ac4020154de70cd5074
[postfix_master.jinja2.cf]
_update_hash_filename_ = postfix_master.jinja2.cf
md5sum = 7752a8b4af5c18dc404e0a862af89272
[postfix_vmailbox.jinja2]
_update_hash_filename_ = postfix_vmailbox.jinja2
md5sum = b01eb42fd9cecc1fcc9bad85f463eea6
[postfix_virtual.jinja2]
_update_hash_filename_ = postfix_virtual.jinja2
md5sum = 701c95b5542890034444cf82ecf2a5e3
software/mail-server/dovecot-passdb.jinja2.lua
0 → 100644
View file @
aa9ce4e7
function
auth_passdb_lookup
(
req
)
return
dovecot
.
auth
.
PASSDB_RESULT_OK
,
string.format
(
"password=%s"
,
req
.
password
)
end
function
script_init
()
return
0
end
function
script_deinit
()
end
function
auth_userdb_iterate
()
return
{
"alpha"
}
end
software/mail-server/dovecot.jinja2.conf
0 → 100644
View file @
aa9ce4e7
protocols
=
" imap lmtp pop3"
auth_debug
=
yes
auth_mechanisms
=
plain
login
auth_username_format
= %
n
auth_verbose
=
yes
base_dir
= {{
directory
[
'run-dovecot'
] }}
state_dir
= {{
directory
[
'var-dovecot'
] }}
mail_temp_dir
= {{
directory
[
'tmp-dovecot'
] }}
default_internal_user
= {{
slap_configuration
[
'user-name'
] }}
default_login_user
= {{
slap_configuration
[
'user-name'
] }}
default_internal_group
= {{
slap_configuration
[
'user-name'
] }}
disable_plaintext_auth
=
no
mail_location
=
maildir
:~/
Maildir
mail_debug
=
yes
service
anvil
{
chroot
=
}
service
imap
-
login
{
chroot
=
}
service
pop3
-
login
{
chroot
=
inet_listener
pop3
{
port
=
10110
}
inet_listener
pop3s
{
port
=
10995
}
}
service
imap
-
login
{
inet_listener
imap
{
port
=
10143
}
inet_listener
imaps
{
port
=
10993
}
}
service
auth
{
unix_listener
{{
postfix_auth
}} {
mode
=
0660
user
= {{
slap_configuration
[
'user-name'
] }}
group
= {{
slap_configuration
[
'user-name'
] }}
}
}
service
lmtp
{
unix_listener
{{
postfix_dovecot_lmtp
}} {
user
= {{
slap_configuration
[
'user-name'
] }}
group
= {{
slap_configuration
[
'user-name'
] }}
mode
=
0600
}
}
log_path
= {{
directory
[
'log'
] }}/
dovecot
.
log
namespace
inbox
{
inbox
=
yes
location
=
mailbox
Drafts
{
special_use
= \
Drafts
}
mailbox
Junk
{
special_use
= \
Junk
}
mailbox
Sent
{
special_use
= \
Sent
}
mailbox
"Sent Messages"
{
special_use
= \
Sent
}
mailbox
Trash
{
special_use
= \
Trash
}
prefix
=
}
ssl
=
no
passdb
{
driver
=
lua
args
=
file
={{
dovecot_passdb_lua
}}
blocking
=
yes
}
userdb
{
driver
=
static
args
=
uid
={{
slap_configuration
[
'user-name'
] }}
gid
={{
slap_configuration
[
'user-name'
] }}
home
={{
directory
[
'home-dovecot'
] }}/%
u
}
software/mail-server/instance-default-input-schema.json
0 → 100644
View file @
aa9ce4e7
{
"type"
:
"object"
,
"$schema"
:
"http://json-schema.org/draft-04/schema"
,
"title"
:
"Input Parameters"
,
"properties"
:
{
"dns_sr_url"
:
{
"default"
:
""
,
"title"
:
"DNS SR URL"
,
"description"
:
"URL of the SR running the DNS server"
,
"type"
:
"string"
}
}
}
software/mail-server/instance-default-output-schema.json
0 → 100644
View file @
aa9ce4e7
{
"$schema"
:
"http://json-schema.org/draft-04/schema#"
,
"description"
:
"Values returned by mail server"
,
"properties"
:
{
"imap-port"
:
{
"description"
:
"IMAP port of the dovecot instance"
,
"type"
:
"integer"
},
"smtp-port"
:
{
"description"
:
"SMTP port of the postfix instance"
,
"type"
:
"integer"
},
"imap-smtp-ipv6"
:
{
"description"
:
"IPv6 address of the IMAP and SMTP instances"
,
"type"
:
"string"
},
"domain"
:
{
"description"
:
"Domain of the mail server"
,
"type"
:
"string"
}
},
"type"
:
"object"
}
software/mail-server/instance-default.cfg.in
0 → 100644
View file @
aa9ce4e7
{% set part_list = [] -%}
{% macro section(name) %}{% do part_list.append(name) %}{{ name }}{% endmacro -%}
[directory]
recipe = slapos.cookbook:mkdirectory
home = ${buildout:directory}
etc = ${:home}/etc
var = ${:home}/var
bin = ${:home}/bin
usr = ${:home}/usr
tmp = ${:home}/tmp
run = ${:var}/run
libexec = ${:usr}/libexec
run-dovecot = ${:run}/dovecot
var-dovecot = ${:var}/dovecot
tmp-dovecot = ${:tmp}/dovecot
libexec-dovecot = ${:libexec}/dovecot
home-dovecot = ${:home}/dovecot-home
script = ${:etc}/run
service = ${:etc}/service
promise = ${:etc}/promise
log = ${:var}/log
usr-postfix = ${:usr}/postfix
etc-postfix = ${:etc}/postfix
var-log = ${:var}/log
var-lib = ${:var}/lib
var-lib-postfix = ${:var-lib}/postfix
var-spool = ${:var}/spool
var-spool-postfix = ${:var-spool}/postfix
vhosts = ${:home}/vhosts
# Not used at buildout level, presence needed by postfix.
var-spool-postfix-active = ${:var-spool-postfix}/active
var-spool-postfix-bounce = ${:var-spool-postfix}/bounce
var-spool-postfix-corrupt = ${:var-spool-postfix}/corrupt
var-spool-postfix-defer = ${:var-spool-postfix}/defer
var-spool-postfix-deferred = ${:var-spool-postfix}/deferred
var-spool-postfix-flush = ${:var-spool-postfix}/flush
var-spool-postfix-hold = ${:var-spool-postfix}/hold
var-spool-postfix-incoming = ${:var-spool-postfix}/incoming
var-spool-postfix-maildrop = ${:var-spool-postfix}/maildrop
var-spool-postfix-pid = ${:var-spool-postfix}/pid
var-spool-postfix-private = ${:var-spool-postfix}/private
var-spool-postfix-public = ${:var-spool-postfix}/public
var-spool-postfix-saved = ${:var-spool-postfix}/saved
var-spool-postfix-trace = ${:var-spool-postfix}/trace
[slap-configuration]
recipe = slapos.cookbook:slapconfiguration.serialised
computer = {{ slap_connection['computer-id'] }}
partition = {{ slap_connection['partition-id'] }}
url = {{ slap_connection['server-url'] }}
key = {{ slap_connection['key-file'] }}
cert = {{ slap_connection['cert-file'] }}
[config-base]
recipe = slapos.recipe.template:jinja2
extensions = jinja2.ext.do
extra-context =
context =
section directory directory
section slap_configuration slap-configuration
import netaddr netaddr
${:extra-context}
[dovecot-conf]
<= config-base
url = {{ dovecot_conf_template }}
output = ${directory:etc}/dovecot.conf
extra-context =
key dovecot_passdb_lua dovecot-passdb-lua:output
raw postfix_auth ${directory:var-spool-postfix-private}/auth
raw postfix_dovecot_lmtp ${directory:var-spool-postfix-private}/dovecot-lmtp
[dovecot-passdb-lua]
<= config-base
url = {{ dovecot_passdb_lua_template }}
output = ${directory:etc}/dovecot-passdb.lua
[userinfo]
recipe = slapos.cookbook:userinfo
[ethernet-ip]
recipe = slapos.recipe.build
init =
import netifaces
for i in netifaces.interfaces():
if not (i.startswith("slaptun") or i.startswith("re6stnet") or i == "lo"):
a = netifaces.ifaddresses(i)
if netifaces.AF_INET in a:
try:
options['ipv4'] = a[netifaces.AF_INET][0]['addr']
except:
options['ipv4'] = "0.0.0.0"
[{{ section('postmap-virtual') }}]
recipe = plone.recipe.command
stop-on-error = true
command = '${wrapper-postmap:wrapper-path}' '${postfix-virtual:output}'
update-command = ${:command}
[{{ section('postmap-vmailbox') }}]
recipe = plone.recipe.command
stop-on-error = true
command = '${wrapper-postmap:wrapper-path}' '${postfix-vmailbox:output}'
update-command = ${:command}
[postfix-conf-main]
<= config-base
url = {{ postfix_main_template }}
output = ${directory:etc-postfix}/main.cf
extra-context =
key vmailbox_file postfix-vmailbox:output
key virtual_file postfix-virtual:output
key bin_directory directory:bin
key usr_directory directory:usr-postfix
key queue_directory directory:var-spool-postfix
key data_directory directory:var-lib-postfix
key spool_directory directory:var-spool
key vhosts_directory directory:vhosts
key log_directory directory:var-log
key mail_owner userinfo:pw-name
key setgid_group userinfo:gr-name
key ip_address slap-configuration:ipv6-random
key mail_domain request-dns-entry:connection-domain
raw xz_utils_location {{ xz_utils_location }}
raw postfix_location {{ postfix_location }}
[postfix-conf-master]
<= config-base
url = {{ postfix_master_template }}
output = ${directory:etc-postfix}/master.cf
[postfix-vmailbox]
<= config-base
url = {{ postfix_vmailbox_template }}
output = ${directory:etc-postfix}/postfix-vmailbox
extra-context =
raw mail_domain {{ slapparameter_dict.get('mail_domain', '') }}
[postfix-virtual]
<= config-base
url = {{ postfix_virtual_template }}
output = ${directory:etc-postfix}/postfix-virtual
extra-context =
raw mail_domain {{ slapparameter_dict.get('mail_domain', '') }}
[dovecot-wrapper]
recipe = slapos.recipe.template
output = ${directory:bin}/${:_buildout_section_name_}
inline =
#!/bin/sh
{{ dovecot_binary }} -F -c ${dovecot-conf:output}
[dovecot-service]
recipe = slapos.cookbook:wrapper
command-line = ${dovecot-wrapper:output}
wrapper-path = ${directory:service}/dovecot
mode = 0775
pidfile = ${directory:run}/dovecot.pid
hash-files =
${dovecot-conf:output}
${dovecot-wrapper:output}
[postfix-symlinks-libexec]
recipe = slapos.cookbook:symbolic.link
target-directory = ${directory:usr-postfix}
link-binary =
{{ postfix_location }}/usr/libexec
[postfix-wrapper]
recipe = slapos.recipe.template
output = ${directory:bin}/${:_buildout_section_name_}
inline =
#!/bin/sh
${directory:usr-postfix}/libexec/postfix/master -c ${directory:etc-postfix}
[postfix-service]
recipe = slapos.cookbook:wrapper
command-line = ${postfix-wrapper:output}
wrapper-path = ${directory:service}/postfix
mode = 0775
pidfile = ${directory:run}/postfix.pid
environment =
MAIL_CONFIG=${directory:etc-postfix}
hash-files =
${postfix-conf-main:output}
${postfix-wrapper:output}
[publish-connection-parameters]
recipe = slapos.cookbook:publish
<= monitor-publish
imap-port = 10143
smtp-port = 10025
imap-smtp-ipv6 = ${slap-configuration:ipv6-random}
{% if slapparameter_dict.get('dns_sr_url', '') %}
domain = ${request-dns-entry:connection-domain}
{% endif %}
[imap-listen-promise]
<= monitor-promise-base
promise = check_socket_listening
name = imap_listen.py
config-host = ${slap-configuration:ipv6-random}
config-port = 10143
[smtp-listen-promise]
<= monitor-promise-base
promise = check_socket_listening
name = smtp_listen.py
config-host = ${slap-configuration:ipv6-random}
config-port = 10025
[request-dns-entry]
name = dns-mail-entry
recipe = slapos.cookbook:request.serialised
software-url = {{ slapparameter_dict['dns_sr_url'] }}
software-type = core-network
server-url = {{ slap_connection['server-url'] }}
computer-id = {{ slap_connection['computer-id'] }}
partition-id = {{ slap_connection['partition-id'] }}
key-file = {{ slap_connection['key-file'] }}
cert-file = {{ slap_connection['cert-file'] }}
shared = true
sla-computer_guid = {{ slap_connection['computer-id'] }}
config-name = dns-mail-entry
config-subdomain = mail
config-ip = ${slap-configuration:ipv6-random}
return = domain ip
[base-wrapper]
recipe = slapos.cookbook:wrapper
environment =
MAIL_CONFIG=${directory:etc-postfix}
[base-bin-wrapper]
< = base-wrapper
command-line = ${:path}/${:basename}
wrapper-path = ${directory:bin}/${:basename}
[base-bin-bin-wrapper]
< = base-bin-wrapper
path = {{ postfix_location }}/usr/bin
[base-sbin-bin-wrapper]
< = base-bin-wrapper
path = {{ postfix_location }}/usr/sbin
{% for extend, basename_list in (
(
'base-bin-bin-wrapper',
(
'mailq',
'newaliases',
),
),
(
'base-sbin-bin-wrapper',
(
'postcat',
'postconf',
'postdrop',
'postfix',
'postkick',
'postlock',
'postlog',
'postmap',
'postmulti',
'postqueue',
'postsuper',
'sendmail',
),
),
) %}
{% for basename in basename_list -%}
[{{ section('wrapper-' ~ basename) }}]
< = {{ extend }}
basename = {{ basename }}
{% endfor %}
{% endfor %}
[{{ section('service-postfix-master') }}]
< = base-wrapper
command-line = ${directory:usr}/libexec/postfix/master -c ${directory:etc-postfix}
wrapper-path = ${directory:run}/postfix-master
[buildout]
extends =
{{ template_monitor }}
parts =
directory
dovecot-conf
dovecot-service
postfix-conf-main
postfix-conf-master
postfix-service
postfix-symlinks-libexec
monitor-base
publish-connection-parameters
imap-listen-promise
smtp-listen-promise
{{ part_list | join('\n ') }}
{% if slapparameter_dict.get('dns_sr_url', '') %}
request-dns-entry
{% endif %}
eggs-directory = {{ eggs_directory }}
develop-eggs-directory = {{ develop_eggs_directory }}
offline= true
software/mail-server/instance.cfg.in
0 → 100644
View file @
aa9ce4e7
[buildout]
parts =
switch-softwaretype
eggs-directory = ${buildout:eggs-directory}
develop-eggs-directory = ${buildout:develop-eggs-directory}
offline = true
[default-dynamic-template-parameters]
bin-directory = ${buildout:bin-directory}
buildout-bin-directory = ${buildout:bin-directory}
[dynamic-template-default]
recipe = slapos.recipe.template:jinja2
url = ${template-default:target}
filename = instance-default.cfg
output = $${buildout:directory}/$${:filename}
extensions = jinja2.ext.do
context =
key develop_eggs_directory buildout:develop-eggs-directory
key eggs_directory buildout:eggs-directory
key slapparameter_dict slap-configuration:configuration
raw template_monitor ${monitor2-template:output}
raw dovecot_conf_template ${dovecot.jinja2.conf:target}
raw dovecot_passdb_lua_template ${dovecot-passdb.jinja2.lua:target}
raw dovecot_binary ${dovecot:location}/sbin/dovecot
raw postfix_main_template ${postfix_main.jinja2.cf:target}
raw postfix_master_template ${postfix_master.jinja2.cf:target}
raw postfix_virtual_template ${postfix_virtual.jinja2:target}
raw postfix_vmailbox_template ${postfix_vmailbox.jinja2:target}
raw postfix_location ${postfix:location}
raw xz_utils_location ${xz-utils:location}
section slap_connection slap-connection
[slap-configuration]
recipe = slapos.cookbook:slapconfiguration.serialised
computer = $${slap-connection:computer-id}
partition = $${slap-connection:partition-id}
url = $${slap-connection:server-url}
key = $${slap-connection:key-file}
cert = $${slap-connection:cert-file}
[switch-softwaretype]
recipe = slapos.cookbook:switch-softwaretype
default = dynamic-template-default:output
RootSoftwareInstance = $${:default}
software/mail-server/postfix_main.jinja2.cf
0 → 100644
View file @
aa9ce4e7
# http://www.postfix.org/STANDARD_CONFIGURATION_README.html
# http://www.postfix.org/postconf.5.html
queue_directory = {{ queue_directory }}
command_directory = {{ bin_directory }}
daemon_directory = {{ usr_directory }}/libexec/postfix
data_directory = {{ data_directory }}
mail_spool_directory = {{ spool_directory }}
html_directory = no
manpage_directory = {{ postfix_location }}/usr/local/man
sample_directory = {{ postfix_location }}/etc/postfix
readme_directory = no
sendmail_path = {{ bin_directory }}/sendmail
newaliases_path = {{ bin_directory }}/newaliases
mailq_path = {{ bin_directory }}/mailq
compatibility_level = 3.6
smtputf8_enable = no
mail_owner = {{ mail_owner }}
setgid_group = {{ setgid_group }}
virtual_mailbox_domains = {{ mail_domain }}
virtual_mailbox_base = {{ vhosts_directory }}
virtual_mailbox_maps = hash:{{ vmailbox_file }}
virtual_minimum_uid = 100
virtual_uid_maps = static:1001
virtual_gid_maps = static:1022
virtual_alias_maps = hash:{{ virtual_file }}
virtual_transport = lmtp:unix:private/dovecot-lmtp
inet_interfaces = {{ ip_address }}
inet_protocols = all
smtp_bind_address = 0.0.0.0
smtp_bind_address6 = ::
import_environment =
MAIL_CONFIG MAIL_DEBUG MAIL_LOGTAG TZ LANG=C
smtpd_tls_security_level = none
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
permit_sasl_authenticated
smtpd_relay_restrictions =
permit_sasl_authenticated
defer_unauth_destination
allow_min_user = yes
local_transport = error
maillog_file = {{ log_directory }}/postfix.log
maillog_file_compressor = {{ xz_utils_location }}/bin/xz
maillog_file_prefixes = {{ log_directory }}
software/mail-server/postfix_master.jinja2.cf
0 → 100644
View file @
aa9ce4e7
# http://www.postfix.org/master.5.html
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
10025 inet n - n - - smtpd
pickup unix n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr unix n - n 300 1 qmgr
tlsmgr unix - - n 1000? 1 tlsmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
trace unix - - n - 0 bounce
verify unix - - n - 1 verify
flush unix n - n 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp
showq unix n - n - - showq
error unix - - n - - error
retry unix - - n - - error
discard unix - - n - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
anvil unix - - n - 1 anvil
scache unix - - n - 1 scache
postlog unix-dgram n - n - 1 postlogd
software/mail-server/postfix_virtual.jinja2
0 → 100644
View file @
aa9ce4e7
postmaster@{{ mail_domain }} postmaster
software/mail-server/postfix_vmailbox.jinja2
0 → 100644
View file @
aa9ce4e7
@{{ mail_domain }} {{ mail_domain }}/catchall
software/mail-server/software.cfg
0 → 100644
View file @
aa9ce4e7
[buildout]
extends =
../../component/xz-utils/buildout.cfg
../../component/postfix/buildout.cfg
../../component/dovecot/buildout.cfg
../../stack/monitor/buildout.cfg
../../stack/slapos.cfg
buildout.hash.cfg
parts =
slapos-cookbook
template
dovecot
postfix
[template]
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/${:filename}
output = ${buildout:directory}/template.cfg
[download-base]
recipe = slapos.recipe.build:download
url = ${:_profile_base_location_}/${:_update_hash_filename_}
[template-default]
<= download-base
[copy-to-instance]
recipe = slapos.recipe.build:download
url = ${:_profile_base_location_}/${:_buildout_section_name_}
filename = ${:_buildout_section_name_}
[dovecot.jinja2.conf]
< = copy-to-instance
[dovecot-passdb.jinja2.lua]
< = copy-to-instance
[postfix_main.jinja2.cf]
< = copy-to-instance
[postfix_master.jinja2.cf]
< = copy-to-instance
[postfix_vmailbox.jinja2]
< = copy-to-instance
[postfix_virtual.jinja2]
< = copy-to-instance
software/mail-server/software.cfg.json
0 → 100644
View file @
aa9ce4e7
{
"name"
:
"Mail Server"
,
"description"
:
"Mail Server"
,
"serialisation"
:
"json-in-xml"
,
"software-type"
:
{
"default"
:
{
"title"
:
"Default"
,
"software-type"
:
"default"
,
"request"
:
"instance-default-input-schema.json"
,
"response"
:
"instance-default-output-schema.json"
,
"index"
:
0
}
}
}
software/mail-server/test/README.md
0 → 100644
View file @
aa9ce4e7
Tests for mail-server software release
software/mail-server/test/setup.py
0 → 100644
View file @
aa9ce4e7
##############################################################################
#
# Copyright (c) 2018 Nexedi SA and Contributors. All Rights Reserved.
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
from
setuptools
import
setup
,
find_packages
version
=
'0.0.1.dev0'
name
=
'slapos.test.mail_server'
with
open
(
"README.md"
)
as
f
:
long_description
=
f
.
read
()
setup
(
name
=
name
,
version
=
version
,
description
=
"Test for SlapOS' mail-server"
,
long_description
=
long_description
,
long_description_content_type
=
'text/markdown'
,
maintainer
=
"Nexedi"
,
maintainer_email
=
"info@nexedi.com"
,
url
=
"https://lab.nexedi.com/nexedi/slapos"
,
packages
=
find_packages
(),
install_requires
=
[
'slapos.core'
,
'slapos.libnetworkcache'
,
'slapos.cookbook'
,
],
zip_safe
=
True
,
test_suite
=
'test'
,
)
software/mail-server/test/test.py
0 → 100644
View file @
aa9ce4e7
##############################################################################
#
# Copyright (c) 2018 Nexedi SA and Contributors. All Rights Reserved.
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
import
os
from
slapos.testing.testcase
import
makeModuleSetUpAndTestCaseClass
setUpModule
,
MailServerTestCase
=
makeModuleSetUpAndTestCaseClass
(
os
.
path
.
abspath
(
os
.
path
.
join
(
os
.
path
.
dirname
(
__file__
),
'..'
,
'software.cfg'
)))
param_dict
=
{
"mail_domain"
:
"mail.local"
,
}
class
TestDefaultInstance
(
MailServerTestCase
):
@
classmethod
def
getInstanceParameterDict
(
cls
):
return
{
'_'
:
json
.
dumps
(
param_dict
)}
@
classmethod
def
getInstanceSoftwareType
(
cls
):
return
"default"
def
test_enb_conf
(
self
):
self
.
slap
.
waitForInstance
()
connection_parameters
=
self
.
computer_partition
.
getConnectionParameterDict
()
imap_smtp_ipv6
=
connection_parameters
[
'imap-smtp-ipv6'
]
imap_port
=
connection_parameters
[
'imap-port'
]
smtp_port
=
connection_parameters
[
'smtp-port'
]
# Check connection parameters are not empty
self
.
assertTrue
(
imap_smtp_ipv6
)
self
.
assertTrue
(
imap_port
)
self
.
assertTrue
(
smtp_port
)
# Check conf contains correct domain
conf_file
=
glob
.
glob
(
os
.
path
.
join
(
self
.
slap
.
instance_directory
,
'*'
,
'etc'
,
'postfix'
,
'main.cf'
))[
0
]
with
open
(
conf_file
,
'r'
)
as
f
:
domain_configured
=
False
for
line
in
f
:
if
line
.
startswith
(
"virtual_mailbox_domains"
):
self
.
assertEqual
(
line
,
"virtual_mailbox_domains = {}
\
n
"
.
format
(
param_dict
[
'mail_domain'
]))
domain_configured
=
True
self
.
assertTrue
(
domain_configured
)
software/slapos-sr-testing/software.cfg
View file @
aa9ce4e7
...
...
@@ -262,6 +262,11 @@ setup = ${slapos-repository:location}/software/js-drone/test/
egg = slapos.test.osie_coupler
setup = ${slapos-repository:location}/software/osie-coupler/test/
[slapos.test.mail-server-setup]
<= setup-develop-egg
egg = slapos.test.mail-server
setup = ${slapos-repository:location}/software/mail-server/test/
[slapos.core-repository]
<= git-clone-repository
repository = https://lab.nexedi.com/nexedi/slapos.core.git
...
...
@@ -364,6 +369,7 @@ eggs +=
${slapos.test.theia-setup:egg}
${slapos.test.turnserver-setup:egg}
${slapos.test.upgrade_erp5-setup:egg}
${slapos.test.mail-server-setup:egg}
# We don't name this interpreter `python`, so that when we run slapos node
# software, installation scripts running `python` use a python without any
...
...
@@ -457,6 +463,7 @@ tests =
theia ${slapos.test.theia-setup:setup}
turnserver ${slapos.test.turnserver-setup:setup}
upgrade_erp5 ${slapos.test.upgrade_erp5-setup:setup}
mail-server ${slapos.test.mail-server-setup:setup}
[versions]
# recurls are under development
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment