|
@@ -4,10 +4,12 @@ from flask import Flask
|
|
from flask import request, render_template
|
|
from flask import request, render_template
|
|
from flask.ext.sqlalchemy import SQLAlchemy
|
|
from flask.ext.sqlalchemy import SQLAlchemy
|
|
#from flask import session, request, url_for, redirect, render_template
|
|
#from flask import session, request, url_for, redirect, render_template
|
|
|
|
+import netaddr
|
|
from netaddr import IPAddress
|
|
from netaddr import IPAddress
|
|
# Hack for python3
|
|
# Hack for python3
|
|
from netaddr.strategy.ipv4 import packed_to_int as unpack_v4
|
|
from netaddr.strategy.ipv4 import packed_to_int as unpack_v4
|
|
from netaddr.strategy.ipv6 import packed_to_int as unpack_v6
|
|
from netaddr.strategy.ipv6 import packed_to_int as unpack_v6
|
|
|
|
+import socket
|
|
from datetime import datetime
|
|
from datetime import datetime
|
|
from uuid import uuid4
|
|
from uuid import uuid4
|
|
|
|
|
|
@@ -22,6 +24,12 @@ def unpack(ip):
|
|
elif len(ip) == 16:
|
|
elif len(ip) == 16:
|
|
return unpack_v6(ip)
|
|
return unpack_v6(ip)
|
|
|
|
|
|
|
|
+def is_valid_ip(ip):
|
|
|
|
+ return netaddr.valid_ipv4(ip) or netaddr.valid_ipv6(ip)
|
|
|
|
+
|
|
|
|
+def resolve_name(hostname):
|
|
|
|
+ return list({s[4][0] for s in socket.getaddrinfo(hostname, None)})
|
|
|
|
+
|
|
class Target(db.Model):
|
|
class Target(db.Model):
|
|
"""Target IP to ping"""
|
|
"""Target IP to ping"""
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
@@ -136,10 +144,17 @@ def homepage():
|
|
@app.route('/submit', methods=['POST'])
|
|
@app.route('/submit', methods=['POST'])
|
|
def submit_job():
|
|
def submit_job():
|
|
if 'target' in request.form:
|
|
if 'target' in request.form:
|
|
- target = Target(request.form['target'])
|
|
|
|
- db.session.add(target)
|
|
|
|
|
|
+ target = request.form['target']
|
|
|
|
+ if is_valid_ip(target):
|
|
|
|
+ # Explicit IP
|
|
|
|
+ targets = [Target(target)]
|
|
|
|
+ else:
|
|
|
|
+ # DNS name, might give multiple IP
|
|
|
|
+ targets = [Target(ip) for ip in resolve_name(target)]
|
|
|
|
+ for t in targets:
|
|
|
|
+ db.session.add(t)
|
|
db.session.commit()
|
|
db.session.commit()
|
|
- return "Launching jobs towards {}".format(target)
|
|
|
|
|
|
+ return "Launching jobs towards {}".format(", ".join((str(t) for t in targets)))
|
|
else:
|
|
else:
|
|
return "Invalid arguments"
|
|
return "Invalid arguments"
|
|
|
|
|