Newer
Older
nextcloud-monitoring-dashboard / zabbix-agent-scripts / get_apache2_user_agent_metrics.py
import pandas as pd

from datetime import datetime

import sys

import json

dt = datetime.now().strftime("%Y%m%d")

df = pd.read_csv(
                 "/var/log/apache2/archive/nextcloud-access-csv.log-%s" % dt,
                 header=None,
                 names=["timestamp","user_agent"],
                 parse_dates=["timestamp"]
                )

df.fillna("not-found",inplace=True)

## EDGE
# Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.57
## Chrome
# Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36
## Firefox
# Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:110.0) Gecko/20100101 Firefox/110.0
## Safari
# Mozilla/5.0 (Macintosh; Intel Mac OS X 13_2_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15

def get_norm_user_agent(s):
        
    s = s.lower()
    
    ## Nextcloud Talk App
    if "nextcloud-talk" in s:
        if "android" in s:
            return "nextcloud_talk_android"
        elif "ios" in s:
            return "nextcloud_talk_ios"
        else:
            return "nextcloud_talk_unknown"
    
    ## Nextcloud Files App
    if "nextcloud-android" in s:
        return "nextcloud_android"
    
    ## Browser
    if "chrome" in s:
        if "edg" in s:
            return "edge_browser"
        else:
            return "chrome_browser"
    if "firefox" in s:
        return "firefox_browser"
    if "macintosh" in s and "applewebkit" in s:
        return "safari_browser"
    
    ## Desktop Client
    if "mirall" in s:
        if "linux" in s:
            return "desktop_client_linux"
        elif "macintosh" in s:
            return "desktop_client_mac"
        elif "windows" in s:
            return "desktop_client_windows"
        else:
            return "desktop_client_unknown"
    
    ## DavX5, CardDAV / CalDAV sync agent on Android
    if "davx5" in s:
        return "davx5"
    
    ## Thunderbird, CardDAV / CalDAV sync agent on Desktop
    if "thunderbird" in s:
        return "thunderbird"
    
    ## Python scripting
    if "python" in s:
        return "python"
    
    return "other"



df["norm_user_agent"] = df.user_agent.apply(get_norm_user_agent)

df_agg = df.value_counts("norm_user_agent")

json.dump(
          df_agg.to_dict(),
          open("/var/lib/zabbix/output/apache2_user_agent_metrics.json","w")
         )