mirror of https://github.com/MISP/misp-dashboard
Added openstreetmap maps from coord
parent
3d79103cd5
commit
41644425fb
|
@ -5,9 +5,16 @@ graph_log_refresh_rate = 1
|
||||||
[Log]
|
[Log]
|
||||||
fieldname_order=["time", "level", "name", "message"]
|
fieldname_order=["time", "level", "name", "message"]
|
||||||
|
|
||||||
[Redis]
|
[RedisLog]
|
||||||
host=localhost
|
host=localhost
|
||||||
port=6250
|
port=6250
|
||||||
db=0
|
db=0
|
||||||
channel=1
|
channel=1
|
||||||
zmq_url="tcp://crf.circl.lu:5556"
|
zmq_url="tcp://crf.circl.lu:5556"
|
||||||
|
|
||||||
|
[RedisMap]
|
||||||
|
host=localhost
|
||||||
|
port=6250
|
||||||
|
db=1
|
||||||
|
channelProc=CoordToProcess
|
||||||
|
channelDisp=PicToDisplay
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
#!/usr/bin/env python3.5
|
||||||
|
import redis
|
||||||
|
import requests
|
||||||
|
import shutil
|
||||||
|
import json
|
||||||
|
import math
|
||||||
|
import sys, os
|
||||||
|
import time
|
||||||
|
from subprocess import PIPE, Popen
|
||||||
|
|
||||||
|
URL_OPEN_MAP = "http://tile.openstreetmap.org/{zoom}/{x}/{y}.png"
|
||||||
|
MAP_DIR = "static/maps/"
|
||||||
|
ZOOM = 16
|
||||||
|
dlat = 2
|
||||||
|
dlon = 2
|
||||||
|
serv = redis.StrictRedis('localhost', 6250, 2)
|
||||||
|
channel_proc = "CoordToProcess"
|
||||||
|
channel_disp = "PicToDisplay"
|
||||||
|
|
||||||
|
|
||||||
|
def lon2tile(lon, zoom):
|
||||||
|
return (math.floor((lon+180)/360*math.pow(2,zoom)))
|
||||||
|
|
||||||
|
def lat2tile(lat, zoom):
|
||||||
|
return (math.floor((1-math.log(math.tan(lat*math.pi/180) + 1/math.cos(lat*math.pi/180))/math.pi)/2 *math.pow(2,zoom)))
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
pubsub = serv.pubsub(ignore_subscribe_messages=True)
|
||||||
|
pubsub.subscribe(channel_proc)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
for d in pubsub.listen():
|
||||||
|
#data = json.loads(d.decode('utf8'))
|
||||||
|
download_maps(d['data'])
|
||||||
|
|
||||||
|
def create_box_around_coord(lon,lat):
|
||||||
|
pics = []
|
||||||
|
for dx in range(-1,2,1):
|
||||||
|
for dy in range(-1,2,1):
|
||||||
|
pics.append(URL_OPEN_MAP.format(x=lon+dx, y=lat+dy, zoom=ZOOM))
|
||||||
|
return pics
|
||||||
|
|
||||||
|
def download_and_merge(url_list, coord):
|
||||||
|
with open('in.txt', 'w') as f:
|
||||||
|
for i, url in enumerate(url_list):
|
||||||
|
f.write(str(i+1)+' '+url+'\n')
|
||||||
|
|
||||||
|
map_name = "map_{lon}-{lat}.png".format(lon=coord['lon'], lat=coord['lat'])
|
||||||
|
path = os.path.join(MAP_DIR, map_name)
|
||||||
|
FULL_COMMAND = "cat in.txt | parallel --colsep ' ' wget -O maps/{1} {2} && montage -geometry +0+0 maps/1 maps/4 maps/7 maps/2 maps/5 maps/8 maps/3 maps/6 maps/9 "+path
|
||||||
|
os.system(FULL_COMMAND)
|
||||||
|
return map_name
|
||||||
|
|
||||||
|
def download_maps(coord):
|
||||||
|
coord = json.loads(coord.decode('utf8'))
|
||||||
|
print(str(coord))
|
||||||
|
lat = lat2tile(coord['lat'], ZOOM)
|
||||||
|
lon = lon2tile(coord['lon'], ZOOM)
|
||||||
|
|
||||||
|
urls = create_box_around_coord(lon, lat)
|
||||||
|
map_name = download_and_merge(urls, coord)
|
||||||
|
print(map_name)
|
||||||
|
serv.publish(channel_disp, map_name)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
37
server.py
37
server.py
|
@ -2,6 +2,7 @@
|
||||||
from flask import Flask, render_template, Response
|
from flask import Flask, render_template, Response
|
||||||
import json
|
import json
|
||||||
import redis
|
import redis
|
||||||
|
import random
|
||||||
import configparser
|
import configparser
|
||||||
from time import gmtime as now
|
from time import gmtime as now
|
||||||
from time import sleep, strftime
|
from time import sleep, strftime
|
||||||
|
@ -13,13 +14,19 @@ cfg.read(configfile)
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
|
||||||
redis_server = redis.StrictRedis(
|
redis_server_log = redis.StrictRedis(
|
||||||
host=cfg.get('Redis', 'host'),
|
host=cfg.get('RedisLog', 'host'),
|
||||||
port=cfg.getint('Redis', 'port'),
|
port=cfg.getint('RedisLog', 'port'),
|
||||||
db=cfg.getint('Redis', 'db'))
|
db=cfg.getint('RedisLog', 'db'))
|
||||||
|
redis_server_map = redis.StrictRedis(
|
||||||
|
host=cfg.get('RedisMap', 'host'),
|
||||||
|
port=cfg.getint('RedisMap', 'port'),
|
||||||
|
db=cfg.getint('RedisMap', 'db'))
|
||||||
|
|
||||||
subscriber = redis_server.pubsub(ignore_subscribe_messages=True)
|
subscriber_log = redis_server_log.pubsub(ignore_subscribe_messages=True)
|
||||||
subscriber.psubscribe(cfg.get('Redis', 'channel'))
|
subscriber_log.psubscribe(cfg.get('RedisLog', 'channel'))
|
||||||
|
subscriber_map = redis_server_map.pubsub(ignore_subscribe_messages=True)
|
||||||
|
subscriber_map.psubscribe(cfg.get('RedisMap', 'channelDisp'))
|
||||||
eventNumber = 0
|
eventNumber = 0
|
||||||
|
|
||||||
class LogItem():
|
class LogItem():
|
||||||
|
@ -80,16 +87,26 @@ def index():
|
||||||
|
|
||||||
@app.route("/_logs")
|
@app.route("/_logs")
|
||||||
def logs():
|
def logs():
|
||||||
return Response(event_stream(), mimetype="text/event-stream")
|
return Response(event_stream_log(), mimetype="text/event-stream")
|
||||||
|
|
||||||
|
@app.route("/_maps")
|
||||||
|
def maps():
|
||||||
|
return Response(event_stream_maps(), mimetype="text/event-stream")
|
||||||
|
|
||||||
@app.route("/_get_log_head")
|
@app.route("/_get_log_head")
|
||||||
def getLogHead():
|
def getLogHead():
|
||||||
return json.dumps(LogItem('').get_head_row())
|
return json.dumps(LogItem('').get_head_row())
|
||||||
|
|
||||||
def event_stream():
|
def event_stream_log():
|
||||||
for msg in subscriber.listen():
|
for msg in subscriber_log.listen():
|
||||||
content = msg['data']
|
content = msg['data']
|
||||||
|
print('sending', content)
|
||||||
yield EventMessage(content).to_json()
|
yield EventMessage(content).to_json()
|
||||||
|
|
||||||
|
def event_stream_maps():
|
||||||
|
for msg in subscriber_map.listen():
|
||||||
|
content = msg['data'].decode('utf8')
|
||||||
|
yield 'data: {}\n\n'.format(json.dumps({ 'path': content }))
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app.run(host='localhost', port=8000)
|
app.run(host='localhost', port=8000, threaded=True)
|
||||||
|
|
|
@ -3,6 +3,7 @@ var updateInterval = 1000*graph_log_refresh_rate; // 1s
|
||||||
var maxNumPoint = 60;
|
var maxNumPoint = 60;
|
||||||
var maxNumCoord = 100;
|
var maxNumCoord = 100;
|
||||||
|
|
||||||
|
var img_to_change = 1;
|
||||||
var emptyArray = [];
|
var emptyArray = [];
|
||||||
var mapCoord = [];
|
var mapCoord = [];
|
||||||
var mapVal = [];
|
var mapVal = [];
|
||||||
|
@ -142,25 +143,40 @@ var optionsPieChart = {
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
createHead(function() {
|
createHead(function() {
|
||||||
if (!!window.EventSource) {
|
if (!!window.EventSource) {
|
||||||
var source = new EventSource(urlForLogs);
|
var source_log = new EventSource(urlForLogs);
|
||||||
|
|
||||||
source.onopen = function(){
|
source_log.onopen = function(){
|
||||||
//console.log('connection is opened. '+source.readyState);
|
//console.log('connection is opened. '+source_log.readyState);
|
||||||
};
|
};
|
||||||
|
|
||||||
source.onerror = function(){
|
source_log.onerror = function(){
|
||||||
//console.log('error: '+source.readyState);
|
//console.log('error: '+source_log.readyState);
|
||||||
};
|
};
|
||||||
|
|
||||||
source.onmessage = function(event) {
|
source_log.onmessage = function(event) {
|
||||||
var json = jQuery.parseJSON( event.data );
|
var json = jQuery.parseJSON( event.data );
|
||||||
updateLogTable(json.feedName, json.log);
|
updateLogTable(json.feedName, json.log);
|
||||||
};
|
};
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
console.log("No event source");
|
console.log("No event source_log");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var source_map = new EventSource(urlForMaps);
|
||||||
|
source_map.onmessage = function(event) {
|
||||||
|
var json = jQuery.parseJSON( event.data );
|
||||||
|
var img2 = linkForDefaultMap.replace(/\/[^\/]+$/, "/"+json.path);
|
||||||
|
$("#img"+img_to_change).fadeOut(400, function(){ $(this).attr('src', img2); }).fadeIn(400);
|
||||||
|
img_to_change = img_to_change == 4 ? 0 : img_to_change+1;
|
||||||
|
};
|
||||||
|
source_map.onopen = function(){
|
||||||
|
console.log('connection is opened. '+source_map.readyState);
|
||||||
|
};
|
||||||
|
source_map.onerror = function(){
|
||||||
|
console.log('error: '+source_map.readyState);
|
||||||
|
};
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
var rData = [
|
var rData = [
|
||||||
|
@ -298,7 +314,7 @@ function marker_animation(x, y, curNumMarker) {
|
||||||
.css({'left': x-15 + 'px'}) /* HACK to center the effect */
|
.css({'left': x-15 + 'px'}) /* HACK to center the effect */
|
||||||
.css({'top': y-15 + 'px'})
|
.css({'top': y-15 + 'px'})
|
||||||
.css({ 'background-color': markerColor })
|
.css({ 'background-color': markerColor })
|
||||||
.animate({ opacity: 0, scale: 1, height: '80px', width:'80px', margin: '-25px' }, 1000, 'linear', function(){$(this).remove(); })
|
.animate({ opacity: 0, scale: 1, height: '80px', width:'80px', margin: '-25px' }, 700, 'linear', function(){$(this).remove(); })
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,10 +73,22 @@ img {
|
||||||
<div id="feedDiv1A" style="width:50%; height: calc(100% - 30px); position: relative; float: left;"></div>
|
<div id="feedDiv1A" style="width:50%; height: calc(100% - 30px); position: relative; float: left;"></div>
|
||||||
<div id="feedDiv1B" style="width:50%; height: calc(100% - 30px); position: relative; float: left;"></div>-->
|
<div id="feedDiv1B" style="width:50%; height: calc(100% - 30px); position: relative; float: left;"></div>-->
|
||||||
<div id="panelbody" class="panel-body" style="height: 100%;">
|
<div id="panelbody" class="panel-body" style="height: 100%;">
|
||||||
<div id="feedDiv1A" style="width:50%; height: 50%; position: relative; float: left;"><img id="img1" src="{{ url_for('static', filename='maps/map.png') }}" style="width:98%;height:97%;"></div>
|
<div id="feedDivMap1" style="width:50%; height: 50%; position: relative; float: left;">
|
||||||
<div id="feedDiv1B" style="width:50%; height: 50%; position: relative; float: left;"><img id="img2" src="{{ url_for('static', filename='maps/map.png') }}" style="width:98%;height:97%;"></div>
|
<small id="textMap1">text1</small>
|
||||||
<div id="feedDiv2A" style="width:50%; height: 50%; position: relative; float: left;"><img id="img3" src="{{ url_for('static', filename='maps/map.png') }}" style="width:98%;height:97%;"></div>
|
<img id="img1" src="{{ url_for('static', filename='maps/default.png') }}" style="width:98%;height:97%;">
|
||||||
<div id="feedDiv2B" style="width:50%; height: 50%; position: relative; float: left;"><img id="img4" src="{{ url_for('static', filename='maps/map.png') }}" style="width:98%;height:97%;"></div>
|
</div>
|
||||||
|
<div id="feedDivMap2" style="width:50%; height: 50%; position: relative; float: left;">
|
||||||
|
<small id="textMap1">text2</small>
|
||||||
|
<img id="img2" src="{{ url_for('static', filename='maps/default.png') }}" style="width:98%;height:97%;">
|
||||||
|
</div>
|
||||||
|
<div id="feedDivMap3" style="width:50%; height: 50%; position: relative; float: left;">
|
||||||
|
<small style="height:10%;" id="textMap1">text3</small>
|
||||||
|
<img id="img3" src="{{ url_for('static', filename='maps/default.png') }}" style="width:98%;height:87%;">
|
||||||
|
</div>
|
||||||
|
<div id="feedDivMap4" style="width:50%; height: 50%; position: relative; float: left;">
|
||||||
|
<small style="height:10%;" id="textMap1">text4</small>
|
||||||
|
<img id="img4" src="{{ url_for('static', filename='maps/default.png') }}" style="width:98%;height:87%;">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- /.panel-body -->
|
<!-- /.panel-body -->
|
||||||
|
|
||||||
|
@ -166,14 +178,11 @@ img {
|
||||||
/* URL */
|
/* URL */
|
||||||
var urlForLogs = "{{ url_for('logs') }}";
|
var urlForLogs = "{{ url_for('logs') }}";
|
||||||
var urlForHead = "{{ url_for('getLogHead') }}";
|
var urlForHead = "{{ url_for('getLogHead') }}";
|
||||||
|
var urlForMaps = "{{ url_for('maps') }}";
|
||||||
|
var linkForDefaultMap = "{{ url_for('static', filename='maps/default.png') }}";
|
||||||
/* DATA */
|
/* DATA */
|
||||||
var graph_log_refresh_rate = {{ graph_log_refresh_rate }};
|
var graph_log_refresh_rate = {{ graph_log_refresh_rate }};
|
||||||
setTimeout(function(){
|
setTimeout(function(){
|
||||||
var img2 = "{{ url_for('static', filename='maps/map2.png') }}";
|
|
||||||
$("#img1").fadeOut();
|
|
||||||
$('#img1').attr('src', img2);
|
|
||||||
$("#img1").delay(200).fadeIn();
|
|
||||||
|
|
||||||
}, 3000);
|
}, 3000);
|
||||||
</script>
|
</script>
|
||||||
<script src="{{ url_for('static', filename='js/index.js') }}"></script>
|
<script src="{{ url_for('static', filename='js/index.js') }}"></script>
|
||||||
|
|
|
@ -13,34 +13,45 @@ configfile = os.path.join(os.environ['VIRTUAL_ENV'], '../config.cfg')
|
||||||
cfg = configparser.ConfigParser()
|
cfg = configparser.ConfigParser()
|
||||||
cfg.read(configfile)
|
cfg.read(configfile)
|
||||||
|
|
||||||
zmq_url = cfg.get('Redis', 'zmq_url')
|
zmq_url = cfg.get('RedisLog', 'zmq_url')
|
||||||
zmq_url = "tcp://crf.circl.lu:5556"
|
zmq_url = "tcp://crf.circl.lu:5556"
|
||||||
channel = cfg.get('Redis', 'channel')
|
channel = cfg.get('RedisLog', 'channel')
|
||||||
context = zmq.Context()
|
context = zmq.Context()
|
||||||
socket = context.socket(zmq.SUB)
|
socket = context.socket(zmq.SUB)
|
||||||
socket.connect(zmq_url)
|
socket.connect(zmq_url)
|
||||||
socket.setsockopt_string(zmq.SUBSCRIBE, channel)
|
socket.setsockopt_string(zmq.SUBSCRIBE, channel)
|
||||||
|
|
||||||
redis_server = redis.StrictRedis(
|
redis_server = redis.StrictRedis(
|
||||||
host=cfg.get('Redis', 'host'),
|
host=cfg.get('RedisLog', 'host'),
|
||||||
port=cfg.getint('Redis', 'port'),
|
port=cfg.getint('RedisLog', 'port'),
|
||||||
db=cfg.getint('Redis', 'db'))
|
db=cfg.getint('RedisLog', 'db'))
|
||||||
|
serv_coord = redis.StrictRedis(
|
||||||
|
host='localhost',
|
||||||
|
port=6250,
|
||||||
|
db=1)
|
||||||
|
|
||||||
|
channel_proc = "CoordToProcess"
|
||||||
|
channel_disp = "PicToDisplay"
|
||||||
|
|
||||||
# server side
|
# server side
|
||||||
pubsub = redis_server.pubsub(ignore_subscribe_messages=True)
|
pubsub = redis_server.pubsub(ignore_subscribe_messages=True)
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
rdm = random.randint(1,3)
|
rdm = random.randint(1,10)
|
||||||
time.sleep(float(rdm / 3))
|
time.sleep(float(rdm))
|
||||||
lat = random.randint(-90,90)
|
#lux
|
||||||
lon = random.randint(-90,90)
|
lon = random.uniform(5.7373, 6.4823)
|
||||||
|
lat = random.uniform(49.4061,49.7449)
|
||||||
|
#central eur
|
||||||
|
lon = random.uniform(3.936, 9.890)
|
||||||
|
lat = random.uniform(47.957, 50.999)
|
||||||
content = ["rdm "+str(rdm)]
|
content = ["rdm "+str(rdm)]
|
||||||
content = [lat,lon]
|
content = [lat,lon]
|
||||||
jsonContent = json.dumps(content)
|
jsonContent = json.dumps(content)
|
||||||
to_send = { 'name': 'feeder'+str(rdm), 'log': jsonContent }
|
to_send = { 'name': 'feeder'+str(rdm), 'log': jsonContent }
|
||||||
redis_server.publish(channel, json.dumps(to_send))
|
redis_server.publish(channel, json.dumps(to_send))
|
||||||
|
serv_coord.publish(channel_proc, json.dumps({'lat': float(lat), 'lon': float(lon)}))
|
||||||
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
|
Loading…
Reference in New Issue