PNG  IHDR* pHYs+ IDATx]n#; cdLb Ǚ[at¤_:uP}>!Usă cag޿ ֵNu`ݼTâabO7uL&y^wFٝA"l[|ŲHLN밪4*sG3|Dv}?+y߉{OuOAt4Jj.u]Gz*҉sP'VQKbA1u\`& Af;HWj hsO;ogTu uj7S3/QzUr&wS`M$X_L7r2;aE+ώ%vikDA:dR+%KzƉo>eOth$z%: :{WwaQ:wz%4foɹE[9<]#ERINƻv溂E%P1i01 |Jvҗ&{b?9g=^wζXn/lK::90KwrюO\!ջ3uzuGv^;騢wq<Iatv09:tt~hEG`v;3@MNZD.1]L:{ծI3`L(÷ba")Y.iljCɄae#I"1 `3*Bdz>j<fU40⨬%O$3cGt]j%Fߠ_twJ;ABU8vP3uEԑwQ V:h%))LfraqX-ۿX]v-\9I gl8tzX ]ecm)-cgʒ#Uw=Wlێn(0hPP/ӨtQ“&J35 $=]r1{tLuǮ*i0_;NƝ8;-vݏr8+U-kruȕYr0RnC]*ެ(M:]gE;{]tg(#ZJ9y>utRDRMdr9㪩̞zֹb<ģ&wzJM"iI( .ꮅX)Qw:9,i좜\Ԛi7&N0:asϓc];=ΗOӣ APqz93 y $)A*kVHZwBƺnWNaby>XMN*45~ղM6Nvm;A=jֲ.~1}(9`KJ/V F9[=`~[;sRuk]rєT!)iQO)Y$V ی ۤmzWz5IM Zb )ˆC`6 rRa}qNmUfDsWuˤV{ Pݝ'=Kֳbg,UҘVz2ﴻnjNgBb{? ߮tcsͻQuxVCIY۠:(V뺕 ٥2;t`@Fo{Z9`;]wMzU~%UA蛚dI vGq\r82iu +St`cR.6U/M9IENDB` REDROOM
PHP 5.6.40
Preview: apport.py Size: 7.05 KB
/lib/python3.6/site-packages/cloudinit/apport.py

# Copyright (C) 2017 Canonical Ltd.
#
# This file is part of cloud-init. See LICENSE file for license information.

"""Cloud-init apport interface"""

import json
import os

from cloudinit.cmd.devel import read_cfg_paths
from cloudinit.cmd.devel.logs import (
    INSTALLER_APPORT_FILES,
    INSTALLER_APPORT_SENSITIVE_FILES,
)

try:
    from apport.hookutils import (
        attach_file,
        attach_file_if_exists,
        attach_root_command_outputs,
        root_command_output,
    )

    has_apport = True
except ImportError:
    has_apport = False


KNOWN_CLOUD_NAMES = [
    "AliYun",
    "AltCloud",
    "Akamai",
    "Amazon - Ec2",
    "Azure",
    "Bigstep",
    "Brightbox",
    "CloudSigma",
    "CloudStack",
    "DigitalOcean",
    "E24Cloud",
    "GCE - Google Compute Engine",
    "Huawei Cloud",
    "Exoscale",
    "Hetzner Cloud",
    "NWCS",
    "IBM - (aka SoftLayer or BlueMix)",
    "LXD",
    "MAAS",
    "NoCloud",
    "OpenNebula",
    "OpenStack",
    "Oracle",
    "OVF",
    "RbxCloud - (HyperOne, Rootbox, Rubikon)",
    "OpenTelekomCloud",
    "SAP Converged Cloud",
    "Scaleway",
    "SmartOS",
    "UpCloud",
    "VMware",
    "Vultr",
    "ZStack",
    "Outscale",
    "Other",
]

# Potentially clear text collected logs
CLOUDINIT_LOG = "/var/log/cloud-init.log"
CLOUDINIT_OUTPUT_LOG = "/var/log/cloud-init-output.log"


