#!/usr/bin/python
import sys
import os
import ConfigParser
import argparse
import logging
from subprocess import call, check_call
import wsa.infra.wsa_file_paths as paths
import wsa.infra.wsa_logging

class executeListener(object):
    ''' class to execute cli commands to perform basic commands '''
    logger = logging.getLogger("AGENT")

    def __init__(self):
        ''' init function '''
        self.pid_file_path = '/var/log/wsa/speedpid.txt'


    def start(self):
        '''start speed listener, if it is already running, don't start it'''
        if self.status() is True:
            self.logger.info('Speed Listener is already running')
        else:
            args = sys.executable  + ' ' + sys.prefix +\
                   paths.filepaths['System']['wsa_install_dir'] + \
                   'wsa/speed_listener.py &'

            call(args, shell=True)
            call("ps -ef | grep speed_listener.py | grep -v grep | awk '{print $1}' 1>"+\
                self.pid_file_path, shell=True)
            self.logger.warning('Starting Speed Listener')


    def stop(self):
        '''stop speed listener, if it is not running, don't do anything'''
        if self.status() is True:
            with open(self.pid_file_path) as f:
                pid = f.read().strip()
            call('pkill -TERM -P ' + pid, shell=True)
            call('kill -9 ' + pid, shell=True)
            try:
                os.remove(self.pid_file_path)
                self.logger.warning('Speed Listener is stopped')
            except OSError as err:
                self.logger.error("Failed to remove Speed Listener PID file: " + str(err))
        else:
            self.logger.warning('Speed Listener is not running')


    def restart(self):
        ''' restart speed listener '''
        self.logger.warning('Restarting Speed Listener')
        if self.status() is True:
            self.stop()
            self.start()
        else:
            self.start()


    def status(self):
        ''' status of speed listener '''
        if os.path.isfile(self.pid_file_path):
            with open(self.pid_file_path) as f:
                pid = f.read().strip()
            try:
                out = check_call("cat /proc/"+pid+"/cmdline | grep speed_listener.py 1>/dev/null",\
                    shell=True)
            except Exception as err:
                return False
            if out == 0:
                return True
        return False


def cli_parser():
    ''' cli parser takes in arguments with argparse '''
    cli_parser.exe = executeListener()
    commands = ['start', 'stop', 'status', 'restart']
    parser = argparse.ArgumentParser(prog="speed_listener", usage='%(prog)s [command]')
    parser.add_argument('execute', choices=commands, action='store',
                        help='command for speed listener to execute')

    args = parser.parse_args()

    if args.execute == 'start':
        cli_parser.exe.start()
    elif args.execute == 'stop':
        cli_parser.exe.stop()
    elif args.execute == 'status':
        cli_parser.exe.status()
    elif args.execute == 'restart':
        cli_parser.exe.restart()

if __name__ == "__main__":
    cli_parser()
