#!/usr/bin/env python

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.

import os
import mozinfo
import shlex
import subprocess
import sys

# determine the platform-specific invocation of `ps`
if mozinfo.isMac:
    psarg = '-Acj'
elif mozinfo.isLinux:
    psarg = 'axwww'
else:
    psarg = 'ax'

def ps(arg=psarg):
    """
    python front-end to `ps`
    http://en.wikipedia.org/wiki/Ps_%28Unix%29
    returns a list of process dicts based on the `ps` header
    """
    retval = []
    process = subprocess.Popen(['ps', arg], stdout=subprocess.PIPE)
    stdout, _ = process.communicate()
    header = None
    for line in stdout.splitlines():
        line = line.strip()
        if header is None:
            # first line is the header
            header = line.split()
            continue
        split = line.split(None, len(header)-1)
        process_dict = dict(zip(header, split))
        retval.append(process_dict)
    return retval

def running_processes(name, psarg=psarg, defunct=True):
    """
    returns a list of
    {'PID': PID of process (int)
     'command': command line of process (list)}
     with the executable named `name`.
     - defunct: whether to return defunct processes
    """
    retval = []
    for process in ps(psarg):
        command = process['COMMAND']
        command = shlex.split(command)
        if command[-1] == '<defunct>':
            command = command[:-1]
            if not command or not defunct:
                continue
        if 'STAT' in process and not defunct:
            if process['STAT'] == 'Z+':
                continue
        prog = command[0]
        basename = os.path.basename(prog)
        if basename == name:
            retval.append((int(process['PID']), command))
    return retval

def get_pids(name):
    """Get all the pids matching name"""

    if mozinfo.isWin:
        # use the windows-specific implementation
        import wpk
        return wpk.get_pids(name)
    else:
        return [pid for pid,_ in running_processes(name)]

if __name__ == '__main__':
    pids = set()
    for i in sys.argv[1:]:
        pids.update(get_pids(i))
    for i in sorted(pids):
        print i
