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  }