gopkg.in/simversity/gottp.v3@v3.0.0-20160401065405-576cf030ca0e/server.go (about) 1 // +build !appengine 2 3 package gottp 4 5 import ( 6 "log" 7 "net" 8 "net/http" 9 "os" 10 "os/signal" 11 "strings" 12 "syscall" 13 14 traceback "gopkg.in/simversity/gotracer.v1" 15 conf "gopkg.in/simversity/gottp.v3/conf" 16 ) 17 18 func cleanAddr(addr string) { 19 err := os.Remove(addr) 20 if err != nil { 21 log.Panic(err) 22 } 23 } 24 25 var cleanupFuncs = []func(){} 26 27 func OnSysExit(cleanup func()) { 28 cleanupFuncs = append(cleanupFuncs, cleanup) 29 } 30 31 func interrupt_cleanup(addr string) { 32 sigchan := make(chan os.Signal, 10) 33 signal.Notify(sigchan, os.Interrupt, syscall.SIGTERM) 34 //NOTE: Capture every Signal right now. 35 //signal.Notify(sigchan) 36 37 s := <-sigchan 38 log.Println("Exiting Program. Got Signal: ", s) 39 40 if strings.Index(addr, "/") == 0 { 41 // do last actions and wait for all write operations to end 42 cleanAddr(addr) 43 } 44 45 if len(cleanupFuncs) > 0 { 46 log.Println("Performing Cleanup routines") 47 48 for i := range cleanupFuncs { 49 cleanupFuncs[i]() 50 } 51 } 52 53 shutdownWorker() 54 55 os.Exit(0) 56 } 57 58 var SysInitChan = make(chan bool, 1) 59 60 var settings conf.Config 61 62 var Tracer traceback.Tracer 63 64 func parseCLI() { 65 cfgPath, unixAddr := conf.CliArgs() 66 settings.MakeConfig(cfgPath) 67 68 if unixAddr != "" { 69 settings.Gottp.Listen = unixAddr 70 } 71 } 72 73 func MakeConfig(cfg conf.Configurer) { 74 cfgPath, unixAddr := conf.CliArgs() 75 cfg.MakeConfig(cfgPath) 76 77 settings.Gottp = *cfg.GetGottpConfig() 78 79 if unixAddr != "" { 80 settings.Gottp.Listen = unixAddr 81 } 82 } 83 84 func MakeExcpetionListener(settings *conf.Config) { 85 Tracer = traceback.Tracer{ 86 Dummy: settings.Gottp.EmailDummy, 87 EmailHost: settings.Gottp.EmailHost, 88 EmailPort: settings.Gottp.EmailPort, 89 EmailPassword: settings.Gottp.EmailPassword, 90 EmailUsername: settings.Gottp.EmailUsername, 91 EmailSender: settings.Gottp.EmailSender, 92 EmailFrom: settings.Gottp.EmailFrom, 93 ErrorTo: settings.Gottp.ErrorTo, 94 } 95 } 96 97 func MakeServer(cfg conf.Configurer) { 98 MakeConfig(cfg) 99 MakeExcpetionListener(&settings) 100 101 makeServer() 102 } 103 104 func DefaultServer() { 105 parseCLI() 106 makeServer() 107 } 108 109 func makeServer() { 110 addr := settings.Gottp.Listen 111 112 SysInitChan <- true 113 114 var serverError error 115 if addr != "" { 116 log.Println("Listening on " + addr) 117 } 118 119 go interrupt_cleanup(addr) 120 121 if strings.Index(addr, "/") == 0 { 122 listener, err := net.Listen("unix", addr) 123 if err != nil { 124 c, err := net.Dial("unix", addr) 125 126 if c != nil { 127 defer c.Close() 128 } 129 130 if err != nil { 131 log.Println("The socket does not look like consumed. Erase ?") 132 cleanAddr(addr) 133 listener, err = net.Listen("unix", addr) 134 } else { 135 log.Fatal("Cannot start Server. Address is already in Use.", err) 136 os.Exit(0) 137 } 138 } 139 140 os.Chmod(addr, 0770) 141 serverError = http.Serve(listener, nil) 142 } else { 143 serverError = http.ListenAndServe(addr, nil) 144 } 145 146 if serverError != nil { 147 log.Println(serverError) 148 } 149 }