# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
from _pyreport import *
from report.io import TextIO, GTKIO, NewtIO
#Compatibility with report package:
# Author(s): Gavin Romig-Koch
# ABRT Team
import os
SYSTEM_RELEASE_PATHS = ["/etc/system-release","/etc/redhat-release"]
SYSTEM_RELEASE_DEPS = ["system-release", "redhat-release"]
_hardcoded_default_product = ""
_hardcoded_default_version = ""
"""
def getProduct_fromRPM():
try:
import rpm
ts = rpm.TransactionSet()
for each_dep in SYSTEM_RELEASE_DEPS:
mi = ts.dbMatch('provides', each_dep)
for h in mi:
if h['name']:
return h['name'].split("-")[0].capitalize()
return ""
except:
return ""
def getProduct_fromFILE():
for each_path in SYSTEM_RELEASE_PATHS:
if os.path.exists(each_path):
file = open(each_path, "r")
content = file.read()
if content.startswith("Red Hat Enterprise Linux"):
return "Red Hat Enterprise Linux"
if content.startswith("Fedora"):
return "Fedora"
i = content.find(" release")
if i > -1:
return content[0:i]
return ""
def getVersion_fromRPM():
try:
import rpm
ts = rpm.TransactionSet()
for each_dep in SYSTEM_RELEASE_DEPS:
mi = ts.dbMatch('provides', each_dep)
for h in mi:
if h['version']:
return str(h['version'])
return ""
except:
return ""
def getVersion_fromFILE():
for each_path in SYSTEM_RELEASE_PATHS:
if os.path.exists(each_path):
file = open(each_path, "r")
content = file.read()
if content.find("Rawhide") > -1:
return "rawhide"
clist = content.split(" ")
i = clist.index("release")
return clist[i+1]
else:
return ""
"""
def getProduct_fromPRODUCT():
try:
from pyanaconda import product
return product.productName
except:
try:
import product
return product.productName
except:
return ""
def getVersion_fromPRODUCT():
try:
from pyanaconda import product
return product.productVersion
except:
try:
import product
return product.productVersion
except:
return ""
def getProduct():
"""Attempt to determine the product of the running system by asking anaconda
"""
product = getProduct_fromPRODUCT()
if product:
return product
return _hardcoded_default_product
def getVersion():
"""Attempt to determine the version of the running system by asking anaconda
Always return as a string.
"""
version = getVersion_fromPRODUCT()
if version:
return version
return _hardcoded_default_version
def createAlertSignature(component, hashmarkername, hashvalue, summary, alertSignature):
pd = problem_data()
pd.add("component", component)
pd.add("hashmarkername", hashmarkername)
pd.add("duphash", hashvalue)
pd.add("reason", summary)
pd.add("description", alertSignature)
pd.add_basics()
return pd
# used in anaconda / python-meh
def createPythonUnhandledExceptionSignature(**kwargs):
mandatory_args = ["component", "hashmarkername", "duphash", "reason",
"description", "exnFileName"]
for arg in mandatory_args:
if arg not in kwargs:
raise AttributeError("missing argument {0}".format(arg))
pd = problem_data()
for (key, value) in kwargs.iteritems():
pd.add(key, value)
product = getProduct()
if product:
pd.add("product", product)
version = getVersion()
if version:
pd.add("version", version)
#libreport expect the os_release as in /etc/redhat-release
if (version and product):
# need to add "release", parse_release() expects format " release "
pd.add("os_release", product +" release "+ version)
pd.add_basics() # adds product and version + some other required field
# FIXME: how to handle files out of dump dir??
# temporary glue: 2011-02-08 (let's see how temporary..)
exnFileName = kwargs["exnFileName"]
try:
inf = open(exnFileName, "r")
pd.add(os.path.basename(exnFileName), inf.read())
inf.close()
except Exception, ex:
print "Can't add %s to report: %s" % (exnFileName, ex)
return pd
"""
def report(cd, io_unused):
state = run_event_state()
#state.logging_callback = logfunc
r = state.run_event_on_problem_data(cd, "report")
return r
"""
def report(pd, io):
flags = None
if isinstance(io, TextIO.TextIO):
flags = LIBREPORT_RUN_CLI
elif isinstance(io, NewtIO.NewtIO):
flags = LIBREPORT_WAIT # wait for report to finish, so we can restore the screen
flags |= LIBREPORT_RUN_NEWT # run newt first
io.screen.suspend() # save the state of anaconda windows before we fork
result = report_problem_in_memory(pd, flags)
io.screen.resume() # restore the previously saved state
return result
result = report_problem(pd)