|
1 |
import sys
|
|
2 |
import struct
|
|
3 |
import StringIO
|
|
4 |
import traceback
|
|
5 |
|
|
6 |
from django.core.management.base import BaseCommand, CommandError
|
|
7 |
from django.core.management import call_command
|
|
8 |
|
|
9 |
|
|
10 |
class Command(BaseCommand):
|
|
11 |
def write_buffer(self, b):
|
|
12 |
sys.stdout.write(b)
|
|
13 |
|
|
14 |
def write_integer(self, i):
|
|
15 |
self.write_buffer(struct.pack('!I', i))
|
|
16 |
|
|
17 |
def write_string(self, s):
|
|
18 |
self.write_integer(len(s))
|
|
19 |
self.write_buffer(s)
|
|
20 |
|
|
21 |
def read_string(self):
|
|
22 |
length = self.read_integer()
|
|
23 |
if length > 100000:
|
|
24 |
raise CommandError('string too big')
|
|
25 |
return self.read_buffer(length)
|
|
26 |
|
|
27 |
def read_buffer(self, length):
|
|
28 |
s = ''
|
|
29 |
while len(s) != length:
|
|
30 |
b = sys.stdin.read(length - len(s))
|
|
31 |
if not b:
|
|
32 |
raise CommandError('EOF')
|
|
33 |
s += b
|
|
34 |
return s
|
|
35 |
|
|
36 |
def read_fmt(self, fmt):
|
|
37 |
n = struct.calcsize(fmt)
|
|
38 |
s = self.read_buffer(n)
|
|
39 |
return struct.unpack(fmt, s)
|
|
40 |
|
|
41 |
def read_integer(self):
|
|
42 |
return self.read_fmt('!I')[0]
|
|
43 |
|
|
44 |
def handle(self, *args, **options):
|
|
45 |
while True:
|
|
46 |
args = self.read_integer()
|
|
47 |
if args > 100:
|
|
48 |
raise CommandError('too much args')
|
|
49 |
argv = []
|
|
50 |
for i in range(args):
|
|
51 |
argv.append(self.read_string())
|
|
52 |
stdin = self.read_string()
|
|
53 |
result, output = self.run_hobo_command(argv, stdin)
|
|
54 |
self.write_integer(result)
|
|
55 |
self.write_string(output)
|
|
56 |
sys.stdout.flush()
|
|
57 |
|
|
58 |
def run_hobo_command(self, argv, stdin):
|
|
59 |
old_stdin = sys.stdin
|
|
60 |
old_stdout = sys.stdout
|
|
61 |
errcode = 0
|
|
62 |
try:
|
|
63 |
sys.stdin = StringIO.StringIO(stdin)
|
|
64 |
sys.stdout = StringIO.StringIO()
|
|
65 |
call_command(*argv)
|
|
66 |
except Exception, e:
|
|
67 |
output = sys.stdout.getvalue()
|
|
68 |
traceback.print_tb(sys.last_traceback, None, sys.stdout)
|
|
69 |
errcode = 1
|
|
70 |
else:
|
|
71 |
output = sys.stdout.getvalue()
|
|
72 |
finally:
|
|
73 |
sys.stdout = old_stdout
|
|
74 |
sys.stdin = old_stdin
|
|
75 |
return errcode, output
|
|
76 |
|
0 |
|
-
|