84 lines
1.6 KiB
Python
84 lines
1.6 KiB
Python
import socket
|
|
import multiprocessing
|
|
import subprocess
|
|
import os
|
|
|
|
|
|
def pinger(job_q, results_q):
|
|
"""
|
|
Do Ping
|
|
:param job_q:
|
|
:param results_q:
|
|
:return:
|
|
"""
|
|
DEVNULL = open(os.devnull, 'w')
|
|
while True:
|
|
|
|
ip = job_q.get()
|
|
|
|
if ip is None:
|
|
break
|
|
|
|
results_q.put(ip)
|
|
|
|
|
|
def get_my_ip():
|
|
"""
|
|
Find my IP address
|
|
:return:
|
|
"""
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
s.connect(("8.8.8.8", 80))
|
|
ip = s.getsockname()[0]
|
|
s.close()
|
|
return ip
|
|
|
|
|
|
def map_network(pool_size=255):
|
|
"""
|
|
Maps the network
|
|
:param pool_size: amount of parallel ping processes
|
|
:return: list of valid ip addresses
|
|
"""
|
|
|
|
ip_list = list()
|
|
my_ip = get_my_ip()
|
|
|
|
# get my IP and compose a base like 192.168.1.xxx
|
|
ip_parts = get_my_ip().split('.')
|
|
base_ip = ip_parts[0] + '.' + ip_parts[1] + '.' + ip_parts[2] + '.'
|
|
|
|
# prepare the jobs queue
|
|
jobs = multiprocessing.Queue()
|
|
results = multiprocessing.Queue()
|
|
|
|
pool = [multiprocessing.Process(target=pinger, args=(jobs, results)) for i in range(pool_size)]
|
|
|
|
for p in pool:
|
|
p.start()
|
|
|
|
# cue hte ping processes
|
|
for i in range(1, 255):
|
|
jobs.put(base_ip + '{0}'.format(i))
|
|
|
|
for p in pool:
|
|
jobs.put(None)
|
|
|
|
for p in pool:
|
|
p.join()
|
|
|
|
# collect he results
|
|
while not results.empty():
|
|
ip = results.get()
|
|
if ip != my_ip:
|
|
ip_list.append(ip)
|
|
|
|
return ip_list
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
print('Mapping...')
|
|
lst = map_network()
|
|
print(lst)
|