120a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski#!/usr/bin/python
220a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
320a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski# Use of this source code is governed by a BSD-style license that can be
420a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski# found in the LICENSE file.
520a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
620a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski"""Extract list of team members for the root individual."""
720a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
820a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
920a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalskiimport commands
1020a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalskiimport json
1120a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalskiimport logging
1220a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalskiimport optparse
1320a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalskiimport os
1420a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalskiimport sys
1520a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
1620a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
1720a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalskidef ParseArgs(argv):
1820a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  """Get input and output file."""
1920a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  base_dir = os.path.realpath(os.path.abspath(os.path.join(
2020a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski      os.getcwd(), os.path.dirname(__file__))))
2120a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
2220a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  parser = optparse.OptionParser()
2320a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  parser.add_option('-r', '--root-person', help='initial person to follow',
2420a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski                    dest='rootperson', default=None)
2520a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  parser.add_option('-o', '--output-file', help='output file (json)',
2620a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski                    dest='outputfile', default="kernel-team.json")
2720a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  parser.add_option('-p', '--print-test', help='print the map as a test',
2820a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski                    dest='printtest', action='store_true', default=False)
2920a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  parser.add_option('-v', '--verbose', help='Show more output',
3020a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski                    dest='verbose', action='store_true', default=False)
3120a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  options, args = parser.parse_args()
3220a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
3320a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  if not options.rootperson:
3420a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski    parser.error('--root-person must be supplied')
3520a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
3620a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  logging_level = logging.INFO
3720a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  if options.verbose:
3820a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski    logging_level = logging.DEBUG
3920a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
4020a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  logging.basicConfig(level=logging_level)
4120a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
4220a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  return options, args, base_dir
4320a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
4420a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
4520a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalskidef SearchOnePerson(person):
4620a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  """Run a command to get details for one person."""
4720a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  found = []
4820a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  if person:
4920a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski    command = 'f %s | grep Reportees' % person
5020a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski    logging.debug(command)
5120a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski    find_result = commands.getoutput(command)
5220a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski    if find_result:
5320a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski      found = find_result.split(' ')[2:]
5420a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski      logging.debug(found)
5520a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  return found
5620a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
5720a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
5820a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalskidef FindTeamMembers(root_person):
5920a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  """Recursively iteratea through the list of team members until done.
6020a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
6120a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  Expect the root_person to have at least 1 report but not needed.
6220a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  """
6320a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  remaining = [root_person]
6420a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  extracted = [root_person]
6520a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  while remaining:
6620a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski    found = SearchOnePerson(remaining.pop(0))
6720a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski    if found:
6820a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski      remaining += found
6920a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski      extracted += found
7020a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
7120a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  return extracted
7220a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
7320a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
7420a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalskidef WriteJson(outputfile, extracted):
7520a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  """Write output in json format."""
7620a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  f = open(outputfile, 'w')
7720a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  json.dump(extracted, f)
7820a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  f.close()
7920a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
8020a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
8120a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalskidef PrintJson(jsonfile):
8220a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  """Read the json file and format-print its contents as a test."""
8320a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  f = open(jsonfile, 'r')
8420a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  team_list = json.load(f)
8520a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  f.close()
8620a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  for t in sorted(team_list):
8720a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski    logging.info('%s', t)
8820a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
8920a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
9020a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalskidef main(argv):
9120a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  """Can generate tables, plots and email."""
9220a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  options, args, base_dir = ParseArgs(argv)
9320a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
9420a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  logging.info('Using %s as root.', options.rootperson)
9520a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  logging.info('Using output file: %s', options.outputfile)
9620a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
9720a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  team = FindTeamMembers(options.rootperson)
9820a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  if team:
9920a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski    WriteJson(options.outputfile, team)
10020a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  if options.printtest:
10120a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski    PrintJson(options.outputfile)
10220a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
10320a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski
10420a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalskiif __name__ == '__main__':
10520a9b58ae53932cad6a536e23bb020bfb6e84a49Scott Zawalski  main(sys.argv)
106