#! /usr/bin/env python
# -----------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
# -----------------------------------------------------------------------




import subprocess

class DriverStop():
        
    def __init__(self):
        pass
    
    def run(self):
        spArgs = []
        spArgs.append('ps')
        spArgs.append('-elf')
        sp = subprocess.Popen(spArgs, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        out, err = sp.communicate()
        for row in out.split('\n'):
            cols = row.split()
            if(len(cols) > 16):
                pid = cols[3]
                cmd = cols[14]
                arg1 = cols[15]
                arg2 = cols[16]
                if(cmd == 'python'):
                    if(arg1 == '-u'):
                        if(arg2 == './driver.py'):
                            spArgs = []
                            spArgs.append('kill')
                            spArgs.append('-9')
                            spArgs.append(pid)
                            print spArgs[0]+' '+spArgs[2]
                            #print spArgs
                            sp = subprocess.Popen(spArgs, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
                            out, err = sp.communicate()
                            if out:
                                print out
                            if err:
                                print err
    
if __name__ == '__main__':

    function = DriverStop()
    function.run()
