2022-10-08 15:55:40 +02:00
#!/usr/bin/env python3
2018-10-22 17:01:59 +02:00
import os
2019-10-08 07:29:33 +02:00
import logging as log
import sys
2022-12-08 13:46:31 +02:00
from socrate import system
2019-10-08 07:29:33 +02:00
2022-11-21 18:50:57 +02:00
os . system ( " chown mailu:mailu -R /dkim " )
os . system ( " find /data | grep -v /fetchmail | xargs -n1 chown mailu:mailu " )
2022-12-23 11:58:06 +02:00
system . drop_privs_to ( ' mailu ' )
2022-11-17 17:03:37 +02:00
2019-10-08 07:29:33 +02:00
log . basicConfig ( stream = sys . stderr , level = os . environ . get ( " LOG_LEVEL " , " INFO " ) )
2022-12-08 13:46:31 +02:00
system . set_env ( [ ' SECRET ' ] )
2018-10-22 17:01:59 +02:00
2018-11-08 22:43:05 +02:00
os . system ( " flask mailu advertise " )
os . system ( " flask db upgrade " )
2019-01-25 16:04:20 +02:00
2019-08-21 15:34:25 +02:00
account = os . environ . get ( " INITIAL_ADMIN_ACCOUNT " )
domain = os . environ . get ( " INITIAL_ADMIN_DOMAIN " )
password = os . environ . get ( " INITIAL_ADMIN_PW " )
if account is not None and domain is not None and password is not None :
mode = os . environ . get ( " INITIAL_ADMIN_MODE " , default = " ifmissing " )
2022-10-19 19:36:13 +02:00
log . info ( " Creating initial admin account %s @ %s with mode %s " , account , domain , mode )
2019-08-21 15:34:25 +02:00
os . system ( " flask mailu admin %s %s ' %s ' --mode %s " % ( account , domain , password , mode ) )
2019-01-25 16:04:20 +02:00
2022-01-05 19:49:30 +02:00
def test_DNS ( ) :
import dns . resolver
import dns . exception
import dns . flags
import dns . rdtypes
import dns . rdatatype
import dns . rdataclass
import time
# DNS stub configured to do DNSSEC enabled queries
resolver = dns . resolver . Resolver ( )
2022-02-19 14:02:52 +02:00
resolver . use_edns ( 0 , dns . flags . DO , 1232 )
2022-01-05 19:49:30 +02:00
resolver . flags = dns . flags . AD | dns . flags . RD
nameservers = resolver . nameservers
for ns in nameservers :
resolver . nameservers = [ ns ]
2022-01-12 14:34:18 +02:00
while True :
2022-01-05 19:49:30 +02:00
try :
2022-01-21 15:17:37 +02:00
result = resolver . resolve ( ' example.org ' , dns . rdatatype . A , dns . rdataclass . IN , lifetime = 10 )
2022-01-05 19:49:30 +02:00
except Exception as e :
2022-10-19 19:36:13 +02:00
log . critical ( " Your DNS resolver at %s is not working ( %s ). Please see https://mailu.io/master/faq.html#the-admin-container-won-t-start-and-its-log-says-critical-your-dns-resolver-isn-t-doing-dnssec-validation " , ns , e )
2022-01-12 14:34:18 +02:00
else :
2022-01-12 14:44:17 +02:00
if result . response . flags & dns . flags . AD :
break
2022-02-23 12:48:53 +02:00
log . critical ( " Your DNS resolver at %s isn ' t doing DNSSEC validation; Please see https://mailu.io/master/faq.html#the-admin-container-won-t-start-and-its-log-says-critical-your-dns-resolver-isn-t-doing-dnssec-validation. " , ns )
2022-01-05 19:49:30 +02:00
time . sleep ( 5 )
test_DNS ( )
2023-01-25 16:15:24 +02:00
cmdline = [
" gunicorn " ,
" --threads " , f " { os . cpu_count ( ) } " ,
# If SUBNET6 is defined, gunicorn must listen on IPv6 as well as IPv4
" -b " , f " { ' [::] ' if os . environ . get ( ' SUBNET6 ' ) else ' ' } :80 " ,
2022-12-29 15:14:53 +02:00
" --logger-class mailu.Logger " ,
" --worker-tmp-dir /dev/shm " ,
2023-01-25 16:15:24 +02:00
" --error-logfile " , " - " ,
" --preload "
]
# logging
if log . root . level < = log . INFO :
cmdline . extend ( [ " --access-logfile " , " - " ] )
cmdline . append ( " ' mailu:create_app() ' " )
2019-10-08 07:29:33 +02:00
2023-01-25 16:15:24 +02:00
os . system ( " " . join ( cmdline ) )