-
Notifications
You must be signed in to change notification settings - Fork 27
/
main.go
126 lines (101 loc) · 2.92 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright (c) 2021 Orange Forum authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package main
import (
"flag"
"math/rand"
"net/http"
"os"
"time"
"github.com/golang/glog"
"github.com/s-gv/orangeforum/models"
"github.com/s-gv/orangeforum/views"
_ "github.com/jackc/pgx/v4/stdlib"
"github.com/jmoiron/sqlx"
)
func main() {
rand.Seed(time.Now().UnixNano())
secretKey := os.Getenv("SECRET_KEY") // Ex: "s6JM1e8JTAphtKNR2y27XA8kkAaXOSYB" // 32 byte long
dsn := os.Getenv("ORANGEFORUM_DSN")
port := flag.String("port", "9123", "Port to listen on")
shouldMigrate := flag.Bool("migrate", false, "Migrate DB")
createDomain := flag.Bool("createdomain", false, "Create domain (interactive)")
createSuperUser := flag.Bool("createsuperuser", false, "Create superuser (interactive)")
createUser := flag.Bool("createuser", false, "Create user (interactive)")
changePasswd := flag.Bool("changepasswd", false, "Change password (interactive)")
makeSuperUser := flag.Bool("makesuperuser", false, "Make user superuser")
removeSuperUserPrivilege := flag.Bool("removesuperuser", false, "Remove superuser privilege")
deleteDomain := flag.Bool("deletedomain", false, "Delete domain")
deleteUser := flag.Bool("deleteuser", false, "Delete user")
setSMTP := flag.Bool("setsmtp", false, "Set SMTP Settings")
disableLogger := flag.Bool("disablelogger", false, "Disable HTTP request logger")
flag.Parse()
if dsn == "" {
dsn = "postgres://dbuser:dbpass@localhost:5432/testdb"
glog.Warningf("Environment variable ORANGEFORUM_DSN not set. Using default dsn: %s\n", dsn)
}
db := sqlx.MustConnect("pgx", dsn)
models.DB = db
if *shouldMigrate {
err := models.Migrate()
if err != nil {
glog.Error(err)
}
return
}
err := models.IsMigrationNeeded()
if err != nil {
glog.Error(err)
return
}
if *createDomain {
commandCreateDomain()
return
}
if *createSuperUser {
commandCreateSuperUser()
return
}
if *changePasswd {
commandChangePasswd()
return
}
if *createUser {
commandCreateUser()
return
}
if *makeSuperUser {
commandMakeSuperUser()
return
}
if *removeSuperUserPrivilege {
commandRemoveSuperUserPrivilege()
return
}
if *deleteDomain {
commandDeleteDomain()
return
}
if *deleteUser {
commandDeleteUser()
return
}
if *setSMTP {
commandSetupSMTP()
return
}
if len(secretKey) != 32 {
glog.Warningf("Secret key in environment variable SECRET_KEY does not have length 32. Using randomly generated key. This will invalidate any active sessions.")
var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
b := make([]rune, 32)
for i := range b {
b[i] = letterRunes[rand.Intn(len(letterRunes))]
}
secretKey = string(b)
}
views.SecretKey = secretKey
r := views.GetRouter(false, *disableLogger)
glog.Info("Starting server on port " + *port)
http.ListenAndServe(":"+*port, r)
}