Add -D to daemonize pathod.

This commit is contained in:
Aldo Cortesi 2012-08-16 16:07:23 +12:00
parent 51d10f53c1
commit ea2ca98bea

151
pathod
View File

@ -1,65 +1,35 @@
#!/usr/bin/env python #!/usr/bin/env python
import argparse, sys, logging, logging.handlers import argparse, sys, logging, logging.handlers
import os
from libpathod import pathod, utils, version, rparse from libpathod import pathod, utils, version, rparse
if __name__ == "__main__": def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
parser = argparse.ArgumentParser(description='A pathological HTTP/S daemon.') try:
parser.add_argument("-p", dest='port', default=9999, type=int, help='Port. Specify 0 to pick an arbitrary empty port.') pid = os.fork()
parser.add_argument("-l", dest='address', default="127.0.0.1", type=str, help='Listening address.') if pid > 0:
parser.add_argument( sys.exit(0)
"-a", dest='anchors', default=[], type=str, action="append", metavar="ANCHOR", except OSError, e:
help='Add an anchor. Specified as a string with the form pattern=pagespec' sys.stderr.write ("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror) )
) sys.exit(1)
parser.add_argument( os.chdir("/")
"-c", dest='craftanchor', default="/p/", type=str, os.umask(0)
help='Anchorpoint for URL crafting commands.' os.setsid()
) try:
parser.add_argument( pid = os.fork()
"-d", dest='staticdir', default=None, type=str, if pid > 0:
help='Directory for static files.' sys.exit(0)
) except OSError, e:
parser.add_argument( sys.stderr.write ("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror) )
"-f", dest='logfile', default=None, type=str, sys.exit(1)
help='Log file.' si = open(stdin, 'r')
) so = open(stdout, 'a+')
parser.add_argument( se = open(stderr, 'a+', 0)
"--debug", dest='debug', default=False, action="store_true", os.dup2(si.fileno(), sys.stdin.fileno())
help='Enable debug output.' os.dup2(so.fileno(), sys.stdout.fileno())
) os.dup2(se.fileno(), sys.stderr.fileno())
parser.add_argument(
"-s", dest='ssl', default=False, action="store_true",
help='Serve with SSL.'
)
parser.add_argument(
"--limit-size", dest='sizelimit', default=None, type=str,
help='Size limit of served responses. Understands size suffixes, i.e. 100k.'
)
parser.add_argument(
"--noapi", dest='noapi', default=False, action="store_true",
help='Disable API.'
)
parser.add_argument(
"--nohang", dest='nohang', default=False, action="store_true",
help='Disable pauses during crafted response generation.'
)
parser.add_argument(
"--noweb", dest='noweb', default=False, action="store_true",
help='Disable both web interface and API.'
)
parser.add_argument(
"--nocraft", dest='nocraft', default=False, action="store_true",
help='Disable response crafting. If anchors are specified, they still work.'
)
parser.add_argument(
"--keyfile", dest='ssl_keyfile', default=None, type=str,
help='SSL key file. If not specified, a default key is used.'
)
parser.add_argument(
"--certfile", dest='ssl_certfile', default=None, type=str,
help='SSL cert file. If not specified, a default cert is used.'
)
args = parser.parse_args()
def main(parser, args):
sl = [args.ssl_keyfile, args.ssl_certfile] sl = [args.ssl_keyfile, args.ssl_certfile]
if any(sl) and not all(sl): if any(sl) and not all(sl):
parser.error("Both --certfile and --keyfile must be specified.") parser.error("Both --certfile and --keyfile must be specified.")
@ -125,3 +95,70 @@ if __name__ == "__main__":
pd.serve_forever() pd.serve_forever()
except KeyboardInterrupt: except KeyboardInterrupt:
pass pass
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='A pathological HTTP/S daemon.')
parser.add_argument("-p", dest='port', default=9999, type=int, help='Port. Specify 0 to pick an arbitrary empty port.')
parser.add_argument("-l", dest='address', default="127.0.0.1", type=str, help='Listening address.')
parser.add_argument(
"-a", dest='anchors', default=[], type=str, action="append", metavar="ANCHOR",
help='Add an anchor. Specified as a string with the form pattern=pagespec'
)
parser.add_argument(
"-c", dest='craftanchor', default="/p/", type=str,
help='Anchorpoint for URL crafting commands.'
)
parser.add_argument(
"-d", dest='staticdir', default=None, type=str,
help='Directory for static files.'
)
parser.add_argument(
"-D", dest='daemonize', default=False, action="store_true",
help='Daemonize.'
)
parser.add_argument(
"-f", dest='logfile', default=None, type=str,
help='Log file.'
)
parser.add_argument(
"--debug", dest='debug', default=False, action="store_true",
help='Enable debug output.'
)
parser.add_argument(
"-s", dest='ssl', default=False, action="store_true",
help='Serve with SSL.'
)
parser.add_argument(
"--limit-size", dest='sizelimit', default=None, type=str,
help='Size limit of served responses. Understands size suffixes, i.e. 100k.'
)
parser.add_argument(
"--noapi", dest='noapi', default=False, action="store_true",
help='Disable API.'
)
parser.add_argument(
"--nohang", dest='nohang', default=False, action="store_true",
help='Disable pauses during crafted response generation.'
)
parser.add_argument(
"--noweb", dest='noweb', default=False, action="store_true",
help='Disable both web interface and API.'
)
parser.add_argument(
"--nocraft", dest='nocraft', default=False, action="store_true",
help='Disable response crafting. If anchors are specified, they still work.'
)
parser.add_argument(
"--keyfile", dest='ssl_keyfile', default=None, type=str,
help='SSL key file. If not specified, a default key is used.'
)
parser.add_argument(
"--certfile", dest='ssl_certfile', default=None, type=str,
help='SSL cert file. If not specified, a default cert is used.'
)
args = parser.parse_args()
if args.daemonize:
daemonize()
main(parser, args)