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