IRCP

- information gathering tool for irc servers
git clone git://git.acid.vegas/IRCP.git
Log | Files | Refs | Archive | README | LICENSE

commit 83dc061112e5572dab42c99f41a40c7078de7329
parent 79c91ba6d126088a12170db2d9e9b452b6c4d717
Author: acidvegas <acid.vegas@acid.vegas>
Date: Tue, 30 May 2023 16:59:24 -0400

Added daemon mode (24/7 scanning) with tar backups

Diffstat:
MREADME.md | 3---
Mircp.py | 72+++++++++++++++++++++++++++++++++++++++++++-----------------------------

2 files changed, 43 insertions(+), 32 deletions(-)

diff --git a/README.md b/README.md
@@ -152,9 +152,6 @@ With that being said, the ability for anyone to be able to do what this project 
 * Checking for IPv6 availability *(SSL= in 005 responses may help verify IPv6)*
 * Support for IRC servers using old versions of SSL
 * Create a seperate log for failed connections *(Sync to file every hour maybe)*
-* Colored output option
-* Added daemon mode *(24/7 scanning heavily throttled in this mode)*
-* Add overlapping logs option *(Do not skip networks we already have logs for,just update them with new changes)*
 * Add snapshot boolean for rbl/proxy detection/scanning
 * Ability to link multiple IRCP instances running in daemon mode together for balancing
 
diff --git a/ircp.py b/ircp.py
@@ -11,10 +11,9 @@ import sys
 import time
 
 class settings:
-	#daemon     = False                        # Run IRCP in daemon mode (24/7 throttled scanning)
+	daemon      = False                        # Run in daemon mode (24/7 throttled scanning)
 	errors      = True                         # Show errors in console
 	errors_conn = False                        # Show connection errors in console
-	#log_overlap = False                       # Do not skip networks we have logs for, just update them
 	log_max     = 5000000                      # Maximum log size (in bytes) before starting another
 	nickname    = 'IRCP'                       # None = random
 	username    = 'ircp'                       # None = random
@@ -24,28 +23,21 @@ class settings:
 	vhost       = None                         # Bind to a specific IP address
 
 class throttle:
-	channels = 3   # Maximum number of channels to scan at once
-	delay    = 300 # Delay before registering nick (if enabled) & sending /LIST
-	join     = 10  # Delay between channel JOINs
-	nick     = 300 # Delay between every random NICK change
-	part     = 10  # Delay before PARTing a channel
-	seconds  = 300 # Maximum seconds to wait when throttled for JOIN
-	threads  = 100 # Maximum number of threads running
-	timeout  = 30  # Timeout for all sockets
-	whois    = 5   # Delay between WHOIS requests
-	ztimeout = 200 # Timeout for zero data from server
+	channels = 3   if not settings.daemon else 2   # Maximum number of channels to scan at once
+	delay    = 300 if not settings.daemon else 600 # Delay before registering nick (if enabled) & sending /LIST
+	join     = 10  if not settings.daemon else 30  # Delay between channel JOINs
+	nick     = 300 if not settings.daemon else 600 # Delay between every random NICK change
+	part     = 10  if not settings.daemon else 30  # Delay before PARTing a channel
+	seconds  = 300 if not settings.daemon else 600 # Maximum seconds to wait when throttled for JOIN
+	threads  = 100 if not settings.daemon else 25  # Maximum number of threads running
+	timeout  = 30  if not settings.daemon else 60  # Timeout for all sockets
+	whois    = 5   if not settings.daemon else 15  # Delay between WHOIS requests
+	ztimeout = 200 if not settings.daemon else 300 # Timeout for zero data from server
 
 donotscan = (
-	'irc.dronebl.org',
-	'irc.alphachat.net',
-	'5.9.164.48',
-	'45.32.74.177',
-	'149.248.55.130',
-	'104.238.146.46'
-	#'2001:19f0:6001:1dc::1',
-	#'2001:19f0:b001:ce3::1',
-	#'2a01:4f8:160:2501:48:164:9:5',
-	#'2001:19f0:6401:17c::1'
+	'irc.dronebl.org',       'irc.alphachat.net',
+	'5.9.164.48',            '45.32.74.177',          '104.238.146.46',               '149.248.55.130',
+	'2001:19f0:6001:1dc::1', '2001:19f0:b001:ce3::1', '2a01:4f8:160:2501:48:164:9:5', '2001:19f0:6401:17c::1'
 )
 
 snapshot = {
@@ -64,7 +56,7 @@ snapshot = {
 	'002' : None, # RPL_YOURHOST
 	'003' : None, # RPL_CREATED
 	'004' : None, # RPL_MYINFO
-	'005' : None, # RPL_ISUPPORT #TODO:  Lots of useful information here can be parsed for fine tuning throttles
+	'005' : None, # RPL_ISUPPORT #TODO:  lots of useful information here can be parsed for fine tuning throttles
 	'006' : None, # RPL_MAP
 	'018' : None, # RPL_MAPUSERS
 	'257' : None, # RPL_ADMINLOC1
@@ -123,6 +115,17 @@ snapshot = {
 	'421' : None  # ERR_UNKNOWNCOMMAND
 }
 
+def backup(name):
+	try:
+		with tarfile.open(f'backup/{name}.tar.gz', 'w:gz') as tar:
+			for log in os.listdir('logs'):
+				tar.add('logs/' + log)
+		debug('\033[1;32mBACKUP COMPLETE\033[0m')
+		for log in os.listdir('logs'):
+			os.remove('logs/' + log)
+	except Exception as ex:
+		error('\033[1;31mBACKUP FAILED\033[0m', ex)
+
 def debug(data):
 	print('{0} \033[30m|\033[0m [\033[35m~\033[0m] {1}'.format(time.strftime('%I:%M:%S'), data))
 
@@ -450,11 +453,22 @@ else:
 	targets = [line.rstrip() for line in open(targets_file).readlines() if line and line not in donotscan]
 	found   = len(targets)
 	debug(f'loaded {found:,} targets')
-	targets = [target for target in targets if not os.path.isfile(f'logs/{target}.json')] # Do not scan targets we already have logged for
+	if settings.daemon:
+		try:
+			os.mkdir('backup')
+		except FileExistsError:
+			pass
+	else:
+		targets = [target for target in targets if not os.path.isfile(f'logs/{target}.json')] # Do not scan targets we already have logged for
 	if len(targets) < found:
 		debug(f'removed {found-len(targets):,} targets we already have logs for already')
 	del found, targets_file
-	random.shuffle(targets)
-	loop = asyncio.get_event_loop()
-	loop.run_until_complete(main(targets))
-	debug('IRCP has finished probing!')
-\ No newline at end of file
+	while True:
+		random.shuffle(targets)
+		loop = asyncio.get_event_loop()
+		loop.run_until_complete(main(targets))
+		debug('IRCP has finished probing!')
+		if settings.daemon:
+			backup(time.strftime('%y%m%d-%H%M%S'))
+		else:
+			break
+\ No newline at end of file