100 lines
3.4 KiB
Python
100 lines
3.4 KiB
Python
#
|
|
# Copyright (C) 2011 Red Hat, Inc.
|
|
# Copyright (C) 2011 Cole Robinson <crobinso@redhat.com>
|
|
#
|
|
# 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.
|
|
#
|
|
|
|
import gettext
|
|
import locale
|
|
import logging
|
|
import logging.handlers
|
|
import os
|
|
import sys
|
|
import traceback
|
|
|
|
import libvirt
|
|
|
|
from virtcli import cliconfig
|
|
|
|
|
|
|
|
def setup_logging(appname, debug_stdout):
|
|
# Configure python logging to capture all logs we generate
|
|
# to $HOME/.virt-manager/${app}.log This file has
|
|
# proved invaluable for debugging
|
|
MAX_LOGSIZE = 1024 * 1024 # 1MB
|
|
ROTATE_NUM = 5
|
|
DIR_NAME = ".virt-manager"
|
|
FILE_NAME = "%s.log" % appname
|
|
FILE_MODE = 'ae'
|
|
FILE_FORMAT = ("[%(asctime)s virt-manager %(process)d] "
|
|
"%(levelname)s (%(module)s:%(lineno)d) %(message)s")
|
|
DATEFMT = "%a, %d %b %Y %H:%M:%S"
|
|
|
|
# set up logging
|
|
vm_dir = os.path.expanduser("~/%s" % DIR_NAME)
|
|
if not os.access(vm_dir, os.W_OK):
|
|
if os.path.exists(vm_dir):
|
|
raise RuntimeError("No write access to %s" % vm_dir)
|
|
|
|
try:
|
|
os.mkdir(vm_dir, 0751)
|
|
except IOError, e:
|
|
raise RuntimeError("Could not create directory %s: %s" %
|
|
(vm_dir, e))
|
|
|
|
filename = "%s/%s" % (vm_dir, FILE_NAME)
|
|
rootLogger = logging.getLogger()
|
|
rootLogger.setLevel(logging.DEBUG)
|
|
fileHandler = logging.handlers.RotatingFileHandler(filename,
|
|
FILE_MODE, MAX_LOGSIZE, ROTATE_NUM)
|
|
fileHandler.setFormatter(logging.Formatter(FILE_FORMAT, DATEFMT))
|
|
rootLogger.addHandler(fileHandler)
|
|
|
|
if debug_stdout:
|
|
streamHandler = logging.StreamHandler(sys.stderr)
|
|
streamHandler.setLevel(logging.DEBUG)
|
|
streamHandler.setFormatter(logging.Formatter(
|
|
"%(asctime)s (%(module)s:%(lineno)d): %(message)s"))
|
|
rootLogger.addHandler(streamHandler)
|
|
|
|
logging.info("%s startup", appname)
|
|
|
|
# Register libvirt handler
|
|
def libvirt_callback(ctx_ignore, err):
|
|
if err[3] != libvirt.VIR_ERR_ERROR:
|
|
# Don't log libvirt errors: global error handler will do that
|
|
logging.warn("Non-error from libvirt: '%s'", err[2])
|
|
libvirt.registerErrorHandler(f=libvirt_callback, ctx=None)
|
|
|
|
# Log uncaught exceptions
|
|
def exception_log(typ, val, tb):
|
|
s = traceback.format_exception(typ, val, tb)
|
|
logging.debug("Uncaught exception:\n" + "".join(s))
|
|
sys.__excepthook__(typ, val, tb)
|
|
sys.excepthook = exception_log
|
|
|
|
def setup_i18n():
|
|
try:
|
|
locale.setlocale(locale.LC_ALL, '')
|
|
except:
|
|
# Can happen if user passed a bogus LANG
|
|
pass
|
|
|
|
gettext.install("virt-manager", cliconfig.gettext_dir)
|
|
gettext.bindtextdomain("virt-manager", cliconfig.gettext_dir)
|