Implement PID file support in nntp.tiny.daemon
This commit is contained in:
		
							parent
							
								
									c53e45ca49
								
							
						
					
					
						commit
						07689f87cb
					
				
					 3 changed files with 56 additions and 8 deletions
				
			
		|  | @ -6,6 +6,7 @@ import argparse | |||
| from nntp.tiny.config import Config | ||||
| from nntp.tiny.db     import Database | ||||
| from nntp.tiny.server import Server | ||||
| from nntp.tiny.daemon import Daemon | ||||
| 
 | ||||
| parser = argparse.ArgumentParser(description='Tiny NNTP server') | ||||
| parser.add_argument('--daemon', '-d', action='store_true', help='Run NNTP server as daemon in background') | ||||
|  | @ -16,9 +17,6 @@ config = Config.load() | |||
| server = Server(config) | ||||
| 
 | ||||
| if args.daemon: | ||||
|     pid = os.fork() | ||||
| 
 | ||||
|     if pid > 0: | ||||
|         exit(0) | ||||
|     Daemon.init(config) | ||||
| 
 | ||||
| server.run() | ||||
|  |  | |||
|  | @ -4,11 +4,35 @@ import configparser | |||
| from typing import Optional | ||||
| 
 | ||||
| class ConfigException(Exception): | ||||
|     def __init__(self, path: str): | ||||
|         self.path = path | ||||
|     pass | ||||
| 
 | ||||
| class ConfigSectionException(ConfigException): | ||||
|     def __init__(self, section: str): | ||||
|         self.section = section | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         return "Unable to locate file '" + self.path + "'" | ||||
|         return "Missing configuration section '%s'" % ( | ||||
|             self.section | ||||
|         ) | ||||
| 
 | ||||
| class ConfigValueException(ConfigException): | ||||
|     def __init__(self, section: str, value: str): | ||||
|         self.section = section | ||||
|         self.value   = value | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         return "Missing configuration value '%s' in section '%s'" % ( | ||||
|             self.value, self.section | ||||
|         ) | ||||
| 
 | ||||
| class ConfigFileException(ConfigException): | ||||
|     def __init__(self, paths: list): | ||||
|         self.paths = paths | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         return "Unable to locate configuration file in: %s" % ( | ||||
|             ", ".join(self.paths) | ||||
|         ) | ||||
| 
 | ||||
| class Config(): | ||||
|     SEARCH_PATHS = [ | ||||
|  | @ -29,7 +53,7 @@ class Config(): | |||
|             path = Config.find() | ||||
|              | ||||
|         if path is None: | ||||
|             raise ConfigException(path) | ||||
|             raise ConfigFileException(Config.SEARCH_PATHS) | ||||
| 
 | ||||
|         parser = configparser.ConfigParser() | ||||
|         parser.read(path) | ||||
|  |  | |||
							
								
								
									
										26
									
								
								lib/nntp/tiny/daemon.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								lib/nntp/tiny/daemon.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | |||
| import os | ||||
| import signal | ||||
| import configparser | ||||
| 
 | ||||
| from nntp.tiny.config import (ConfigSectionException, | ||||
|                               ConfigValueException) | ||||
| 
 | ||||
| class Daemon(): | ||||
|     def init(config: configparser.ConfigParser): | ||||
|         if not config.has_section('daemon'): | ||||
|             raise ConfigSectionException('daemon') | ||||
| 
 | ||||
|         if not config.has_option('daemon', 'pidfile'): | ||||
|             raise ConfigValueException('daemon', 'pidfile') | ||||
| 
 | ||||
|         pidfile = config.get('daemon', 'pidfile') | ||||
| 
 | ||||
|         pid = os.fork() | ||||
| 
 | ||||
|         if pid > 0: | ||||
|             exit(0) | ||||
| 
 | ||||
|         with open(pidfile, 'w') as fh: | ||||
|             print(str(os.getpid()), file=fh) | ||||
| 
 | ||||
|         signal.signal(signal.SIGTERM, lambda s, f: os.unlink(pidfile)) | ||||
		Loading…
	
	Add table
		
		Reference in a new issue