# coding: UTF-8 import traceback import calendar import os import datetime import re import sys sys.path.append('/var/local/mode2/') from functions.mwDB import mwDB from functions.utility import get_ctrinfo from functions.apch_httpd_cf_action import get_vhostconfig def count_elements(arr): keys = [] datalist = [] for i in arr: if i not in keys: keys.append(i) for k in keys: data = {} data['ip_address'] = k data['access_count'] = arr.count(k) datalist.append(data) return datalist if __name__ == "__main__": ctrinfo = get_ctrinfo() ctrid = ctrinfo.get("ctrid") date_today = datetime.date.today() try: # mode2_webanalysis_settingsから始まるファイル名を検索 # 各ファイルについてドメイン部分をsplit settings_list = [] target_path = '/var/tmp/' for x in os.listdir(target_path): if x.startswith('mode2_webanalysis_settings'): if x == 'mode2_webanalysis_settings': settings_list.append(False) else: domain = x.replace("mode2_webanalysis_settings_", "") settings_list.append(domain) for domain in settings_list: try: # ファイル内容取得 if domain: vhostconfig = get_vhostconfig(ctrid) access_log_file_path = vhostconfig[domain]['customlog'] if access_log_file_path == "": # テンポラリドメインを想定 access_log_file_path = f'/usr/home/{ctrid}/www/logs/access_log' else: access_log_file_path = f'/usr/home/{ctrid}/www/logs/access_log' f = open(access_log_file_path, 'r') log_lines = f.readlines() f.close() ipaddrs = [] for line in log_lines: str_piwik1 = line.find("GET /mode2_piwik/matomo.php") str_piwik2 = line.find("GET /mode2_piwik/piwik.php") if str_piwik1 != -1 or str_piwik2 != -1: # IPぽいものもマッチさせてしまうbugfix str_ipaddr = re.search( r'^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}) ', line) if str_ipaddr: ipaddrs.append(str_ipaddr.group()) ipdatas = count_elements(ipaddrs) # DB挿入 conn = mwDB(domain,DictCursor=True) for insert_data in ipdatas: try: # Insert処理 sql = "INSERT INTO web_access_ip (period_type, access_date, ip_address, access_count) VALUES ('day','%s', '%s', '%s') " \ "ON DUPLICATE KEY UPDATE period_type='day', access_date='%s', ip_address='%s', access_count='%s', updated=CURRENT_TIMESTAMP;" % \ (date_today, insert_data['ip_address'], insert_data['access_count'], date_today, insert_data['ip_address'], insert_data['access_count']) print(sql) conn.execute(sql) conn.commit() except Exception as e: raise e try: sql = 'SELECT * FROM web_access_ip WHERE period_type = "day" AND access_date >= "' \ + str(date_today.year) + "-" + str(date_today.month) + '-01" AND access_date <= "' \ + str(date_today.year) + "-" + str(date_today.month) + "-" + str( calendar.monthrange(date_today.year, date_today.month)[1]) + '\";' print(sql) month_data = conn.fetch(sql) print(f'month_data: {month_data}') except Exception as e: raise e md_ipaddrs = {} if len(month_data) > 0: for md in month_data: if md['ip_address'] in md_ipaddrs: md_ipaddrs[md['ip_address']] += md['access_count'] else: md_ipaddrs[md['ip_address']] = md['access_count'] month_date = str(date_today.year) + "-" + \ str(date_today.month) + "-01" for k, v in md_ipaddrs.items(): try: # Insert処理 sql = "INSERT INTO web_access_ip (period_type, access_date, ip_address, access_count) VALUES ('month','%s', '%s', '%s') " \ "ON DUPLICATE KEY UPDATE period_type='month', access_date='%s', ip_address='%s', access_count='%s', updated=CURRENT_TIMESTAMP;" % \ (month_date, k, v, month_date, k, v) print(sql) conn.execute(sql) conn.commit() except Exception as e: raise e except Exception as e: raise e finally: conn.close() except Exception as e: print(traceback(e))