Commit 3dd41db2 by lyh3024

add view

Change-Id: I2a1a5bcbce8b456267c39ef6afdd2ca1acc270e3
parent fadccd9f
from neomodel import db
# charset = utf-8
from neomodel import (
StructuredNode,
StructuredRel,
IntegerProperty,
StringProperty,
DateTimeFormatProperty,
DateTimeProperty,
RelationshipTo,
FloatProperty
)
db.set_connection('bolt://neo4j:neo4j@localhost:7687/block')
class BlockRel(StructuredRel):
index = StringProperty(required=True)
date = DateTimeProperty(required=True)
class Block(StructuredNode):
hash = StringProperty(required=True)
next_block = RelationshipTo('Block', 'NEXT_BLOCK')
hash = StringProperty(required=True, index=True)
next_block = RelationshipTo('Block', 'NEXT_BLOCK', model=BlockRel)
class Miner(StructuredNode):
address = StringProperty(required=True)
pack_date = DateTimeFormatProperty(required=True, index=True, format='%Y-%m-%d')
pack_num = IntegerProperty()
pack = RelationshipTo('Block', 'PACK')
pack = RelationshipTo('Block', 'PACK', model=BlockRel)
class Transaction(StructuredNode):
hash = StringProperty(required=True, index=True)
amount = FloatProperty(required=True)
trade = RelationshipTo('Block', 'Trade')
transfer_in = RelationshipTo('Account', 'TRANSFER_IN')
invoke = RelationshipTo('Contract', 'INVOKE')
......
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
def get_block_list(request):
if request.method == "GET":
try:
account = request.GET.get("account")
from_time = request.GET.get('from_time')
end_time = request.GET.get('end_time')
pass
except Exception as e:
resp = tools.dec_error_resp(e)
......
......@@ -51,3 +51,36 @@ def gen_node_json(node):
"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():
do2 = DomainName(domain_name='google.cn')
do1.save()
do2.save()
r1 = req1.request_domain.connect(do1, {"rel_id": "123", "date": t1})
r2 = req2.request_domain.connect(do2, {"rel_id": "124", "date": t1})
r3 = d1.parse_domain.connect(do1, {"rel_id": "125", "date": t1})
r4 = d2.parse_domain.connect(do2, {"rel_id": "126", "date": t1})
r5 = do1.label.connect(l1, {"rel_id": "127", "date": t1})
r6 = do2.label.connect(l2, {"rel_id": "128", "date": t1})
r1 = req1.request_domain.connect(do1, {"index": "123", "date": t1})
r2 = req2.request_domain.connect(do2, {"index": "124", "date": t1})
r3 = d1.parse_domain.connect(do1, {"index": "125", "date": t1})
r4 = d2.parse_domain.connect(do2, {"index": "126", "date": t1})
r5 = do1.label.connect(l1, {"index": "127", "date": t1})
r6 = do2.label.connect(l2, {"index": "128", "date": t1})
for r in [r1, r2, r3, r4, r5, r6]:
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__':
test()
test2()
test3()
......@@ -3,7 +3,7 @@
from django.http import JsonResponse
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
......@@ -22,19 +22,22 @@ def get_label_list(request):
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:
from_time = tools.from_str_to_time(from_time)
end_time = tools.from_str_to_time(end_time)
ips = []
if label:
if from_time:
param = {"label": label, "from_time": from_time, "end_time": end_time}
query = 'match (r:RequestIp)-[]->(d:DomainName)-[]->(l:Label) where d.label_name = $label return r'
param = {"label": label, "from_time": from_time.timestamp(), "end_time": end_time.timestamp()}
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:
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]
for node in nodes:
ips.append(getattr(node, '_properties').get("request_ip"))
else:
if 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):
nodes = query.all()
else:
nodes = RequestIp.nodes.all()
return nodes
for node in nodes:
ips.append(node.request_ip)
return ips
except Exception as e:
raise e
......@@ -53,7 +57,7 @@ def get_domain_list(request):
try:
label = request.GET.get("label")
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:
resp = tools.dec_error_resp("end_time is null")
......@@ -63,12 +67,27 @@ def get_domain_list(request):
return JsonResponse(resp)
resp_nodes, resp_relations = [], []
request_ip_nodes = get_request_ip_nodes(label, from_time, end_time)
request_ip_node_ids = [r.id for r in request_ip_nodes]
param = {"ids": request_ip_node_ids}
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'
n_ids, r_ids = [], []
ips = get_request_ips(label, from_time, end_time)
param = {"ips": ips}
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]
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:
resp = tools.dec_error_resp(e)
return JsonResponse(resp, safe=False)
......@@ -77,7 +96,25 @@ def get_domain_list(request):
def get_label_rank(request):
if request.method == "GET":
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
except Exception as e:
resp = tools.dec_error_resp(e)
return JsonResponse(resp, safe=False)
......@@ -86,7 +123,16 @@ def get_label_rank(request):
def get_domain_rank(request):
if request.method == "GET":
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:
resp = tools.dec_error_resp(e)
return JsonResponse(resp, safe=False)
......@@ -95,7 +141,16 @@ def get_domain_rank(request):
def get_request_ip_rank(request):
if request.method == "GET":
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:
resp = tools.dec_error_resp(e)
return JsonResponse(resp, safe=False)
......@@ -104,7 +159,16 @@ def get_request_ip_rank(request):
def get_dns_ip_rank(request):
if request.method == "GET":
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:
resp = tools.dec_error_resp(e)
return JsonResponse(resp, safe=False)
......
......@@ -67,5 +67,4 @@ def gen_rel_json(r):
"source": s.id,
"target": e.id,
"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