diff options
author | Anthony G. Basile <blueness@gentoo.org> | 2015-10-09 20:35:08 -0400 |
---|---|---|
committer | Anthony G. Basile <blueness@gentoo.org> | 2015-10-09 20:35:15 -0400 |
commit | 438583d1e40fd764d491974d1b0ebd75cacf2148 (patch) | |
tree | dcf451d47e19edc10994f0d40ebcbe295b06b5d3 | |
parent | grs/Interpret.py: clean up parsing a line. (diff) | |
download | grss-438583d1e40fd764d491974d1b0ebd75cacf2148.tar.gz grss-438583d1e40fd764d491974d1b0ebd75cacf2148.tar.bz2 grss-438583d1e40fd764d491974d1b0ebd75cacf2148.zip |
grs/Interpret.py: restructure semantic actions.
-rw-r--r-- | grs/Interpret.py | 106 |
1 files changed, 42 insertions, 64 deletions
diff --git a/grs/Interpret.py b/grs/Interpret.py index 7add215..15b6cfa 100644 --- a/grs/Interpret.py +++ b/grs/Interpret.py @@ -79,20 +79,27 @@ class Interpret(Daemon): sys.exit(signum + 128) - def smartlog(_log, obj, has_obj): - """ This logs whether or not we have a grammatically incorrect - directive, or we are doing a mock run, and returns whether - or not we should execute the directive: - True = skip this directive - False = don't skip it - """ - if (has_obj and not obj) or (not has_obj and obj): - _lo.log('Bad command: %s' % _log) - return True + def signalexit(): + pid = os.getpid() + while True: + os.kill(pid, signal.SIGTERM) + time.sleep(2.0) + + + def semantic_action(_line, objs, n, execstr): + """ Execute the directive """ if self.mock_run: - _lo.log(_log) - return True - return False + _lo.log(_line) + return + try: + if len(objs) < n: + raise Exception('Number of objs for verb incorrect.') + exec(execstr) + except Exception as e: + _lo.log('Bad command: %s' % _line) + _lo.log('Exception throw: %s' % e) + _lo.log('SENDING SIGTERM to pid = %d\n' % pid) + signalexit() def stampit(progress): @@ -195,82 +202,53 @@ class Interpret(Daemon): sentence = _line.split() verb = sentence[0] objs = sentence[1:] - obj = objs[0] # This long concatenated if is where the semantics of the # build script are implemented. Note: 'hashit' can only come # after 'tarit' or 'isoit' so that it knows the medium_name # to hash, ie whether its a .tar.xz or a .iso if verb == 'log': - if smartlog(_line, obj, True): - stampit(progress) - continue - if obj == 'stamp': - _lo.log('='*80) - else: - _lo.log(obj) + if objs[0] == 'stamp': + objs[0] = '='*80 + semantic_action(_line, objs, 1, '_lo.log(\' \'.join(objs))') elif verb == 'mount': - if smartlog(_line, obj, False): - stampit(progress) - continue - _md.mount_all() + semantic_action(_line, objs, 0, '_md.mount_all()') elif verb == 'unmount': - if smartlog(_line, obj, False): - stampit(progress) - continue - _md.umount_all() + semantic_action(_line, objs, 0, '_md.umount_all()') elif verb == 'populate': - if smartlog(_line, obj, True): - stampit(progress) - continue - _po.populate(cycle=int(obj)) + semantic_action(_line, objs, 1, '_po.populate(cycle=int(objs[0]))') elif verb == 'runscript': - if smartlog(_line, obj, True): - stampit(progress) - continue - _ru.runscript(obj) + semantic_action(_line, objs, 1, '_ru.runscript(objs[0])') elif verb == 'pivot': - if smartlog(_line, obj, True): - stampit(progress) - continue - _pc.pivot(obj, _md) + semantic_action(_line, objs, 1, '_pc.pivot(objs[0], _md)') elif verb == 'kernel': - if smartlog(_line, obj, False): - stampit(progress) - continue - _ke.kernel() + semantic_action(_line, objs, 0, '_ke.kernel()') elif verb == 'tarit': - # 'tarit' can either be just a verb, - # or a 'verb obj' pair. - if obj: - smartlog(_line, obj, True) - _bi.tarit(obj) + # 'tarit' can either be just a verb, or a 'verb obj' pair. + if len(objs): + semantic_action(_line, objs, 1, '_bi.tarit(objs[0])') else: - smartlog(_line, obj, False) - _bi.tarit() + semantic_action(_line, objs, 0, '_bi.tarit()') medium_type = 'tarit' elif verb == 'isoit': - # 'isoit' can either be just a verb, - # or a 'verb obj' pair. - if obj: - smartlog(_line, obj, True) - _io.isoit(obj) + # 'isoit' can either be just a verb, or a 'verb obj' pair. + if len(objs): + semantic_action(_line, objs, 1, '_io.isoit(objs[1])') else: - smartlog(_line, obj, False) - _io.isoit() + semantic_action(_line, objs, 0, '_io.isoit()') medium_type = 'isoit' elif verb == 'hashit': - if smartlog(_line, obj, False): - stampit(progress) - continue if medium_type == 'tarit': - _bi.hashit() + semantic_action(_line, objs, 0, '_bi.hashit()') elif medium_type == 'isoit': - _io.hashit() + semantic_action(_line, objs, 0, '_io.hashit()') else: raise Exception('Unknown medium to hash.') else: _lo.log('Bad command: %s' % _line) + _lo.log('Unknown verb: %s' % verb) + _lo.log('SENDING SIGTERM to pid = %d\n' % pid) + signalexit() stampit(progress) |