12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- /*
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at https://mozilla.org/MPL/2.0/.
- */
- package main
- import (
- "context"
- "log"
- "net/http"
- "os"
- "os/signal"
- "strconv"
- "time"
- "golang.org/x/sys/unix"
- )
- func main() {
- ctx, cancel := context.WithCancel(context.Background())
- srv := NewServer(ctx)
- // Catch signals
- cleanup := make(chan struct{})
- go func() {
- sig := make(chan os.Signal, 1)
- signal.Notify(sig, unix.SIGINT, unix.SIGTERM)
- Loop:
- for {
- select {
- case <-sig:
- log.Println("caught signal; canceling operations...")
- cancel()
- log.Println("shutting down...")
- if err := srv.Shutdown(); err != nil {
- log.Printf("shutdown: %v", err)
- }
- break Loop
- case <-ctx.Done():
- log.Println("received server done")
- break Loop
- case <-time.After(100 * time.Millisecond):
- // do nothing; just throttle cpu
- }
- }
- close(cleanup)
- }()
- listenPort := 4140
- if len(os.Args) == 2 {
- if port, err := strconv.Atoi(os.Args[1]); err == nil {
- if 1 <= port && port <= 65535 {
- listenPort = port
- }
- }
- }
- err := srv.ListenAndServe(listenPort)
- if err != http.ErrServerClosed {
- log.Printf("server error: %v", err)
- }
- cancel()
- <-cleanup
- log.Println("cleanup complete")
- }
|