aboutsummaryrefslogtreecommitdiffstats
path: root/libpathod
diff options
context:
space:
mode:
Diffstat (limited to 'libpathod')
-rw-r--r--libpathod/cmdline.py60
-rw-r--r--libpathod/pathod.py41
-rw-r--r--libpathod/utils.py27
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())
+
+