diff options
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 29 |
1 files changed, 25 insertions, 4 deletions
@@ -12,6 +12,8 @@ import ( "net" "os" "os/user" + "os/signal" + "syscall" "strings" ) @@ -77,10 +79,28 @@ func main() { l.SearchFunc("", backend) l.CloseFunc("", backend) backend.logger.Printf("LDAP server listen: %s, network %s", backend.Listen, backend.Network) - if err := l.ListenAndServe(backend.Listen, backend.Network); err != nil { - backend.logger.Printf("LDAP server listen failed: %s", err.Error()) - os.Exit(1) - } + can_quit := make(chan bool, 1) + go func() { + if err := l.ListenAndServe(backend.Listen, backend.Network); err != nil { + backend.logger.Printf("LDAP server listen failed: %s", err.Error()) + os.Exit(1) + } + can_quit <- true + }() + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP) + done := make(chan bool, 1) + go func() { + sig := <-sigs + backend.logger.Printf("Received a signal %s", sig.String()) + done <- true + }() + backend.logger.Printf("Running ...") + <-done + l.Quit <- true + backend.logger.Printf("Signalling LDAP server to terminate ..."); + <-can_quit + backend.logger.Printf("Exiting ...") } func (b Backend) Bind(bindDN, bindSimplePw string, conn net.Conn) (resultCode ldap.LDAPResultCode, err error) { @@ -159,6 +179,7 @@ func (b Backend) Search(bindDN string, req ldap.SearchRequest, conn net.Conn) (r func (b Backend) Close(bindDN string, conn net.Conn) (err error) { b.logger.Printf("Close addr=%s", conn.RemoteAddr().String()) + conn.Close() return nil } |