summaryrefslogtreecommitdiff
path: root/shim.py
blob: aa74f92e741a6d8d7715bc55e985400f86699d06 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import re
import os
import atexit
import shutil
import subprocess
import __builtin__
from cStringIO import StringIO

FILES = []

_fdopen = os.fdopen
_oopen = os.open
_open = __builtin__.open
def write_files():
    os.open = _oopen
    os.fdopen = _fdopen
    __builtin__.open = _open

    for file in FILES:
        if not file._safe_name():
            continue
        _open(file._safe_name(), 'w').write(file.buffer.getvalue())


atexit.register(write_files)


class FakeOpenFile:

    def __init__(self, name=None):
        self.name = name
        self.buffer = StringIO()
        FILES.append(self)

    def _safe_name(self):
        name = self.name
        if hasattr(self.name, 'name'):
            name = self.name.name
        if isinstance(name, int):
            return None
        return str(name).replace("/", "__")

    def readline(self):
        return "Ubuntu"

    def writelines(self, lines):
        self.buffer.write(lines)

    def write(self, lines):
        self.buffer.write(lines)

    def read(self):
        return ""

    def close(self):
        pass

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        pass


shutil.copyfile = lambda x, y: False

def patched_call(*args, **kwargs):
    print "CALL: {!r} {!r}".format(args, kwargs)
    return 0

subprocess.call = patched_call

os.geteuid = lambda: 0

def patched_system(*args, **kwargs):
    print "SYSTEM: {!r} {!r}".format(args, kwargs)

os.system = patched_system

_old_open = __builtin__.open
def patched_open(name):
    def opener(*args, **kwargs):
        if args[0] == os.devnull:
            return _old_open(os.devnull)

        print "{}: {!r} {!r}".format(name, args, kwargs)

        return FakeOpenFile(args[0])
    return opener

os.open = patched_open("OS.OPEN")
os.fdopen = patched_open("OS.FDOPEN")
__builtin__.open = patched_open("OPEN")

def patched_mkdir(*args, **kwargs):
    print "MKDIR: {!r} {!r}".format(args, kwargs)

os.mkdir = patched_mkdir

def patched_raw_input(prompt):
    print prompt
    value = re.findall('\[([^\]]+)\]', prompt)[0]
    return value if value != 'Y' else 'n'

__builtin__.raw_input = patched_raw_input