Mini Shell
# -*- 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
Zerion Mini Shell 1.0