diff --git a/plugins/display/subdomains.py b/plugins/display/subdomains.py
new file mode 100644
index 0000000..84cb1dd
--- /dev/null
+++ b/plugins/display/subdomains.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright Grégory Soutadé 2023
+
+# This file is part of iwla
+
+# iwla is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# iwla is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with iwla. If not, see .
+#
+
+from iwla import IWLA
+from iplugin import IPlugin
+from display import *
+
+import awstats_data
+
+"""
+Display hook
+
+Add subdomains statistics
+
+Plugin requirements :
+ post_analysis/subdomains
+
+Conf values needed :
+ None
+
+Output files :
+ OUTPUT_ROOT/year/month/index.html
+
+Statistics creation :
+ None
+
+Statistics update :
+ None
+
+Statistics deletion :
+ None
+"""
+
+class IWLADisplaySubDomains(IPlugin):
+ def __init__(self, iwla):
+ super(IWLADisplaySubDomains, self).__init__(iwla)
+ self.requires = ['IWLAPostAnalysisSubDomains']
+
+
+ def hook(self):
+ display = self.iwla.getDisplay()
+ subdomains = self.iwla.getMonthStats()['subdomains']
+
+ # Subdomains in index
+ title = self.iwla._(u'Subdomains')
+
+ index = self.iwla.getDisplayIndex()
+
+ table = display.createBlock(DisplayHTMLBlockTable, title, [self.iwla._('URI'), self.iwla._(u'Entrance')])
+ table.setColsCSSClass(['', 'iwla_hit'])
+ subdomains = sorted(subdomains.items(), key=lambda t: t[1], reverse=True)
+ for (uri, count) in subdomains:
+ table.appendRow([uri, count])
+ table.computeRatio(1)
+ index.appendBlock(table)
diff --git a/plugins/post_analysis/subdomains.py b/plugins/post_analysis/subdomains.py
new file mode 100644
index 0000000..cb40751
--- /dev/null
+++ b/plugins/post_analysis/subdomains.py
@@ -0,0 +1,73 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright Grégory Soutadé 2023
+
+# This file is part of iwla
+
+# iwla is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# iwla is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with iwla. If not, see .
+#
+
+import re
+
+from iwla import IWLA
+from iplugin import IPlugin
+
+"""
+Post analysis hook
+
+Group top pages by subdomains
+
+Plugin requirements :
+ post_analysis/top_pages
+
+Conf values needed :
+ None
+
+Output files :
+ None
+
+Statistics creation :
+month_stats:
+ subdomains =>
+ domain => count
+
+Statistics update :
+ None
+
+Statistics deletion :
+ None
+"""
+
+class IWLAPostAnalysisSubDomains(IPlugin):
+ def __init__(self, iwla):
+ super(IWLAPostAnalysisSubDomains, self).__init__(iwla)
+ self.requires = ['IWLAPostAnalysisTopPages']
+
+ def load(self):
+ self.domain_re = re.compile(r'([^/]*)/.*')
+ return True
+
+ def hook(self):
+ month_stats = self.iwla.getMonthStats()
+ top_pages = month_stats['top_pages']
+
+ subdomains = {}
+
+ for (uri, count) in top_pages.items():
+ domain = self.domain_re.match(uri)
+ if not domain: continue
+ domain = domain.group(1)
+ subdomains[domain] = subdomains.get(domain, 0) + count
+
+ month_stats['subdomains'] = subdomains