def _get_user_data_file() -> str:
    paths = read_cfg_paths()
    return paths.get_ipath_cur("userdata_raw")


def attach_cloud_init_logs(report, ui=None):
    """Attach cloud-init logs and tarfile from 'cloud-init collect-logs'."""
    attach_root_command_outputs(
        report,
        {
            "cloud-init-log-warnings": (
                'egrep -i "warn|error" /var/log/cloud-init.log'
            ),
            "cloud-init-output.log.txt": "cat /var/log/cloud-init-output.log",
        },
    )
    root_command_output(
        ["cloud-init", "collect-logs", "-t", "/tmp/cloud-init-logs.tgz"]
    )
    attach_file(report, "/tmp/cloud-init-logs.tgz", "logs.tgz")


def attach_hwinfo(report, ui=None):
    """Optionally attach hardware info from lshw."""
    prompt = (
        "Your device details (lshw) may be useful to developers when"
        " addressing this bug, but gathering it requires admin privileges."
        " Would you like to include this info?"
    )
    if ui and ui.yesno(prompt):
        attach_root_command_outputs(report, {"lshw.txt": "lshw"})


def attach_cloud_info(report, ui=None):
    """Prompt for cloud details if instance-data unavailable.

    When we have valid _get_instance_data, apport/generic-hooks/cloud_init.py
    provides CloudName, CloudID, CloudPlatform and CloudSubPlatform.

    Apport/generic-hooks are delivered by cloud-init's downstream branches
    ubuntu/(devel|kinetic|jammy|focal|bionic) so they will not be represented
    in upstream main.

    In absence of viable instance-data.json format, prompt for the cloud below.
    """

    if ui:
        paths = read_cfg_paths()
        try:
            with open(paths.get_runpath("instance_data")) as file:
                instance_data = json.load(file)
                assert instance_data.get("v1", {}).get("cloud_name")
                return  # Valid instance-data means generic-hooks will report
        except (IOError, json.decoder.JSONDecodeError, AssertionError):
            pass

        # No valid /run/cloud/instance-data.json on system. Prompt for cloud.
        prompt = "Is this machine running in a cloud environment?"
        response = ui.yesno(prompt)
        if response is None:
            raise StopIteration  # User cancelled
        if response:
            prompt = (
                "Please select the cloud vendor or environment in which"
                " this instance is running"
            )
            response = ui.choice(prompt, KNOWN_CLOUD_NAMES)
            if response:
                report["CloudName"] = KNOWN_CLOUD_NAMES[response[0]]
            else:
                report["CloudName"] = "None"


def attach_installer_files(report, ui=None):
    """Attach any subiquity installer logs config.

    To support decoupling apport integration from installer config/logs,
    we eventually want to either source this function or APPORT_FILES
    attribute from subiquity  and/or ubuntu-desktop-installer package-hooks
    python modules.
    """
    for apport_file in INSTALLER_APPORT_FILES:
        realpath = os.path.realpath(apport_file.path)
        attach_file_if_exists(report, realpath, apport_file.label)


def attach_ubuntu_pro_info(report, ui=None):
    """Attach ubuntu pro logs and tag if keys present in user-data."""
    realpath = os.path.realpath("/var/log/ubuntu-advantage.log")
    attach_file_if_exists(report, realpath)
    if os.path.exists(realpath):
        report.setdefault("Tags", "")
        if report["Tags"]:
            report["Tags"] += " "
        report["Tags"] += "ubuntu-pro"


def attach_user_data(report, ui=None):
    """Optionally provide user-data if desired."""
    if ui:
        user_data_file = _get_user_data_file()
        prompt = (
            "Your user-data, cloud-config or autoinstall files can optionally "
            " be provided from {0} and could be useful to developers when"
            " addressing this bug. Do you wish to attach user-data to this"
            " bug?".format(user_data_file)
        )
        response = ui.yesno(prompt)
        if response is None:
            raise StopIteration  # User cancelled
        if response:
            realpath = os.path.realpath(user_data_file)
            attach_file(report, realpath, "user_data.txt")
            for apport_file in INSTALLER_APPORT_SENSITIVE_FILES:
                realpath = os.path.realpath(apport_file.path)
                attach_file_if_exists(report, realpath, apport_file.label)


