add support for systemd logging

New CLI option: --systemd
will enabled journalctl logging when ifupdown2 is run in a systemd context

Signed-off-by: Julien Fortin <jfortin@nvidia.com>
This commit is contained in:
Julien Fortin 2023-05-03 16:19:57 +02:00
parent 7c8627f876
commit a51aad8d60
5 changed files with 36 additions and 11 deletions

2
debian/control vendored
View File

@ -17,7 +17,7 @@ Architecture: all
Provides: ifupdown
Conflicts: ifupdown
Replaces: ifupdown
Depends: ${python3:Depends}, ${misc:Depends}, iproute2, python3-six, python3-setuptools
Depends: ${python3:Depends}, ${misc:Depends}, iproute2, python3-six, python3-setuptools, python3-systemd
Suggests: isc-dhcp-client, bridge-utils, ethtool, python3-gvgen, python3-mako
Description: Network Interface Management tool similar to ifupdown
ifupdown2 is ifupdown re-written in Python. It replaces ifupdown and provides

View File

@ -108,6 +108,10 @@ def stand_alone():
except NetlinkListenerWithCacheErrorNotInitialized:
status = Status.Client.STATUS_NLERROR
LogManager.get_instance().write("exit status %s" % status)
if status != 0:
LogManager.get_instance().report_error_to_systemd()
return status

View File

@ -151,6 +151,7 @@ class Parse:
""" common arg parser for ifup and ifdown """
argparser.add_argument('-f', '--force', dest='force', action='store_true', help='force run all operations')
argparser.add_argument('-l', '--syslog', dest='syslog', action='store_true')
argparser.add_argument('--systemd', dest='systemd', action='store_true', help="enable journalctl logging")
group = argparser.add_mutually_exclusive_group(required=False)
group.add_argument('-n', '--no-act', dest='noact', action='store_true',
help="print out what would happen, but don't do it")
@ -231,6 +232,7 @@ class Parse:
'Useful when your state file is corrupted or you want down to use the latest '
'from the interfaces file')
argparser.add_argument('-l', '--syslog', dest='syslog', action='store_true')
argparser.add_argument('--systemd', dest='systemd', action='store_true', help="enable journalctl logging")
argparser.add_argument('-f', '--force', dest='force', action='store_true', help='force run all operations')
argparser.add_argument('-s', '--syntax-check', dest='syntaxcheck', action='store_true',
help='Only run the interfaces file parser')

View File

@ -29,6 +29,8 @@ import logging
import logging.handlers
from datetime import date, datetime
from systemd.journal import JournalHandler
try:
from ifupdown2.ifupdown.utils import utils
@ -83,10 +85,13 @@ class LogManager:
self.__root_logger = logging.getLogger()
self.__root_logger.name = self.LOGGER_NAME
self.new_dir_path = None
self.__debug_handler = None
self.__socket_handler = None
self.__syslog_handler = None
self.__console_handler = None
self.__journald_handler = None
self.daemon = None
@ -172,16 +177,16 @@ class LogManager:
# create new log directory to store eni and debug logs
# format: network_config_ifupdown2_1_Aug-17-2021_23:42:00.000000
new_dir_path = "%s/%s%s_%s" % (
self.new_dir_path = "%s/%s%s_%s" % (
self.LOGGING_DIRECTORY,
self.LOGGING_DIRECTORY_PREFIX,
last_id + 1,
"%s_%s" % (date.today().strftime("%b-%d-%Y"), str(datetime.now()).split(" ", 1)[1])
)
self.__create_dir(new_dir_path)
self.__create_dir(self.new_dir_path)
# start logging in the new directory
self.__debug_handler = logging.FileHandler("%s/ifupdown2.debug.log" % new_dir_path, mode="w+")
self.__debug_handler = logging.FileHandler("%s/ifupdown2.debug.log" % self.new_dir_path, mode="w+")
self.__debug_handler.setFormatter(logging.Formatter(self.__debug_fmt))
self.__debug_handler.setLevel(logging.DEBUG)
@ -191,9 +196,9 @@ class LogManager:
self.__root_logger.debug("persistent debugging is initialized")
# cp ENI and ENI.d in the log directory
shutil.copy2("/etc/network/interfaces", new_dir_path)
shutil.copy2("/etc/network/interfaces", self.new_dir_path)
try:
shutil.copytree("/etc/network/interfaces.d/", "%s/interfaces.d" % new_dir_path)
shutil.copytree("/etc/network/interfaces.d/", "%s/interfaces.d" % self.new_dir_path)
except Exception:
pass
@ -250,6 +255,12 @@ class LogManager:
""" Remove console handler from root logger """
self.__root_logger.removeHandler(self.__console_handler)
def enable_systemd(self):
""" Add journalctl handler to root logger """
self.__journald_handler = JournalHandler()
self.__journald_handler.setFormatter(logging.Formatter(self.__fmt))
self.__root_logger.addHandler(self.__journald_handler)
def enable_syslog(self):
""" Add syslog handler to root logger """
if self.__syslog_handler and self.__syslog_handler not in self.__root_logger.handlers:
@ -322,6 +333,9 @@ class LogManager:
def start_standalone_logging(self, args):
self.__root_logger.name = self.LOGGER_NAME
if hasattr(args, "systemd") and args.systemd:
self.enable_systemd()
if hasattr(args, "syslog") and args.syslog:
self.enable_syslog()
self.disable_console()
@ -360,3 +374,8 @@ class LogManager:
def root_logger(self):
return self.__root_logger
def report_error_to_systemd(self):
if self.__journald_handler:
self.__journald_handler.setFormatter(logging.Formatter("%(message)s"))
self.__root_logger.error(">>> Full logs available in: %s <<<" % self.new_dir_path)

View File

@ -92,7 +92,7 @@ ifup_hotplug () {
done)
if [ -n "$ifaces" ]
then
ifup $ifaces "$@" || true
ifup $ifaces "$@" --systemd || true
fi
fi
}
@ -101,7 +101,7 @@ ifup_mgmt () {
ifaces=$(ifquery --list --allow=mgmt 2>/dev/null)
if [ -n "$ifaces" ]; then
echo "bringing up mgmt class interfaces"
ifup --allow=mgmt
ifup --allow=mgmt --systemd
fi
}
@ -127,7 +127,7 @@ start)
perfoptions=$(perf_options)
echo ${NAME}':' "Configuring network interfaces"
ifup_mgmt
ifup -a $EXTRA_ARGS $exclusions $perfoptions
ifup -a $EXTRA_ARGS $exclusions $perfoptions --systemd
ifup_hotplug $HOTPLUG_ARGS $EXTRA_ARGS $exclusions
;;
stop)
@ -148,7 +148,7 @@ stop)
exclusions=$(process_exclusions)
echo ${NAME}':' "Deconfiguring network interfaces"
ifdown -a $EXTRA_ARGS $exclusions
ifdown -a $EXTRA_ARGS $exclusions --systemd
;;
reload)
@ -157,7 +157,7 @@ reload)
exclusions=$(process_exclusions)
echo ${NAME}':' "Reloading network interfaces configuration"
ifreload -a $EXTRA_ARGS $exclusions
ifreload -a $EXTRA_ARGS $exclusions --systemd
;;
*)