mirror of
https://git.juggalol.com/agatha/gitmon.git
synced 2024-11-22 15:36:43 +00:00
Initial commit
This commit is contained in:
commit
49e1d16c6f
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
.idea/
|
||||
venv/
|
||||
|
||||
__pycache__/
|
||||
*.py[cod]
|
15
README.md
Normal file
15
README.md
Normal file
@ -0,0 +1,15 @@
|
||||
# GitMon
|
||||
Monitor GitHub events and clone repositories to search for secrets, and more.
|
||||
|
||||
## Overview
|
||||
GitMon allows an operator to continually monitor the GitHub Events API to collect
|
||||
metadata and look for secret leakage.
|
||||
|
||||
When certain events such as _CreateEvent_ or _DeleteEvent_ are observed, GitMon
|
||||
will send the repository URL to a worker that will clone the repository and
|
||||
search for API keys, passwords, endpoints, and more.
|
||||
|
||||
GitMon will also build a table that maps commit email addresses to GitHub usernames.
|
||||
|
||||
## Contributors
|
||||
- agathanonymous
|
0
gitmon/__init__.py
Normal file
0
gitmon/__init__.py
Normal file
46
gitmon/api.py
Normal file
46
gitmon/api.py
Normal file
@ -0,0 +1,46 @@
|
||||
"""GitHub API module"""
|
||||
import logging
|
||||
import requests
|
||||
from requests.adapters import HTTPAdapter
|
||||
from requests.packages.urllib3.util.retry import Retry
|
||||
|
||||
|
||||
class GitHubApi:
|
||||
def __init__(self, proxy=None):
|
||||
self.base_url = 'https://api.github.com'
|
||||
self.session = requests.Session()
|
||||
|
||||
retries = Retry(total=3, backoff_factor=1)
|
||||
self.session.mount('https://', HTTPAdapter(max_retries=retries))
|
||||
|
||||
if proxy:
|
||||
self.session.proxies.update(proxy)
|
||||
|
||||
def __get(self, endpoint, params=None):
|
||||
"""GET an HTTP resource and return JSON."""
|
||||
url = self.base_url + endpoint
|
||||
|
||||
try:
|
||||
response = self.session.get(url, params=params)
|
||||
except requests.RequestException as e:
|
||||
logging.warning(f'Failed to execute GET request: {str(e)}')
|
||||
return None
|
||||
|
||||
self.__parse_headers(response.headers)
|
||||
return response.json()
|
||||
|
||||
def __parse_headers(self, headers):
|
||||
"""Parse headers to update rate limits."""
|
||||
pass
|
||||
|
||||
def get_events(self, page=None):
|
||||
"""Fetch GitHub events."""
|
||||
endpoint = '/events'
|
||||
params = None
|
||||
|
||||
if page:
|
||||
params = {'page': page}
|
||||
|
||||
events = self.__get(endpoint, params)
|
||||
|
||||
return events
|
16
main.py
Normal file
16
main.py
Normal file
@ -0,0 +1,16 @@
|
||||
"""GitMon"""
|
||||
from gitmon.api import GitHubApi
|
||||
|
||||
|
||||
def main():
|
||||
"""Main entry point."""
|
||||
|
||||
api = GitHubApi()
|
||||
|
||||
events = api.get_events()
|
||||
for event in events:
|
||||
print(event['type'])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
1
requirements.txt
Normal file
1
requirements.txt
Normal file
@ -0,0 +1 @@
|
||||
requests
|
Loading…
Reference in New Issue
Block a user