listen/bind in deterministic order for consistent error messages, and warn if quickstart cannot find public ip's

without public ip's, the generated mox config will try to listen on 0.0.0.0 and
::, but because there is already a listener for 127.0.0.1:80 (and possibly
others), a bind for 0.0.0.0:80 will fail. explicit public ip's are needed.

the public http listener is useful for ACME validation over http.

for issue #52
This commit is contained in:
Mechiel Lukkien
2023-08-10 10:29:06 +02:00
parent 01bcd98a42
commit 038b478d16
4 changed files with 40 additions and 6 deletions

View File

@ -19,11 +19,14 @@ import (
"net"
"os"
"runtime/debug"
"sort"
"strconv"
"strings"
"sync"
"time"
"golang.org/x/exp/maps"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
@ -175,7 +178,11 @@ func durationDefault(delay *time.Duration, def time.Duration) time.Duration {
// Listen initializes network listeners for incoming SMTP connection.
// The listeners are stored for a later call to Serve.
func Listen() {
for name, listener := range mox.Conf.Static.Listeners {
names := maps.Keys(mox.Conf.Static.Listeners)
sort.Strings(names)
for _, name := range names {
listener := mox.Conf.Static.Listeners[name]
var tlsConfig *tls.Config
if listener.TLS != nil {
tlsConfig = listener.TLS.Config