Last active
June 24, 2019 08:26
-
-
Save daTokenizer/4ce85348e36a379f5079049e0c7ecb29 to your computer and use it in GitHub Desktop.
generate github access report for all repos of a single org, useful in the SOC evaluation stage, and for ongoing maintenance of security credentials
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/bin/python3 | |
from github import Github, GithubException | |
from prettytable import PrettyTable | |
import sys | |
def printProgressBar (iteration, total, prefix = 'Progress:', suffix = 'Complete', total_length = 78, fill = '█'): | |
percent = 100 * (iteration / float(total)) | |
percent_str = ("{0:.1f}").format(percent) | |
length = total_length - len(prefix) - len(suffix) - len (percent_str) | |
filledLength = int(length * iteration // total) | |
bar = fill * filledLength + '-' * (length - filledLength) | |
print('\r%s |%s| %s%% %s ' % (prefix, bar, percent_str, suffix), end = '\r') | |
# Print New Line on Complete | |
if iteration == total: | |
print() | |
def get_name(member): | |
return f'{member.login} ({member.name})' if member.name else member.login | |
def run(org_name, access_token, out_file=None): | |
if out_file: | |
print(f"Outputting to {out_file} as csv") | |
else: | |
print("No file name supplied, outputting to stdout as PrettyTable") | |
titles = ["Project Name", "User", "Access Level"] | |
if out_file: | |
report = [", ".join(titles)] | |
else: | |
report = PrettyTable() | |
report.field_names = titles | |
g = Github(access_token) #"access_token") | |
emg = g.get_organization(org_name) | |
repos = list(emg.get_repos()) | |
members = [(m, get_name(m)) for m in emg.get_members()] | |
l = len(repos) * len(members) | |
i=0 | |
for repo in repos:#type='private'): | |
for member, member_name in members: | |
printProgressBar(i, l) # print('.', end='', flush=True) | |
try: | |
member_prem = repo.get_collaborator_permission(member) | |
except GithubException: | |
try: | |
member_prem = repo.get_collaborator_permission(member) | |
except GithubException: | |
member_prem = "ERROR" | |
row = [repo.name, member_name, member_prem] | |
if out_file: | |
report.append(", ".join(row)) | |
else: | |
report.add_row(row) | |
i +=1 | |
if out_file: | |
try: | |
file = open(out_file, 'w') | |
for row in report: | |
file.write(row+"\n") | |
file.close() | |
except: | |
for row in report: | |
print(row) | |
else: | |
print() | |
print(report) | |
##### Main #### | |
try: | |
run(sys.argv[1], sys.argv[2], sys.argv[3]) | |
except: | |
run(sys.argv[1], sys.argv[2]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment