diff options
Diffstat (limited to 'libpathod')
-rw-r--r-- | libpathod/cmdline.py | 60 | ||||
-rw-r--r-- | libpathod/pathod.py | 41 | ||||
-rw-r--r-- | libpathod/utils.py | 27 |
3 files changed, 68 insertions, 60 deletions
diff --git a/libpathod/cmdline.py b/libpathod/cmdline.py index fa2c10cd..6d1573f1 100644 --- a/libpathod/cmdline.py +++ b/libpathod/cmdline.py @@ -2,7 +2,7 @@ import argparse import sys import os -from . import pathoc, pathod, version +from . import pathoc, pathod, version, utils from netlib import http_uastrings @@ -144,32 +144,6 @@ def go_pathoc(): pathoc.main(args) -def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): - try: - pid = os.fork() - if pid > 0: - sys.exit(0) - except OSError, e: - sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror)) - sys.exit(1) - os.chdir("/") - os.umask(0) - os.setsid() - try: - pid = os.fork() - if pid > 0: - sys.exit(0) - except OSError, e: - sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror)) - sys.exit(1) - si = open(stdin, 'rb') - so = open(stdout, 'a+b') - se = open(stderr, 'a+b', 0) - os.dup2(si.fileno(), sys.stdin.fileno()) - os.dup2(so.fileno(), sys.stdout.fileno()) - os.dup2(se.fileno(), sys.stderr.fileno()) - - def go_pathod(): parser = argparse.ArgumentParser( description='A pathological HTTP/S daemon.' @@ -308,7 +282,33 @@ def go_pathod(): help="Log request/response in hexdump format" ) args = parser.parse_args() - if args.daemonize: - daemonize() - pathod.main(parser, args) + + certs = [] + for i in args.ssl_certs: + parts = i.split("=", 1) + if len(parts) == 1: + parts = ["*", parts[0]] + parts[1] = os.path.expanduser(parts[1]) + if not os.path.exists(parts[1]): + parser.error("Certificate file does not exist: %s"%parts[1]) + certs.append(parts) + args.ssl_certs = certs + + alst = [] + for i in args.anchors: + parts = utils.parse_anchor_spec(i) + if not parts: + parser.error("Invalid anchor specification: %s"%i) + alst.append(parts) + args.anchors = alst + + sizelimit = None + if args.sizelimit: + try: + sizelimit = utils.parse_size(args.sizelimit) + except ValueError, v: + parser.error(v) + args.sizelimit = sizelimit + + pathod.main(args) diff --git a/libpathod/pathod.py b/libpathod/pathod.py index 25f072fa..37b07bb6 100644 --- a/libpathod/pathod.py +++ b/libpathod/pathod.py @@ -3,6 +3,7 @@ import threading import re import logging import os +import sys from netlib import tcp, http, wsgi, certutils import netlib.utils @@ -371,33 +372,16 @@ class Pathod(tcp.TCPServer): return self.log -def main(parser, args): - certs = [] - for i in args.ssl_certs: - parts = i.split("=", 1) - if len(parts) == 1: - parts = ["*", parts[0]] - parts[1] = os.path.expanduser(parts[1]) - if not os.path.exists(parts[1]): - parser.error("Certificate file does not exist: %s"%parts[1]) - certs.append(parts) - +def main(args): ssloptions = SSLOptions( cn = args.cn, confdir = args.confdir, not_after_connect = args.ssl_not_after_connect, ciphers = args.ciphers, sslversion = utils.SSLVERSIONS[args.sslversion], - certs = certs + certs = args.ssl_certs ) - alst = [] - for i in args.anchors: - parts = utils.parse_anchor_spec(i) - if not parts: - parser.error("Invalid anchor specification: %s"%i) - alst.append(parts) - root = logging.getLogger() if root.handlers: for handler in root.handlers: @@ -418,13 +402,6 @@ def main(parser, args): sh.setFormatter(fmt) log.addHandler(sh) - sizelimit = None - if args.sizelimit: - try: - sizelimit = utils.parse_size(args.sizelimit) - except ValueError, v: - parser.error(v) - try: pd = Pathod( (args.address, args.port), @@ -432,8 +409,8 @@ def main(parser, args): ssl = args.ssl, ssloptions = ssloptions, staticdir = args.staticdir, - anchors = alst, - sizelimit = sizelimit, + anchors = args.anchors, + sizelimit = args.sizelimit, noweb = args.noweb, nocraft = args.nocraft, noapi = args.noapi, @@ -445,9 +422,13 @@ def main(parser, args): explain = args.explain, ) except PathodError, v: - parser.error(str(v)) + print >> sys.stderr, "Error: %s"%v + sys.exit(1) except language.FileAccessDenied, v: - parser.error("%s You probably want to a -d argument."%str(v)) + print >> sys.stderr, "Error: %s"%v + + if args.daemonize: + utils.daemonize() try: print "%s listening on %s:%s"%( diff --git a/libpathod/utils.py b/libpathod/utils.py index 110a7170..be49daec 100644 --- a/libpathod/utils.py +++ b/libpathod/utils.py @@ -110,3 +110,30 @@ class Data: data = Data(__name__) + +def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): + try: + pid = os.fork() + if pid > 0: + sys.exit(0) + except OSError, e: + sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror)) + sys.exit(1) + os.chdir("/") + os.umask(0) + os.setsid() + try: + pid = os.fork() + if pid > 0: + sys.exit(0) + except OSError, e: + sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror)) + sys.exit(1) + si = open(stdin, 'rb') + so = open(stdout, 'a+b') + se = open(stderr, 'a+b', 0) + os.dup2(si.fileno(), sys.stdin.fileno()) + os.dup2(so.fileno(), sys.stdout.fileno()) + os.dup2(se.fileno(), sys.stderr.fileno()) + + |