def add_bug_tags(report):
    """Add any appropriate tags to the bug."""
    new_tags = []
    if report.get("CurtinError"):
        new_tags.append("curtin")
    if report.get("SubiquityLog"):
        new_tags.append("subiquity")
    if "JournalErrors" in report.keys():
        errors = report["JournalErrors"]
        if "Breaking ordering cycle" in errors:
            new_tags.append("systemd-ordering")
    if report.get("UdiLog"):
        new_tags.append("ubuntu-desktop-installer")
    if new_tags:
        report.setdefault("Tags", "")
        if report["Tags"]:
            report["Tags"] += " "
        report["Tags"] += " ".join(new_tags)


def add_info(report, ui):
    """This is an entry point to run cloud-init's apport functionality.

    Distros which want apport support will have a cloud-init package-hook at
    /usr/share/apport/package-hooks/cloud-init.py which defines an add_info
    function and returns the result of cloudinit.apport.add_info(report, ui).
    """
    if not has_apport:
        raise RuntimeError(
            "No apport imports discovered. Apport functionality disabled"
        )
    attach_cloud_init_logs(report, ui)
    attach_hwinfo(report, ui)
    attach_cloud_info(report, ui)
    attach_user_data(report, ui)
    attach_installer_files(report, ui)
    attach_ubuntu_pro_info(report, ui)
    add_bug_tags(report)
    return True

Directory Contents

Dirs: 11 × Files: 29

Name Size Perms Modified Actions
analyze DIR
- drwxr-xr-x 2026-01-24 23:01:14
Edit Download
cmd DIR
- drwxr-xr-x 2026-01-24 23:01:14
Edit Download
config DIR
- drwxr-xr-x 2026-01-24 23:01:14
Edit Download
distros DIR
- drwxr-xr-x 2026-01-24 23:01:14
Edit Download
filters DIR
- drwxr-xr-x 2026-01-24 23:01:14
Edit Download
handlers DIR
- drwxr-xr-x 2026-01-24 23:01:14
Edit Download
mergers DIR
- drwxr-xr-x 2026-01-24 23:01:14
Edit Download
net DIR
- drwxr-xr-x 2026-01-24 23:01:14
Edit Download
reporting DIR
- drwxr-xr-x 2026-01-24 23:01:14
Edit Download
sources DIR
- drwxr-xr-x 2026-01-24 23:01:14
Edit Download
- drwxr-xr-x 2026-01-24 23:01:14
Edit Download
7.05 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
2.45 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
3.22 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
6.77 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
2.00 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
3.38 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
4.28 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
16.41 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
2.43 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
5.47 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
22.97 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
2.52 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
1022 B lrw-r--r-- 2023-12-04 11:47:40
Edit Download
10.28 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
2.02 KB lrw-r--r-- 2026-01-23 08:56:46
Edit Download
1.74 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
1.93 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
22.28 KB lrw-r--r-- 2026-01-23 08:56:47
Edit Download
38.88 KB lrw-r--r-- 2026-01-23 08:56:46
Edit Download
13.23 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
5.95 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
3.15 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
703 B lrw-r--r-- 2023-12-04 11:47:40
Edit Download
27.32 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
14.43 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
96.43 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
566 B lrw-r--r-- 2026-01-23 08:56:50
Edit Download
3.76 KB lrw-r--r-- 2023-12-04 11:47:40
Edit Download
0 B lrw-r--r-- 2023-12-04 11:47:40
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).
© 2026 REDROOM — Secure File Manager. All rights reserved. Built with ❤️ & Red Dark UI