Skip to content

Commit 519de8c

Browse files
author
Sajjad
committed
add files
1 parent af8f11d commit 519de8c

File tree

8 files changed

+281
-0
lines changed

8 files changed

+281
-0
lines changed

Pipfile

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[[source]]
2+
name = "pypi"
3+
url = "https://pypi.org/simple"
4+
verify_ssl = true
5+
6+
[dev-packages]
7+
8+
[packages]
9+
10+
[requires]
11+
python_version = "3.7"

Pipfile.lock

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

activenodes/__init__.py

Whitespace-only changes.

activenodes/activeNodes.py

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
2+
"""
3+
activenodes/activeNodes.py
4+
Python3 package for find active nodes for IPv4 in range of IP address
5+
"""
6+
7+
import sys
8+
import time
9+
import subprocess
10+
import ipaddress
11+
from threading import Thread
12+
from queue import Queue
13+
14+
import error
15+
16+
class ActiveNodes:
17+
def __init__(self, start, end, threads=512, log=False):
18+
19+
self.start = start
20+
self.end = end
21+
self.threads = threads
22+
self.log = log
23+
self.logs = []
24+
self.addresses = []
25+
self.activeNodes = []
26+
self.deactiveNodes = []
27+
28+
try:
29+
ipaddress.IPv4Address(start)
30+
ipaddress.IPv4Address(end)
31+
except ValueError as e:
32+
raise e
33+
34+
if ipaddress.ip_address(self.start) > ipaddress.ip_address(self.end):
35+
raise error.AddressRangeError("Start and end address are not same range")
36+
37+
def __repr__(self):
38+
return "ActiveNodes('{0}', '{1}', {2})".format(self.start, self.end, self.threads)
39+
40+
def genAddresses(self):
41+
42+
"""
43+
collect IPv4 addresses
44+
"""
45+
46+
self.addresses.clear()
47+
48+
#start from first address
49+
address = self.start
50+
while address != self.end:
51+
#print(address)
52+
address = str(ipaddress.ip_address(address) + 1)
53+
self.addresses.append(address)
54+
55+
return self.addresses
56+
57+
def pinger(self, thread, queue):
58+
59+
"""
60+
Pings subnet
61+
"""
62+
63+
self.logs.clear()
64+
65+
while True:
66+
address = queue.get()
67+
68+
if self.log:
69+
log = "{0} Thread <{1}> Pinging : {2}".format(time.ctime(), thread, address)
70+
self.logs.append(log)
71+
print(log)
72+
73+
ret = subprocess.call("ping -c 1 {0}".format(address),
74+
shell=True,
75+
stdout=open('/dev/null', 'w'),
76+
stderr=subprocess.STDOUT)
77+
if ret == 0:
78+
if self.log:
79+
log = "{0} Active Node at : {1}".format(time.ctime(), address)
80+
self.logs.append(log)
81+
print(log)
82+
self.activeNodes.append(address)
83+
else:
84+
if self.log:
85+
log = "{0} Node Not Active at : {1}".format(time.ctime(), address)
86+
self.logs.append(log)
87+
print(log)
88+
self.deactiveNodes.append(address)
89+
queue.task_done()
90+
91+
def active(self):
92+
93+
"""
94+
return self.activeNodes, self.deactiveNodes
95+
"""
96+
97+
self.genAddresses()
98+
queue = Queue()
99+
100+
for thread in range(self.threads):
101+
worker = Thread(target=self.pinger, args=(thread, queue))
102+
worker.setDaemon(True)
103+
worker.start()
104+
105+
for address in self.addresses:
106+
queue.put(address)
107+
queue.join()
108+
109+
#remove duplicates addresses and sort them
110+
self.activeNodes = list(dict.fromkeys(sorted(self.activeNodes)))
111+
self.deactiveNodes = list(dict.fromkeys(sorted(self.deactiveNodes)))
112+
113+
#ratio add after this function run
114+
self.ratio = {
115+
"addresses": len(self.addresses),
116+
"active": len(self.activeNodes),
117+
"deactive": len(self.deactiveNodes)
118+
}
119+
120+
return self.activeNodes
121+
122+
def deactive(self):
123+
self.active()
124+
return self.deactiveNodes
125+
126+
x = ActiveNodes("192.168.0.1", "192.168.0.225", log=True)

