__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
import json
import logging
import os
import pathlib
from collections import OrderedDict
from typing import Any, Dict, List, Union # noqa: F401
from uaclient import defaults, secret_manager, system, util
from uaclient.config import UAConfig
class RegexRedactionFilter(logging.Filter):
"""A logging filter to redact confidential info"""
def filter(self, record: logging.LogRecord):
record.msg = util.redact_sensitive_logs(str(record.msg))
return True
class KnownSecretRedactionFilter(logging.Filter):
"""A logging filter to redact confidential info"""
def filter(self, record: logging.LogRecord):
record.msg = secret_manager.secrets.redact_secrets(str(record.msg))
return True
class JsonArrayFormatter(logging.Formatter):
"""Json Array Formatter for our logging mechanism
Custom made for Pro logging needs
"""
default_time_format = "%Y-%m-%dT%H:%M:%S"
default_msec_format = "%s.%03d"
required_fields = (
"asctime",
"levelname",
"name",
"funcName",
"lineno",
"message",
)
def format(self, record: logging.LogRecord) -> str:
record.message = record.getMessage()
record.asctime = self.formatTime(record)
extra_message_dict = {} # type: Dict[str, Any]
if record.exc_info:
extra_message_dict["exc_info"] = self.formatException(
record.exc_info
)
if not extra_message_dict.get("exc_info") and record.exc_text:
extra_message_dict["exc_info"] = record.exc_text
if record.stack_info:
extra_message_dict["stack_info"] = self.formatStack(
record.stack_info
)
extra = record.__dict__.get("extra")
if extra and isinstance(extra, dict):
extra_message_dict.update(extra)
# is ordered to maintain order of fields in log output
local_log_record = OrderedDict() # type: Dict[str, Any]
# update the required fields in the order stated
for field in self.required_fields:
value = record.__dict__.get(field)
local_log_record[field] = value
local_log_record["extra"] = extra_message_dict
return json.dumps(list(local_log_record.values()))
def get_user_or_root_log_file_path() -> str:
"""
Gets the correct log_file path,
adjusting for whether the user is root or not.
"""
if util.we_are_currently_root():
return UAConfig().log_file
else:
return get_user_log_file()
def get_user_log_file() -> str:
"""Gets the correct user log_file storage location"""
return os.path.join(system.get_user_cache_dir(), "ubuntu-pro.log")
def get_all_user_log_files() -> List[str]:
"""Gets all the log files for the users in the system
Returns a list of all user log files in their home directories.
"""
user_directories = os.listdir("/home")
log_files = []
for user_directory in user_directories:
user_path = os.path.join(
"/home",
user_directory,
".cache",
defaults.USER_CACHE_SUBDIR,
"ubuntu-pro.log",
)
if os.path.isfile(user_path):
log_files.append(user_path)
return log_files
def setup_journald_logging():
logger = logging.getLogger("ubuntupro")
logger.setLevel(logging.INFO)
console_handler = logging.StreamHandler()
console_handler.setFormatter(JsonArrayFormatter())
console_handler.setLevel(logging.INFO)
console_handler.addFilter(RegexRedactionFilter())
console_handler.addFilter(KnownSecretRedactionFilter())
logger.addHandler(console_handler)
def setup_cli_logging(log_level: Union[str, int], log_file: str):
"""Setup logging to log_file
If run as non-root then log_file is replaced with a user-specific log file.
"""
# support lower-case log_level config value
if isinstance(log_level, str):
log_level = log_level.upper()
# if we are running as non-root, change log file
if not util.we_are_currently_root():
log_file = get_user_log_file()
logger = logging.getLogger("ubuntupro")
logger.setLevel(log_level)
# Clear all handlers, so they are replaced for this logger
logger.handlers = []
# Setup file logging
log_file_path = pathlib.Path(log_file)
if not log_file_path.exists():
log_file_path.parent.mkdir(parents=True, exist_ok=True)
log_file_path.touch(mode=0o640)
file_handler = logging.FileHandler(log_file)
file_handler.setFormatter(JsonArrayFormatter())
file_handler.setLevel(log_level)
file_handler.addFilter(RegexRedactionFilter())
file_handler.addFilter(KnownSecretRedactionFilter())
logger.addHandler(file_handler)
def extra(**kwargs):
"""
A helper for passing extra fields to log statements.
Usage:
LOG.info("message string", extra=log.extra(field=something_relevant))
"""
return {"extra": kwargs}
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| __pycache__ | Folder | 0755 |
|
|
| api | Folder | 0755 |
|
|
| cli | Folder | 0755 |
|
|
| clouds | Folder | 0755 |
|
|
| daemon | Folder | 0755 |
|
|
| entitlements | Folder | 0755 |
|
|
| files | Folder | 0755 |
|
|
| http | Folder | 0755 |
|
|
| messages | Folder | 0755 |
|
|
| timer | Folder | 0755 |
|
|
| __init__.py | File | 0 B | 0644 |
|
| actions.py | File | 14.63 KB | 0644 |
|
| apt.py | File | 35.77 KB | 0644 |
|
| apt_news.py | File | 8.39 KB | 0644 |
|
| config.py | File | 18.91 KB | 0644 |
|
| contract.py | File | 35.88 KB | 0644 |
|
| contract_data_types.py | File | 9.89 KB | 0644 |
|
| data_types.py | File | 13.21 KB | 0644 |
|
| defaults.py | File | 3.19 KB | 0644 |
|
| event_logger.py | File | 8.06 KB | 0644 |
|
| exceptions.py | File | 18.29 KB | 0644 |
|
| gpg.py | File | 836 B | 0644 |
|
| livepatch.py | File | 12.85 KB | 0644 |
|
| lock.py | File | 4.42 KB | 0644 |
|
| log.py | File | 4.9 KB | 0644 |
|
| secret_manager.py | File | 648 B | 0644 |
|
| security_status.py | File | 26.16 KB | 0644 |
|
| snap.py | File | 6.26 KB | 0644 |
|
| status.py | File | 28.53 KB | 0644 |
|
| system.py | File | 28.12 KB | 0644 |
|
| types.py | File | 308 B | 0644 |
|
| update_contract_info.py | File | 1.55 KB | 0644 |
|
| upgrade_lts_contract.py | File | 3.22 KB | 0644 |
|
| util.py | File | 15.45 KB | 0644 |
|
| version.py | File | 2.63 KB | 0644 |
|
| yaml.py | File | 840 B | 0644 |
|