Linkstamp the binaries when building with make.
[mailpopbox.git] / mailpopbox.go
1 // mailpopbox
2 // Copyright 2020 Blue Static <https://www.bluestatic.org>
3 // This program is free software licensed under the GNU General Public License,
4 // version 3.0. The full text of the license can be found in LICENSE.txt.
5 // SPDX-License-Identifier: GPL-3.0-only
6
7 package main
8
9 import (
10 "encoding/json"
11 "fmt"
12 "os"
13
14 "go.uber.org/zap"
15 )
16
17 var (
18 versionGit = "development"
19 versionNumber = "2.0.0"
20 versionString = "mailpopbox " + versionNumber + " (" + versionGit + ")\n"
21 )
22
23 func main() {
24 if len(os.Args) != 2 {
25 fmt.Fprintf(os.Stderr, "Usage: %s config.json\n", os.Args[0])
26 os.Exit(1)
27 }
28
29 if os.Args[1] == "version" {
30 fmt.Print(versionString)
31 os.Exit(0)
32 }
33
34 configFile, err := os.Open(os.Args[1])
35 if err != nil {
36 fmt.Fprintf(os.Stderr, "config file: %s\n", err)
37 os.Exit(2)
38 }
39
40 var config Config
41 if err := json.NewDecoder(configFile).Decode(&config); err != nil {
42 fmt.Fprintf(os.Stderr, "config file: %s\n", err)
43 os.Exit(3)
44 }
45 configFile.Close()
46
47 logConfig := zap.NewDevelopmentConfig()
48 logConfig.Development = false
49 logConfig.DisableStacktrace = true
50 logConfig.Level.SetLevel(zap.DebugLevel)
51 log, err := logConfig.Build()
52 if err != nil {
53 fmt.Fprintf(os.Stderr, "create logger: %v\n", err)
54 os.Exit(4)
55 }
56
57 log.Info("starting mailpopbox", zap.String("hostname", config.Hostname))
58
59 pop3 := runPOP3Server(config, log)
60 smtp := runSMTPServer(config, log)
61
62 for {
63 select {
64 case cm := <-pop3:
65 if cm == ServerControlRestart {
66 pop3 = runPOP3Server(config, log)
67 } else {
68 break
69 }
70 case <-smtp:
71 // smtp never reloads.
72 break
73 }
74 }
75 }