#!/usr/bin/python3 -Es # -*- mode: Python; -*- # # Authors: John Dennis # Dan Walsh # # Copyright (C) 2006,2007,2008,2009 Red Hat, Inc. # # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # import sys import os import getopt import syslog import gettext import dbus import selinux from setroubleshoot.config import parse_config_setting, get_config from setroubleshoot.util import log_debug gettext.install(domain=get_config('general', 'i18n_text_domain'), localedir=get_config('general', 'i18n_locale_dir')) pkg_name = get_config('general', 'pkg_name') syslog.openlog(pkg_name) def usage(): print(''' -f --nofork no fork -d --debug debug -c --config section.option=value set a configuration value -h --help display help info ''') fork = True timeout = 10 try: opts, args = getopt.getopt(sys.argv[1:], "dfc:h", ["debug", "nofork", "config=", "help"]) except getopt.GetoptError: # print help information and exit: usage() sys.exit(2) for o, a in opts: if o in ("-h", "--help"): usage() sys.exit() if o in ("-f", "--nofork"): fork = False if o in ("-d", "--debug"): timeout = 0 if o in ("-c", "--config"): config_setting = a if not parse_config_setting(config_setting): syslog.syslog(syslog.LOG_ERR, "could not parse config setting '%s'", config_setting) if not selinux.is_selinux_enabled(): syslog.syslog(syslog.LOG_ERR, _("SELinux not enabled, setroubleshootd exiting...")) sys.exit(3) try: if fork: # do the UNIX double-fork magic, see Stevens' "Advanced # Programming in the UNIX Environment" for details (ISBN 0201563177) pid = os.fork() if pid > 0: # exit first parent sys.exit(0) # decouple from parent environment os.chdir("/") os.setsid() os.umask(os.umask(0o077) | 0o022) # write the pid file pid_file = get_config('general', 'pid_file') with open(pid_file, encoding='utf-8', mode='w') as f: f.write(str(os.getpid())) from setroubleshoot.server import RunFaultServer log_debug("RunFaultServer(%d)" % timeout) RunFaultServer(timeout) except OSError as e: print(_("fork #1 failed: %d (%s)") % (e.errno, e.strerror), file=sys.stderr) sys.exit(1) except dbus.DBusException as e: syslog.syslog(syslog.LOG_ERR, str(e)) print(e, file=sys.stderr) sys.exit(1)