going-flying.com gemini git repository
aef063ca3c44abfa18092093dd0b93b9f64a4509 - Matthew Ernisse - 1619123142
put this here...
diff --git a/files/gemini-stats.py b/files/gemini-stats.py new file mode 100644 index 0000000..ed5b37f --- /dev/null +++ b/files/gemini-stats.py @@ -0,0 +1,228 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +'''gemini-stats.py (c) 2020-2021 Matthew J Ernisse <matt@going-flying.com> +All Rights Reserved. + +Redistribution and use in source and binary forms, +with or without modification, are permitted provided +that the following conditions are met: + + * Redistributions of source code must retain the + above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce + the above copyright notice, this list of conditions + and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +''' +import datetime +import pytz +import re +import sys +import os +from urllib.parse import urlparse + +MAXWIDTH=60 +MAXLABEL=30 + +class MollyStats(object): + ''' Look at a Molly Brown logfile and generate some statistics + from it. + + Produces: + Hits per page + Hits per day + Errors (url, code tuple) + ''' + logre = re.compile( + r'^.*:\s+(?P<date>\d{4}-\d{2}-\d{2}T(\d{2}:){2}\d{2}Z)\s*(?P<addr>\[[a-f0-9:]+\]|[0-9\.]+)\s+(?P<code>\d{2})\s+(?P<url>.+)