| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | // +build !windows | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package core | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"io/ioutil" | 
					
						
							|  |  |  | 	"log" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | 	"os/signal" | 
					
						
							|  |  |  | 	"syscall" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // trapSignalsPosix captures POSIX-only signals. | 
					
						
							|  |  |  | func trapSignalsPosix() { | 
					
						
							|  |  |  | 	go func() { | 
					
						
							|  |  |  | 		sigchan := make(chan os.Signal, 1) | 
					
						
							|  |  |  | 		signal.Notify(sigchan, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGUSR1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for sig := range sigchan { | 
					
						
							|  |  |  | 			switch sig { | 
					
						
							|  |  |  | 			case syscall.SIGTERM: | 
					
						
							|  |  |  | 				log.Println("[INFO] SIGTERM: Terminating process") | 
					
						
							|  |  |  | 				if PidFile != "" { | 
					
						
							|  |  |  | 					os.Remove(PidFile) | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				os.Exit(0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case syscall.SIGQUIT: | 
					
						
							|  |  |  | 				log.Println("[INFO] SIGQUIT: Shutting down") | 
					
						
							|  |  |  | 				exitCode := executeShutdownCallbacks("SIGQUIT") | 
					
						
							|  |  |  | 				err := Stop() | 
					
						
							|  |  |  | 				if err != nil { | 
					
						
							|  |  |  | 					log.Printf("[ERROR] SIGQUIT stop: %v", err) | 
					
						
							|  |  |  | 					exitCode = 1 | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				if PidFile != "" { | 
					
						
							|  |  |  | 					os.Remove(PidFile) | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				os.Exit(exitCode) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case syscall.SIGHUP: | 
					
						
							|  |  |  | 				log.Println("[INFO] SIGHUP: Hanging up") | 
					
						
							|  |  |  | 				err := Stop() | 
					
						
							|  |  |  | 				if err != nil { | 
					
						
							|  |  |  | 					log.Printf("[ERROR] SIGHUP stop: %v", err) | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case syscall.SIGUSR1: | 
					
						
							|  |  |  | 				log.Println("[INFO] SIGUSR1: Reloading") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 				var updatedCorefile Input | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 				corefileMu.Lock() | 
					
						
							|  |  |  | 				if corefile == nil { | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 					// Hmm, did spawing process forget to close stdin? Anyhow, this is unusual. | 
					
						
							| 
									
										
										
										
											2016-04-09 22:53:39 +01:00
										 |  |  | 					log.Println("[ERROR] SIGUSR1: no Corefile to reload (was stdin left open?)") | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 					corefileMu.Unlock() | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 					continue | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 				if corefile.IsFile() { | 
					
						
							|  |  |  | 					body, err := ioutil.ReadFile(corefile.Path()) | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 					if err == nil { | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 						updatedCorefile = CorefileInput{ | 
					
						
							|  |  |  | 							Filepath: corefile.Path(), | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 							Contents: body, | 
					
						
							|  |  |  | 							RealFile: true, | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 				corefileMu.Unlock() | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 				err := Restart(updatedCorefile) | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 				if err != nil { | 
					
						
							|  |  |  | 					log.Printf("[ERROR] SIGUSR1: %v", err) | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | } |