forked from ops-class/test161
/
server.go
116 lines (99 loc) · 2.31 KB
/
server.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
package main
import (
"errors"
"fmt"
"os"
"os/signal"
"github.com/jay1999ke/test161"
)
// test161 Submission Server
// Run cleanup when signal is received
type test161Server interface {
Start()
Stop()
}
var servers = []test161Server{}
// Modified from http://nathanleclaire.com/blog/2014/08/24/handling-ctrl-c-interrupt-signal-in-golang-programs/
func waitForSignal() {
signalChan := make(chan os.Signal, 1)
doneChan := make(chan bool)
signal.Notify(signalChan, os.Interrupt)
signal.Notify(signalChan, os.Kill)
go func() {
for _ = range signalChan {
for _, s := range servers {
s.Stop()
}
fmt.Println("Killing...")
doneChan <- true
}
}()
<-doneChan
}
func main() {
// TODO: Usage
if len(os.Args) > 1 {
var err error
var status int
switch os.Args[1] {
case "status":
status, err = CtrlStatus()
if err == nil {
switch status {
case test161.SM_ACCEPTING:
fmt.Println("test161 server: accepting submissions")
case test161.SM_NOT_ACCEPTING:
fmt.Println("test161 server: not accepting submissions")
case test161.SM_STAFF_ONLY:
fmt.Println("test161 server: accepting submissions for staff only")
default:
fmt.Printf("test161 server: unknown status %v\n", status)
}
}
case "pause":
err = CtrlPause()
case "resume":
err = CtrlResume()
case "staff-only":
err = CtrlSetStaffOnly()
case "set-capacity":
if len(os.Args) != 3 {
err = errors.New("Wrong number of arguments to set-capacity")
} else {
err = CtrlSetCapacity(os.Args[2])
}
case "get-capacity":
var capacity int
capacity, err = CtrlGetCapacity()
if err == nil {
fmt.Println("Current test capacity:", capacity)
}
case "version":
fmt.Printf("test161-server version: %v\n", test161.Version)
err = nil
default:
fmt.Println("Unknown command:", os.Args[1])
os.Exit(2)
}
if err != nil {
fmt.Println("Error processing request:", err)
os.Exit(1)
} else {
os.Exit(0)
}
}
// Create Submission Server
server, err := NewSubmissionServer()
if err != nil {
fmt.Println("Error creating submission server:", err)
return
}
servers = append(servers, server)
submissionServer = server.(*SubmissionServer)
ctrl := &ControlServer{}
servers = append(servers, ctrl)
for _, s := range servers {
go s.Start()
}
waitForSignal()
}