Use dir named after user by default. Use fork to handle multiple files at once.
This commit is contained in:
parent
349ee8a646
commit
d672788a65
|
@ -8,6 +8,7 @@ import sys
|
|||
import argparse
|
||||
import daemon
|
||||
import hashlib
|
||||
import getpass
|
||||
|
||||
sockpath = "mailcap.sock"
|
||||
|
||||
|
@ -41,20 +42,16 @@ class Server(object):
|
|||
retval += data
|
||||
return retval
|
||||
|
||||
def __init__(self, path="mailcap.sock", dir = None):
|
||||
def __init__(self, path="mailcap.sock"):
|
||||
self._socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
||||
self._socket.bind(path)
|
||||
self._socket.listen(3)
|
||||
if dir:
|
||||
if not os.path.exists(dir):
|
||||
os.makedirs(dir)
|
||||
self._dir = dir
|
||||
else:
|
||||
self._dir = tempfile.TemporaryDirectory(prefix="mailcapd")
|
||||
|
||||
def close(self):
|
||||
self._socket.close()
|
||||
self._dir.cleanup()
|
||||
|
||||
def next_file(self, initial_timeout=None, timeout=5):
|
||||
conn = self.Connection(self._socket.accept()[0])
|
||||
|
@ -97,7 +94,7 @@ class Server(object):
|
|||
if data is None:
|
||||
return None
|
||||
|
||||
full_name = os.path.join(self._dir.name, fn)
|
||||
full_name = os.path.join(self._dir, fn)
|
||||
append = 0
|
||||
# While the filename already exists, check if we have a hash match
|
||||
print("Trying path %s" % (full_name,))
|
||||
|
@ -117,9 +114,9 @@ class Server(object):
|
|||
hash = hashlib.sha256()
|
||||
name_parts = fn.split('.')
|
||||
if len(name_parts) > 1:
|
||||
full_name = os.path.join(self._dir.name, "%s-%d.%s" % ('.'.join(name_parts[:-1]), append, name_parts[-1]))
|
||||
full_name = os.path.join(self._dir, "%s-%d.%s" % ('.'.join(name_parts[:-1]), append, name_parts[-1]))
|
||||
else:
|
||||
full_name = os.path.join(self._dir.name, "%s-%d" % (fn, append))
|
||||
full_name = os.path.join(self._dir, "%s-%d" % (fn, append))
|
||||
print("Accepted filename %s" % (full_name,))
|
||||
conn.send(b'\x01')
|
||||
|
||||
|
@ -130,7 +127,7 @@ class Server(object):
|
|||
file_len = struct.unpack("!I", data)[0]
|
||||
|
||||
# Receive the file data
|
||||
fn = os.path.join(self._dir.name, fn)
|
||||
fn = os.path.join(self._dir, fn)
|
||||
with open(fn, "wb+") as f:
|
||||
while file_len > 0:
|
||||
data = conn.recv(min(4096, file_len))
|
||||
|
@ -147,24 +144,35 @@ class Server(object):
|
|||
|
||||
def run_server(args):
|
||||
sv = Server(path=args.socket, dir=args.dir)
|
||||
caps = mailcap.getcaps()
|
||||
open(args.pid, "w+").write(str(os.getpid()))
|
||||
while True:
|
||||
rv = sv.next_file()
|
||||
if rv:
|
||||
f, mime = rv
|
||||
print(f, mime)
|
||||
caps = mailcap.getcaps()
|
||||
match = mailcap.findmatch(caps, mime.split(';')[0], filename=f)
|
||||
if match and match[0]:
|
||||
pid = os.fork()
|
||||
if pid != 0:
|
||||
os.waitid(os.P_PID, pid, os.WEXITED)
|
||||
else:
|
||||
pid2 = os.fork()
|
||||
if pid2 != 0:
|
||||
exit(0)
|
||||
else:
|
||||
os.system(match[0])
|
||||
|
||||
if __name__ == "__main__":
|
||||
tempbase = tempfile.gettempdir()
|
||||
user = getpass.getuser()
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('--pid', '-p', default=os.path.join(os.environ['HOME'], '.mailcap.pid'))
|
||||
parser.add_argument('--action', '-a', default='run', choices=['run', 'kill'])
|
||||
parser.add_argument('--no-daemonize', '-n', action='store_true')
|
||||
parser.add_argument('--socket', '-s', default=os.path.join(os.environ['HOME'], '.mailcap.sock'))
|
||||
parser.add_argument('--dir', '-d', default=None)
|
||||
parser.add_argument('--dir', '-d', default=os.path.join(tempbase, "mailcap-server_" + user))
|
||||
parser.add_argument('--force', '-f', action='store_true')
|
||||
args = parser.parse_args()
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user