#!/usr/bin/python
#coding utf8

import os
import sys
import time

def getRuningProgramPids(progname):
    pids = []
    lines = os.popen('ps -ef | grep %s' % progname).readlines()
    for l in lines:
        line = ''
        oldc = ''
        for c in l.strip():
            if c in [' ', '\t'] and c == oldc:
                continue
            oldc = c
            line += c
        line = line.split(' ')

        if line[7] == './%s' % progname:
            pids.append(line[1])
    return pids

def getExePath(pid):
    return os.popen('ls -l /proc/%d | grep "exe ->" | cut -d " " -f 7-' % int(pid)).read()

def getExeCmdLine(pid):
    return os.popen('cat /proc/%d/cmdline' % int(pid)).read()

def stop(instance_id, node_id, progname):
    pids = getRuningProgramPids(progname)
    for pid in pids:
        exepath = getExePath(pid)
        cmdline = getExeCmdLine(pid)
        if cmdline == ("./%s\0-i\0%d\0-n\0%d\0" % (progname, instance_id, node_id)):
            os.popen('kill -9 %d' % int(pid))

def listServer(progname):
    pids = getRuningProgramPids(progname)
    for pid in pids:
        exepath = getExePath(pid)
        cmdline = getExeCmdLine(pid)
        print(pid, exepath, cmdline)

def restartServer(str_instance_ids, str_node_id, progname):
    instance_ids = str_instance_ids.split(',')
    node_id = int(str_node_id)
    for instance_id in instance_ids:
        instance_id = int(instance_id)
        stop(instance_id, node_id, progname)
        time.sleep(0.5)
        print('%s %d %d starting......' % (progname, instance_id, node_id))
        cmd = 'sh start_instance.sh %d %d' % (instance_id, node_id)
        os.popen(cmd)
        time.sleep(0.5)

def printHelp():
    print('usuage: [restart stop list]')

def main(argv):
    if len(argv) == 1:
        printHelp()
    else:
        if argv[1] == 'restart':
            restartServer(argv[2], argv[3], argv[4])
        elif argv[1] == 'stop':
            stop(argv[2], argv[3], argv[4])
        elif argv[1] == 'list':
            listServer(argv[2])

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