adding export
parent
73597bcd6a
commit
8d0dce1267
31
app.py
31
app.py
|
@ -4,7 +4,6 @@ import sys
|
|||
import time
|
||||
import socket
|
||||
import iperf3
|
||||
import logging
|
||||
import requests
|
||||
import subprocess
|
||||
import scapy.all as scapy
|
||||
|
@ -14,12 +13,6 @@ from flask_navigation import Navigation
|
|||
from flask_socketio import SocketIO, emit
|
||||
from flask import Flask, render_template, Response, request, redirect, url_for, session, escape
|
||||
|
||||
#Global config
|
||||
__version__ = "1.0.0"
|
||||
path = os.path.dirname(__file__)
|
||||
logging.basicConfig(filename=path+'/log/Pyng.log', level=logging.DEBUG, format=f'%(asctime)s %(levelname)s %(name)s %(threadName)s : %(message)s')
|
||||
logging.info('PROGRAM START')
|
||||
|
||||
#Init
|
||||
app = Flask(__name__)
|
||||
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
|
||||
|
@ -30,6 +23,7 @@ nav = Navigation(app)
|
|||
|
||||
#Variable
|
||||
uphost=0
|
||||
export_list=[]
|
||||
#Menu
|
||||
nav.Bar('top', [
|
||||
nav.Item('Network', 'index'),
|
||||
|
@ -100,6 +94,7 @@ def bg_scan_port(target):
|
|||
|
||||
#Background network scan
|
||||
def bg_scan_network(subnet):
|
||||
global export_list
|
||||
global uphost
|
||||
uphost=0
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
|
@ -109,18 +104,18 @@ def bg_scan_network(subnet):
|
|||
broadcast.dst = 'ff:ff:ff:ff:ff:ff'
|
||||
request_broadcast = broadcast / request
|
||||
clients = scapy.srp(request_broadcast, timeout = 1)[0]
|
||||
export_list=['IP,MAC,VENDOR,DNS']
|
||||
for element in clients:
|
||||
uphost=uphost+1
|
||||
macdet=get_mac_details(element[1].hwsrc)
|
||||
dns=dns_resolv(element[1].psrc)
|
||||
export_list.append(element[1].psrc+','+element[1].hwsrc+','+macdet.replace(",", " ")+','+dns)
|
||||
socketio.emit('net_response',{'ip': element[1].psrc,'mac': element[1].hwsrc,'vendor':macdet,'dns':dns})
|
||||
sock.close()
|
||||
|
||||
#Main route to index.
|
||||
@app.route("/")
|
||||
def index():
|
||||
app.logger.info('Info level log')
|
||||
app.logger.warning('Warning level log')
|
||||
if 'username' in session:
|
||||
return render_template('index.html')
|
||||
return render_template('login.html',title="Welcome")
|
||||
|
@ -156,11 +151,24 @@ def connect(data):
|
|||
@socketio.on('net_port')
|
||||
def connect(data):
|
||||
global uphost
|
||||
global export_list
|
||||
emit('net_response', {'ip':'IP','mac':'Mac address','vendor':'Vendor resolution','dns':'Local DNS'})
|
||||
socketio.start_background_task(bg_scan_network(data))
|
||||
downhost=256-uphost
|
||||
print(export_list)
|
||||
emit('net_response', {'ip':' ','mac':'Up:'+str(uphost),'vendor': 'Down:'+str(downhost),'dns':''})
|
||||
|
||||
#Export
|
||||
@app.route("/export", methods=['GET', 'POST'])
|
||||
def export_file():
|
||||
global export_list
|
||||
csv=""
|
||||
for line in export_list:
|
||||
csv = csv+'\n'+line
|
||||
return Response(
|
||||
csv,
|
||||
mimetype="text/csv",
|
||||
headers={"Content-disposition":
|
||||
"attachment; filename=CMDB.csv"})
|
||||
##Login
|
||||
@app.route("/login", methods=['GET', 'POST'])
|
||||
def login():
|
||||
|
@ -169,7 +177,6 @@ def login():
|
|||
password = request.form['password']
|
||||
if authenticate(str(username), str(password)):
|
||||
session['username'] = request.form['username']
|
||||
logging.info('AUTH LOG - New auth from '+username+' !')
|
||||
return redirect(url_for('index'))
|
||||
else:
|
||||
resultats='<p id="alert" style="color:red">Invalid Username/Password ! </p>'
|
||||
|
@ -182,4 +189,4 @@ def logout():
|
|||
|
||||
##Start
|
||||
if __name__ == '__main__':
|
||||
socketio.run(app, host='0.0.0.0', port='5005', allow_unsafe_werkzeug=True)
|
||||
socketio.run(app, host='0.0.0.0', port='5005')
|
||||
|
|
|
@ -4,8 +4,8 @@ body {
|
|||
font-family: helvetica, arial, verdana, sans-serif;
|
||||
text-align:center;
|
||||
min-height: 100% !important;
|
||||
background: #333;
|
||||
color: white;
|
||||
background: white;
|
||||
color: black;
|
||||
}
|
||||
|
||||
::placeholder {
|
||||
|
@ -87,7 +87,7 @@ span {
|
|||
background-color: #BB8FCE;
|
||||
}
|
||||
#output {
|
||||
border-radius: 15px;
|
||||
// border-radius: 15px;
|
||||
box-shadow: 0px 0px 9px 0px rgba(0,0,0,0.1);
|
||||
width: fit-content;
|
||||
background-color:white;
|
||||
|
@ -110,13 +110,13 @@ tr:not(:first-child):hover {
|
|||
background-color: rgba(114, 114, 113, 0.2);
|
||||
}
|
||||
input {
|
||||
padding: 6px;
|
||||
padding: 15px;
|
||||
font-size: 14px;
|
||||
border-width: 0px;
|
||||
border-color: #CCCCCC;
|
||||
background-color: #FFFFFF;
|
||||
color: #000000;
|
||||
color: #333;
|
||||
border-style: solid;
|
||||
border-radius: 9px;
|
||||
box-shadow: 0px 0px 5px rgba(66,66,66,.75);
|
||||
border-radius: 5px;
|
||||
box-shadow: 0px 0px 2px rgba(66,66,66,.75);
|
||||
}
|
||||
|
|
|
@ -32,6 +32,19 @@
|
|||
return false;
|
||||
});
|
||||
|
||||
const outputDiv = document.querySelector('#output');
|
||||
const autreDiv = document.querySelector('#export_list');
|
||||
if (outputDiv.innerHTML.trim() === '') {
|
||||
autreDiv.style.display = 'none';
|
||||
}
|
||||
outputDiv.addEventListener('DOMSubtreeModified', function () {
|
||||
if (outputDiv.innerHTML.trim() === '') {
|
||||
autreDiv.style.display = 'none';
|
||||
} else {
|
||||
autreDiv.style.display = 'block';
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
|
@ -58,7 +71,8 @@
|
|||
</form>
|
||||
|
||||
<center>
|
||||
<br><br><div id="output"></div>
|
||||
<br><br><div id="export_list"><a href="./export">Export List</a></div>
|
||||
<br><div id="output"></div>
|
||||
</center>
|
||||
</body>
|
||||
</html>
|
||||
|
|
Loading…
Reference in New Issue