Commit 3dd41db2 by lyh3024

add view

Change-Id: I2a1a5bcbce8b456267c39ef6afdd2ca1acc270e3
parent fadccd9f
from neomodel import db # charset = utf-8
from neomodel import ( from neomodel import (
StructuredNode, StructuredNode,
StructuredRel,
IntegerProperty, IntegerProperty,
StringProperty, StringProperty,
DateTimeFormatProperty, DateTimeProperty,
RelationshipTo, RelationshipTo,
FloatProperty FloatProperty
) )
db.set_connection('bolt://neo4j:neo4j@localhost:7687/block')
class BlockRel(StructuredRel):
index = StringProperty(required=True)
date = DateTimeProperty(required=True)
class Block(StructuredNode): class Block(StructuredNode):
hash = StringProperty(required=True) hash = StringProperty(required=True, index=True)
next_block = RelationshipTo('Block', 'NEXT_BLOCK') next_block = RelationshipTo('Block', 'NEXT_BLOCK', model=BlockRel)
class Miner(StructuredNode): class Miner(StructuredNode):
address = StringProperty(required=True) address = StringProperty(required=True)
pack_date = DateTimeFormatProperty(required=True, index=True, format='%Y-%m-%d') pack = RelationshipTo('Block', 'PACK', model=BlockRel)
pack_num = IntegerProperty()
pack = RelationshipTo('Block', 'PACK')
class Transaction(StructuredNode): class Transaction(StructuredNode):
hash = StringProperty(required=True, index=True) hash = StringProperty(required=True, index=True)
amount = FloatProperty(required=True) amount = FloatProperty(required=True)
trade = RelationshipTo('Block', 'Trade')
transfer_in = RelationshipTo('Account', 'TRANSFER_IN') transfer_in = RelationshipTo('Account', 'TRANSFER_IN')
invoke = RelationshipTo('Contract', 'INVOKE') invoke = RelationshipTo('Contract', 'INVOKE')
......
from django.test import TestCase from django.test import TestCase
# Create your tests here. from datetime import datetime
from openpyxl import load_workbook
from block import models
def add_test_data():
pass
...@@ -8,6 +8,10 @@ from utils import tools ...@@ -8,6 +8,10 @@ from utils import tools
def get_block_list(request): def get_block_list(request):
if request.method == "GET": if request.method == "GET":
try: try:
account = request.GET.get("account")
from_time = request.GET.get('from_time')
end_time = request.GET.get('end_time')
pass pass
except Exception as e: except Exception as e:
resp = tools.dec_error_resp(e) resp = tools.dec_error_resp(e)
......
...@@ -51,3 +51,36 @@ def gen_node_json(node): ...@@ -51,3 +51,36 @@ def gen_node_json(node):
"properties": {} "properties": {}
} }
def gen_node_json2(node):
node_type = list(node.labels)[0]
if node_type == "RequestIp":
category, label = 1, "请求IP"
elif node_type == "DomainName":
category, label = 2, "请求域名"
elif node_type == "DnsIp":
category, label = 3, "DNS服务器IP"
else:
category, label = 4, "标签"
return {
"id": node.id,
"category": category,
"label": label,
"properties": {}
}
def gen_relation_json2(relation):
r_type = relation.type
if r_type == "REQUEST":
label = "请求"
elif r_type == "PARSE":
label = "解析"
else:
label = "标签"
return {
"id": relation.id,
"source": relation.nodes[0].id,
"target": relation.nodes[1].id,
"label": label,
}
...@@ -25,15 +25,70 @@ def test(): ...@@ -25,15 +25,70 @@ def test():
do2 = DomainName(domain_name='google.cn') do2 = DomainName(domain_name='google.cn')
do1.save() do1.save()
do2.save() do2.save()
r1 = req1.request_domain.connect(do1, {"rel_id": "123", "date": t1}) r1 = req1.request_domain.connect(do1, {"index": "123", "date": t1})
r2 = req2.request_domain.connect(do2, {"rel_id": "124", "date": t1}) r2 = req2.request_domain.connect(do2, {"index": "124", "date": t1})
r3 = d1.parse_domain.connect(do1, {"rel_id": "125", "date": t1}) r3 = d1.parse_domain.connect(do1, {"index": "125", "date": t1})
r4 = d2.parse_domain.connect(do2, {"rel_id": "126", "date": t1}) r4 = d2.parse_domain.connect(do2, {"index": "126", "date": t1})
r5 = do1.label.connect(l1, {"rel_id": "127", "date": t1}) r5 = do1.label.connect(l1, {"index": "127", "date": t1})
r6 = do2.label.connect(l2, {"rel_id": "128", "date": t1}) r6 = do2.label.connect(l2, {"index": "128", "date": t1})
for r in [r1, r2, r3, r4, r5, r6]: for r in [r1, r2, r3, r4, r5, r6]:
r.save() r.save()
def test1():
t1 = datetime(year=2022, month=1, day=1).timestamp()
t2 = datetime(year=2022, month=1, day=2).timestamp()
param = {"ips": ['127.0.0.1', '127.0.0.2']}
query = 'match (r:RequestIp)-[req:REQUEST]->(d:DomainName)-[lab:LABEL]->(l:Label), (dns:DnsIp)-[par:PARSE]->(d)' \
'where r.request_ip in $ips return r, d, l, dns, req, lab, par'
items = db.cypher_query(query, param)[0]
print(query)
print(type(items))
for item in items:
nodes = item[:4]
node = nodes[0]
relations = item[4:]
r = relations[0]
# print(node.labels)
# print(node)
# node_type = list(getattr(node, "labels"))[0]
# print(type(node_type))
# print(r)
# print(r.id)
print((r.type))
print(r.nodes[0].id)
def test2():
t1 = datetime(year=2022, month=1, day=2)
req1 = RequestIp(request_ip='127.0.0.10', province='北京', isp='联通')
req1.save()
d1 = DnsIp(dns_ip='127.0.0.11')
d1.save()
do1 = DomainName(domain_name='tencent.com')
do1.save()
l1 = Label.nodes.filter(label_name='恶意域名').first()
r1 = req1.request_domain.connect(do1, {"index": "221", "date": t1})
r2 = d1.parse_domain.connect(do1, {"index": "299", "date": t1})
r3 = do1.label.connect(l1, {"index": "199", "date": t1})
r1.save()
r2.save()
r3.save()
def test3():
t1 = datetime(year=2022, month=1, day=2)
req1 = RequestIp(request_ip='127.0.0.12', province='北京', isp='联通')
d1 = DnsIp.nodes.filter(dns_ip='127.0.0.11').first()
req1.save()
do1 = DomainName.nodes.filter(domain_name='tencent.com').first()
r1 = req1.request_domain.connect(do1, {"index": "222", "date": t1})
r2 = d1.parse_domain.connect(do1, {"index": "999", "date": t1})
r1.save()
r2.save()
if __name__ == '__main__': if __name__ == '__main__':
test() test()
test2()
test3()
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
from django.http import JsonResponse from django.http import JsonResponse
from neomodel import db from neomodel import db
from domain.models import Label, RequestIp, gen_node_json from domain.models import Label, RequestIp, gen_node_json, gen_node_json2, gen_relation_json2
from utils import tools from utils import tools
...@@ -22,19 +22,22 @@ def get_label_list(request): ...@@ -22,19 +22,22 @@ def get_label_list(request):
return JsonResponse(resp, safe=False) return JsonResponse(resp, safe=False)
def get_request_ip_nodes(label, from_time, end_time): def get_request_ips(label, from_time, end_time):
try: try:
from_time = tools.from_str_to_time(from_time) from_time = tools.from_str_to_time(from_time)
end_time = tools.from_str_to_time(end_time) end_time = tools.from_str_to_time(end_time)
ips = []
if label: if label:
if from_time: if from_time:
param = {"label": label, "from_time": from_time, "end_time": end_time} param = {"label": label, "from_time": from_time.timestamp(), "end_time": end_time.timestamp()}
query = 'match (r:RequestIp)-[]->(d:DomainName)-[]->(l:Label) where d.label_name = $label return r' query = 'match (r:RequestIp)-[req:REQUEST]->(d:DomainName)-[]->(l:Label) where d.label_name = $label and req.date >= $from_time and req.date <= $end_time return r'
else: else:
param = {"label": label} param = {"label": label}
query = 'match (r:RequestIp)-[req:REQUEST]->(d:DomainName)-[]->(l:Label) where d.label_name = $label and req.date >= $from_time and req.date <= $end_time return r' query = 'match (r:RequestIp)-[]->(d:DomainName)-[]->(l:Label) where d.label_name = $label return r'
nodes = db.cypher_query(query, param)[0] nodes = db.cypher_query(query, param)[0]
for node in nodes:
ips.append(getattr(node, '_properties').get("request_ip"))
else: else:
if from_time: if from_time:
query = RequestIp.nodes.request_domain.match(date__gte=from_time) query = RequestIp.nodes.request_domain.match(date__gte=from_time)
...@@ -42,8 +45,9 @@ def get_request_ip_nodes(label, from_time, end_time): ...@@ -42,8 +45,9 @@ def get_request_ip_nodes(label, from_time, end_time):
nodes = query.all() nodes = query.all()
else: else:
nodes = RequestIp.nodes.all() nodes = RequestIp.nodes.all()
for node in nodes:
return nodes ips.append(node.request_ip)
return ips
except Exception as e: except Exception as e:
raise e raise e
...@@ -53,7 +57,7 @@ def get_domain_list(request): ...@@ -53,7 +57,7 @@ def get_domain_list(request):
try: try:
label = request.GET.get("label") label = request.GET.get("label")
from_time = request.GET.get('from_time') from_time = request.GET.get('from_time')
end_time = request.GET.get('to_time') end_time = request.GET.get('end_time')
if from_time and not end_time: if from_time and not end_time:
resp = tools.dec_error_resp("end_time is null") resp = tools.dec_error_resp("end_time is null")
...@@ -63,12 +67,27 @@ def get_domain_list(request): ...@@ -63,12 +67,27 @@ def get_domain_list(request):
return JsonResponse(resp) return JsonResponse(resp)
resp_nodes, resp_relations = [], [] resp_nodes, resp_relations = [], []
request_ip_nodes = get_request_ip_nodes(label, from_time, end_time) n_ids, r_ids = [], []
request_ip_node_ids = [r.id for r in request_ip_nodes] ips = get_request_ips(label, from_time, end_time)
param = {"ids": request_ip_node_ids} param = {"ips": ips}
query = 'match (r:RequestIp)-[req:REQUEST]->(d:DomainName)-[]->(l:Label) ' \ query = 'match (r:RequestIp)-[req:REQUEST]->(d:DomainName)-[lab:LABEL]->(l:Label), (dns:DnsIp)-[par:PARSE]->(d)' \
'where d.label_name = $label and req.date >= $from_time and req.date <= $end_time return r' 'where r.request_ip in $ips return r, d, l, dns, req, lab, par'
items = db.cypher_query(query, param)[0]
for item in items:
nodes = item[:4]
relations = item[4:]
for n in nodes:
if n.id in n_ids:
continue
resp_nodes.append(gen_node_json2(n))
n_ids.append(n.id)
for r in relations:
if r.id in r_ids:
continue
resp_relations.append(gen_relation_json2(r))
resp = tools.dec_success_resp({"nodes": resp_nodes, "relations": resp_relations})
return JsonResponse(resp, safe=False)
except Exception as e: except Exception as e:
resp = tools.dec_error_resp(e) resp = tools.dec_error_resp(e)
return JsonResponse(resp, safe=False) return JsonResponse(resp, safe=False)
...@@ -77,7 +96,25 @@ def get_domain_list(request): ...@@ -77,7 +96,25 @@ def get_domain_list(request):
def get_label_rank(request): def get_label_rank(request):
if request.method == "GET": if request.method == "GET":
try: try:
label = request.GET.get("label")
from_time = request.GET.get('from_time')
end_time = request.GET.get('end_time')
sort_type = request.GET.get("sort_type")
if from_time and not end_time:
resp = tools.dec_error_resp("end_time is null")
return JsonResponse(resp)
if not from_time and end_time:
resp = tools.dec_error_resp("from_time is null")
return JsonResponse(resp)
ips = get_request_ips(label, from_time, end_time)
param = {"ips": ips}
if sort_type == 1:
pass
else:
pass pass
except Exception as e: except Exception as e:
resp = tools.dec_error_resp(e) resp = tools.dec_error_resp(e)
return JsonResponse(resp, safe=False) return JsonResponse(resp, safe=False)
...@@ -86,7 +123,16 @@ def get_label_rank(request): ...@@ -86,7 +123,16 @@ def get_label_rank(request):
def get_domain_rank(request): def get_domain_rank(request):
if request.method == "GET": if request.method == "GET":
try: try:
pass label = request.GET.get("label")
from_time = request.GET.get('from_time')
end_time = request.GET.get('to_time')
if from_time and not end_time:
resp = tools.dec_error_resp("end_time is null")
return JsonResponse(resp)
if not from_time and end_time:
resp = tools.dec_error_resp("from_time is null")
return JsonResponse(resp)
except Exception as e: except Exception as e:
resp = tools.dec_error_resp(e) resp = tools.dec_error_resp(e)
return JsonResponse(resp, safe=False) return JsonResponse(resp, safe=False)
...@@ -95,7 +141,16 @@ def get_domain_rank(request): ...@@ -95,7 +141,16 @@ def get_domain_rank(request):
def get_request_ip_rank(request): def get_request_ip_rank(request):
if request.method == "GET": if request.method == "GET":
try: try:
pass label = request.GET.get("label")
from_time = request.GET.get('from_time')
end_time = request.GET.get('to_time')
if from_time and not end_time:
resp = tools.dec_error_resp("end_time is null")
return JsonResponse(resp)
if not from_time and end_time:
resp = tools.dec_error_resp("from_time is null")
return JsonResponse(resp)
except Exception as e: except Exception as e:
resp = tools.dec_error_resp(e) resp = tools.dec_error_resp(e)
return JsonResponse(resp, safe=False) return JsonResponse(resp, safe=False)
...@@ -104,7 +159,16 @@ def get_request_ip_rank(request): ...@@ -104,7 +159,16 @@ def get_request_ip_rank(request):
def get_dns_ip_rank(request): def get_dns_ip_rank(request):
if request.method == "GET": if request.method == "GET":
try: try:
pass label = request.GET.get("label")
from_time = request.GET.get('from_time')
end_time = request.GET.get('to_time')
if from_time and not end_time:
resp = tools.dec_error_resp("end_time is null")
return JsonResponse(resp)
if not from_time and end_time:
resp = tools.dec_error_resp("from_time is null")
return JsonResponse(resp)
except Exception as e: except Exception as e:
resp = tools.dec_error_resp(e) resp = tools.dec_error_resp(e)
return JsonResponse(resp, safe=False) return JsonResponse(resp, safe=False)
......
...@@ -67,5 +67,4 @@ def gen_rel_json(r): ...@@ -67,5 +67,4 @@ def gen_rel_json(r):
"source": s.id, "source": s.id,
"target": e.id, "target": e.id,
"label": label, "label": label,
"date": r.date
} }
from django.contrib import admin
# Register your models here.
from django.apps import AppConfig
class ScriptConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'script'
from django.db import models
# Create your models here.
from django.test import TestCase
# Create your tests here.
from django.shortcuts import render
# Create your views here.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment