-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathtasks.py
138 lines (126 loc) · 4.68 KB
/
tasks.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
from __future__ import absolute_import
import os, re
#os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
#from django.conf import settings
from .celery import app
from .models import *
from .views.graph import graph_init
from .views.db import get_node_on_db, get_node_on_graph, get_relation_on_graph
from .plugins.hostname import parse_hostname
from .plugins.domain import whois_domain
from .plugins.ipaddress import whois_ip
#@app.task(rate_limit='5/m')
@app.task(soft_time_limit=60)
def process_node(node, subcluster = None):
#nodetype = str(node.label.name + node.key_property.key.name).lower()
nodetype = str(node.index.label.name + node.index.property_key.name).lower()
if re.search("hostname", nodetype):
parse_hostname(node, subcluster)
elif re.search("domainname", nodetype):
whois_domain(node, subcluster)
elif re.search("ipaddress", nodetype):
whois_ip(node, subcluster)
def push_node_to_db(node, graph):
label, = node.labels
label_key = None
if graph.schema.get_uniqueness_constraints(str(label)):
label_key, = graph.schema.get_uniqueness_constraints(str(label))
n = None
if label_key:
label_value = node[label_key]
ref = node._id
try:
n = Node.objects.get(ref=ref)
except:
pass
if n:
pk,created = PropertyKey.objects.get_or_create(
name = label_key,
)
if pk:
p, created = Property.objects.get_or_create(
key = pk,
value = label_value,
)
l, created = NodeLabel.objects.get_or_create(
name = label
)
if p and l:
n.label = l
n.key_property = p
n.properties.add(p)
n.save()
else:
n = get_node_on_db(label, label_key, label_value, node.properties)
n.ref = ref
n.save()
return n
def push_relation_to_db(relation, graph):
src = push_node_to_db(relation.start_node, graph)
dst = push_node_to_db(relation.end_node, graph)
rt, created = RelType.objects.get_or_create(name=relation.type)
rel = None
if src and dst and rt:
rel, created = Relation.objects.get_or_create(type=rt, src=src, dst=dst)
if rel:
if relation.properties:
subcluster = []
for k, v in relation.properties.iteritems():
if k == "cluster":
if type(v) is list:
for i in v:
c, created = Cluster.objects.get_or_create(name=i)
elif type(v) is str:
c, created = Cluster.objects.get_or_create(name=v)
elif k =="subcluster":
if type(v) is list:
for i in v:
sc, created = SubCluster.objects.get_or_create(name=i)
if sc and not sc in subcluster:
subcluster.append(sc)
elif type(v) is str:
sc, created = SubCluster.objects.get_or_create(name=v)
if sc and not sc in subcluster:
subcluster.append(sc)
elif k =="firstseen":
rel.firstseen = v
elif k =="lastseen":
rel.lastseen = v
else:
pk, created = PropertyKey.objects.get_or_create(name=k)
p, created = Property.objects.get_or_create(key=pk, value=v)
rel.properties.add(p)
for s in subcluster:
rel.subcluster.add(s)
rel.save()
rel.ref = int(str(relation.ref).split('/')[1])
rel.save()
return rel
@app.task
def push_graph_to_db(postprocess):
graph = graph_init()
nodes = graph.cypher.execute("MATCH (n) return n")
sg = nodes.to_subgraph()
for n in sg.nodes:
node = push_node_to_db(n, graph)
if node and postprocess:
for s in node.subcluster.all():
process_node.delay(node, s)
relations = graph.cypher.execute("MATCH (n)-[r]->(m) return n,r,m")
for n, r, m in relations:
rel = push_relation_to_db(r, graph)
@app.task
def push_db_to_graph(entity):
graph = graph_init()
nodes = None
if not entity or entity == "node":
nodes = Node.objects.all()
for node in nodes:
get_node_on_graph(node, graph)
relations = None
if not entity == "relation":
relations = Relation.objects.all()
for relation in relations:
get_relation_on_graph(relation, graph)
#if __name__ == '__main__':
# app.start()