summaryrefslogtreecommitdiff
path: root/tools/merge
blob: 0d1bf0ee4e263dcd6488408d221e16b272ebbed3 (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
#! /usr/bin/env python
"""merge"""

import os
import sys
import signal
from time import sleep
from mergetools import parse_args
from multiprocessing import Process
import merge_fetch, merge_backup, merge_sth, merge_dist

def run_once():
    """Merge once."""
    ret = merge_fetch.main()
    if ret == 0:
        ret = merge_backup.main()
    if ret == 0:
        ret = merge_sth.main()
    if ret == 0:
        ret = merge_dist.main()
    return ret

def term(signal, arg):
    sys.exit(1)

def run_continuously(pidfilepath):
    """Run continuously."""
    parts = ('fetch', merge_fetch), ('backup', merge_backup), ('sth', merge_sth), ('dist', merge_dist)
    procs = {}
    for part, mod in parts:
        procs[part] = Process(target=mod.main, name='merge_%s' % part)
        procs[part].daemon = True
        procs[part].start()

    if pidfilepath:
        open(pidfilepath, 'w').write(str(os.getpid()) + '\n')

    signal.signal(signal.SIGTERM, term)
    while True:
        for name, p in procs.items():
            if not p.is_alive():
                print >>sys.stderr, "\nERROR:", name, "process is gone; exiting"
                return 1
        sleep(1)

def main():
    """Main"""
    args, _, _ = parse_args()

    if args.mergeinterval is None:
        ret = run_once()
    else:
        ret = run_continuously(args.pidfile)

    return ret

if __name__ == '__main__':
    sys.exit(main())