aboutsummaryrefslogtreecommitdiff
blob: 7dd3ed777bf583a836d0d6fa394ea7a944359713 (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
#!/usr/bin/env python
#
#    grsrun: this file is part of the GRS suite
#    Copyright (C) 2015  Anthony G. Basile
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.

import os
import re
import signal
import sys
import time

from grs import CONST
from grs import Execute
from grs import Interpret

from getopt import gnu_getopt, GetoptError


def usage(rc=1):
    use = """
usage: grsrun [-m|-u|-h|-s <name>]

flags:             Release run.  Do every step in build script.
     : -u          Update run.  Do only '+' steps.
     : -m          Mock run.  Log what would be done.
     : -s <name>.  Only run for GRS system <name>.
     : -h          Print this help file.
"""
    print(use)
    sys.exit(rc)



def main():
    try:
        opts, x = gnu_getopt(sys.argv[1:], 'mus:h')
    except GetoptError as e:
        usage()

    mock_run = False
    update_run = False
    grsname = None
    for o, a in opts:
        if o == '-h':
            usage(0)
        elif o == '-m':
            mock_run = True
        elif o == '-u':
            update_run = True
        elif o == '-s':
            grsname = a

    os.makedirs(CONST.GRS_CGROUPDIR, mode=0o555, exist_ok=True)
    if not os.path.ismount(CONST.GRS_CGROUPDIR):
        cmd = 'mount -t cgroup -o none,name=grs grs %s' % CONST.GRS_CGROUPDIR
        Execute(cmd)

    count = 0
    for name in CONST.names:
        if grsname:
            if name != grsname:
                count = count + 1
                continue
        if not os.fork():
            subcgroup    = 'run-%s' % name
            subcgroupdir = os.path.join(CONST.GRS_CGROUPDIR, subcgroup)
            os.makedirs(subcgroupdir, exist_ok=True)

            cmd = 'cgclassify -g name=%s:/%s %d' % (CONST.GRS_CGROUP, subcgroup, os.getpid())
            Execute(cmd)

            mr = Interpret(CONST.pidfiles[count], run_number=count, subcgroupdir=subcgroupdir, \
                mock_run=mock_run, update_run=update_run)
            mr.start()
            sys.exit(0)
        count = count + 1


if __name__ == '__main__':
    main()