aboutsummaryrefslogtreecommitdiffstats
path: root/pathod/utils.py
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2016-02-18 13:03:40 +0100
committerMaximilian Hils <git@maximilianhils.com>2016-02-18 13:03:40 +0100
commitd33d3663ecb166461d9cb5a78a29b44ee7a8fbb7 (patch)
treefe8856f65d1dafa946150c5acbaf6e942ba3c026 /pathod/utils.py
parent294774d6f0dee95b02a93307ec493b111b7f171e (diff)
downloadmitmproxy-d33d3663ecb166461d9cb5a78a29b44ee7a8fbb7.tar.gz
mitmproxy-d33d3663ecb166461d9cb5a78a29b44ee7a8fbb7.tar.bz2
mitmproxy-d33d3663ecb166461d9cb5a78a29b44ee7a8fbb7.zip
combine projects
Diffstat (limited to 'pathod/utils.py')
-rw-r--r--pathod/utils.py124
1 files changed, 124 insertions, 0 deletions
diff --git a/pathod/utils.py b/pathod/utils.py
new file mode 100644
index 00000000..a1109a3c
--- /dev/null
+++ b/pathod/utils.py
@@ -0,0 +1,124 @@
+import os
+import sys
+
+
+SIZE_UNITS = dict(
+ b=1024 ** 0,
+ k=1024 ** 1,
+ m=1024 ** 2,
+ g=1024 ** 3,
+ t=1024 ** 4,
+)
+
+
+class MemBool(object):
+
+ """
+ Truth-checking with a memory, for use in chained if statements.
+ """
+
+ def __init__(self):
+ self.v = None
+
+ def __call__(self, v):
+ self.v = v
+ return bool(v)
+
+
+def parse_size(s):
+ try:
+ return int(s)
+ except ValueError:
+ pass
+ for i in SIZE_UNITS.keys():
+ if s.endswith(i):
+ try:
+ return int(s[:-1]) * SIZE_UNITS[i]
+ except ValueError:
+ break
+ raise ValueError("Invalid size specification.")
+
+
+def parse_anchor_spec(s):
+ """
+ Return a tuple, or None on error.
+ """
+ if "=" not in s:
+ return None
+ return tuple(s.split("=", 1))
+
+
+def xrepr(s):
+ return repr(s)[1:-1]
+
+
+def inner_repr(s):
+ """
+ Returns the inner portion of a string or unicode repr (i.e. without the
+ quotes)
+ """
+ if isinstance(s, unicode):
+ return repr(s)[2:-1]
+ else:
+ return repr(s)[1:-1]
+
+
+def escape_unprintables(s):
+ """
+ Like inner_repr, but preserves line breaks.
+ """
+ s = s.replace("\r\n", "PATHOD_MARKER_RN")
+ s = s.replace("\n", "PATHOD_MARKER_N")
+ s = inner_repr(s)
+ s = s.replace("PATHOD_MARKER_RN", "\n")
+ s = s.replace("PATHOD_MARKER_N", "\n")
+ return s
+
+
+class Data(object):
+
+ def __init__(self, name):
+ m = __import__(name)
+ dirname, _ = os.path.split(m.__file__)
+ self.dirname = os.path.abspath(dirname)
+
+ def path(self, path):
+ """
+ Returns a path to the package data housed at 'path' under this
+ module.Path can be a path to a file, or to a directory.
+
+ This function will raise ValueError if the path does not exist.
+ """
+ fullpath = os.path.join(self.dirname, path)
+ if not os.path.exists(fullpath):
+ raise ValueError("dataPath: %s does not exist." % fullpath)
+ return fullpath
+
+
+data = Data(__name__)
+
+
+def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): # pragma: nocover
+ try:
+ pid = os.fork()
+ if pid > 0:
+ sys.exit(0)
+ except OSError as 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 as 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())