Projet

Général

Profil

0001-add-new-command-hobo_batch-got-agent.common-to-launc.patch

Benjamin Dauvergne, 01 février 2016 14:25

Télécharger (2,88 ko)

Voir les différences:

Subject: [PATCH 1/2] add new command hobo_batch got agent.common to launch
 commands trough a pipe (#9821)

 .../agent/common/management/commands/hobo_batch.py | 76 ++++++++++++++++++++++
 1 file changed, 76 insertions(+)
 create mode 100644 hobo/agent/common/management/commands/hobo_batch.py
hobo/agent/common/management/commands/hobo_batch.py
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
-