Skip to content

Instantly share code, notes, and snippets.

@daTokenizer
Last active June 24, 2019 08:26
Show Gist options
  • Save daTokenizer/4ce85348e36a379f5079049e0c7ecb29 to your computer and use it in GitHub Desktop.
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
#! /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