Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 36 additions & 11 deletions gitrecon.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import queue
import time
import urllib.request, urllib.error, urllib.parse
import coloredlogs

__author__ = "Jaime Filson <wick2o@gmail.com>, Borja Ruiz <borja@libcrack.so>"
__email__ = "wick2o@gmail.com, borja@libcrack.so"
Expand All @@ -28,10 +29,17 @@

logname = 'gitrecon'
logfile = '{0}.log'.format(logname)
logging.basicConfig(level=(logging.INFO))

logger = logging.getLogger(logname)
#logger = logging.getLogger(__name__)

#logging.basicConfig(level=(logging.INFO))
#coloredlogs.install(level='DEBUG') # logs program & libs
#coloredlogs.install(level='DEBUG', logger=logger) # logs program only
coloredlogs.install(level=logging.DEBUG, logger=logger)

# LOG_FORMAT = '%(asctime)s [%(levelname)s] %(module)s.%(funcName)s : %(message)s'

# __formatter = logging.Formatter(LOG_FORMAT)
# __streamhandler = logging.StreamHandler()
# __streamhandler.setFormatter(__formatter)
Expand All @@ -47,8 +55,8 @@
import argparse
import simplejson as json
except ImportError as e:
logger.exception('Missing mandatory module(s): {0}'.format(e.message))
logger.exception('Use pip install -r requirements.txt')
logger.critical('Missing mandatory module(s): {0}'.format(e))
logger.critical('Use pip install -r requirements.txt')
sys.exit(1)


Expand Down Expand Up @@ -78,10 +86,18 @@ def logo():

def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument('-d', '--debug', action='store_true', dest='debug', default=False, help='Show debug messages')
parser.add_argument('-r', '--repos', action='store', dest='repos', default=None, type=str, help='Repo list (comma separated)')
parser.add_argument('-t', '--threads', action='store', dest='threads', default=0, type=int, help='Number of threads')
parser.add_argument('-u', '--username', action='store', dest='username', required=True, help='Github username')

parser.add_argument('-d', '--debug', action='store_true',
dest='debug', default=False, help='Show debug messages')
parser.add_argument('-m', '--method', action='store', dest='method',
default='https', type=str, help='Access method (git/https)')
parser.add_argument('-r', '--repos', action='store', dest='repos',
default=None, type=str, help='Repo list (comma separated)')
parser.add_argument('-t', '--threads', action='store', dest='threads',
default=0, type=int, help='Number of threads')
parser.add_argument('-u', '--username', action='store', dest='username',
required=True, help='Github username')

global args
args = parser.parse_args()

Expand All @@ -108,7 +124,7 @@ def dl_worker(repo):
logger.info('Completed %s' % repo['name'])
del dlw_res
except Exception as e:
logger.exception('There was a problem cloning %s %s' % (repo['name'], e.message))
logger.exception('There was a problem cloning %s %s' % (repo['name'], e))


def main():
Expand Down Expand Up @@ -139,8 +155,17 @@ def main():
repos_json = ''
tmp_list = []
for r in args.repos.split(","):
clone_url = None
if args.method == "https":
clone_url = "https://github.com/{0}/{1}.git".format(args.username, r)
elif args.method == "git":
clone_url = "git@github.com:{0}/{1}.git".format(args.username, r)
else:
logger.fatal("Unknown access method {0}".format(args.method))
raise Exception("Unknown access method {0}".format(args.method))
logger.info('Clone URL: {0}'.format(clone_url))
tmp_str = {
"clone_url": "https://github.com/{0}/{1}.git".format(args.username, r),
"clone_url": clone_url,
"full_name": os.path.realpath("{0}/{1}".format(args.username, r)),
"name": "{0}".format(r)}
tmp_list.append(tmp_str)
Expand Down Expand Up @@ -230,7 +255,7 @@ def main():
fp.write('%s\n' % (encoded_itm))
fp.close()
except (OSError, IOError) as e:
logger.exception('Cannot write to "{0}": {1}'.format(filename, e.message))
logger.exception('Cannot write to "{0}": {1}'.format(filename, e))

if args.debug is True:
logger.debug('Generating the dirs wordlist')
Expand All @@ -246,7 +271,7 @@ def main():
fp.write('%s\n' % (itm[0]))
fp.close()
except (OSError, IOError) as e:
logger.exception('Cannot write to "{0}": {1}'.format(filename,e.message))
logger.exception('Cannot write to "{0}": {1}'.format(filename,e))

if cur:
cur.close()
Expand Down
1 change: 0 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
argparse
gitpython
simplejson
sqlite3
urllib2
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env python2
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
# vim:ts=4 sts=4 tw=100:
# pylint: disable-msg=C0103
Expand Down