activenodes/activeNodesTool.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
2+
"""
3+
activenodes/activeNodesTool.py
4+
executable python file of activeNodes.py as Terminal Tool
5+
"""
6+
7+
import sys
8+
import re
9+
10+
from activeNodes import ActiveNodes
11+
12+
start = sys.argv[1]
13+
end = sys.argv[2]
14+
15+
if 'log' in sys.argv:
16+
log = True
17+
18+
for arg in sys.argv:
19+
if re.search(r'threads:([0-9])\d+', arg):
20+
threads = arg.split(':')[1]
21+
22+
ant = ActiveNodes(start, end, threads=512, log=log).active()

activenodes/error.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
3+
class MessageError(Exception):
4+
"""Base class for errors in the email package."""
5+
6+
7+
class NotVaildIPAddressError(MessageError):
8+
"""Base class for Not a vaild IPv4 address"""
9+
10+
class AddressRangeError(MessageError):
11+
"""Raise when end address bigger than start address"""

activenodes/temp.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
2+
"""
3+
activenodes/activeNodesExec.py
4+
executable python file of activeNodes.py
5+
"""
6+
7+
import sys
8+
import subprocess
9+
import ipaddress
10+
from threading import Thread
11+
from queue import Queue
12+
13+
def next(oldip):
14+
15+
def gen_next_ip(ip):
16+
octets = ip.split(".")
17+
last_octet = octets[-1]
18+
if last_octet == '254':
19+
octets[2] = str(int(octets[2]) + 1)
20+
nextip = '{0}.{1}.{2}.{3}'.format(octets[0],octets[1],octets[2],"0")
21+
22+
else:
23+
octets[3] = str(int(octets[3]) + 1)
24+
nextip = '{0}.{1}.{2}.{3}'.format(octets[0],octets[1],octets[2],octets[3])
25+
return str(nextip)
26+
27+
try :
28+
oldip == str(ipaddress.IPv4Address(oldip))
29+
30+
out = gen_next_ip(oldip)
31+
return out
32+
except:
33+
print("Your address is not vaild")
34+
35+
36+
if len(sys.argv) == 3:
37+
start_range = sys.argv[1]
38+
end_range = sys.argv[2]
39+
40+
print("Please Wait ...")
41+
else:
42+
print("""Use it like that
43+
~$ python3 livenodes.py 192.168.0.1 192.168.3.254""")
44+
exit()
45+
46+
address = start_range
47+
iprange = []
48+
49+
while address != end_range:
50+
address = next(address)
51+
iprange.append(address)
52+
#iprange = iprange[--:--]
53+
#print(iprange)
54+
55+
56+
LiveNodes = []
57+
#the number of threads set to 512 if you have powerfull computer you can increases
58+
num_threads = 512
59+
queue = Queue()
60+
61+
#wraps system ping command
62+
def pinger(i, q):
63+
"""Pings subnet"""
64+
while True:
65+
ip = q.get()
66+
#print("Thread {0}: Pinging {1}".format(i, ip))
67+
ret = subprocess.call("ping -c 1 {0}".format(ip),
68+
shell=True,
69+
stdout=open('/dev/null', 'w'),
70+
stderr=subprocess.STDOUT)
71+
if ret == 0:
72+
#print( "There is a Live Node at : {0}".format(ip))
73+
LiveNodes.append(ip)
74+
else:
75+
pass
76+
#print( "There is no Node Available at {0}".format(ip))
77+
q.task_done()
78+
#Spawn thread pool
79+
for i in range(num_threads):
80+
81+
worker = Thread(target=pinger, args=(i, queue))
82+
worker.setDaemon(True)
83+
worker.start()
84+
#Place work in queue
85+
for ip in iprange:
86+
queue.put(ip)
87+
#Wait until worker threads are done to exit
88+
queue.join()
89+
print("\nAll live nodes in Range ({0} -- {1})".format(start_range, end_range))
90+
for node in LiveNodes:
91+
print(node)

setup.py

Whitespace-only changes.

0 commit comments

Comments
 (0)