This repository has been archived by the owner on Feb 9, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathentry.go
140 lines (112 loc) · 2.96 KB
/
entry.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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package entry
import (
"fmt"
"github.com/braintree/manners"
"github.com/pufferpanel/apufferi/v4/logging"
"github.com/pufferpanel/pufferd/v2"
"github.com/pufferpanel/pufferd/v2/environments"
"github.com/pufferpanel/pufferd/v2/programs"
"github.com/pufferpanel/pufferd/v2/routing"
"github.com/pufferpanel/pufferd/v2/sftp"
"github.com/pufferpanel/pufferd/v2/shutdown"
"github.com/spf13/viper"
"os"
"os/signal"
"runtime/debug"
"syscall"
)
var runService = true
func Start() chan error {
errChan := make(chan error)
go entry(errChan)
return errChan
}
func entry(errChan chan error) {
logging.Info(pufferd.Display)
environments.LoadModules()
programs.Initialize()
var err error
if _, err = os.Stat(programs.ServerFolder); os.IsNotExist(err) {
logging.Info("No server directory found, creating")
err = os.MkdirAll(programs.ServerFolder, 0755)
if err != nil && !os.IsExist(err) {
errChan <- err
return
}
}
programs.LoadFromFolder()
programs.InitService()
for _, element := range programs.GetAll() {
if element.IsEnabled() {
element.GetEnvironment().DisplayToConsole(true, "Daemon has been started\n")
if element.IsAutoStart() {
logging.Info("Queued server %s", element.Id())
element.GetEnvironment().DisplayToConsole(true, "Server has been queued to start\n")
programs.StartViaService(element)
}
}
}
createHook()
for runService && err == nil {
err = runServices()
}
shutdown.Shutdown()
errChan <- err
return
}
func runServices() error {
defer recoverPanic()
router := routing.ConfigureWeb()
useHttps := false
httpsPem := viper.GetString("listen.webCert")
httpsKey := viper.GetString("listen.webKey")
if _, err := os.Stat(httpsPem); os.IsNotExist(err) {
logging.Warn("No HTTPS.PEM found in data folder, will use http instead")
} else if _, err := os.Stat(httpsKey); os.IsNotExist(err) {
logging.Warn("No HTTPS.KEY found in data folder, will use http instead")
} else {
useHttps = true
}
sftp.Run()
web := viper.GetString("listen.web")
logging.Info("Starting web access on %s", web)
var err error
if useHttps {
err = manners.ListenAndServeTLS(web, httpsPem, httpsKey, router)
} else {
err = manners.ListenAndServe(web, router)
}
return err
}
func createHook() {
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGPIPE)
go func() {
defer func() {
if err := recover(); err != nil {
logging.Error("%+v\n%s", err, debug.Stack())
}
}()
var sig os.Signal
for sig != syscall.SIGTERM {
sig = <-c
switch sig {
case syscall.SIGHUP:
//manners.Close()
//sftp.Stop()
_ = pufferd.LoadConfig()
case syscall.SIGPIPE:
//ignore SIGPIPEs for now, we're somehow getting them and it's causing issues
}
}
runService = false
shutdown.CompleteShutdown()
}()
}
func recoverPanic() {
if rec := recover(); rec != nil {
err := rec.(error)
fmt.Printf("CRITICAL: %s", err.Error())
logging.Critical("Unhandled error: %s", err.Error())
}
}