1
2
3
4
5
6 import json
7 import logging
8 import os.path
9 import socket
10 import tempfile
11 import threading
12
13 from lib.cuckoo.common.config import Config
14
15 cfg = Config()
16 log = logging.getLogger(__name__)
17 unixpath = tempfile.mktemp()
18 lock = threading.Lock()
19
20 vpns = {}
21
22 -def rooter(command, *args, **kwargs):
23 if not os.path.exists(cfg.cuckoo.rooter):
24 log.critical("Unable to passthrough root command (%s) as the rooter "
25 "unix socket doesn't exist.", command)
26 return
27
28 lock.acquire()
29
30 s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
31
32 if os.path.exists(unixpath):
33 os.remove(unixpath)
34
35 s.bind(unixpath)
36
37 try:
38 s.connect(cfg.cuckoo.rooter)
39 except socket.error as e:
40 log.critical("Unable to passthrough root command as we're unable to "
41 "connect to the rooter unix socket: %s.", e)
42 return
43
44 s.send(json.dumps({
45 "command": command,
46 "args": args,
47 "kwargs": kwargs,
48 }))
49
50 ret = json.loads(s.recv(0x10000))
51
52 lock.release()
53
54 if ret["exception"]:
55 log.warning("Rooter returned error: %s", ret["exception"])
56
57 return ret["output"]
58