Browse Source

Allow to specify targets by hostname

Baptiste Jonglez 10 years ago
parent
commit
087a0c046b
1 changed files with 18 additions and 3 deletions
  1. 18 3
      peerfinder.py

+ 18 - 3
peerfinder.py

@@ -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"