#! /usr/bin/python3
# -*- python -*-
# -*- coding: utf-8 -*-
#   print process flags
#   Copyright (C) 2015 Red Hat Inc.
#   Arnaldo Carvalho de Melo <acme@redhat.com>
#
#   This application is free software; you can redistribute it and/or
#   modify it under the terms of the GNU General Public License
#   as published by the Free Software Foundation; version 2.
#
#   This application is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   General Public License for more details.


import procfs, re, fnmatch, sys
import argparse
from functools import reduce
from six.moves import map

ps = None

def thread_mapper(s):
    global ps

    try:
        return [int(s), ]
    except:
        pass
    try:
        return ps.find_by_regex(re.compile(fnmatch.translate(s)))
    except:
        return ps.find_by_name(s)

def main(argv):

    global ps
    ps = procfs.pidstats()

    parser = argparse.ArgumentParser(description='Print process flags')
    parser.add_argument('pid', nargs='*', help='a list of pids or names')
    args = parser.parse_args()

    if len(argv) > 1:
        pids = args.pid
        pids = reduce(lambda i, j: i + j, list(map(thread_mapper, pids)))
    else:
        pids = list(ps.processes.keys())

    pids.sort()
    len_comms = []
    for pid in pids:
        if pid in ps:
            try:
                len(ps[pid]["stat"]["comm"])
            except (TypeError, FileNotFoundError):
                continue
            len_comms.append(len(ps[pid]["stat"]["comm"]))

    max_comm_len = max(len_comms, default=0)
    del len_comms

    for pid in pids:
        if pid not in ps:
            continue
        try:
            flags = ps[pid].stat.process_flags()
        except AttributeError:
            continue
        # Remove flags that were superseeded
        if "PF_THREAD_BOUND" in flags and "PF_NO_SETAFFINITY" in flags:
            flags.remove("PF_THREAD_BOUND")
        if "PF_FLUSHER" in flags and "PF_NPROC_EXCEEDED" in flags:
            flags.remove("PF_FLUSHER")
        if "PF_SWAPOFF" in flags and "PF_MEMALLOC_NOIO" in flags:
            flags.remove("PF_SWAPOFF")
        if "PF_FREEZER_NOSIG" in flags and "PF_SUSPEND_TASK" in flags:
            flags.remove("PF_FREEZER_NOSIG")
        comm = ps[pid].stat["comm"]
        flags.sort()
        sflags = reduce(lambda i, j: "%s|%s" % (i, j), [a[3:] for a in flags])
        print("%6d %*s %s" %(pid, max_comm_len, comm, sflags))

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