diff --git a/TODO b/TODO
index 7f71f61..e18bc14 100644
--- a/TODO
+++ b/TODO
@@ -4,7 +4,7 @@ doc auto generation
doc enhancement
Limit hits/pages/downloads by rate
Automatic tests
-quiet mode
Add Licence
Free memory as soon as possible
-gzip output files
\ No newline at end of file
+gzip output files
+different debug output levels
\ No newline at end of file
diff --git a/conf.py b/conf.py
index 0b4342c..82f490a 100644
--- a/conf.py
+++ b/conf.py
@@ -24,3 +24,5 @@ hit_to_page_conf = [r'^.+/category/.+$', r'^.+/tag/.+$', r'^.+/archive/.+$', r'^
# Because it's too long to build HTML when there is too much entries
max_hits_displayed = 100
max_downloads_displayed = 100
+
+compress_output_files = ['html', 'css', 'js']
diff --git a/default_conf.py b/default_conf.py
index 0d1df53..7ccd2ff 100644
--- a/default_conf.py
+++ b/default_conf.py
@@ -48,3 +48,6 @@ resources_path = ['resources']
icon_path = '%s/%s' % (os.path.basename(resources_path[0]), 'icon')
# CSS path (you can add yours)
css_path = ['%s/%s/%s' % (os.path.basename(resources_path[0]), 'css', 'iwla.css')]
+
+# Extensions to compress in gzip during display build
+compress_output_files = []
diff --git a/iwla.py b/iwla.py
index 5a20786..325b06d 100755
--- a/iwla.py
+++ b/iwla.py
@@ -31,6 +31,7 @@ from display import *
# Conf values needed :
# analyzed_filename
# domain_name
+# compress_output_files*
#
# Output files :
# DB_ROOT/meta.db
@@ -40,7 +41,7 @@ from display import *
#
# Statistics creation :
#
-# meta =>
+# meta :
# last_time
# start_analysis_time
# stats =>
@@ -50,6 +51,7 @@ from display import *
# not_viewed_bandwidth
# viewed_pages
# viewed_hits
+# nb_visits
# nb_visitors
#
# month_stats :
@@ -57,7 +59,7 @@ from display import *
# not_viewed_bandwidth
# viewed_pages
# viewed_hits
-# nb_visitors
+# nb_visits
#
# days_stats :
# day =>
@@ -65,6 +67,7 @@ from display import *
# not_viewed_bandwidth
# viewed_pages
# viewed_hits
+# nb_visits
# nb_visitors
#
# visits :
@@ -338,18 +341,18 @@ class IWLA(object):
page = self.display.createPage(title, filename, conf.css_path)
_, nb_month_days = monthrange(cur_time.tm_year, cur_time.tm_mon)
- days = self.display.createBlock(DisplayHTMLBlockTableWithGraph, 'By day', ['Day', 'Visitors', 'Pages', 'Hits', 'Bandwidth', 'Not viewed Bandwidth'], None, nb_month_days, range(1,6))
- days.setColsCSSClass(['', 'iwla_visitor', 'iwla_page', 'iwla_hit', 'iwla_bandwidth', 'iwla_bandwidth'])
+ days = self.display.createBlock(DisplayHTMLBlockTableWithGraph, 'By day', ['Day', 'Visits', 'Pages', 'Hits', 'Bandwidth', 'Not viewed Bandwidth'], None, nb_month_days, range(1,6))
+ days.setColsCSSClass(['', 'iwla_visit', 'iwla_page', 'iwla_hit', 'iwla_bandwidth', 'iwla_bandwidth'])
nb_visits = 0
nb_days = 0
for i in range(1, nb_month_days+1):
day = '%d
%s' % (i, time.strftime('%b', cur_time))
- full_day = '%d %s %d' % (i, time.strftime('%b', cur_time), cur_time.tm_year)
+ full_day = '%02d %s %d' % (i, time.strftime('%b', cur_time), cur_time.tm_year)
if i in self.current_analysis['days_stats'].keys():
stats = self.current_analysis['days_stats'][i]
- row = [full_day, stats['nb_visitors'], stats['viewed_pages'], stats['viewed_hits'],
+ row = [full_day, stats['nb_visits'], stats['viewed_pages'], stats['viewed_hits'],
stats['viewed_bandwidth'], stats['not_viewed_bandwidth']]
- nb_visits += stats['nb_visitors']
+ nb_visits += stats['nb_visits']
nb_days += 1
else:
row = [full_day, 0, 0, 0, 0, 0]
@@ -391,10 +394,10 @@ class IWLA(object):
cur_time = time.localtime()
months_name = ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
title = 'Summary %d' % (year)
- cols = ['Month', 'Visitors', 'Pages', 'Hits', 'Bandwidth', 'Not viewed Bandwidth', 'Details']
- graph_cols=range(1,6)
+ cols = ['Month', 'Visitors', 'Visits', 'Pages', 'Hits', 'Bandwidth', 'Not viewed Bandwidth', 'Details']
+ graph_cols=range(1,7)
months = self.display.createBlock(DisplayHTMLBlockTableWithGraph, title, cols, None, 12, graph_cols)
- months.setColsCSSClass(['', 'iwla_visitor', 'iwla_page', 'iwla_hit', 'iwla_bandwidth', 'iwla_bandwidth', ''])
+ months.setColsCSSClass(['', 'iwla_visitor', 'iwla_visit', 'iwla_page', 'iwla_hit', 'iwla_bandwidth', 'iwla_bandwidth', ''])
total = [0] * len(cols)
for i in range(1, 13):
month = '%s
%d' % (months_name[i], year)
@@ -402,15 +405,15 @@ class IWLA(object):
if i in month_stats.keys():
stats = month_stats[i]
link = 'Details' % (year, i)
- row = [full_month, stats['nb_visitors'], stats['viewed_pages'], stats['viewed_hits'],
+ row = [full_month, stats['nb_visitors'], stats['nb_visits'], stats['viewed_pages'], stats['viewed_hits'],
stats['viewed_bandwidth'], stats['not_viewed_bandwidth'], link]
for j in graph_cols:
total[j] += row[j]
else:
- row = [full_month, 0, 0, 0, 0, 0, '']
+ row = [full_month, 0, 0, 0, 0, 0, 0, '']
months.appendRow(row)
- months.setCellValue(i-1, 4, bytesToStr(row[4]))
months.setCellValue(i-1, 5, bytesToStr(row[5]))
+ months.setCellValue(i-1, 6, bytesToStr(row[6]))
months.appendShortTitle(month)
if year == cur_time.tm_year and i == cur_time.tm_mon:
css = months.getCellCSSClass(i-1, 0)
@@ -419,8 +422,8 @@ class IWLA(object):
months.setCellCSSClass(i-1, 0, css)
total[0] = 'Total'
- total[4] = bytesToStr(total[4])
total[5] = bytesToStr(total[5])
+ total[6] = bytesToStr(total[6])
months.appendRow(total)
page.appendBlock(months)
@@ -431,19 +434,40 @@ class IWLA(object):
page = self.display.createPage(title, filename, conf.css_path)
- last_update = 'Last update %s
' % (time.strftime('%d %b %Y %H:%M', time.localtime()))
+ last_update = 'Last update %s
' % (time.strftime('%02d %b %Y %H:%M', time.localtime()))
page.appendBlock(self.display.createBlock(DisplayHTMLRaw, last_update))
- for year in self.meta_infos['stats'].keys():
+ for year in sorted(self.meta_infos['stats'].keys(), reverse=True):
self._generateDisplayMonthStats(page, year, self.meta_infos['stats'][year])
self.display.addPage(page)
+ def _compressFile(self, build_time, root, filename):
+ path = os.path.join(root, filename)
+ gz_path = path + '.gz'
+ #print 'Compress %s => %s' % (path, gz_path)
+ if not os.path.exists(gz_path) or\
+ os.stat(path).st_mtime > build_time:
+ with open(path, 'rb') as f_in:
+ with gzip.open(gz_path, 'wb') as f_out:
+ f_out.write(f_in.read())
+
+ def _compressFiles(self, build_time, root):
+ if not conf.compress_output_files: return
+ for rootdir, subdirs, files in os.walk(root, followlinks=True):
+ for f in files:
+ for ext in conf.compress_output_files:
+ if f.endswith(ext):
+ self._compressFile(build_time, rootdir, f)
+ break
+
def _generateDisplay(self):
self._generateDisplayDaysStats()
self._callPlugins(conf.DISPLAY_HOOK_DIRECTORY)
self._generateDisplayWholeMonthStats()
+ build_time = time.localtime()
self.display.build(conf.DISPLAY_ROOT)
+ self._compressFiles(build_time, conf.DISPLAY_ROOT)
def _createEmptyStats(self):
stats = {}
@@ -451,7 +475,7 @@ class IWLA(object):
stats['not_viewed_bandwidth'] = 0
stats['viewed_pages'] = 0
stats['viewed_hits'] = 0
- stats['nb_visitors'] = 0
+ stats['nb_visits'] = 0
return stats
@@ -464,7 +488,7 @@ class IWLA(object):
for (day, stat) in self.current_analysis['days_stats'].items():
for k in stats.keys():
stats[k] += stat[k]
-
+
duplicated_stats = {k:v for (k,v) in stats.items()}
cur_time = self.meta_infos['last_time']
@@ -485,7 +509,7 @@ class IWLA(object):
continue
self.valid_visitors[k] = v
- duplicated_stats['visitors'] = stats['visitors'] = len(self.valid_visitors.keys())
+ duplicated_stats['nb_visitors'] = stats['nb_visitors'] = len(self.valid_visitors.keys())
self._callPlugins(conf.POST_HOOK_DIRECTORY)
@@ -535,9 +559,9 @@ class IWLA(object):
if (conf.count_hit_only_visitors or\
viewed_pages) and\
not super_hit['robot']:
- stats['nb_visitors'] += 1
+ stats['nb_visits'] += 1
- print "== Stats for %d/%02d/%d ==" % (cur_time.tm_year, cur_time.tm_mon, cur_time.tm_mday)
+ print "== Stats for %d/%02d/%02d ==" % (cur_time.tm_year, cur_time.tm_mon, cur_time.tm_mday)
print stats