aboutsummaryrefslogtreecommitdiff
path: root/applications/github/github_branch_protections.py
diff options
context:
space:
mode:
authorChristian Cleberg <hello@cleberg.net>2024-12-28 11:30:03 -0600
committerChristian Cleberg <hello@cleberg.net>2024-12-28 11:30:03 -0600
commit2ee3e7af7b9133da946dff2643505a3d7013b3c0 (patch)
tree30159ba605abc870507902bcbc53bf6733487476 /applications/github/github_branch_protections.py
parentbe74e8cab3bbd8b702adce0127cec2bb48dd7b7b (diff)
downloadaudit-tools-2ee3e7af7b9133da946dff2643505a3d7013b3c0.tar.gz
audit-tools-2ee3e7af7b9133da946dff2643505a3d7013b3c0.tar.bz2
audit-tools-2ee3e7af7b9133da946dff2643505a3d7013b3c0.zip
restructure directories
Diffstat (limited to 'applications/github/github_branch_protections.py')
-rw-r--r--applications/github/github_branch_protections.py78
1 files changed, 78 insertions, 0 deletions
diff --git a/applications/github/github_branch_protections.py b/applications/github/github_branch_protections.py
new file mode 100644
index 0000000..73c94b6
--- /dev/null
+++ b/applications/github/github_branch_protections.py
@@ -0,0 +1,78 @@
+"""
+Gathers branch protection rules for a repository.
+"""
+
+import requests
+
+GITHUB_TOKEN = 'your_personal_access_token'
+ORGANIZATION = 'your_organization'
+REPOSITORY = 'your_repository'
+TIMEOUT = 30
+
+headers = {
+ 'Authorization': f'token {GITHUB_TOKEN}',
+ 'Accept': 'application/vnd.github.v3+json'
+}
+
+def get_all_branches(org, repo):
+ """
+ Get all branches in a repository
+ """
+ all_branches = []
+ page = 1
+ while True:
+ url = f'https://api.github.com/repos/{org}/{repo}/branches?page={page}&per_page=100'
+ response = requests.get(url, headers=headers, timeout=TIMEOUT)
+ response.raise_for_status()
+ page_branches = response.json()
+ if not page_branches:
+ break
+ all_branches.extend(page_branches)
+ page += 1
+ return all_branches
+
+def get_branch_protection(org, repo, repo_branch):
+ """
+ Get branch protection settings
+ """
+ url = f'https://api.github.com/repos/{org}/{repo}/branches/{repo_branch}/protection'
+ response = requests.get(url, headers=headers, timeout=TIMEOUT)
+ if response.status_code == 404:
+ return None # No protection settings for this branch
+ response.raise_for_status()
+ return response.json()
+
+def get_repository_rulesets(org, repo):
+ """
+ Get repository rulesets
+ """
+ url = f'https://api.github.com/repos/{org}/{repo}/rulesets'
+ response = requests.get(url, headers=headers, timeout=TIMEOUT)
+ response.raise_for_status()
+ return response.json()
+
+if __name__ == '__main__':
+ try:
+ # Get all branches in the repository
+ branches = get_all_branches(ORGANIZATION, REPOSITORY)
+ print(f"Total branches in the repository '{REPOSITORY}': {len(branches)}")
+
+ # Get protection settings for each branch
+ for branch in branches:
+ branch_name = branch['name']
+ protection_settings = get_branch_protection(ORGANIZATION, REPOSITORY, branch_name)
+ print(f"\nBranch: {branch_name}")
+ if protection_settings:
+ print(f"Protection settings: {protection_settings}")
+ else:
+ print("No protection settings")
+
+ # Get repository rulesets
+ rulesets = get_repository_rulesets(ORGANIZATION, REPOSITORY)
+ print(f"\nRepository rulesets for '{REPOSITORY}':")
+ print(rulesets)
+
+ except requests.exceptions.Timeout:
+ print("The request timed out")
+ except requests.exceptions.RequestException as e:
+ print(f"An error occurred: {e}")