From f53dc935f1423dec46b6594af07b9d2026b7b5d4 Mon Sep 17 00:00:00 2001
From: David Schmitz <David.Schmitz@lrz.de>
Date: Wed, 4 Dec 2024 14:05:14 +0000
Subject: [PATCH] feature/generic_mitigation_stats: start to work on multiple
 (JUNOS SNMP+Nokia) router mitigation stats support

---
 flowspy/settings.py.dist                      |  2 +
 utils/dfncert/fodadapter.py                   |  7 ++-
 utils/mitigation_stats_collector.py           |  3 ++
 ...tigation_stats_collector_specific_multi.py | 49 +++++++++++++++++++
 4 files changed, 59 insertions(+), 2 deletions(-)
 create mode 100644 utils/mitigation_stats_collector_specific_multi.py

diff --git a/flowspy/settings.py.dist b/flowspy/settings.py.dist
index 2b90aeb7..850509aa 100644
--- a/flowspy/settings.py.dist
+++ b/flowspy/settings.py.dist
@@ -567,6 +567,8 @@ NETCONF_PORT = 830
 # generic mitigation statistics support
 
 MITIGATION_STATISTIC_COLLECTOR_SPECIFIC_CLASS="mitigation_stats_collector_specific_junos_snmp"
+#MITIGATION_STATISTIC_COLLECTOR_SPECIFIC_CLASS="mitigation_stats_collector_specific_nokia"
+#MITIGATION_STATISTIC_COLLECTOR_SPECIFIC_CLASS="mitigation_stats_collector_specific_multi"
 
 ##############################################################################
 ##############################################################################
diff --git a/utils/dfncert/fodadapter.py b/utils/dfncert/fodadapter.py
index 2c876f38..be3abf84 100644
--- a/utils/dfncert/fodadapter.py
+++ b/utils/dfncert/fodadapter.py
@@ -130,10 +130,13 @@ def get_nokia_stats():
 
     logger.info("get_nokia_stats(): before creating manager")
     #multiprocessing.set_start_method('spawn')
+
+    ## hack to make current celery worker process non-daemonic, so it can reuse multiprocessing:
+    #del (multiprocessing.current_process()._config)['daemon']
     #manager = multiprocessing.Manager()
 
     import queue
-    #q = queue.Queue()
+    ##q = queue.Queue()
     manager = queue
 
     logger.info("get_nokia_stats(): after creating manager")
@@ -145,7 +148,7 @@ def get_nokia_stats():
 
     if option_oneshot:
 
-        logger.info("get_nokia_stats(): option_oneshot")
+        logger.info("get_nokia_stats(): option_oneshotx ROUTERS="+str(ROUTERS))
 
         router_data = {router['name']: query_router_once(router) for router in ROUTERS}
 
diff --git a/utils/mitigation_stats_collector.py b/utils/mitigation_stats_collector.py
index dfad2565..cce3e195 100644
--- a/utils/mitigation_stats_collector.py
+++ b/utils/mitigation_stats_collector.py
@@ -11,6 +11,9 @@ if hasattr(settings, "MITIGATION_STATISTIC_COLLECTOR_SPECIFIC_CLASS") and settin
 elif hasattr(settings, "MITIGATION_STATISTIC_COLLECTOR_SPECIFIC_CLASS") and settings.MITIGATION_STATISTIC_COLLECTOR_SPECIFIC_CLASS == "mitigation_stats_collector_specific_junos_snmp":
   from utils import mitigation_stats_collector_specific_junos_snmp as mitigation_stats_collector_specific_class
   mitigation_stats_collector_specific = mitigation_stats_collector_specific_class.MitigationStatisticCollectorSpecific_JunosSnmp()
+elif hasattr(settings, "MITIGATION_STATISTIC_COLLECTOR_SPECIFIC_CLASS") and settings.MITIGATION_STATISTIC_COLLECTOR_SPECIFIC_CLASS == "mitigation_stats_collector_specific_multi":
+  from utils import mitigation_stats_collector_specific_multi as mitigation_stats_collector_specific_class
+  mitigation_stats_collector_specific = mitigation_stats_collector_specific_class.MitigationStatisticCollectorSpecific_Multi()
 else: # default is junos_snmp for compatibility
   from utils import mitigation_stats_collector_specific_junos_snmp as mitigation_stats_collector_specific_class
   mitigation_stats_collector_specific = mitigation_stats_collector_specific_class.MitigationStatisticCollectorSpecific_JunosSnmp()
diff --git a/utils/mitigation_stats_collector_specific_multi.py b/utils/mitigation_stats_collector_specific_multi.py
new file mode 100644
index 00000000..b6d04b6e
--- /dev/null
+++ b/utils/mitigation_stats_collector_specific_multi.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*- vim:fileencoding=utf-8:
+# vim: tabstop=4:shiftwidth=4:softtabstop=4:expandtab
+
+from pysnmp.hlapi.asyncore import *
+from django.conf import settings
+from datetime import datetime, timedelta
+import json
+import os
+import time
+import re
+
+from flowspec.models import Route
+from utils.route_spec_utils import get_rulename_by_ruleparams__generic, unify_ratelimit_value
+
+from utils.mitigation_stats_collector_specific_base import MitigationStatisticCollectorSpecific_Base
+from utils.mitigation_stats_collector_specific_junos_snmp import MitigationStatisticCollectorSpecific_JunosSnmp
+from utils.mitigation_stats_collector_specific_nokia import MitigationStatisticCollectorSpecific_Nokia
+
+import flowspec.logging_utils
+logger = flowspec.logging_utils.logger_init_default(__name__, "celery_multistats.log", False)
+
+#
+
+class MitigationStatisticCollectorSpecific_Multi(MitigationStatisticCollectorSpecific_Base):
+
+  #
+
+  # to be overriden in sub classes
+  def get_new_mitigation_statistic_data(self):
+     return self.get_statistic_data__from_multiple_sources()
+  
+  # to be overriden in sub classes
+  def get_statistic_data_rule_key(self, ruleobj):
+     return get_rulename_by_ruleparams__generic(ruleobj)
+
+
+  def get_statistic_data__from_multiple_sources(self):
+
+    # TODO: run all parallel:
+
+    mitigation_stats_collector_specific1 = MitigationStatisticCollectorSpecific_Nokia()
+    stats_data1 = mitigation_stats_collector_specific1.get_new_mitigation_statistic_data()
+
+
+    mitigation_stats_collector_specific2 = MitigationStatisticCollectorSpecific_JunosSnmp()
+    stats_data2 = mitigation_stats_collector_specific2.get_new_mitigation_statistic_data()
+
+    # TODO: merge data 
+
-- 
GitLab