ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ# -*- coding: utf-8 -*- # Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2021 All Rights Reserved # # Licensed under CLOUD LINUX LICENSE AGREEMENT # http://cloudlinux.com/docs/LICENSE.TXT """ This module contains a base class including methods, common for SSA Request Processor and SSA Decision Maker """ import fnmatch from typing import Tuple from datetime import date from ..configuration import load_configuration class Common: """ Base SSA module class """ def __init__(self): self.config = self.load_conf() def __getattr__(self, item): """ All undefined attributes, e.g. - domains_number - urls_number - correlation_coefficient - correlation - request_number - time are queried in config. Others would be empty """ conf = getattr(self, 'config') return conf.get(item, '') @property def non_url_fields(self) -> set: return {'domain_total_reqs', 'is_a_wordpress_domain'} @property def configured_ignores(self) -> list: """ Render configured ignore list """ elements = self.ignore_list.split(',') return [i.strip() for i in elements if i.strip()] def is_ignored(self, _url: str) -> bool: """ Check if given URL matches ignore list """ for pattern in self.configured_ignores: if '*' in pattern: # set * on the first position if it not set to allow filter without scheme (e.g. domain.com) if not pattern.startswith('*'): pattern = f"*{pattern}" if fnmatch.fnmatch(_url, pattern): return True else: if pattern in _url: return True return False @staticmethod def load_conf() -> dict: """ Load configuration """ return load_configuration()