ÿØÿà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 import pwd import logging from dataclasses import dataclass, field from datetime import datetime, timezone from typing import Optional from clcommon.clwpos_lib import is_wp_path from clcommon.cpapi import docroot @dataclass class ThirdPartyAdvice: """ Class for those advices which are generated not by Smart Advice, 3rd utilities returns different values """ username: str domain: str website: str id: int type: str status: str description: str detailed_description: str is_premium: str module_name: str license_status: str subscription_status: str upgrade_url: str total_stages: int completed_stages: int created_at: Optional[datetime] = field(default_factory=lambda: datetime.now(timezone.utc).isoformat()) updated_at: Optional[datetime] = field(default_factory=lambda: datetime.now(timezone.utc).isoformat()) def to_advice(self): return { 'created_at': self.created_at, 'updated_at': self.updated_at, 'metadata': { 'username': self.username, 'domain': self.domain, 'website': self.website }, 'advice': { 'id': self.id, 'type': self.type, 'status': self.status, 'description': self.description, 'detailed_description': self.detailed_description, 'is_premium': self.is_premium, 'module_name': self.module_name, 'license_status': self.license_status, 'subscription': { 'status': self.subscription_status, 'upgrade_url': self.upgrade_url }, 'total_stages': self.total_stages, 'completed_stages': self.completed_stages } } def does_user_exist_on_server(username): try: pwd.getpwnam(username) return True except KeyError: return False def filter_by_non_existence(advices_to_filter): filtered = [] for item in advices_to_filter: # skip advices which appear to be linked with non-existing users if not does_user_exist_on_server(item['metadata']['username']): logging.info('User %s does not exist anymore on this server,' 'skipping advices for him', item['metadata']['username']) continue try: domain_docroot = docroot(item['metadata']['domain'])[0] except Exception: logging.info('Cannot obtain document root for domain=%s. ' 'Most likely domain does not exist anymore or panel configs are malformed. ' 'Skipping advice for this domain', item['metadata']['domain']) continue full_website_path = domain_docroot + item['metadata']['website'] if not is_wp_path(full_website_path): logging.info('Wordpress site %s does not exist anymore on this server, skipping advice for it', full_website_path) continue filtered.append(item) return filtered