一、功能和需求
先说下现在实现的功能吧,想要在实现一个内部DNS查询系统,通过在页面上输入域名或IP地址就可以查出对应的IP或域名。具体效果如下:
通过点击后面的提交查询,就可以返回相应的结果。里面的地址和域名也是可以直接更换为想要查询的地址或者内容。
二、代码实现
本来系统是想使用golang gin + vue 或 jquery实现,因为系统本身get返回的是json数据,将json数据通过前端处理就直接可以在页面上展示。由于对前端技术不擅长,只能过换用更灵活的后端python + flask去这现了。由于功能比较简单,一个python脚本 + 对应的1-2个模板就行了。具体结构如下:
# tree . ├── templates │ ├── index.html │ └── query.html └── web.py
web.py代码如下:
from flask import Flask,jsonify,render_template,render_template_string,request import requests,json app = Flask(__name__) @app.route('/') def index(): return render_template("index.html") @app.route('/domain', methods=['POST']) def qdomain(): domain = request.form['domain'] print('domain is :' + domain) astr = domain.split('.') dstr = "/".join(astr[::-1]) url = "http://10.212.52.14:2379/v2/keys/skydns/" + dstr r = requests.get(url) hjson = json.loads(r.text) nodes = hjson['node']['nodes'] return render_template("query.html", domain=domain,nodes=nodes) @app.route('/ptr', methods=['POST']) def qptr(): ip = request.form['ip'] #print('ip is :' + ip) dstr = ip.replace('.','/') url = "http://10.212.52.14:2379/v2/keys/skydns/arpa/in-addr/" + dstr r = requests.get(url) hjson = json.loads(r.text) data = hjson['node'] return render_template_string(''' <table border="1"> <tr> <td> IP </td> <td> Domain </td> </tr> <tr> <td>{{ IP }}</td> <td>{{ data['value'] |sjsons }}</td> </tr> </table>''', IP=ip,data=data) @app.template_filter('sjsons') def reverse_filter(s): d = json.loads(s) return d["host"] if __name__ == '__main__': app.jinja_env.filters['sjsons'] = reverse_filter app.run("0.0.0.0")
index.html模板文件内容如下:
<!DOCTYPE html> <html> <body> <form action="/domain" method="post"> 输入查询的域名(域名查IP):<br> <input type="text" name="domain" value="68.v-40.binjiang.migu"> <input type="submit" value="提交查询"> </form> <br> <form action="/ptr" method="post"> 输入查询的IP(IP查域名):<br> <input type="text" name="ip" value="192.168.40.68"> <input type="submit" value="提交查询"> </form> <p>通过选择不同的查询方式,进行正向和反向查询。</p> </body> </html>
query.html模板内容如下:
<table border="1"> <tr> <td> Domain </td> <td> Key </td> <td> Value </td> </tr> {% for data in nodes %} <tr> <td>{{ domain }}</td> <td>{{ data['key'] }}</td> <td>{{ data['value'] |sjsons }}</td> </tr> {% endfor %} </table>
总结:这里后端的数据是etcd,本来也可以使用现成的别人已经实现的etcd-browser、etcdkeeper 进行web管理,不过出于安全考虑,这里界面上不允许修改数据只进行查询,功能相对单一,也比较简单,就自行用代码简单的撸一个。