|
Packit |
bc9a3a |
# Copyright (C) 2017 Canonical Ltd.
|
|
Packit |
bc9a3a |
#
|
|
Packit |
bc9a3a |
# This file is part of cloud-init. See LICENSE file for license information.
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
'''Cloud-init apport interface'''
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
try:
|
|
Packit |
bc9a3a |
from apport.hookutils import (
|
|
Packit |
bc9a3a |
attach_file, attach_root_command_outputs, root_command_output)
|
|
Packit |
bc9a3a |
has_apport = True
|
|
Packit |
bc9a3a |
except ImportError:
|
|
Packit |
bc9a3a |
has_apport = False
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
KNOWN_CLOUD_NAMES = [
|
|
Packit |
bc9a3a |
'AliYun',
|
|
Packit |
bc9a3a |
'AltCloud',
|
|
Packit |
bc9a3a |
'Amazon - Ec2',
|
|
Packit |
bc9a3a |
'Azure',
|
|
Packit |
bc9a3a |
'Bigstep',
|
|
Packit |
bc9a3a |
'Brightbox',
|
|
Packit |
bc9a3a |
'CloudSigma',
|
|
Packit |
bc9a3a |
'CloudStack',
|
|
Packit |
bc9a3a |
'DigitalOcean',
|
|
Packit |
bc9a3a |
'E24Cloud',
|
|
Packit |
bc9a3a |
'GCE - Google Compute Engine',
|
|
Packit |
bc9a3a |
'Exoscale',
|
|
Packit |
bc9a3a |
'Hetzner Cloud',
|
|
Packit |
bc9a3a |
'IBM - (aka SoftLayer or BlueMix)',
|
|
Packit |
bc9a3a |
'LXD',
|
|
Packit |
bc9a3a |
'MAAS',
|
|
Packit |
bc9a3a |
'NoCloud',
|
|
Packit |
bc9a3a |
'OpenNebula',
|
|
Packit |
bc9a3a |
'OpenStack',
|
|
Packit |
bc9a3a |
'Oracle',
|
|
Packit |
bc9a3a |
'OVF',
|
|
Packit |
bc9a3a |
'RbxCloud - (HyperOne, Rootbox, Rubikon)',
|
|
Packit |
bc9a3a |
'OpenTelekomCloud',
|
|
Packit |
bc9a3a |
'Scaleway',
|
|
Packit |
bc9a3a |
'SmartOS',
|
|
Packit |
bc9a3a |
'VMware',
|
|
Packit |
bc9a3a |
'ZStack',
|
|
Packit |
bc9a3a |
'Other'
|
|
Packit |
bc9a3a |
]
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
# Potentially clear text collected logs
|
|
Packit |
bc9a3a |
CLOUDINIT_LOG = '/var/log/cloud-init.log'
|
|
Packit |
bc9a3a |
CLOUDINIT_OUTPUT_LOG = '/var/log/cloud-init-output.log'
|
|
Packit |
bc9a3a |
USER_DATA_FILE = '/var/lib/cloud/instance/user-data.txt' # Optional
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
def attach_cloud_init_logs(report, ui=None):
|
|
Packit |
bc9a3a |
'''Attach cloud-init logs and tarfile from 'cloud-init collect-logs'.'''
|
|
Packit |
bc9a3a |
attach_root_command_outputs(report, {
|
|
Packit |
bc9a3a |
'cloud-init-log-warnings':
|
|
Packit |
bc9a3a |
'egrep -i "warn|error" /var/log/cloud-init.log',
|
|
Packit |
bc9a3a |
'cloud-init-output.log.txt': 'cat /var/log/cloud-init-output.log'})
|
|
Packit |
bc9a3a |
root_command_output(
|
|
Packit |
bc9a3a |
['cloud-init', 'collect-logs', '-t', '/tmp/cloud-init-logs.tgz'])
|
|
Packit |
bc9a3a |
attach_file(report, '/tmp/cloud-init-logs.tgz', 'logs.tgz')
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
def attach_hwinfo(report, ui=None):
|
|
Packit |
bc9a3a |
'''Optionally attach hardware info from lshw.'''
|
|
Packit |
bc9a3a |
prompt = (
|
|
Packit |
bc9a3a |
'Your device details (lshw) may be useful to developers when'
|
|
Packit |
bc9a3a |
' addressing this bug, but gathering it requires admin privileges.'
|
|
Packit |
bc9a3a |
' Would you like to include this info?')
|
|
Packit |
bc9a3a |
if ui and ui.yesno(prompt):
|
|
Packit |
bc9a3a |
attach_root_command_outputs(report, {'lshw.txt': 'lshw'})
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
def attach_cloud_info(report, ui=None):
|
|
Packit |
bc9a3a |
'''Prompt for cloud details if available.'''
|
|
Packit |
bc9a3a |
if ui:
|
|
Packit |
bc9a3a |
prompt = 'Is this machine running in a cloud environment?'
|
|
Packit |
bc9a3a |
response = ui.yesno(prompt)
|
|
Packit |
bc9a3a |
if response is None:
|
|
Packit |
bc9a3a |
raise StopIteration # User cancelled
|
|
Packit |
bc9a3a |
if response:
|
|
Packit |
bc9a3a |
prompt = ('Please select the cloud vendor or environment in which'
|
|
Packit |
bc9a3a |
' this instance is running')
|
|
Packit |
bc9a3a |
response = ui.choice(prompt, KNOWN_CLOUD_NAMES)
|
|
Packit |
bc9a3a |
if response:
|
|
Packit |
bc9a3a |
report['CloudName'] = KNOWN_CLOUD_NAMES[response[0]]
|
|
Packit |
bc9a3a |
else:
|
|
Packit |
bc9a3a |
report['CloudName'] = 'None'
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
def attach_user_data(report, ui=None):
|
|
Packit |
bc9a3a |
'''Optionally provide user-data if desired.'''
|
|
Packit |
bc9a3a |
if ui:
|
|
Packit |
bc9a3a |
prompt = (
|
|
Packit |
bc9a3a |
'Your user-data or cloud-config file can optionally be provided'
|
|
Packit |
bc9a3a |
' from {0} and could be useful to developers when addressing this'
|
|
Packit |
bc9a3a |
' bug. Do you wish to attach user-data to this bug?'.format(
|
|
Packit |
bc9a3a |
USER_DATA_FILE))
|
|
Packit |
bc9a3a |
response = ui.yesno(prompt)
|
|
Packit |
bc9a3a |
if response is None:
|
|
Packit |
bc9a3a |
raise StopIteration # User cancelled
|
|
Packit |
bc9a3a |
if response:
|
|
Packit |
bc9a3a |
attach_file(report, USER_DATA_FILE, 'user_data.txt')
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
def add_bug_tags(report):
|
|
Packit |
bc9a3a |
'''Add any appropriate tags to the bug.'''
|
|
Packit |
bc9a3a |
if 'JournalErrors' in report.keys():
|
|
Packit |
bc9a3a |
errors = report['JournalErrors']
|
|
Packit |
bc9a3a |
if 'Breaking ordering cycle' in errors:
|
|
Packit |
bc9a3a |
report['Tags'] = 'systemd-ordering'
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
def add_info(report, ui):
|
|
Packit |
bc9a3a |
'''This is an entry point to run cloud-init's apport functionality.
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
Distros which want apport support will have a cloud-init package-hook at
|
|
Packit |
bc9a3a |
/usr/share/apport/package-hooks/cloud-init.py which defines an add_info
|
|
Packit |
bc9a3a |
function and returns the result of cloudinit.apport.add_info(report, ui).
|
|
Packit |
bc9a3a |
'''
|
|
Packit |
bc9a3a |
if not has_apport:
|
|
Packit |
bc9a3a |
raise RuntimeError(
|
|
Packit |
bc9a3a |
'No apport imports discovered. Apport functionality disabled')
|
|
Packit |
bc9a3a |
attach_cloud_init_logs(report, ui)
|
|
Packit |
bc9a3a |
attach_hwinfo(report, ui)
|
|
Packit |
bc9a3a |
attach_cloud_info(report, ui)
|
|
Packit |
bc9a3a |
attach_user_data(report, ui)
|
|
Packit |
bc9a3a |
add_bug_tags(report)
|
|
Packit |
bc9a3a |
return True
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
# vi: ts=4 expandtab
|