#!/usr/bin/env python

"""
critvisor = critbot + supervisor
https://github.com/denis-ryzhkov/critbot

@author Denis Ryzhkov <denisr@denisr.com>
"""

usage = '''Create a config for Supervisor:
[eventlistener:critvisor]
command=critvisor /path/to/critbot_config.py
events=PROCESS_STATE_EXITED,PROCESS_STATE_FATAL
'''

### import

import imp
from critbot import crit
from supervisor.childutils import eventdata, listener
import sys

### main

def main():

    if len(sys.argv) < 2:
        exit(usage)
    imp.load_source('critbot_config', sys.argv[1])

    while True:
        headers, event = listener.wait()
        event_name = headers.get('eventname')
        if event_name in ('PROCESS_STATE_EXITED', 'PROCESS_STATE_FATAL'):
            headers, event = eventdata(event + '\n')
            text = 'Process{space_pid} {groupname}:{processname} crashed from {from_state} to {to_state}'.format(
                space_pid=' pid={pid}'.format(**headers) if 'pid' in headers else '',
                to_state=event_name.replace('PROCESS_STATE_', ''),
                **headers
            )
            crit(only=text)
        listener.ok()

if __name__ == '__main__':
    main()
