Difference between revisions of "Python Skeleton Scripts"
Jump to navigation
Jump to search
PeterHarding (talk | contribs) (New page: =Based on a server= <pre> #!/usr/bin/env python # # Purpose: # # $Id:$ # #------------------------------------------------------------------------------- """ Skeleton Python script...) |
PeterHarding (talk | contribs) |
||
(2 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
Also check out - [[Implementing a Standard Library]] - and - [[Skel.py]] | |||
=Based on a server= | |||
=Get CLI Arguments and Read a Config File - Based on a server= | |||
Also incorporates use of Python logging module. | |||
<pre> | <pre> | ||
Line 48: | Line 52: | ||
def INFO(msg): | def INFO(msg): | ||
if log: log.info(' ' + msg) | if log: log.info(' ' + msg) | ||
if verbose_flg: print "[ | if verbose_flg: print "[xxxx] %s" % msg | ||
#------------------------------------------------------------------------------- | #------------------------------------------------------------------------------- | ||
Line 54: | Line 58: | ||
def ERROR(msg): | def ERROR(msg): | ||
if log: log.error(msg) | if log: log.error(msg) | ||
sys.stderr.write('[ | sys.stderr.write('[xxxx] %s\n' % msg) | ||
#------------------------------------------------------------------------------- | #------------------------------------------------------------------------------- | ||
Line 60: | Line 64: | ||
def WARNING(msg): | def WARNING(msg): | ||
if log: log.warning('*****' + msg + '*****') | if log: log.warning('*****' + msg + '*****') | ||
if verbose_flg: print "[ | if verbose_flg: print "[xxxx] %s" % msg | ||
#=============================================================================== | #=============================================================================== | ||
Line 98: | Line 102: | ||
terminal_type = os.environ["TERM"] | terminal_type = os.environ["TERM"] | ||
except KeyError, e: | except KeyError, e: | ||
print "Set TERM environment variable and rerun!" | print "[xxxx] Set TERM environment variable and rerun!" | ||
return 1 | return 1 | ||
Line 125: | Line 129: | ||
print "[xxxx] Working directory is %s" % os.getcwd() | print "[xxxx] Working directory is %s" % os.getcwd() | ||
if (debug_level > 0): print "Debugging level set to %d" % debug_level | if (debug_level > 0): print "[xxxx] Debugging level set to %d" % debug_level | ||
if args: | if args: | ||
Line 150: | Line 154: | ||
Date Who Description | Date Who Description | ||
-------- --- ------------------------------------------------------------ | -------- --- ------------------------------------------------------------ | ||
20031014 plh Initial implementation | |||
Problems to fix: | |||
To Do: | |||
Issues: | |||
""" | |||
</pre> | |||
=Reading CSV Files= | |||
<pre> | |||
</pre> | |||
=Daemonized Server= | |||
Features: | |||
* Threaded model. | |||
* Serevr runs as daemon. | |||
* Reads config file. | |||
* Incorporates use of Python logging module. | |||
* Start, Shutdown, Check methods. | |||
<pre> | |||
#!/usr/bin/env python | |||
# | |||
# Purpose: Threaded data server implementation | |||
# | |||
# $Id:$ | |||
# | |||
#--------------------------------------------------------------------- | |||
""" | |||
Uses threaded server model | |||
Server side: open a socket on a port, listen for | |||
a message from a client, and accept a request and | |||
service it. | |||
The server spawns a thread to handle each client connection. | |||
Threads share global memory space with main thread; | |||
This is more portable than fork -- not yet on Windows; | |||
This version has been extended to use the standard Python | |||
logging module. | |||
Add the delimiter to the INI file to allow use of alternate | |||
delimiters in transmitted data - so data with embedded commas | |||
can be used. | |||
""" | |||
#--------------------------------------------------------------------- | |||
import os | |||
import csv | |||
import sys | |||
import getopt | |||
import thread | |||
import time | |||
import signal | |||
import logging | |||
#--------------------------------------------------------------------- | |||
from socket import * # get socket constructor and constants | |||
from datetime import datetime | |||
#--------------------------------------------------------------------- | |||
__version__ = "1.1.1" | |||
__id__ = "@(#) server.py [%s] 05/03/2008" | |||
check_flg = False | |||
daemon_flg = False | |||
silent_flg = False | |||
terminate_flg = False | |||
verbose_flg = False | |||
wait_flg = False | |||
debug_level = 0 | |||
HOST = '' # Host server - '' means localhost | |||
PORT = 9999 # Listen on a non-reserved port number | |||
sockobj = None | |||
dserver_dir = None | |||
data_dir = None | |||
pid_path = None | |||
CONFIGFILE = "server.ini" | |||
LOGFILE = "server.log" | |||
PIDFILE = "server.pid" | |||
tables = [] | |||
INVALID = "INVALID" | |||
log = None | |||
#===================================================================== | |||
class Group: | |||
Name = None | |||
Idx = None | |||
Data = None | |||
def __init__(self, name): | |||
self.Name = name | |||
self.Idx = 0 | |||
self.Data = [] | |||
def __str__(self): | |||
s = "Grp %s Len %d" % (self.Name, len(self.Data)) | |||
return s | |||
def append(self, s): | |||
self.Data.append(s) | |||
def set(self): | |||
if len(self.Data) > 0: | |||
self.Idx = 0 | |||
else: | |||
self.Idx = -1 | |||
#--------------------------------------------------------------------- | |||
... | |||
#===================================================================== | |||
def INFO(msg): | |||
if log: log.info(' ' + msg) | |||
if verbose_flg: print "[server] %s" % msg | |||
#--------------------------------------------------------------------- | |||
def ERROR(msg): | |||
if log: log.error(msg) | |||
sys.stderr.write('[server] %s\n' % msg) | |||
#--------------------------------------------------------------------- | |||
def WARNING(msg): | |||
if log: log.warning('*****' + msg + '*****') | |||
if verbose_flg: print "[server] %s" % msg | |||
#===================================================================== | |||
def read_config(): | |||
config_file = data_dir + CONFIGFILE | |||
try: | |||
f = open(config_file, 'r') | |||
except IOError, e: | |||
ERROR('Open failed: ' + str(e)) | |||
sys.exit(1) | |||
definition_flg = False | |||
while True: | |||
line = f.readline() | |||
if not line: break | |||
line = line[:-1] | |||
line = line.replace('\r','') | |||
line = line.strip() | |||
if (line.find("#") != -1): continue | |||
if (line.find("[Data]") != -1): | |||
definition_flg = True | |||
elif (line.find("Description=") != -1): | |||
description = line.split("=") | |||
(name, type, delimiter) = description[1].split(":") | |||
t = Table(name, type, delimiter) | |||
INFO(str(t)) | |||
tables.append(t) | |||
f.close() | |||
#--------------------------------------------------------------------- | |||
def process(str): | |||
if debug_level > 1: INFO("[server::process] len %d msg %s" % (l, msg)) | |||
ts = datetime.now().strftime('%Y%m%d%H%M%S') | |||
reply = 'XXXX' | |||
return reply | |||
#--------------------------------------------------------------------- | |||
def sig_term(signum, frame): | |||
"SIGTERM handler" | |||
shutdown() | |||
#--------------------------------------------------------------------- | |||
def shutdown(): | |||
INFO("Server shutdown at %s" % datetime.now()) | |||
for i in range(len(tables)): | |||
tables[i].flush() | |||
try: | |||
os.unlink(pid_path) | |||
except IOError, e: | |||
ERROR('Unlink failed: ' + str(e)) | |||
sys.exit(1) | |||
sys.exit(0) | |||
#--------------------------------------------------------------------- | |||
def check_running(): | |||
try: | |||
pfp = open(pid_path, 'r') | |||
except IOError, (errno, strerror): | |||
pfp = None | |||
# ERROR("I/O error(%s): %s" % (errno, strerror)) | |||
except: | |||
ERROR("Unexpected error:", sys.exc_info()[0]) | |||
raise | |||
if pfp: | |||
line = pfp.readline() | |||
line = line.strip() | |||
dserver_pid = int(line) | |||
noProcess = 0 | |||
try: | |||
os.kill(dserver_pid, 0) | |||
except OSError, e: | |||
if e.errno == 3: | |||
noProcess = 1 | |||
else: | |||
ERROR("kill() failed:" + str(e)) | |||
sys.exit(0) | |||
if noProcess: | |||
INFO("[server] Stale dserver pid file!") | |||
pfp.close() | |||
os.unlink(pid_path) | |||
return None | |||
else: | |||
pfp.close() | |||
return dserver_pid | |||
return dserver_pid | |||
else: | |||
return None | |||
#--------------------------------------------------------------------- | |||
def create_pidfile(): | |||
pid = os.getpid() | |||
try: | |||
pfp = open(pid_path, 'w') | |||
except IOError, e: | |||
ERROR("Open failed - " + str(e)) | |||
sys.exit(0) | |||
pfp.write("%d" % pid) | |||
pfp.close() | |||
INFO("Running server with PID -> %d" % pid) | |||
return pid | |||
#--------------------------------------------------------------------- | |||
def become_daemon(): | |||
pid = os.fork() | |||
if pid == 0: # In child | |||
pid = create_pidfile() | |||
time.sleep(1) | |||
elif pid == -1: # Should not happen! | |||
ERROR("fork() failed!") | |||
time.sleep(1) | |||
sys.exit(0) | |||
else: # In Parent | |||
time.sleep(1) | |||
sys.exit(0) | |||
time.sleep(2) | |||
os.setsid() | |||
return pid | |||
#--------------------------------------------------------------------- | |||
def init(): | |||
pid = check_running() | |||
if pid: | |||
print "[server] Server already running! (pid = %d)" % pid | |||
sys.exit(0) | |||
if daemon_flg: | |||
pid = become_daemon() | |||
else: | |||
pid = create_pidfile() | |||
global log | |||
log = logging.getLogger('dserver') | |||
hdlr = logging.FileHandler(LOGFILE) | |||
fmtr = logging.Formatter('%(asctime)s %(levelname)s %(message)s') | |||
hdlr.setFormatter(fmtr) | |||
log.addHandler(hdlr) | |||
log.setLevel(logging.INFO) | |||
INFO("Started processing") | |||
read_config() | |||
if (not silent_flg): | |||
INFO("Server PID is %d" % pid) | |||
#--------------------------------------------------------------------- | |||
def terminate(): | |||
server_pid = check_running() | |||
if server_pid: | |||
if (not silent_flg): | |||
INFO("Terminating server with pid, %d" % server_pid) | |||
os.kill(server_pid, signal.SIGTERM) | |||
if (wait_flg): | |||
while True: | |||
try: | |||
kill(server_pid, 0) | |||
except OSError, e: | |||
if e.errno == 3: | |||
break | |||
else: | |||
ERROR("kill() failed:" + str(e)) | |||
sys.exit(0) | |||
time.sleep(1) | |||
return 0 | |||
#--------------------------------------------------------------------- | |||
def check(): | |||
pid = check_running() | |||
if pid: | |||
print "[server] Server already running! (pid = %d)" % pid | |||
sys.exit(0) | |||
else: | |||
print "[server] Server not running" | |||
#==== Socket Server ================================================== | |||
def init_connection(): | |||
global sockobj | |||
sockobj = socket(AF_INET, SOCK_STREAM) # make a TCP socket object | |||
sockobj.bind((HOST, PORT)) # bind it to server port number | |||
sockobj.listen(10) # allow upto 10 pending connects | |||
#--------------------------------------------------------------------- | |||
def handle_client(connection): # in spawned thread: reply | |||
while True: # read, write a client socket | |||
try: | |||
request = connection.recv(1024) | |||
except: | |||
break | |||
if debug_level > 0: INFO('[server] Request -> "%s"' % request) | |||
if not request: break | |||
reply = process(request) | |||
if debug_level > 0: INFO('[server] Reply -> "%s..."' % reply[0:30]) | |||
connection.send(reply) | |||
connection.close() | |||
#--------------------------------------------------------------------- | |||
def dispatcher(): | |||
while True: | |||
# Wait for next connection, | |||
connection, address = sockobj.accept() | |||
INFO('Host (%s) - Connected at %s' % (address[0], datetime.now())) | |||
thread.start_new(handle_client, (connection,)) | |||
#===================================================================== | |||
def main(): | |||
global check_flg | |||
global daemon_flg | |||
global terminate_flg | |||
global verbose_flg | |||
global wait_flg | |||
global debug_level | |||
global dserver_dir | |||
global data_dir | |||
global pid_path | |||
try: | |||
opts, args = getopt.getopt(sys.argv[1:], "cdDsTvVw?") | |||
except getopt.error, msg: | |||
print __doc__ | |||
return 1 | |||
try: | |||
server_dir = os.environ["SERVER_DIR"] | |||
except KeyError, e: | |||
print "[server] Set SERVER_DIR environment variable and rerun!" | |||
return 1 | |||
data_dir = server_dir + '/DATA/' | |||
pid_path = data_dir + PIDFILE | |||
wrk_path = os.getcwd() | |||
wrk_dir = os.path.basename(wrk_path) | |||
os.chdir(data_dir) | |||
for o, a in opts: | |||
if o == '-d': | |||
debug_level += 1 | |||
elif o == '-c': | |||
check_flg = True | |||
elif o == '-D': | |||
daemon_flg = True | |||
elif o == '-s': | |||
tsilent_flg = True | |||
elif o == '-T': | |||
terminate_flg = True | |||
elif o == '-v': | |||
verbose_flg = True | |||
elif o == '-V': | |||
print "[dserver] Version: %s" % __version__ | |||
return 1 | |||
elif o == '-w': | |||
wait_flg = True | |||
elif o == '-?': | |||
print __doc__ | |||
return 1 | |||
print "[server] Server working directory is %s" % os.getcwd() | |||
if check_flg: | |||
check() | |||
return 0 | |||
if terminate_flg: | |||
terminate() | |||
return 0 | |||
if (debug_level > 0): print "[server] Debugging level set to %d" % debug_level | |||
if args: | |||
for arg in args: | |||
print arg | |||
signal.signal(signal.SIGTERM, sig_term) | |||
init() | |||
init_connection() | |||
dispatcher() | |||
return 0 | |||
#--------------------------------------------------------------------- | |||
if __name__ == '__main__' or __name__ == sys.argv[0]: | |||
try: | |||
sys.exit(main()) | |||
except KeyboardInterrupt, e: | |||
print "[server] Interrupted!" | |||
shutdown() | |||
#--------------------------------------------------------------------- | |||
""" | |||
Revision History: | |||
Date Who Description | |||
-------- --- -------------------------------------------------- | |||
20031014 plh Initial implementation | 20031014 plh Initial implementation | ||
Latest revision as of 09:15, 13 March 2013
Also check out - Implementing a Standard Library - and - Skel.py
Get CLI Arguments and Read a Config File - Based on a server
Also incorporates use of Python logging module.
#!/usr/bin/env python # # Purpose: # # $Id:$ # #------------------------------------------------------------------------------- """ Skeleton Python script ... """ #------------------------------------------------------------------------------- import os import sys import getopt import logging #------------------------------------------------------------------------------- from datetime import datetime #------------------------------------------------------------------------------- __version__ = "1.0.0" __id__ = "@(#) skel.py [%s] 05/03/2008" verbose_flg = False debug_level = 0 LOGFILE = "xxxx.log" PIDFILE = "xxxx.pid" tables = [] log = None pid = None #=============================================================================== def INFO(msg): if log: log.info(' ' + msg) if verbose_flg: print "[xxxx] %s" % msg #------------------------------------------------------------------------------- def ERROR(msg): if log: log.error(msg) sys.stderr.write('[xxxx] %s\n' % msg) #------------------------------------------------------------------------------- def WARNING(msg): if log: log.warning('*****' + msg + '*****') if verbose_flg: print "[xxxx] %s" % msg #=============================================================================== def init(): global log global pid pid = os.getpid() log = logging.getLogger('xxx') hdlr = logging.FileHandler(LOGFILE) fmtr = logging.Formatter('%(asctime)s %(levelname)s %(message)s') hdlr.setFormatter(fmtr) log.addHandler(hdlr) log.setLevel(logging.INFO) INFO("Started processing") if (not verbose_flg): INFO("PID is %d" % pid) #=============================================================================== def main(): global verbose_flg global debug_level try: opts, args = getopt.getopt(sys.argv[1:], "dD:vVw?") except getopt.error, msg: print __doc__ return 1 try: terminal_type = os.environ["TERM"] except KeyError, e: print "[xxxx] Set TERM environment variable and rerun!" return 1 wrk_path = os.getcwd() wrk_dir = os.path.basename(wrk_path) data_dir = wrk_dir + '/DATA/' pid_path = data_dir + PIDFILE # os.chdir(data_dir) for o, a in opts: if o == '-d': debug_level += 1 elif o == '-D': debug_level = int(a) elif o == '-v': verbose_flg = True elif o == '-V': print "[xxxx] Version: %s" % __version__ return 1 elif o == '-?': print __doc__ return 1 print "[xxxx] Working directory is %s" % os.getcwd() if (debug_level > 0): print "[xxxx] Debugging level set to %d" % debug_level if args: for arg in args: print arg init() return 0 #------------------------------------------------------------------------------- if __name__ == '__main__' or __name__ == sys.argv[0]: try: sys.exit(main()) except KeyboardInterrupt, e: print "[xxxx] Interrupted!" #------------------------------------------------------------------------------- """ Revision History: Date Who Description -------- --- ------------------------------------------------------------ 20031014 plh Initial implementation Problems to fix: To Do: Issues: """
Reading CSV Files
Daemonized Server
Features:
- Threaded model.
- Serevr runs as daemon.
- Reads config file.
- Incorporates use of Python logging module.
- Start, Shutdown, Check methods.
#!/usr/bin/env python # # Purpose: Threaded data server implementation # # $Id:$ # #--------------------------------------------------------------------- """ Uses threaded server model Server side: open a socket on a port, listen for a message from a client, and accept a request and service it. The server spawns a thread to handle each client connection. Threads share global memory space with main thread; This is more portable than fork -- not yet on Windows; This version has been extended to use the standard Python logging module. Add the delimiter to the INI file to allow use of alternate delimiters in transmitted data - so data with embedded commas can be used. """ #--------------------------------------------------------------------- import os import csv import sys import getopt import thread import time import signal import logging #--------------------------------------------------------------------- from socket import * # get socket constructor and constants from datetime import datetime #--------------------------------------------------------------------- __version__ = "1.1.1" __id__ = "@(#) server.py [%s] 05/03/2008" check_flg = False daemon_flg = False silent_flg = False terminate_flg = False verbose_flg = False wait_flg = False debug_level = 0 HOST = '' # Host server - '' means localhost PORT = 9999 # Listen on a non-reserved port number sockobj = None dserver_dir = None data_dir = None pid_path = None CONFIGFILE = "server.ini" LOGFILE = "server.log" PIDFILE = "server.pid" tables = [] INVALID = "INVALID" log = None #===================================================================== class Group: Name = None Idx = None Data = None def __init__(self, name): self.Name = name self.Idx = 0 self.Data = [] def __str__(self): s = "Grp %s Len %d" % (self.Name, len(self.Data)) return s def append(self, s): self.Data.append(s) def set(self): if len(self.Data) > 0: self.Idx = 0 else: self.Idx = -1 #--------------------------------------------------------------------- ... #===================================================================== def INFO(msg): if log: log.info(' ' + msg) if verbose_flg: print "[server] %s" % msg #--------------------------------------------------------------------- def ERROR(msg): if log: log.error(msg) sys.stderr.write('[server] %s\n' % msg) #--------------------------------------------------------------------- def WARNING(msg): if log: log.warning('*****' + msg + '*****') if verbose_flg: print "[server] %s" % msg #===================================================================== def read_config(): config_file = data_dir + CONFIGFILE try: f = open(config_file, 'r') except IOError, e: ERROR('Open failed: ' + str(e)) sys.exit(1) definition_flg = False while True: line = f.readline() if not line: break line = line[:-1] line = line.replace('\r','') line = line.strip() if (line.find("#") != -1): continue if (line.find("[Data]") != -1): definition_flg = True elif (line.find("Description=") != -1): description = line.split("=") (name, type, delimiter) = description[1].split(":") t = Table(name, type, delimiter) INFO(str(t)) tables.append(t) f.close() #--------------------------------------------------------------------- def process(str): if debug_level > 1: INFO("[server::process] len %d msg %s" % (l, msg)) ts = datetime.now().strftime('%Y%m%d%H%M%S') reply = 'XXXX' return reply #--------------------------------------------------------------------- def sig_term(signum, frame): "SIGTERM handler" shutdown() #--------------------------------------------------------------------- def shutdown(): INFO("Server shutdown at %s" % datetime.now()) for i in range(len(tables)): tables[i].flush() try: os.unlink(pid_path) except IOError, e: ERROR('Unlink failed: ' + str(e)) sys.exit(1) sys.exit(0) #--------------------------------------------------------------------- def check_running(): try: pfp = open(pid_path, 'r') except IOError, (errno, strerror): pfp = None # ERROR("I/O error(%s): %s" % (errno, strerror)) except: ERROR("Unexpected error:", sys.exc_info()[0]) raise if pfp: line = pfp.readline() line = line.strip() dserver_pid = int(line) noProcess = 0 try: os.kill(dserver_pid, 0) except OSError, e: if e.errno == 3: noProcess = 1 else: ERROR("kill() failed:" + str(e)) sys.exit(0) if noProcess: INFO("[server] Stale dserver pid file!") pfp.close() os.unlink(pid_path) return None else: pfp.close() return dserver_pid return dserver_pid else: return None #--------------------------------------------------------------------- def create_pidfile(): pid = os.getpid() try: pfp = open(pid_path, 'w') except IOError, e: ERROR("Open failed - " + str(e)) sys.exit(0) pfp.write("%d" % pid) pfp.close() INFO("Running server with PID -> %d" % pid) return pid #--------------------------------------------------------------------- def become_daemon(): pid = os.fork() if pid == 0: # In child pid = create_pidfile() time.sleep(1) elif pid == -1: # Should not happen! ERROR("fork() failed!") time.sleep(1) sys.exit(0) else: # In Parent time.sleep(1) sys.exit(0) time.sleep(2) os.setsid() return pid #--------------------------------------------------------------------- def init(): pid = check_running() if pid: print "[server] Server already running! (pid = %d)" % pid sys.exit(0) if daemon_flg: pid = become_daemon() else: pid = create_pidfile() global log log = logging.getLogger('dserver') hdlr = logging.FileHandler(LOGFILE) fmtr = logging.Formatter('%(asctime)s %(levelname)s %(message)s') hdlr.setFormatter(fmtr) log.addHandler(hdlr) log.setLevel(logging.INFO) INFO("Started processing") read_config() if (not silent_flg): INFO("Server PID is %d" % pid) #--------------------------------------------------------------------- def terminate(): server_pid = check_running() if server_pid: if (not silent_flg): INFO("Terminating server with pid, %d" % server_pid) os.kill(server_pid, signal.SIGTERM) if (wait_flg): while True: try: kill(server_pid, 0) except OSError, e: if e.errno == 3: break else: ERROR("kill() failed:" + str(e)) sys.exit(0) time.sleep(1) return 0 #--------------------------------------------------------------------- def check(): pid = check_running() if pid: print "[server] Server already running! (pid = %d)" % pid sys.exit(0) else: print "[server] Server not running" #==== Socket Server ================================================== def init_connection(): global sockobj sockobj = socket(AF_INET, SOCK_STREAM) # make a TCP socket object sockobj.bind((HOST, PORT)) # bind it to server port number sockobj.listen(10) # allow upto 10 pending connects #--------------------------------------------------------------------- def handle_client(connection): # in spawned thread: reply while True: # read, write a client socket try: request = connection.recv(1024) except: break if debug_level > 0: INFO('[server] Request -> "%s"' % request) if not request: break reply = process(request) if debug_level > 0: INFO('[server] Reply -> "%s..."' % reply[0:30]) connection.send(reply) connection.close() #--------------------------------------------------------------------- def dispatcher(): while True: # Wait for next connection, connection, address = sockobj.accept() INFO('Host (%s) - Connected at %s' % (address[0], datetime.now())) thread.start_new(handle_client, (connection,)) #===================================================================== def main(): global check_flg global daemon_flg global terminate_flg global verbose_flg global wait_flg global debug_level global dserver_dir global data_dir global pid_path try: opts, args = getopt.getopt(sys.argv[1:], "cdDsTvVw?") except getopt.error, msg: print __doc__ return 1 try: server_dir = os.environ["SERVER_DIR"] except KeyError, e: print "[server] Set SERVER_DIR environment variable and rerun!" return 1 data_dir = server_dir + '/DATA/' pid_path = data_dir + PIDFILE wrk_path = os.getcwd() wrk_dir = os.path.basename(wrk_path) os.chdir(data_dir) for o, a in opts: if o == '-d': debug_level += 1 elif o == '-c': check_flg = True elif o == '-D': daemon_flg = True elif o == '-s': tsilent_flg = True elif o == '-T': terminate_flg = True elif o == '-v': verbose_flg = True elif o == '-V': print "[dserver] Version: %s" % __version__ return 1 elif o == '-w': wait_flg = True elif o == '-?': print __doc__ return 1 print "[server] Server working directory is %s" % os.getcwd() if check_flg: check() return 0 if terminate_flg: terminate() return 0 if (debug_level > 0): print "[server] Debugging level set to %d" % debug_level if args: for arg in args: print arg signal.signal(signal.SIGTERM, sig_term) init() init_connection() dispatcher() return 0 #--------------------------------------------------------------------- if __name__ == '__main__' or __name__ == sys.argv[0]: try: sys.exit(main()) except KeyboardInterrupt, e: print "[server] Interrupted!" shutdown() #--------------------------------------------------------------------- """ Revision History: Date Who Description -------- --- -------------------------------------------------- 20031014 plh Initial implementation Problems to fix: To Do: Issues: """