diff --git a/README.md b/README.md index b854bf4..d522f1c 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,69 @@ optional arguments: The URL to connect to ``` +# Deploy in production using mod_wsgi + +Install Apache's mod-wsgi for Python3 + +```bash +sudo apt-get install libapache2-mod-wsgi-py3 +``` + +Caveat: If you already have mod-wsgi installed for Python2, it will be replaced! + +```bash +The following packages will be REMOVED: + libapache2-mod-wsgi +The following NEW packages will be installed: + libapache2-mod-wsgi-py3 +``` + +Configuration file `/etc/apache2/sites-available/misp-dashboard.conf` assumes that `misp-dashboard` is cloned into `var/www/misp-dashboard`. It runs as user `misp` in this example. Change the permissions to folder and files accordingly. + +``` + + ServerAdmin admin@misp.local + ServerName misp.local + + DocumentRoot /var/www/misp-dashboard + + WSGIDaemonProcess misp-dashboard \ + user=misp group=misp \ + python-home=/var/www/misp-dashboard/DASHENV \ + processes=1 \ + threads=15 \ + maximum-requests=5000 \ + listen-backlog=100 \ + queue-timeout=45 \ + socket-timeout=60 \ + connect-timeout=15 \ + request-timeout=60 \ + inactivity-timeout=0 \ + deadlock-timeout=60 \ + graceful-timeout=15 \ + eviction-timeout=0 \ + shutdown-timeout=5 \ + send-buffer-size=0 \ + receive-buffer-size=0 \ + header-buffer-size=0 \ + response-buffer-size=0 \ + server-metrics=Off + + WSGIScriptAlias / /var/www/misp-dashboard/misp-dashboard.wsgi + + + WSGIProcessGroup misp-dashboard + WSGIApplicationGroup %{GLOBAL} + Require all granted + + + LogLevel info + ErrorLog /var/log/apache2/misp-dashboard.local_error.log + CustomLog /var/log/apache2/misp-dashboard.local_access.log combined + ServerSignature Off + +``` + # License Images and logos are handmade for: - rankingMISPOrg/ diff --git a/config/config.cfg.default b/config/config.cfg.default index 9513db2..423dfcb 100644 --- a/config/config.cfg.default +++ b/config/config.cfg.default @@ -1,3 +1,7 @@ +[Server] +host = localhost +port = 8001 + [Dashboard] #hours graph_log_refresh_rate = 1 diff --git a/helpers/geo_helper.py b/helpers/geo_helper.py index b1a2784..e1ab86f 100644 --- a/helpers/geo_helper.py +++ b/helpers/geo_helper.py @@ -174,8 +174,15 @@ class Geo_helper: def ip_to_coord(self, ip): resp = self.reader.city(ip) - lat = float(resp.location.latitude) - lon = float(resp.location.longitude) + try: + lat = float(resp.location.latitude) + lon = float(resp.location.longitude) + except TypeError: # No location, try to use iso_code instead + self.logger.info('no location in geIP.database response for ip: {}'.format(ip)) + iso_code = resp.registered_country.iso_code #if no iso_code, throws + coord = self.country_code_to_coord[iso_code.lower()] # countrycode is in upper case + lat = float(coord['lat']) + lon = float(coord['long']) # 0.0001 correspond to ~10m # Cast the float so that it has the correct float format lat_corrected = float("{:.4f}".format(lat)) diff --git a/misp-dashboard.wsgi b/misp-dashboard.wsgi new file mode 100644 index 0000000..47924c5 --- /dev/null +++ b/misp-dashboard.wsgi @@ -0,0 +1,4 @@ +import sys,os,os.path +sys.path.insert(0, os.path.dirname(__file__)) +os.environ["DASH_CONFIG"] = os.path.join(os.path.dirname(__file__), "config") +from server import app as application diff --git a/server.py b/server.py index 48017ea..ffdd7e1 100755 --- a/server.py +++ b/server.py @@ -23,6 +23,9 @@ cfg.read(configfile) logger = logging.getLogger('werkzeug') logger.setLevel(logging.ERROR) +server_host = cfg.get("Server", "host") +server_port = cfg.getint("Server", "port") + app = Flask(__name__) redis_server_log = redis.StrictRedis( @@ -550,4 +553,4 @@ def getGenericTrendingOvertime(): return jsonify(data) if __name__ == '__main__': - app.run(host='localhost', port=8001, threaded=True) + app.run(host=server_host, port=server_port, threaded=True)