diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:49:52 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:49:52 +0000 |
commit | 55944e5e40b1be2afc4855d8d2baf4b73d1876b5 (patch) | |
tree | 33f869f55a1b149e9b7c2b7e201867ca5dd52992 /tools | |
parent | Initial commit. (diff) | |
download | systemd-55944e5e40b1be2afc4855d8d2baf4b73d1876b5.tar.xz systemd-55944e5e40b1be2afc4855d8d2baf4b73d1876b5.zip |
Adding upstream version 255.4.upstream/255.4
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
38 files changed, 6328 insertions, 0 deletions
diff --git a/tools/add-git-hook.sh b/tools/add-git-hook.sh new file mode 100755 index 0000000..8cff62e --- /dev/null +++ b/tools/add-git-hook.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1-or-later +set -eu + +cd "${MESON_SOURCE_ROOT:?}" + +if [ ! -f .git/hooks/pre-commit.sample ] || [ -f .git/hooks/pre-commit ]; then + exit 2 # not needed +fi + +cp -p .git/hooks/pre-commit.sample .git/hooks/pre-commit +chmod +x .git/hooks/pre-commit +echo 'Activated pre-commit hook' diff --git a/tools/analyze-dump-sort.py b/tools/analyze-dump-sort.py new file mode 100755 index 0000000..cc9a9fc --- /dev/null +++ b/tools/analyze-dump-sort.py @@ -0,0 +1,80 @@ +#!/usr/bin/python +# SPDX-License-Identifier: LGPL-2.1-or-later +# pylint: disable=consider-using-with + +""" +A helper to compare 'systemd-analyze dump' outputs. + +systemd-analyze dump >/var/tmp/dump1 +(reboot) +tools/analyze-dump-sort.py /var/tmp/dump1 → this does a diff from dump1 to current + +systemd-analyze dump >/var/tmp/dump2 +tools/analyze-dump-sort.py /var/tmp/{dump1,dump2} → this does a diff from dump1 to dump2 +""" + +import argparse +import subprocess +import tempfile + + +def sort_dump(sourcefile, destfile=None): + if destfile is None: + destfile = tempfile.NamedTemporaryFile('wt') + + units = {} + unit = [] + + same = [] + + for line in sourcefile: + line = line.rstrip() + + header = line.split(':')[0] + if 'Timestamp' in header or 'Invocation ID' in header or 'PID' in header: + line = header + ': …' + + if line.startswith('->'): + if unit: + units[unit[0]] = unit + unit = [line] + elif line.startswith('\t'): + assert unit + + if same and same[0].startswith(header): + same.append(line) + else: + unit.extend(sorted(same, key=str.lower)) + same = [line] + else: + print(line, file=destfile) + + if unit: + units[unit[0]] = unit + + for unit in sorted(units.values()): + print('\n'.join(unit), file=destfile) + + destfile.flush() + return destfile + +def parse_args(): + p = argparse.ArgumentParser(description=__doc__) + p.add_argument('one') + p.add_argument('two', nargs='?') + p.add_argument('--user', action='store_true') + return p.parse_args() + +if __name__ == '__main__': + opts = parse_args() + + one = sort_dump(open(opts.one)) + if opts.two: + two = sort_dump(open(opts.two)) + else: + user = ['--user'] if opts.user else [] + two = subprocess.run(['systemd-analyze', 'dump', *user], + capture_output=True, text=True, check=True) + two = sort_dump(two.stdout.splitlines()) + with subprocess.Popen(['diff', '-U10', one.name, two.name], stdout=subprocess.PIPE) as diff: + subprocess.Popen(['less'], stdin=diff.stdout) diff --git a/tools/catalog-report.py b/tools/catalog-report.py new file mode 100755 index 0000000..060b1aa --- /dev/null +++ b/tools/catalog-report.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: MIT +# +# This file is distributed under the MIT license, see below. +# +# The MIT License (MIT) +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +""" +Prints out journal entries with no or bad catalog explanations. +""" + +import re + +from systemd import id128, journal + + +# pylint: disable=consider-using-f-string +def log_entry(entry): + if 'CODE_FILE' in entry: + # some of our code was using 'CODE_FUNCTION' instead of 'CODE_FUNC' + print('{}:{} {}'.format(entry.get('CODE_FILE', '???'), + entry.get('CODE_LINE', '???'), + entry.get('CODE_FUNC', None) or entry.get('CODE_FUNCTION', '???'))) + print(' {}'.format(entry.get('MESSAGE', 'no message!'))) + for k, v in entry.items(): + if k.startswith('CODE_') or k in {'MESSAGE_ID', 'MESSAGE'}: + continue + print(f' {k}={v}') + print() + +if __name__ == '__main__': + j = journal.Reader() + logged = set() + pattern = re.compile('@[A-Z0-9_]+@') + + mids = { v:k for k,v in id128.__dict__.items() if k.startswith('SD_MESSAGE') } + + for i, x in enumerate(j): + if i % 1000 == 0: + print(i, end='\r') + + try: + mid = x['MESSAGE_ID'] + except KeyError: + continue + name = mids.get(mid, 'unknown') + + try: + desc = journal.get_catalog(mid) + except FileNotFoundError: + if mid in logged: + continue + + print(f'{name} {mid.hex}: no catalog entry') + log_entry(x) + logged.add(mid) + continue + + fields = [field[1:-1] for field in pattern.findall(desc)] + for field in fields: + index = (mid, field) + if field in x or index in logged: + continue + print(f'{name} {mid.hex}: no field {field}') + log_entry(x) + logged.add(index) diff --git a/tools/check-api-docs.sh b/tools/check-api-docs.sh new file mode 100755 index 0000000..2e973a0 --- /dev/null +++ b/tools/check-api-docs.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later +set -eu +set -o pipefail + +sd_good=0 +sd_total=0 +udev_good=0 +udev_total=0 + +deprecated=( + -e sd_bus_try_close + -e sd_bus_process_priority + -e sd_bus_message_get_priority + -e sd_bus_message_set_priority + -e sd_seat_can_multi_session + -e sd_journal_open_container +) + +for symbol in $(nm -g --defined-only "$@" | grep " T " | cut -d" " -f3 | grep -wv "${deprecated[@]}" | sort -u); do + if test -f "${MESON_BUILD_ROOT:?}/man/$symbol.3"; then + echo "✓ Symbol $symbol() is documented." + good=1 + else + echo -e " \x1b[1;31mSymbol $symbol() lacks documentation.\x1b[0m" + good=0 + fi + + case "$symbol" in + sd_*) + ((sd_good+=good)) + ((sd_total+=1)) + ;; + udev_*) + ((udev_good+=good)) + ((udev_total+=1)) + ;; + *) + echo 'unknown symbol prefix' + exit 1 + esac +done + +echo "libsystemd: $sd_good/$sd_total libudev: $udev_good/$udev_total" diff --git a/tools/check-help.sh b/tools/check-help.sh new file mode 100755 index 0000000..f974293 --- /dev/null +++ b/tools/check-help.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later +set -eu +set -o pipefail + +# Note: 'grep ... >/dev/null' instead of just 'grep -q' is used intentionally +# here, since 'grep -q' exits on the first match causing SIGPIPE being +# sent to the sender. + +BINARY="${1:?}" +export SYSTEMD_LOG_LEVEL=info + +if [[ ! -x "$BINARY" ]]; then + echo "$BINARY is not an executable" + exit 1 +fi + +# output width +if "$BINARY" --help | grep -v 'default:' | grep -E '.{80}.' >/dev/null; then + echo "$(basename "$BINARY") --help output is too wide:" + "$BINARY" --help | awk 'length > 80' | grep -E --color=yes '.{80}' + exit 1 +fi + +# --help prints something. Also catches case where args are ignored. +if ! "$BINARY" --help | grep . >/dev/null; then + echo "$(basename "$BINARY") --help output is empty" + exit 2 +fi + +# no --help output to stderr +if "$BINARY" --help 2>&1 1>/dev/null | grep .; then + echo "$(basename "$BINARY") --help prints to stderr" + exit 3 +fi + +# error output to stderr +if ! ("$BINARY" --no-such-parameter 2>&1 1>/dev/null || :) | grep . >/dev/null; then + echo "$(basename "$BINARY") with an unknown parameter does not print to stderr" + exit 4 +fi + +# --help and -h are equivalent +if ! diff <("$BINARY" -h) <("$BINARY" --help); then + echo "$(basename "$BINARY") --help and -h are not identical" + exit 5 +fi diff --git a/tools/check-includes.py b/tools/check-includes.py new file mode 100755 index 0000000..5d5b39f --- /dev/null +++ b/tools/check-includes.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-or-later + +# pylint: disable=consider-using-with + +import os +import pathlib +import re +import sys + +PROJECT_ROOT = pathlib.Path(os.getenv('PROJECT_SOURCE_ROOT', '.')) + +def check_file(filename): + seen = set() + good = True + for n, line in enumerate(open(filename)): + m = re.match(r'^\s*#\s*include\s*[<"](\S*)[>"]', line) + if m: + include = m.group(1) + if include in seen: + try: + filename = pathlib.Path(filename).resolve().relative_to(PROJECT_ROOT) + except ValueError: + pass + print(f'{filename}:{n}: {line.strip()}') + good = False + seen.add(include) + return good + +if __name__ == '__main__': + all_good = all(check_file(name) for name in sys.argv[1:]) + sys.exit(0 if all_good else 1) diff --git a/tools/check-version-history.py b/tools/check-version-history.py new file mode 100644 index 0000000..c4d4b3e --- /dev/null +++ b/tools/check-version-history.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-or-later + +import os +import sys +import lxml.etree as tree + +_parser = tree.XMLParser(resolve_entities=False) +tree.set_default_parser(_parser) + + +def find_undocumented_functions(pages, ignorelist): + undocumented = [] + for page in pages: + filename = os.path.basename(page) + pagetree = tree.parse(page) + + assert pagetree.getroot().tag == "refentry" + + hist_section = pagetree.find("refsect1[title='History']") + for func in pagetree.findall("//funcprototype/funcdef/function"): + path = f"/refsynopsisdiv/funcsynopsis/funcprototype/funcdef/function[.='{func.text}']" + assert pagetree.findall(path) == [func] + + if ( + hist_section is None + or hist_section.find(f"para/function[.='{func.text}()']") is None + ): + if func.text not in ignorelist: + undocumented.append((filename, func.text)) + return undocumented + + +def construct_path(element): + tag = element.tag + + if tag == "refentry": + return "" + + predicate = "" + if tag == "varlistentry": + text = "".join(element.find("term").itertext()) + predicate = f'[term="{text}"]' + elif tag.startswith("refsect"): + text = "".join(element.find("title").itertext()) + predicate = f'[title="{text}"]' + elif tag == "variablelist": + varlists = element.getparent().findall(tag) + if len(varlists) > 1: + predicate = f"[{varlists.index(element)+1}]" + + return construct_path(element.getparent()) + "/" + tag + predicate + + +def find_undocumented_commands(pages, ignorelist): + undocumented = [] + for page in pages: + filename = os.path.basename(page) + + pagetree = tree.parse(page) + if pagetree.getroot().tag != "refentry": + continue + + for varlistentry in pagetree.findall("*//variablelist/varlistentry"): + path = construct_path(varlistentry) + + assert pagetree.findall(path) == [varlistentry] + + listitem = varlistentry.find("listitem") + parent = listitem if listitem is not None else varlistentry + + rev = parent.getchildren()[-1] + if rev.get("href") != "version-info.xml": + if (filename, path) not in ignorelist: + undocumented.append((filename, path)) + return undocumented + + +def process_pages(pages): + command_pages = [] + function_pages = [] + + for page in pages: + filename = os.path.basename(page) + if filename.startswith("org.freedesktop."): # dbus + continue + + if ( + filename.startswith("sd_") + or filename.startswith("sd-") + or filename.startswith("udev_") + ): + function_pages.append(page) + continue + + command_pages.append(page) + + undocumented_commands = find_undocumented_commands( + command_pages, command_ignorelist + ) + undocumented_functions = find_undocumented_functions( + function_pages, function_ignorelist + ) + + return undocumented_commands, undocumented_functions + + +if __name__ == "__main__": + with open(os.path.join(os.path.dirname(__file__), "command_ignorelist")) as f: + command_ignorelist = [] + for l in f.read().splitlines(): + if l.startswith("#"): + continue + fname, path = l.split(" ", 1) + path = path.replace("\\n", "\n") + command_ignorelist.append((fname, path)) + with open(os.path.join(os.path.dirname(__file__), "function_ignorelist")) as f: + function_ignorelist = f.read().splitlines() + + undocumented_commands, undocumented_functions = process_pages(sys.argv[1:]) + + if undocumented_commands or undocumented_functions: + for filename, func in undocumented_functions: + print( + f"Function {func}() in {filename} isn't documented in the History section." + ) + for filename, path in undocumented_commands: + print(filename, path, "is undocumented") + if undocumented_commands: + print( + "Hint: if you reorganized this part of the documentation, " + "please update tools/commands_ignorelist." + ) + + sys.exit(1) diff --git a/tools/check-version.sh b/tools/check-version.sh new file mode 100755 index 0000000..faefb46 --- /dev/null +++ b/tools/check-version.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later +set -eu +set -o pipefail + +# Note: 'grep ... >/dev/null' instead of just 'grep -q' is used intentionally +# here, since 'grep -q' exits on the first match causing SIGPIPE being +# sent to the sender. + +BINARY="${1:?}" +VERSION="${2:?}" +export SYSTEMD_LOG_LEVEL=info + +if [[ ! -x "$BINARY" ]]; then + echo "$BINARY is not an executable" + exit 1 +fi + +# --version prints something. Also catches case where args are ignored. +if ! "$BINARY" --version | grep . >/dev/null; then + echo "$(basename "$BINARY") --version output is empty" + exit 2 +fi + +# no --version output to stderr +if "$BINARY" --version 2>&1 1>/dev/null | grep .; then + echo "$(basename "$BINARY") --version prints to stderr" + exit 3 +fi + +# project version appears in version output +out="$("$BINARY" --version)" +if ! grep -F "$VERSION" >/dev/null <<<"$out"; then + echo "$(basename "$BINARY") --version output does not match '$VERSION': $out" + exit 4 +fi diff --git a/tools/chromiumos/gen_autosuspend_rules.py b/tools/chromiumos/gen_autosuspend_rules.py new file mode 100644 index 0000000..76b166a --- /dev/null +++ b/tools/chromiumos/gen_autosuspend_rules.py @@ -0,0 +1,402 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: BSD-3-Clause +# -*- coding: utf-8 -*- + +# Copyright 2017 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSES/BSD-3-Clause.txt file. + +"""Autosuspend udev rule generator + +This script is executed at build time to generate udev rules. The +resulting rules file is installed on the device, the script itself +is not. +""" + +# List of USB devices (vendorid:productid) for which it is safe to enable +# autosuspend. +USB_IDS = [] + +# Host Controllers and internal hubs +USB_IDS += [ + # Linux Host Controller (UHCI) (most older x86 boards) + "1d6b:0001", + # Linux Host Controller (EHCI) (all boards) + "1d6b:0002", + # Linux Host Controller (XHCI) (most newer boards) + "1d6b:0003", + # SMSC (Internal HSIC Hub) (most Exynos boards) + "0424:3503", + # Intel (Rate Matching Hub) (all x86 boards) + "05e3:0610", + # Intel (Internal Hub?) (peppy, falco) + "8087:0024", + # Genesys Logic (Internal Hub) (rambi) + "8087:8000", + # Microchip (Composite HID + CDC) (kefka) + "04d8:0b28", +] + +# Webcams +USB_IDS += [ + # Chicony (zgb) + "04f2:b1d8", + # Chicony (mario) + "04f2:b262", + # Chicony (stout) + "04f2:b2fe", + # Chicony (butterfly) + "04f2:b35f", + # Chicony (rambi) + "04f2:b443", + # Chicony (glados) + "04f2:b552", + # LiteOn (spring) + "058f:b001", + # Foxlink? (butterfly) + "05c8:0351", + # Foxlink? (butterfly) + "05c8:0355", + # Cheng Uei? (falco) + "05c8:036e", + # SuYin (parrot) + "064e:d251", + # Realtek (falco) + "0bda:571c", + # IMC Networks (squawks) + "13d3:5657", + # Sunplus (parrot) + "1bcf:2c17", + # (C-13HDO10B39N) (alex) + "2232:1013", + # (C-10HDP11538N) (lumpy) + "2232:1017", + # (Namuga) (link) + "2232:1033", + # (C-03FFM12339N) (daisy) + "2232:1037", + # (C-10HDO13531N) (peach) + "2232:1056", + # (NCM-G102) (samus) + "2232:6001", + # Acer (stout) + "5986:0299", +] + +# Bluetooth Host Controller +USB_IDS += [ + # Hon-hai (parrot) + "0489:e04e", + # Hon-hai (peppy) + "0489:e056", + # Hon-hai (Kahlee) + "0489:e09f", + # QCA6174A (delan) + "0489:e0a2", + # LiteOn (parrot) + "04ca:3006", + # LiteOn (aleena) + "04ca:3016", + # LiteOn (scarlet) + "04ca:301a", + # Realtek (blooglet) + "0bda:b00c", + # Atheros (stumpy, stout) + "0cf3:3004", + # Atheros (AR3011) (mario, alex, zgb) + "0cf3:3005", + # Atheros (stumyp) + "0cf3:3007", + # Atheros (butterfly) + "0cf3:311e", + # Atheros (scarlet) + "0cf3:e300", + # Marvell (rambi) + "1286:2046", + # Marvell (gru) + "1286:204e", + # Intel (rambi, samus) + "8087:07dc", + # Intel (strago, glados) + "8087:0a2a", + # Intel (octopus) + "8087:0aaa", + # Intel (hatch) + "8087:0026", + # Intel (atlas) + "8087:0025", +] + +# WWAN (LTE) +USB_IDS += [ + # Huawei (ME936) (kip) + "12d1:15bb", + # Fibocom (L850-GL) (coral, nautilus, sarien) + "2cb7:0007", + # Fibocom (NL668, NL652) + "2cb7:01a0", + # Fibocom (FM101-GL) (mbim) + "2cb7:01a2", + # Fibocom (FM101-GL) (adb) + "2cb7:01a4", +] + +# Mass Storage +USB_IDS += [ + # Genesys (SD card reader) (lumpy, link, peppy) + "05e3:0727", + # Realtek (SD card reader) (mario, alex) + "0bda:0138", + # Realtek (SD card reader) (helios) + "0bda:0136", + # Realtek (SD card reader) (falco) + "0bda:0177", + # Realtek (SD card reader) (pirrha) + "0bda:0129", +] + +# Security Key +USB_IDS += [ + # Yubico.com + "1050:0211", + # Yubico.com (HID firmware) + "1050:0200", + # Google Titan key + "18d1:5026", +] + +# USB Audio devices +USB_IDS += [ + # Google USB-C to 3.5mm Digital Headphone Jack Adapter 'Mir' + "18d1:5025", + # Google USB-C to 3.5mm Digital Headphone Jack Adapter 'Mir' (HID only) + "18d1:5029", + # Google USB-C to 3.5mm Digital Headphone Jack Adapter 2018 'Condor' + "18d1:5034", + # Google Pixel USB-C Earbuds 'Blackbird' + "18d1:5033", + # Libratone Q Adapt In-Ear USB-C Earphones, Made for Google + "03eb:2433", + # Moshi USB-C to 3.5 mm Adapter/Charger, Made for Google + "282b:48f0", + # Moshi USB-C to 3.5 mm Adapter/Charger, Made for Google (HID only) + "282b:0026", + # AiAiAi TMA-2 C60 Cable, Made for Google + "0572:1a08", + # Apple USB-C to 3.5mm Headphone Jack Adapter + "05ac:110a", +] + +# RGB Keyboard +USB_IDS += [ + # Google Prism + "18d1:5022", +] + +# List of PCI devices (vendorid:deviceid) for which it is safe to enable +# autosuspend. +PCI_IDS = [] + +# Intel +PCI_IDS += [ + # Host bridge + "8086:590c", + # i915 + "8086:591e", + # proc_thermal + "8086:1903", + # SPT PCH xHCI controller + "8086:9d2f", + # CNP PCH xHCI controller + "8086:9ded", + # intel_pmc_core + "8086:9d21", + # i801_smbus + "8086:9d23", + # iwlwifi + "8086:095a", + # GMM + "8086:1911", + # Thermal + "8086:9d31", + # MME + "8086:9d3a", + # CrOS EC + "8086:9d4b", + # PCH SPI + "8086:9d24", + # SATA + "8086:02d3", + # RAM memory + "8086:02ef", + # ISA bridge + "8086:0284", + # Communication controller + "8086:02e0", + # Network controller + "8086:02f0", + # Serial bus controller + "8086:02a4", + # USB controller + "8086:02ed", + # JSL xHCI controller + "8086:4ded", + # Volteer xHCI controller + "8086:a0ed", + # Brya xHCI controller + "8086:51ed", + # ADL-N PCH xHCI controller + "8086:54ed", + # Graphics + "8086:9b41", + # DSP + "8086:02f9", + # Host bridge + "8086:9b61", + # Host bridge + "8086:9b71", + # PCI Bridge + "8086:02b0", + # i915 (atlas) + "8086:591c", + # iwlwifi (atlas) + "8086:2526", + # i915 (kefka) + "8086:22b1", + # proc_thermal (kefka) + "8086:22dc", + # xchi_hdc (kefka) + "8086:22b5", + # snd_hda (kefka) + "8086:2284", + # pcieport (kefka) + "8086:22c8", + "8086:22cc", + # lpc_ich (kefka) + "8086:229c", + # iosf_mbi_pci (kefka) + "8086:2280", + # Host bridge (nami) + "8086:5904", + "8086:5914", + # Graphics (nami) + "8086:5906", + "8086:5917", + # ISA bridge (nami) + "8086:9d4e", + # wifi 7265 (nami) + "8086:095b", + # Graphics (brya) + "8086:46a8", + # Core 12G GNA (brya) + "8086:464f", + # PCH Shared SRAM (brya) + "8086:51ef", + # PCH eSPI (brya) + "8086:5182", + "8086:4601", + # Core 12G DTT (brya) + "8086:461d", + # Wifi (Brya) + "8086:51f0", + # PCH SPI (brya) + "8086:51a4", +] + +# Samsung +PCI_IDS += [ + # NVMe KUS030205M-B001 + "144d:a806", + # NVMe MZVLB256HAHQ + "144d:a808", + # NVMe MZ9LQ256HBJD-00BH1 (brya) + "144d:a809", +] + +# Lite-on +PCI_IDS += [ + # 3C07110288 + "14a4:9100", +] + +# Seagate +PCI_IDS += [ + # ZP256CM30011 + "7089:5012", +] + +# Kingston +PCI_IDS += [ + # RBUSNS8154P3128GJ3 + "2646:5008", +] + +# Genesys Logic +PCI_IDS += [ + # SD Host Controller (brya) + "17a0:9755", +] + +# Phison +PCI_IDS += [ + # E13 NVMe Controller (redrix) + '1987:5013', + # E18 PCIe4 NVMe Controller (vell) + '1987:5018', +] + +# Do not edit below this line. ################################################# + +UDEV_RULE = """\ +ACTION!="add", GOTO="autosuspend_end" +SUBSYSTEM!="i2c|pci|usb", GOTO="autosuspend_end" + +SUBSYSTEM=="i2c", GOTO="autosuspend_i2c" +SUBSYSTEM=="pci", GOTO="autosuspend_pci" +SUBSYSTEM=="usb", GOTO="autosuspend_usb" + +# I2C rules +LABEL="autosuspend_i2c" +ATTR{name}=="cyapa", ATTR{power/control}="on", GOTO="autosuspend_end" +GOTO="autosuspend_end" + +# PCI rules +LABEL="autosuspend_pci" +%(pci_rules)s\ +GOTO="autosuspend_end" + +# USB rules +LABEL="autosuspend_usb" +%(usb_rules)s\ +GOTO="autosuspend_end" + +# Enable autosuspend +LABEL="autosuspend_enable" +TEST=="power/control", ATTR{power/control}="auto", GOTO="autosuspend_end" + +LABEL="autosuspend_end" +""" + + +def main(): + pci_rules = "" + for dev_ids in PCI_IDS: + vendor, device = dev_ids.split(":") + pci_rules += ( + 'ATTR{vendor}=="0x%s", ATTR{device}=="0x%s", ' + 'GOTO="autosuspend_enable"\n' % (vendor, device) + ) + + usb_rules = "" + for dev_ids in USB_IDS: + vid, pid = dev_ids.split(":") + usb_rules += ( + 'ATTR{idVendor}=="%s", ATTR{idProduct}=="%s", ' + 'GOTO="autosuspend_enable"\n' % (vid, pid) + ) + + print(UDEV_RULE % {"pci_rules": pci_rules, "usb_rules": usb_rules}) + + +if __name__ == "__main__": + main() diff --git a/tools/command_ignorelist b/tools/command_ignorelist new file mode 100644 index 0000000..186136d --- /dev/null +++ b/tools/command_ignorelist @@ -0,0 +1,527 @@ +# The format for this file is "filename xpath" separated by a space, where the xpath is in a format +# supported by the `find` method of ElemenTree. +# To reduce the need to change the xpaths when items are added or removed, we use predicates depending +# on the contents: `title` for sections (refsect1 and refsect2) and `term` for varlistentry. +# Wherever said contents contain a newline, it is replaced by "\n". +# If you change the title of a section, you need to change the corresponding title in this file. +journalctl.xml /refsect1[title="Output Options"]/variablelist/varlistentry[term="-a"] +journalctl.xml /refsect1[title="Output Options"]/variablelist/varlistentry[term="-f"] +journalctl.xml /refsect1[title="Output Options"]/variablelist/varlistentry[term="-n"] +journalctl.xml /refsect1[title="Output Options"]/variablelist/varlistentry[term="--no-tail"] +journalctl.xml /refsect1[title="Output Options"]/variablelist/varlistentry[term="-o"] +journalctl.xml /refsect1[title="Output Options"]/variablelist/varlistentry[term="-q"] +journald.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Compress="] +journald.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="RateLimitIntervalSec="] +journald.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="SystemMaxUse="] +journald.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ForwardToSyslog="] +loginctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-p"] +loginctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-a"] +loginctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--no-ask-password"] +loginctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--kill-whom="] +loginctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-s"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="Session Commands"]/variablelist/varlistentry[term="list-sessions"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="Session Commands"]/variablelist/varlistentry[term="session-status ID…"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="Session Commands"]/variablelist/varlistentry[term="show-session ID…"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="Session Commands"]/variablelist/varlistentry[term="activate ID"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="Session Commands"]/variablelist/varlistentry[term="lock-session ID…"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="Session Commands"]/variablelist/varlistentry[term="terminate-session ID…"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="Session Commands"]/variablelist/varlistentry[term="kill-session ID…"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="User Commands"]/variablelist/varlistentry[term="list-users"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="User Commands"]/variablelist/varlistentry[term="user-status USER…"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="User Commands"]/variablelist/varlistentry[term="show-user USER…"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="User Commands"]/variablelist/varlistentry[term="enable-linger USER…"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="User Commands"]/variablelist/varlistentry[term="terminate-user USER…"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="User Commands"]/variablelist/varlistentry[term="kill-user USER…"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="Seat Commands"]/variablelist/varlistentry[term="list-seats"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="Seat Commands"]/variablelist/varlistentry[term="seat-status NAME…"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="Seat Commands"]/variablelist/varlistentry[term="show-seat NAME…"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="Seat Commands"]/variablelist/varlistentry[term="attach NAME DEVICE…"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="Seat Commands"]/variablelist/varlistentry[term="flush-devices"] +loginctl.xml /refsect1[title="Commands"]/refsect2[title="Seat Commands"]/variablelist/varlistentry[term="terminate-seat NAME…"] +logind.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="NAutoVTs="] +logind.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="KillUserProcesses="] +logind.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="KillOnlyUsers="] +logind.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="InhibitDelayMaxSec="] +machine-info.xml /refsect1[title="Options"]/variablelist/varlistentry[term="PRETTY_HOSTNAME="] +machine-info.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ICON_NAME="] +os-release.xml /refsect1[title="Options"]/refsect2[title="General information identifying the operating system"]/variablelist/varlistentry[term="NAME="] +os-release.xml /refsect1[title="Options"]/refsect2[title="Information about the version of the operating system"]/variablelist/varlistentry[term="VERSION="] +os-release.xml /refsect1[title="Options"]/refsect2[title="General information identifying the operating system"]/variablelist/varlistentry[term="ID="] +os-release.xml /refsect1[title="Options"]/refsect2[title="General information identifying the operating system"]/variablelist/varlistentry[term="ID_LIKE="] +os-release.xml /refsect1[title="Options"]/refsect2[title="Information about the version of the operating system"]/variablelist/varlistentry[term="VERSION_ID="] +os-release.xml /refsect1[title="Options"]/refsect2[title="General information identifying the operating system"]/variablelist/varlistentry[term="PRETTY_NAME="] +os-release.xml /refsect1[title="Options"]/refsect2[title="Presentation information and links"]/variablelist/varlistentry[term="ANSI_COLOR="] +os-release.xml /refsect1[title="Options"]/refsect2[title="General information identifying the operating system"]/variablelist/varlistentry[term="CPE_NAME="] +os-release.xml /refsect1[title="Options"]/refsect2[title="Presentation information and links"]/variablelist/varlistentry[term="HOME_URL="] +pam_systemd.xml /refsect1[title="Options"]/variablelist/varlistentry[term="debug="] +pam_systemd.xml /refsect1[title="Environment"]/variablelist[1]/varlistentry[term="$XDG_SESSION_ID"] +pam_systemd.xml /refsect1[title="Environment"]/variablelist[1]/varlistentry[term="$XDG_RUNTIME_DIR"] +runlevel.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--help"] +runlevel.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$RUNLEVEL"] +runlevel.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$PREVLEVEL"] +runlevel.xml /refsect1[title="Files"]/variablelist/varlistentry[term="/run/utmp"] +shutdown.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--help"] +shutdown.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-H"] +shutdown.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-P"] +shutdown.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-r"] +shutdown.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-h"] +shutdown.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-k"] +shutdown.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--no-wall"] +shutdown.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-c"] +systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"] +systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-p"] +systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-a"] +systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-l"] +systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-q"] +systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--no-block"] +systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--no-wall"] +systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--global"] +systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--no-reload"] +systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--no-ask-password"] +systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--kill-whom="] +systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-f"] +systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--root="] +systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--runtime"] +systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-n"] +systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-o"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="list-units PATTERN…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="start PATTERN…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="stop PATTERN…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="reload PATTERN…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="restart PATTERN…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="try-restart PATTERN…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="reload-or-restart PATTERN…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="isolate UNIT"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="kill PATTERN…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="is-active PATTERN…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="status PATTERN…|PID…]"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="show PATTERN…|JOB…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="reset-failed [PATTERN…]"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit File Commands"]/variablelist/varlistentry[term="list-unit-files PATTERN…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit File Commands"]/variablelist/varlistentry[term="enable UNIT…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit File Commands"]/variablelist/varlistentry[term="is-enabled UNIT…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit File Commands"]/variablelist/varlistentry[term="reenable UNIT…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit File Commands"]/variablelist/varlistentry[term="preset UNIT…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit File Commands"]/variablelist/varlistentry[term="mask UNIT…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit File Commands"]/variablelist/varlistentry[term="unmask UNIT…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit File Commands"]/variablelist/varlistentry[term="link PATH…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Job Commands"]/variablelist/varlistentry[term="list-jobs PATTERN…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Job Commands"]/variablelist/varlistentry[term="cancel JOB…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Manager State Commands"]/variablelist/varlistentry[term="daemon-reload"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Manager State Commands"]/variablelist/varlistentry[term="daemon-reexec"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Environment Commands"]/variablelist/varlistentry[term="show-environment"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Environment Commands"]/variablelist/varlistentry[term="set-environment VARIABLE=VALUE…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="Environment Commands"]/variablelist/varlistentry[term="unset-environment VARIABLE…"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="default"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="rescue"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="emergency"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="halt"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="poweroff"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="reboot"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="kexec"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="exit EXIT_CODE"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="suspend"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="hibernate"] +systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="switch-root ROOT INIT"] +systemd-ask-password.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--icon="] +systemd-ask-password.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--timeout="] +systemd-ask-password.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--no-tty"] +systemd-ask-password.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--accept-cached"] +systemd-ask-password.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--multiple"] +systemd-cat.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"] +systemd-cat.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-p"] +systemd-cat.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--level-prefix="] +systemd-cgls.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--all"] +systemd-cgls.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-k"] +systemd-cgtop.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-p"] +systemd-cgtop.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"] +systemd-cgtop.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-c"] +systemd-cgtop.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-m"] +systemd-cgtop.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-i"] +systemd-cgtop.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-d"] +systemd-cgtop.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--depth="] +systemd-cgtop.xml /refsect1[title="Keys"]/variablelist/varlistentry[term="h"] +systemd-cgtop.xml /refsect1[title="Keys"]/variablelist/varlistentry[term="q"] +systemd-cgtop.xml /refsect1[title="Keys"]/variablelist/varlistentry[term="p"] +systemd-cgtop.xml /refsect1[title="Keys"]/variablelist/varlistentry[term="+"] +systemd-delta.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"] +systemd-delta.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--diff="] +systemd-delta.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"]/listitem/para/variablelist/varlistentry[term="masked"] +systemd-delta.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"]/listitem/para/variablelist/varlistentry[term="equivalent"] +systemd-delta.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"]/listitem/para/variablelist/varlistentry[term="redirected"] +systemd-delta.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"]/listitem/para/variablelist/varlistentry[term="overridden"] +systemd-delta.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"]/listitem/para/variablelist/varlistentry[term="unchanged"] +systemd-detect-virt.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-c"] +systemd-detect-virt.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-v"] +systemd-detect-virt.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-q"] +systemd-inhibit.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--what="] +systemd-inhibit.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--who="] +systemd-inhibit.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--why="] +systemd-inhibit.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--mode="] +systemd-inhibit.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--list"] +systemd-notify.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--ready"] +systemd-notify.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--pid="] +systemd-notify.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--status="] +systemd-notify.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--booted"] +systemd-nspawn.xml /refsect1[title="Options"]/refsect2[title="Image Options"]/variablelist/varlistentry[term="-D"] +systemd-nspawn.xml /refsect1[title="Options"]/refsect2[title="Execution Options"]/variablelist/varlistentry[term="-b"] +systemd-nspawn.xml /refsect1[title="Options"]/refsect2[title="Execution Options"]/variablelist/varlistentry[term="-u"] +systemd-nspawn.xml /refsect1[title="Options"]/refsect2[title="System Identity Options"]/variablelist/varlistentry[term="--uuid="] +systemd-nspawn.xml /refsect1[title="Options"]/refsect2[title="Networking Options"]/variablelist/varlistentry[term="--private-network"] +systemd-nspawn.xml /refsect1[title="Options"]/refsect2[title="Image Options"]/variablelist/varlistentry[term="--read-only"] +systemd-tmpfiles.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--create"] +systemd-tmpfiles.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--clean"] +systemd-tmpfiles.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--remove"] +systemd-tmpfiles.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--prefix=path"] +systemd.automount.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Where="] +systemd.automount.xml /refsect1[title="Options"]/variablelist/varlistentry[term="DirectoryMode="] +systemd.device.xml /refsect1[title="The udev Database"]/variablelist/varlistentry[term="SYSTEMD_WANTS="] +systemd.device.xml /refsect1[title="The udev Database"]/variablelist/varlistentry[term="SYSTEMD_ALIAS="] +systemd.device.xml /refsect1[title="The udev Database"]/variablelist/varlistentry[term="SYSTEMD_READY="] +systemd.device.xml /refsect1[title="The udev Database"]/variablelist/varlistentry[term="ID_MODEL_FROM_DATABASE="] +systemd.exec.xml /refsect1[title="Paths"]/variablelist/varlistentry[term="WorkingDirectory="] +systemd.exec.xml /refsect1[title="Paths"]/variablelist/varlistentry[term="RootDirectory="] +systemd.exec.xml /refsect1[title="User/Group Identity"]/variablelist/varlistentry[term="User="] +systemd.exec.xml /refsect1[title="User/Group Identity"]/variablelist/varlistentry[term="SupplementaryGroups="] +systemd.exec.xml /refsect1[title="Scheduling"]/variablelist/varlistentry[term="Nice="] +systemd.exec.xml /refsect1[title="Process Properties"]/variablelist/varlistentry[term="OOMScoreAdjust="] +systemd.exec.xml /refsect1[title="Scheduling"]/variablelist/varlistentry[term="IOSchedulingClass="] +systemd.exec.xml /refsect1[title="Scheduling"]/variablelist/varlistentry[term="IOSchedulingPriority="] +systemd.exec.xml /refsect1[title="Scheduling"]/variablelist/varlistentry[term="CPUSchedulingPolicy="] +systemd.exec.xml /refsect1[title="Scheduling"]/variablelist/varlistentry[term="CPUSchedulingPriority="] +systemd.exec.xml /refsect1[title="Scheduling"]/variablelist/varlistentry[term="CPUSchedulingResetOnFork="] +systemd.exec.xml /refsect1[title="Scheduling"]/variablelist/varlistentry[term="CPUAffinity="] +systemd.exec.xml /refsect1[title="Process Properties"]/variablelist/varlistentry[term="UMask="] +systemd.exec.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="Environment="] +systemd.exec.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="EnvironmentFile="] +systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="StandardInput="] +systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="StandardOutput="] +systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="StandardError="] +systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="TTYPath="] +systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="TTYReset="] +systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="TTYVHangup="] +systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="TTYVTDisallocate="] +systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="SyslogIdentifier="] +systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="SyslogFacility="] +systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="SyslogLevel="] +systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="SyslogLevelPrefix="] +systemd.exec.xml /refsect1[title="Process Properties"]/variablelist/varlistentry[term="TimerSlackNSec="] +systemd.exec.xml /refsect1[title="Process Properties"]/variablelist/varlistentry[term="LimitCPU="] +systemd.exec.xml /refsect1[title="User/Group Identity"]/variablelist/varlistentry[term="PAMName="] +systemd.exec.xml /refsect1[title="Capabilities"]/variablelist/varlistentry[term="CapabilityBoundingSet="] +systemd.exec.xml /refsect1[title="Security"]/variablelist/varlistentry[term="SecureBits="] +systemd.exec.xml /refsect1[title="Sandboxing"]/variablelist/varlistentry[term="PrivateTmp="] +systemd.exec.xml /refsect1[title="Sandboxing"]/variablelist/varlistentry[term="PrivateNetwork="] +systemd.exec.xml /refsect1[title="Sandboxing"]/variablelist/varlistentry[term="MountFlags="] +systemd.exec.xml /refsect1[title="System V Compatibility"]/variablelist/varlistentry[term="UtmpIdentifier="] +systemd.exec.xml /refsect1[title="Process Properties"]/variablelist/varlistentry[term="IgnoreSIGPIPE="] +systemd.journal-fields.xml /refsect1[title="User Journal Fields"]/variablelist/varlistentry[term="MESSAGE="] +systemd.journal-fields.xml /refsect1[title="User Journal Fields"]/variablelist/varlistentry[term="MESSAGE_ID="] +systemd.journal-fields.xml /refsect1[title="User Journal Fields"]/variablelist/varlistentry[term="PRIORITY="] +systemd.journal-fields.xml /refsect1[title="User Journal Fields"]/variablelist/varlistentry[term="CODE_FILE="] +systemd.journal-fields.xml /refsect1[title="User Journal Fields"]/variablelist/varlistentry[term="SYSLOG_FACILITY="] +systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_PID="] +systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_COMM="] +systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_AUDIT_SESSION="] +systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_SYSTEMD_CGROUP="] +systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_SELINUX_CONTEXT="] +systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_SOURCE_REALTIME_TIMESTAMP="] +systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_BOOT_ID="] +systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_MACHINE_ID="] +systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_HOSTNAME="] +systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_TRANSPORT="] +systemd.journal-fields.xml /refsect1[title="Address Fields"]/variablelist/varlistentry[term="__CURSOR="] +systemd.journal-fields.xml /refsect1[title="Address Fields"]/variablelist/varlistentry[term="__REALTIME_TIMESTAMP="] +systemd.journal-fields.xml /refsect1[title="Address Fields"]/variablelist/varlistentry[term="__MONOTONIC_TIMESTAMP="] +systemd.mount.xml /refsect1[title="Options"]/variablelist/varlistentry[term="What="] +systemd.mount.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Where="] +systemd.mount.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Type="] +systemd.mount.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Options="] +systemd.mount.xml /refsect1[title="Options"]/variablelist/varlistentry[term="DirectoryMode="] +systemd.mount.xml /refsect1[title="Options"]/variablelist/varlistentry[term="TimeoutSec="] +systemd.path.xml /refsect1[title="Options"]/variablelist/varlistentry[term="PathExists="] +systemd.path.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Unit="] +systemd.path.xml /refsect1[title="Options"]/variablelist/varlistentry[term="MakeDirectory="] +systemd.path.xml /refsect1[title="Options"]/variablelist/varlistentry[term="DirectoryMode="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Type="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="RemainAfterExit="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="GuessMainPID="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="PIDFile="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="BusName="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ExecStart="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ExecStartPre="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ExecReload="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ExecStop="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ExecStopPost="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="RestartSec="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="TimeoutSec="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="WatchdogSec="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Restart="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="RootDirectoryStartOnly="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="NonBlocking="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="NotifyAccess="] +systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Sockets="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ListenStream="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ListenFIFO="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ListenSpecial="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ListenNetlink="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ListenMessageQueue="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="BindIPv6Only="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Backlog="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="BindToDevice="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="DirectoryMode="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="SocketMode="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Accept="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="MaxConnections="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="KeepAlive="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Priority="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ReceiveBuffer="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="IPTOS="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="IPTTL="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Mark="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="PipeSize="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="MessageQueueMaxMessages=,\n MessageQueueMessageSize="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="FreeBind="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Transparent="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Broadcast="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="PassCredentials="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="PassSecurity="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="TCPCongestion="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ExecStartPre="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ExecStopPre="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="TimeoutSec="] +systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Service="] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="basic.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units for Devices"]/variablelist/varlistentry[term="bluetooth.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="ctrl-alt-del.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="cryptsetup.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="dbus.service"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="dbus.socket"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="default.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="display-manager.service"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="emergency.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="final.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="getty.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="graphical.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="hibernate.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="halt.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="kbrequest.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="kexec.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="local-fs.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special Passive System Units "]/variablelist/varlistentry[term="local-fs-pre.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="multi-user.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special Passive System Units "]/variablelist/varlistentry[term="network.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special Passive System Units "]/variablelist/varlistentry[term="nss-lookup.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special Passive System Units "]/variablelist/varlistentry[term="nss-user-lookup.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="poweroff.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units for Devices"]/variablelist/varlistentry[term="printer.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="reboot.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="remote-fs.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special Passive System Units "]/variablelist/varlistentry[term="remote-fs-pre.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="rescue.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special Passive System Units "]/variablelist/varlistentry[term="rpcbind.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="runlevel2.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="shutdown.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="sigpwr.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="sleep.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units for Devices"]/variablelist/varlistentry[term="smartcard.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="sockets.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units for Devices"]/variablelist/varlistentry[term="sound.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="suspend.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="swap.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="sysinit.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="syslog.socket"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special Passive System Units "]/variablelist/varlistentry[term="time-sync.target"] +systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="umount.target"] +systemd.swap.xml /refsect1[title="Options"]/variablelist/varlistentry[term="What="] +systemd.swap.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Priority="] +systemd.swap.xml /refsect1[title="Options"]/variablelist/varlistentry[term="TimeoutSec="] +systemd.timer.xml /refsect1[title="Options"]/variablelist/varlistentry[term="OnActiveSec="] +systemd.timer.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Unit="] +systemd.xml /refsect1[title="Options"]/refsect2[title="Introspection and debugging options"]/variablelist/varlistentry[term="--test"] +systemd.xml /refsect1[title="Options"]/refsect2[title="Introspection and debugging options"]/variablelist/varlistentry[term="--dump-configuration-items"] +systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--unit="] +systemd.xml /refsect1[title="Options"]/refsect2[title="Introspection and debugging options"]/variablelist/varlistentry[term="--system"] +systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--dump-core"] +systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--crash-shell"] +systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--confirm-spawn"] +systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--show-status"] +systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--log-target="] +systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--log-level="] +systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--log-color"] +systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--log-location"] +systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--default-standard-output="] +systemd.xml /refsect1[title="Directories"]/variablelist[1]/varlistentry[term="System unit directories"] +systemd.xml /refsect1[title="Directories"]/variablelist[2]/varlistentry[term="User unit directories"] +systemd.xml /refsect1[title="Directories"]/variablelist[3]/varlistentry[term="SysV init scripts directory"] +systemd.xml /refsect1[title="Directories"]/variablelist[4]/varlistentry[term="SysV runlevel link farm directory"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGTERM"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGINT"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGWINCH"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGPWR"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGUSR1"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGUSR2"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGHUP"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+0"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+1"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+2"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+3"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+4"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+5"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+6"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+13"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+14"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+15"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+16"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+20"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+21"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+22"] +systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+26"] +systemd.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$SYSTEMD_LOG_LEVEL"] +systemd.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$SYSTEMD_LOG_TARGET"] +systemd.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$SYSTEMD_LOG_COLOR"] +systemd.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$SYSTEMD_LOG_LOCATION"] +systemd.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$XDG_CONFIG_HOME"] +systemd.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$SYSTEMD_UNIT_PATH"] +systemd.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$LISTEN_PID"] +systemd.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$NOTIFY_SOCKET"] +systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.unit="] +systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.dump_core"] +systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.crash_shell"] +systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.crash_chvt"] +systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.confirm_spawn"] +systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.show_status"] +systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.log_color"] +systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.default_standard_output="] +systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.setenv="] +systemd.xml /refsect1[title="Sockets and FIFOs"]/variablelist/varlistentry[term="/run/systemd/notify"] +systemd.xml /refsect1[title="Sockets and FIFOs"]/variablelist/varlistentry[term="/run/systemd/private"] +systemd.xml /refsect1[title="Sockets and FIFOs"]/variablelist/varlistentry[term="/dev/initctl"] +telinit.xml /refsect1[title="Options"]/variablelist[1]/varlistentry[term="--help"] +telinit.xml /refsect1[title="Options"]/variablelist[1]/varlistentry[term="--no-wall"] +telinit.xml /refsect1[title="Options"]/variablelist[2]/varlistentry[term="0"] +telinit.xml /refsect1[title="Options"]/variablelist[2]/varlistentry[term="6"] +telinit.xml /refsect1[title="Options"]/variablelist[2]/varlistentry[term="2"] +telinit.xml /refsect1[title="Options"]/variablelist[2]/varlistentry[term="1"] +telinit.xml /refsect1[title="Options"]/variablelist[2]/varlistentry[term="q"] +telinit.xml /refsect1[title="Options"]/variablelist[2]/varlistentry[term="u"] +tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="f"] +tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="w"] +tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="d"] +tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="D"] +tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="p"] +tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="L"] +tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="c"] +tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="b"] +tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="x"] +tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="r"] +tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="R"] +tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="z"] +tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="Z"] +tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="h"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Operators"]/variablelist/varlistentry[term="=="] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Operators"]/variablelist/varlistentry[term="!="] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Operators"]/variablelist/varlistentry[term="="] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Operators"]/variablelist/varlistentry[term="+="] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Operators"]/variablelist/varlistentry[term=":="] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="ACTION"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="DEVPATH"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="KERNEL"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="NAME"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="SYMLINK"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="SUBSYSTEM"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="DRIVER"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="ATTR{filename}"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="KERNELS"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="SUBSYSTEMS"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="DRIVERS"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="ATTRS{filename}"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="TAGS"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="ENV{key}"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="TAG"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="TEST{octal mode mask}"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="PROGRAM"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="RESULT"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[2]/varlistentry[term="*"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[2]/varlistentry[term="?"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[2]/varlistentry[term="[]"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="NAME"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="SYMLINK"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="OWNER, GROUP, MODE"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="ATTR{key}"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="ENV{key}"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="TAG"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="RUN{type}"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="LABEL"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="GOTO"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="IMPORT{type}"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="OPTIONS"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="RUN{type}"]/listitem/variablelist/varlistentry[term="program"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="IMPORT{type}"]/listitem/variablelist/varlistentry[term="file"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="IMPORT{type}"]/listitem/variablelist/varlistentry[term="db"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="IMPORT{type}"]/listitem/variablelist/varlistentry[term="cmdline"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="IMPORT{type}"]/listitem/variablelist/varlistentry[term="parent"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="OPTIONS"]/listitem/variablelist/varlistentry[term="link_priority=value"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="OPTIONS"]/listitem/variablelist/varlistentry[term="string_escape=none|replace"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="OPTIONS"]/listitem/variablelist/varlistentry[term="static_node="] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="OPTIONS"]/listitem/variablelist/varlistentry[term="watch"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="OPTIONS"]/listitem/variablelist/varlistentry[term="nowatch"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$kernel, %k"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$number, %n"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$devpath, %p"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$id, %b"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$driver"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$attr{file}, %s{file}"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$env{key}, %E{key}"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$major, %M"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$minor, %m"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$result, %c"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$parent, %P"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$name"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$links"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$root, %r"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$sys, %S"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$devnode, %N"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="%%"] +udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$$"] +udevadm.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-d"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-q"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-p"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-n"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-r"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-a"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-x"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-P"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-d"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-e"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-c"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-v"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-n"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-t"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-c"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-s"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-S"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-a"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-A"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-p"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-g"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-y"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-b"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm settle\n options\n "]/variablelist/varlistentry[term="-t"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm settle\n options\n "]/variablelist/varlistentry[term="-E"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm control option"]/variablelist/varlistentry[term="-e"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm control option"]/variablelist/varlistentry[term="-l"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm control option"]/variablelist/varlistentry[term="-s"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm control option"]/variablelist/varlistentry[term="-S"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm control option"]/variablelist/varlistentry[term="-R"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm control option"]/variablelist/varlistentry[term="-p"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm control option"]/variablelist/varlistentry[term="-m"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm control option"]/variablelist/varlistentry[term="-t"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm monitor\n options\n "]/variablelist/varlistentry[term="-k"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm monitor\n options\n "]/variablelist/varlistentry[term="-u"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm monitor\n options\n "]/variablelist/varlistentry[term="-p"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm monitor\n options\n "]/variablelist/varlistentry[term="-s"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm monitor\n options\n "]/variablelist/varlistentry[term="-t"] +udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm test\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-a"] +vconsole.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="KEYMAP="] +vconsole.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="FONT="] diff --git a/tools/coverity.sh b/tools/coverity.sh new file mode 100755 index 0000000..361376f --- /dev/null +++ b/tools/coverity.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later + +set -eux + +COVERITY_SCAN_TOOL_BASE="/tmp/coverity-scan-analysis" +COVERITY_SCAN_PROJECT_NAME="systemd/systemd" + +function coverity_install_script { + local platform tool_url tool_archive + + platform=$(uname) + tool_url="https://scan.coverity.com/download/${platform}" + tool_archive="/tmp/cov-analysis-${platform}.tgz" + + set +x # this is supposed to hide COVERITY_SCAN_TOKEN + echo -e "\033[33;1mDownloading Coverity Scan Analysis Tool...\033[0m" + wget -nv -O "$tool_archive" "$tool_url" --post-data "project=$COVERITY_SCAN_PROJECT_NAME&token=${COVERITY_SCAN_TOKEN:?}" + set -x + + mkdir -p "$COVERITY_SCAN_TOOL_BASE" + pushd "$COVERITY_SCAN_TOOL_BASE" + tar xzf "$tool_archive" + popd +} + +function run_coverity { + local results_dir tool_dir results_archive sha response status_code + + results_dir="cov-int" + tool_dir=$(find "$COVERITY_SCAN_TOOL_BASE" -type d -name 'cov-analysis*') + results_archive="analysis-results.tgz" + sha=$(git rev-parse --short HEAD) + + meson -Dman=false build + COVERITY_UNSUPPORTED=1 "$tool_dir/bin/cov-build" --dir "$results_dir" sh -c "ninja -C ./build -v" + "$tool_dir/bin/cov-import-scm" --dir "$results_dir" --scm git --log "$results_dir/scm_log.txt" + + tar czf "$results_archive" "$results_dir" + + set +x # this is supposed to hide COVERITY_SCAN_TOKEN + echo -e "\033[33;1mUploading Coverity Scan Analysis results...\033[0m" + response=$(curl \ + --silent --write-out "\n%{http_code}\n" \ + --form project="$COVERITY_SCAN_PROJECT_NAME" \ + --form token="${COVERITY_SCAN_TOKEN:?}" \ + --form email="${COVERITY_SCAN_NOTIFICATION_EMAIL:?}" \ + --form file="@$results_archive" \ + --form version="$sha" \ + --form description="Daily build" \ + https://scan.coverity.com/builds) + printf "\033[33;1mThe response is\033[0m\n%s\n" "$response" + status_code=$(echo "$response" | sed -n '$p') + if [ "$status_code" != "200" ]; then + echo -e "\033[33;1mCoverity Scan upload failed: $(echo "$response" | sed '$d').\033[0m" + return 1 + fi + set -x +} + +coverity_install_script +run_coverity diff --git a/tools/dbus_exporter.py b/tools/dbus_exporter.py new file mode 100755 index 0000000..819584d --- /dev/null +++ b/tools/dbus_exporter.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-or-later +from argparse import ArgumentParser +from pathlib import Path +from subprocess import PIPE, run + + +def extract_interfaces_xml(output_dir, executable): + proc = run( + args=[executable.absolute(), '--bus-introspect', 'list'], + stdout=PIPE, + check=True, + universal_newlines=True) + + interface_names = (x.split()[1] for x in proc.stdout.splitlines()) + + for interface_name in interface_names: + proc = run( + args=[executable.absolute(), '--bus-introspect', interface_name], + stdout=PIPE, + check=True, + universal_newlines=True) + + interface_file_name = output_dir / (interface_name + '.xml') + interface_file_name.write_text(proc.stdout) + interface_file_name.chmod(0o644) + +def main(): + parser = ArgumentParser() + parser.add_argument('output', + type=Path) + parser.add_argument('executables', + nargs='+', + type=Path) + + args = parser.parse_args() + + args.output.mkdir(exist_ok=True) + for exe in args.executables: + extract_interfaces_xml(args.output, exe) + +if __name__ == '__main__': + main() diff --git a/tools/dbus_ignorelist b/tools/dbus_ignorelist new file mode 100644 index 0000000..d0c2150 --- /dev/null +++ b/tools/dbus_ignorelist @@ -0,0 +1,2174 @@ +org.freedesktop.LogControl1.LogLevel +org.freedesktop.LogControl1.LogTarget +org.freedesktop.LogControl1.SyslogIdentifier +org.freedesktop.home1.Home.Acquire() +org.freedesktop.home1.Home.Activate() +org.freedesktop.home1.Home.Authenticate() +org.freedesktop.home1.Home.ChangePassword() +org.freedesktop.home1.Home.Deactivate() +org.freedesktop.home1.Home.Fixate() +org.freedesktop.home1.Home.Lock() +org.freedesktop.home1.Home.Realize() +org.freedesktop.home1.Home.Ref() +org.freedesktop.home1.Home.Release() +org.freedesktop.home1.Home.Remove() +org.freedesktop.home1.Home.Resize() +org.freedesktop.home1.Home.State +org.freedesktop.home1.Home.UID +org.freedesktop.home1.Home.UnixRecord +org.freedesktop.home1.Home.Unlock() +org.freedesktop.home1.Home.Unregister() +org.freedesktop.home1.Home.Update() +org.freedesktop.home1.Home.UserName +org.freedesktop.home1.Home.UserRecord +org.freedesktop.home1.Manager.AcquireHome() +org.freedesktop.home1.Manager.ActivateHome() +org.freedesktop.home1.Manager.AuthenticateHome() +org.freedesktop.home1.Manager.AutoLogin +org.freedesktop.home1.Manager.ChangePasswordHome() +org.freedesktop.home1.Manager.CreateHome() +org.freedesktop.home1.Manager.DeactivateAllHomes() +org.freedesktop.home1.Manager.DeactivateHome() +org.freedesktop.home1.Manager.FixateHome() +org.freedesktop.home1.Manager.GetHomeByName() +org.freedesktop.home1.Manager.GetHomeByUID() +org.freedesktop.home1.Manager.GetUserRecordByName() +org.freedesktop.home1.Manager.GetUserRecordByUID() +org.freedesktop.home1.Manager.ListHomes() +org.freedesktop.home1.Manager.LockAllHomes() +org.freedesktop.home1.Manager.LockHome() +org.freedesktop.home1.Manager.RealizeHome() +org.freedesktop.home1.Manager.Rebalance() +org.freedesktop.home1.Manager.RefHome() +org.freedesktop.home1.Manager.RegisterHome() +org.freedesktop.home1.Manager.ReleaseHome() +org.freedesktop.home1.Manager.RemoveHome() +org.freedesktop.home1.Manager.ResizeHome() +org.freedesktop.home1.Manager.UnlockHome() +org.freedesktop.home1.Manager.UnregisterHome() +org.freedesktop.home1.Manager.UpdateHome() +org.freedesktop.hostname1.Chassis +org.freedesktop.hostname1.DefaultHostname +org.freedesktop.hostname1.Deployment +org.freedesktop.hostname1.Describe() +org.freedesktop.hostname1.GetProductUUID() +org.freedesktop.hostname1.HardwareModel +org.freedesktop.hostname1.HardwareVendor +org.freedesktop.hostname1.HomeURL +org.freedesktop.hostname1.Hostname +org.freedesktop.hostname1.HostnameSource +org.freedesktop.hostname1.IconName +org.freedesktop.hostname1.KernelName +org.freedesktop.hostname1.KernelRelease +org.freedesktop.hostname1.KernelVersion +org.freedesktop.hostname1.Location +org.freedesktop.hostname1.OperatingSystemCPEName +org.freedesktop.hostname1.OperatingSystemPrettyName +org.freedesktop.hostname1.PrettyHostname +org.freedesktop.hostname1.SetChassis() +org.freedesktop.hostname1.SetDeployment() +org.freedesktop.hostname1.SetHostname() +org.freedesktop.hostname1.SetIconName() +org.freedesktop.hostname1.SetLocation() +org.freedesktop.hostname1.SetPrettyHostname() +org.freedesktop.hostname1.SetStaticHostname() +org.freedesktop.hostname1.StaticHostname +org.freedesktop.import1.Manager.CancelTransfer() +org.freedesktop.import1.Manager.ExportRaw() +org.freedesktop.import1.Manager.ExportTar() +org.freedesktop.import1.Manager.ImportFileSystem() +org.freedesktop.import1.Manager.ImportRaw() +org.freedesktop.import1.Manager.ImportTar() +org.freedesktop.import1.Manager.ListTransfers() +org.freedesktop.import1.Manager.PullRaw() +org.freedesktop.import1.Manager.PullTar() +org.freedesktop.import1.Manager.TransferNew +org.freedesktop.import1.Manager.TransferRemoved +org.freedesktop.import1.Transfer.Cancel() +org.freedesktop.import1.Transfer.Id +org.freedesktop.import1.Transfer.Local +org.freedesktop.import1.Transfer.LogMessage +org.freedesktop.import1.Transfer.Progress +org.freedesktop.import1.Transfer.Remote +org.freedesktop.import1.Transfer.Type +org.freedesktop.import1.Transfer.Verify +org.freedesktop.locale1.Locale +org.freedesktop.locale1.SetLocale() +org.freedesktop.locale1.SetVConsoleKeyboard() +org.freedesktop.locale1.SetX11Keyboard() +org.freedesktop.locale1.VConsoleKeymap +org.freedesktop.locale1.VConsoleKeymapToggle +org.freedesktop.locale1.X11Layout +org.freedesktop.locale1.X11Model +org.freedesktop.locale1.X11Options +org.freedesktop.locale1.X11Variant +org.freedesktop.login1.Manager.ActivateSession() +org.freedesktop.login1.Manager.ActivateSessionOnSeat() +org.freedesktop.login1.Manager.AttachDevice() +org.freedesktop.login1.Manager.BlockInhibited +org.freedesktop.login1.Manager.BootLoaderEntries +org.freedesktop.login1.Manager.CanHalt() +org.freedesktop.login1.Manager.CanHibernate() +org.freedesktop.login1.Manager.CanHybridSleep() +org.freedesktop.login1.Manager.CanPowerOff() +org.freedesktop.login1.Manager.CanReboot() +org.freedesktop.login1.Manager.CanRebootParameter() +org.freedesktop.login1.Manager.CanRebootToBootLoaderEntry() +org.freedesktop.login1.Manager.CanRebootToBootLoaderMenu() +org.freedesktop.login1.Manager.CanRebootToFirmwareSetup() +org.freedesktop.login1.Manager.CanSuspend() +org.freedesktop.login1.Manager.CanSuspendThenHibernate() +org.freedesktop.login1.Manager.CancelScheduledShutdown() +org.freedesktop.login1.Manager.CreateSession() +org.freedesktop.login1.Manager.DelayInhibited +org.freedesktop.login1.Manager.Docked +org.freedesktop.login1.Manager.EnableWallMessages +org.freedesktop.login1.Manager.FlushDevices() +org.freedesktop.login1.Manager.GetSeat() +org.freedesktop.login1.Manager.GetSession() +org.freedesktop.login1.Manager.GetSessionByPID() +org.freedesktop.login1.Manager.GetUser() +org.freedesktop.login1.Manager.GetUserByPID() +org.freedesktop.login1.Manager.Halt() +org.freedesktop.login1.Manager.HaltWithFlags() +org.freedesktop.login1.Manager.HandleHibernateKey +org.freedesktop.login1.Manager.HandleLidSwitch +org.freedesktop.login1.Manager.HandleLidSwitchDocked +org.freedesktop.login1.Manager.HandleLidSwitchExternalPower +org.freedesktop.login1.Manager.HandlePowerKey +org.freedesktop.login1.Manager.HandleSuspendKey +org.freedesktop.login1.Manager.Hibernate() +org.freedesktop.login1.Manager.HibernateWithFlags() +org.freedesktop.login1.Manager.HoldoffTimeoutUSec +org.freedesktop.login1.Manager.HybridSleep() +org.freedesktop.login1.Manager.HybridSleepWithFlags() +org.freedesktop.login1.Manager.IdleAction +org.freedesktop.login1.Manager.IdleActionUSec +org.freedesktop.login1.Manager.IdleHint +org.freedesktop.login1.Manager.IdleSinceHint +org.freedesktop.login1.Manager.IdleSinceHintMonotonic +org.freedesktop.login1.Manager.Inhibit() +org.freedesktop.login1.Manager.InhibitDelayMaxUSec +org.freedesktop.login1.Manager.InhibitorsMax +org.freedesktop.login1.Manager.KillExcludeUsers +org.freedesktop.login1.Manager.KillOnlyUsers +org.freedesktop.login1.Manager.KillSession() +org.freedesktop.login1.Manager.KillUser() +org.freedesktop.login1.Manager.KillUserProcesses +org.freedesktop.login1.Manager.LidClosed +org.freedesktop.login1.Manager.ListInhibitors() +org.freedesktop.login1.Manager.ListSeats() +org.freedesktop.login1.Manager.ListSessions() +org.freedesktop.login1.Manager.ListUsers() +org.freedesktop.login1.Manager.LockSession() +org.freedesktop.login1.Manager.LockSessions() +org.freedesktop.login1.Manager.NAutoVTs +org.freedesktop.login1.Manager.NCurrentInhibitors +org.freedesktop.login1.Manager.NCurrentSessions +org.freedesktop.login1.Manager.OnExternalPower +org.freedesktop.login1.Manager.PowerOff() +org.freedesktop.login1.Manager.PowerOffWithFlags() +org.freedesktop.login1.Manager.PrepareForShutdown +org.freedesktop.login1.Manager.PrepareForSleep +org.freedesktop.login1.Manager.PreparingForShutdown +org.freedesktop.login1.Manager.PreparingForSleep +org.freedesktop.login1.Manager.Reboot() +org.freedesktop.login1.Manager.RebootParameter +org.freedesktop.login1.Manager.RebootToBootLoaderEntry +org.freedesktop.login1.Manager.RebootToBootLoaderMenu +org.freedesktop.login1.Manager.RebootToFirmwareSetup +org.freedesktop.login1.Manager.RebootWithFlags() +org.freedesktop.login1.Manager.ReleaseSession() +org.freedesktop.login1.Manager.RemoveIPC +org.freedesktop.login1.Manager.RuntimeDirectoryInodesMax +org.freedesktop.login1.Manager.RuntimeDirectorySize +org.freedesktop.login1.Manager.ScheduleShutdown() +org.freedesktop.login1.Manager.ScheduledShutdown +org.freedesktop.login1.Manager.SeatNew +org.freedesktop.login1.Manager.SeatRemoved +org.freedesktop.login1.Manager.SessionNew +org.freedesktop.login1.Manager.SessionRemoved +org.freedesktop.login1.Manager.SessionsMax +org.freedesktop.login1.Manager.SetRebootParameter() +org.freedesktop.login1.Manager.SetRebootToBootLoaderEntry() +org.freedesktop.login1.Manager.SetRebootToBootLoaderMenu() +org.freedesktop.login1.Manager.SetRebootToFirmwareSetup() +org.freedesktop.login1.Manager.SetUserLinger() +org.freedesktop.login1.Manager.SetWallMessage() +org.freedesktop.login1.Manager.Suspend() +org.freedesktop.login1.Manager.SuspendThenHibernate() +org.freedesktop.login1.Manager.SuspendThenHibernateWithFlags() +org.freedesktop.login1.Manager.SuspendWithFlags() +org.freedesktop.login1.Manager.TerminateSeat() +org.freedesktop.login1.Manager.TerminateSession() +org.freedesktop.login1.Manager.TerminateUser() +org.freedesktop.login1.Manager.UnlockSession() +org.freedesktop.login1.Manager.UnlockSessions() +org.freedesktop.login1.Manager.UserNew +org.freedesktop.login1.Manager.UserRemoved +org.freedesktop.login1.Manager.UserStopDelayUSec +org.freedesktop.login1.Manager.WallMessage +org.freedesktop.login1.Seat.ActivateSession() +org.freedesktop.login1.Seat.ActiveSession +org.freedesktop.login1.Seat.CanGraphical +org.freedesktop.login1.Seat.CanTTY +org.freedesktop.login1.Seat.Id +org.freedesktop.login1.Seat.IdleHint +org.freedesktop.login1.Seat.IdleSinceHint +org.freedesktop.login1.Seat.IdleSinceHintMonotonic +org.freedesktop.login1.Seat.Sessions +org.freedesktop.login1.Seat.SwitchTo() +org.freedesktop.login1.Seat.SwitchToNext() +org.freedesktop.login1.Seat.SwitchToPrevious() +org.freedesktop.login1.Seat.Terminate() +org.freedesktop.login1.Session.Activate() +org.freedesktop.login1.Session.Active +org.freedesktop.login1.Session.Audit +org.freedesktop.login1.Session.Class +org.freedesktop.login1.Session.Desktop +org.freedesktop.login1.Session.Display +org.freedesktop.login1.Session.Id +org.freedesktop.login1.Session.IdleHint +org.freedesktop.login1.Session.IdleSinceHint +org.freedesktop.login1.Session.IdleSinceHintMonotonic +org.freedesktop.login1.Session.Kill() +org.freedesktop.login1.Session.Leader +org.freedesktop.login1.Session.Lock +org.freedesktop.login1.Session.Lock() +org.freedesktop.login1.Session.LockedHint +org.freedesktop.login1.Session.Name +org.freedesktop.login1.Session.PauseDevice +org.freedesktop.login1.Session.PauseDeviceComplete() +org.freedesktop.login1.Session.ReleaseControl() +org.freedesktop.login1.Session.ReleaseDevice() +org.freedesktop.login1.Session.Remote +org.freedesktop.login1.Session.RemoteHost +org.freedesktop.login1.Session.RemoteUser +org.freedesktop.login1.Session.ResumeDevice +org.freedesktop.login1.Session.Scope +org.freedesktop.login1.Session.Seat +org.freedesktop.login1.Session.Service +org.freedesktop.login1.Session.SetBrightness() +org.freedesktop.login1.Session.SetIdleHint() +org.freedesktop.login1.Session.SetLockedHint() +org.freedesktop.login1.Session.SetType() +org.freedesktop.login1.Session.State +org.freedesktop.login1.Session.TTY +org.freedesktop.login1.Session.TakeControl() +org.freedesktop.login1.Session.TakeDevice() +org.freedesktop.login1.Session.Terminate() +org.freedesktop.login1.Session.Timestamp +org.freedesktop.login1.Session.TimestampMonotonic +org.freedesktop.login1.Session.Type +org.freedesktop.login1.Session.Unlock +org.freedesktop.login1.Session.Unlock() +org.freedesktop.login1.Session.User +org.freedesktop.login1.Session.VTNr +org.freedesktop.login1.User.Display +org.freedesktop.login1.User.GID +org.freedesktop.login1.User.IdleHint +org.freedesktop.login1.User.IdleSinceHint +org.freedesktop.login1.User.IdleSinceHintMonotonic +org.freedesktop.login1.User.Kill() +org.freedesktop.login1.User.Linger +org.freedesktop.login1.User.Name +org.freedesktop.login1.User.RuntimePath +org.freedesktop.login1.User.Service +org.freedesktop.login1.User.Sessions +org.freedesktop.login1.User.Slice +org.freedesktop.login1.User.State +org.freedesktop.login1.User.Terminate() +org.freedesktop.login1.User.Timestamp +org.freedesktop.login1.User.TimestampMonotonic +org.freedesktop.login1.User.UID +org.freedesktop.machine1.Image.Clone() +org.freedesktop.machine1.Image.CreationTimestamp +org.freedesktop.machine1.Image.GetHostname() +org.freedesktop.machine1.Image.GetMachineID() +org.freedesktop.machine1.Image.GetMachineInfo() +org.freedesktop.machine1.Image.GetOSRelease() +org.freedesktop.machine1.Image.Limit +org.freedesktop.machine1.Image.LimitExclusive +org.freedesktop.machine1.Image.MarkReadOnly() +org.freedesktop.machine1.Image.ModificationTimestamp +org.freedesktop.machine1.Image.Name +org.freedesktop.machine1.Image.Path +org.freedesktop.machine1.Image.ReadOnly +org.freedesktop.machine1.Image.Remove() +org.freedesktop.machine1.Image.Rename() +org.freedesktop.machine1.Image.SetLimit() +org.freedesktop.machine1.Image.Type +org.freedesktop.machine1.Image.Usage +org.freedesktop.machine1.Image.UsageExclusive +org.freedesktop.machine1.Machine.BindMount() +org.freedesktop.machine1.Machine.Class +org.freedesktop.machine1.Machine.CopyFrom() +org.freedesktop.machine1.Machine.CopyTo() +org.freedesktop.machine1.Machine.GetAddresses() +org.freedesktop.machine1.Machine.GetOSRelease() +org.freedesktop.machine1.Machine.GetUIDShift() +org.freedesktop.machine1.Machine.Id +org.freedesktop.machine1.Machine.Kill() +org.freedesktop.machine1.Machine.Leader +org.freedesktop.machine1.Machine.Name +org.freedesktop.machine1.Machine.NetworkInterfaces +org.freedesktop.machine1.Machine.OpenLogin() +org.freedesktop.machine1.Machine.OpenPTY() +org.freedesktop.machine1.Machine.OpenRootDirectory() +org.freedesktop.machine1.Machine.OpenShell() +org.freedesktop.machine1.Machine.RootDirectory +org.freedesktop.machine1.Machine.Service +org.freedesktop.machine1.Machine.State +org.freedesktop.machine1.Machine.Terminate() +org.freedesktop.machine1.Machine.Timestamp +org.freedesktop.machine1.Machine.TimestampMonotonic +org.freedesktop.machine1.Machine.Unit +org.freedesktop.machine1.Manager.BindMountMachine() +org.freedesktop.machine1.Manager.CleanPool() +org.freedesktop.machine1.Manager.CloneImage() +org.freedesktop.machine1.Manager.CopyFromMachine() +org.freedesktop.machine1.Manager.CopyToMachine() +org.freedesktop.machine1.Manager.CreateMachine() +org.freedesktop.machine1.Manager.CreateMachineWithNetwork() +org.freedesktop.machine1.Manager.GetImage() +org.freedesktop.machine1.Manager.GetImageHostname() +org.freedesktop.machine1.Manager.GetImageMachineID() +org.freedesktop.machine1.Manager.GetImageMachineInfo() +org.freedesktop.machine1.Manager.GetImageOSRelease() +org.freedesktop.machine1.Manager.GetMachine() +org.freedesktop.machine1.Manager.GetMachineAddresses() +org.freedesktop.machine1.Manager.GetMachineByPID() +org.freedesktop.machine1.Manager.GetMachineOSRelease() +org.freedesktop.machine1.Manager.GetMachineUIDShift() +org.freedesktop.machine1.Manager.KillMachine() +org.freedesktop.machine1.Manager.ListImages() +org.freedesktop.machine1.Manager.ListMachines() +org.freedesktop.machine1.Manager.MachineNew +org.freedesktop.machine1.Manager.MachineRemoved +org.freedesktop.machine1.Manager.MapFromMachineGroup() +org.freedesktop.machine1.Manager.MapFromMachineUser() +org.freedesktop.machine1.Manager.MapToMachineGroup() +org.freedesktop.machine1.Manager.MapToMachineUser() +org.freedesktop.machine1.Manager.MarkImageReadOnly() +org.freedesktop.machine1.Manager.OpenMachineLogin() +org.freedesktop.machine1.Manager.OpenMachinePTY() +org.freedesktop.machine1.Manager.OpenMachineRootDirectory() +org.freedesktop.machine1.Manager.OpenMachineShell() +org.freedesktop.machine1.Manager.PoolLimit +org.freedesktop.machine1.Manager.PoolPath +org.freedesktop.machine1.Manager.PoolUsage +org.freedesktop.machine1.Manager.RegisterMachine() +org.freedesktop.machine1.Manager.RegisterMachineWithNetwork() +org.freedesktop.machine1.Manager.RemoveImage() +org.freedesktop.machine1.Manager.RenameImage() +org.freedesktop.machine1.Manager.SetImageLimit() +org.freedesktop.machine1.Manager.SetPoolLimit() +org.freedesktop.machine1.Manager.TerminateMachine() +org.freedesktop.machine1.Manager.UnregisterMachine() +org.freedesktop.network1.DHCPServer.Leases +org.freedesktop.network1.Link.AddressState +org.freedesktop.network1.Link.AdministrativeState +org.freedesktop.network1.Link.BitRates +org.freedesktop.network1.Link.CarrierState +org.freedesktop.network1.Link.Describe() +org.freedesktop.network1.Link.ForceRenew() +org.freedesktop.network1.Link.IPv4AddressState +org.freedesktop.network1.Link.IPv6AddressState +org.freedesktop.network1.Link.OnlineState +org.freedesktop.network1.Link.OperationalState +org.freedesktop.network1.Link.Reconfigure() +org.freedesktop.network1.Link.Renew() +org.freedesktop.network1.Link.RevertDNS() +org.freedesktop.network1.Link.RevertNTP() +org.freedesktop.network1.Link.SetDNS() +org.freedesktop.network1.Link.SetDNSEx() +org.freedesktop.network1.Link.SetDNSOverTLS() +org.freedesktop.network1.Link.SetDNSSEC() +org.freedesktop.network1.Link.SetDNSSECNegativeTrustAnchors() +org.freedesktop.network1.Link.SetDefaultRoute() +org.freedesktop.network1.Link.SetDomains() +org.freedesktop.network1.Link.SetLLMNR() +org.freedesktop.network1.Link.SetMulticastDNS() +org.freedesktop.network1.Link.SetNTP() +org.freedesktop.network1.Manager.AddressState +org.freedesktop.network1.Manager.CarrierState +org.freedesktop.network1.Manager.Describe() +org.freedesktop.network1.Manager.DescribeLink() +org.freedesktop.network1.Manager.ForceRenewLink() +org.freedesktop.network1.Manager.GetLinkByIndex() +org.freedesktop.network1.Manager.GetLinkByName() +org.freedesktop.network1.Manager.IPv4AddressState +org.freedesktop.network1.Manager.IPv6AddressState +org.freedesktop.network1.Manager.ListLinks() +org.freedesktop.network1.Manager.NamespaceId +org.freedesktop.network1.Manager.OnlineState +org.freedesktop.network1.Manager.OperationalState +org.freedesktop.network1.Manager.ReconfigureLink() +org.freedesktop.network1.Manager.Reload() +org.freedesktop.network1.Manager.RenewLink() +org.freedesktop.network1.Manager.RevertLinkDNS() +org.freedesktop.network1.Manager.RevertLinkNTP() +org.freedesktop.network1.Manager.SetLinkDNS() +org.freedesktop.network1.Manager.SetLinkDNSEx() +org.freedesktop.network1.Manager.SetLinkDNSOverTLS() +org.freedesktop.network1.Manager.SetLinkDNSSEC() +org.freedesktop.network1.Manager.SetLinkDNSSECNegativeTrustAnchors() +org.freedesktop.network1.Manager.SetLinkDefaultRoute() +org.freedesktop.network1.Manager.SetLinkDomains() +org.freedesktop.network1.Manager.SetLinkLLMNR() +org.freedesktop.network1.Manager.SetLinkMulticastDNS() +org.freedesktop.network1.Manager.SetLinkNTP() +org.freedesktop.network1.Network.Description +org.freedesktop.network1.Network.MatchDriver +org.freedesktop.network1.Network.MatchMAC +org.freedesktop.network1.Network.MatchName +org.freedesktop.network1.Network.MatchPath +org.freedesktop.network1.Network.MatchType +org.freedesktop.network1.Network.SourcePath +org.freedesktop.oom1.Manager.DumpByFileDescriptor() +org.freedesktop.portable1.Image.Attach() +org.freedesktop.portable1.Image.AttachWithExtensions() +org.freedesktop.portable1.Image.CreationTimestamp +org.freedesktop.portable1.Image.Detach() +org.freedesktop.portable1.Image.DetachWithExtensions() +org.freedesktop.portable1.Image.GetMetadata() +org.freedesktop.portable1.Image.GetMetadataWithExtensions() +org.freedesktop.portable1.Image.GetOSRelease() +org.freedesktop.portable1.Image.GetState() +org.freedesktop.portable1.Image.Limit +org.freedesktop.portable1.Image.LimitExclusive +org.freedesktop.portable1.Image.MarkReadOnly() +org.freedesktop.portable1.Image.ModificationTimestamp +org.freedesktop.portable1.Image.Name +org.freedesktop.portable1.Image.Path +org.freedesktop.portable1.Image.ReadOnly +org.freedesktop.portable1.Image.Reattach() +org.freedesktop.portable1.Image.ReattacheWithExtensions() +org.freedesktop.portable1.Image.Remove() +org.freedesktop.portable1.Image.SetLimit() +org.freedesktop.portable1.Image.Type +org.freedesktop.portable1.Image.Usage +org.freedesktop.portable1.Image.UsageExclusive +org.freedesktop.portable1.Manager.AttachImage() +org.freedesktop.portable1.Manager.AttachImageWithExtensions() +org.freedesktop.portable1.Manager.DetachImage() +org.freedesktop.portable1.Manager.DetachImageWithExtensions() +org.freedesktop.portable1.Manager.GetImage() +org.freedesktop.portable1.Manager.GetImageMetadata() +org.freedesktop.portable1.Manager.GetImageMetadataWithExtensions() +org.freedesktop.portable1.Manager.GetImageOSRelease() +org.freedesktop.portable1.Manager.GetImageState() +org.freedesktop.portable1.Manager.ListImages() +org.freedesktop.portable1.Manager.MarkImageReadOnly() +org.freedesktop.portable1.Manager.PoolLimit +org.freedesktop.portable1.Manager.PoolPath +org.freedesktop.portable1.Manager.PoolUsage +org.freedesktop.portable1.Manager.Profiles +org.freedesktop.portable1.Manager.ReattachImage() +org.freedesktop.portable1.Manager.ReattachImageWithExtensions() +org.freedesktop.portable1.Manager.RemoveImage() +org.freedesktop.portable1.Manager.SetImageLimit() +org.freedesktop.portable1.Manager.SetPoolLimit() +org.freedesktop.resolve1.DnssdService.Conflicted +org.freedesktop.resolve1.DnssdService.Unregister() +org.freedesktop.resolve1.Link.CurrentDNSServer +org.freedesktop.resolve1.Link.CurrentDNSServerEx +org.freedesktop.resolve1.Link.DNS +org.freedesktop.resolve1.Link.DNSEx +org.freedesktop.resolve1.Link.DNSOverTLS +org.freedesktop.resolve1.Link.DNSSEC +org.freedesktop.resolve1.Link.DNSSECNegativeTrustAnchors +org.freedesktop.resolve1.Link.DNSSECSupported +org.freedesktop.resolve1.Link.DefaultRoute +org.freedesktop.resolve1.Link.Domains +org.freedesktop.resolve1.Link.LLMNR +org.freedesktop.resolve1.Link.MulticastDNS +org.freedesktop.resolve1.Link.Revert() +org.freedesktop.resolve1.Link.ScopesMask +org.freedesktop.resolve1.Link.SetDNS() +org.freedesktop.resolve1.Link.SetDNSEx() +org.freedesktop.resolve1.Link.SetDNSOverTLS() +org.freedesktop.resolve1.Link.SetDNSSEC() +org.freedesktop.resolve1.Link.SetDNSSECNegativeTrustAnchors() +org.freedesktop.resolve1.Link.SetDefaultRoute() +org.freedesktop.resolve1.Link.SetDomains() +org.freedesktop.resolve1.Link.SetLLMNR() +org.freedesktop.resolve1.Link.SetMulticastDNS() +org.freedesktop.resolve1.Manager.CacheStatistics +org.freedesktop.resolve1.Manager.CurrentDNSServer +org.freedesktop.resolve1.Manager.CurrentDNSServerEx +org.freedesktop.resolve1.Manager.DNS +org.freedesktop.resolve1.Manager.DNSEx +org.freedesktop.resolve1.Manager.DNSOverTLS +org.freedesktop.resolve1.Manager.DNSSEC +org.freedesktop.resolve1.Manager.DNSSECNegativeTrustAnchors +org.freedesktop.resolve1.Manager.DNSSECStatistics +org.freedesktop.resolve1.Manager.DNSSECSupported +org.freedesktop.resolve1.Manager.DNSStubListener +org.freedesktop.resolve1.Manager.Domains +org.freedesktop.resolve1.Manager.FallbackDNS +org.freedesktop.resolve1.Manager.FallbackDNSEx +org.freedesktop.resolve1.Manager.FlushCaches() +org.freedesktop.resolve1.Manager.GetLink() +org.freedesktop.resolve1.Manager.LLMNR +org.freedesktop.resolve1.Manager.LLMNRHostname +org.freedesktop.resolve1.Manager.MulticastDNS +org.freedesktop.resolve1.Manager.RegisterService() +org.freedesktop.resolve1.Manager.ResetServerFeatures() +org.freedesktop.resolve1.Manager.ResetStatistics() +org.freedesktop.resolve1.Manager.ResolvConfMode +org.freedesktop.resolve1.Manager.ResolveAddress() +org.freedesktop.resolve1.Manager.ResolveHostname() +org.freedesktop.resolve1.Manager.ResolveRecord() +org.freedesktop.resolve1.Manager.ResolveService() +org.freedesktop.resolve1.Manager.RevertLink() +org.freedesktop.resolve1.Manager.SetLinkDNS() +org.freedesktop.resolve1.Manager.SetLinkDNSEx() +org.freedesktop.resolve1.Manager.SetLinkDNSOverTLS() +org.freedesktop.resolve1.Manager.SetLinkDNSSEC() +org.freedesktop.resolve1.Manager.SetLinkDNSSECNegativeTrustAnchors() +org.freedesktop.resolve1.Manager.SetLinkDefaultRoute() +org.freedesktop.resolve1.Manager.SetLinkDomains() +org.freedesktop.resolve1.Manager.SetLinkLLMNR() +org.freedesktop.resolve1.Manager.SetLinkMulticastDNS() +org.freedesktop.resolve1.Manager.TransactionStatistics +org.freedesktop.resolve1.Manager.UnregisterService() +org.freedesktop.systemd1.Automount.DirectoryMode +org.freedesktop.systemd1.Automount.ExtraOptions +org.freedesktop.systemd1.Automount.Result +org.freedesktop.systemd1.Automount.TimeoutIdleUSec +org.freedesktop.systemd1.Automount.Where +org.freedesktop.systemd1.Device.SysFSPath +org.freedesktop.systemd1.Job.Cancel() +org.freedesktop.systemd1.Job.GetAfter() +org.freedesktop.systemd1.Job.GetBefore() +org.freedesktop.systemd1.Job.Id +org.freedesktop.systemd1.Job.JobType +org.freedesktop.systemd1.Job.State +org.freedesktop.systemd1.Job.Unit +org.freedesktop.systemd1.Manager.AbandonScope() +org.freedesktop.systemd1.Manager.AddDependencyUnitFiles() +org.freedesktop.systemd1.Manager.Architecture +org.freedesktop.systemd1.Manager.AttachProcessesToUnit() +org.freedesktop.systemd1.Manager.BindMountUnit() +org.freedesktop.systemd1.Manager.CancelJob() +org.freedesktop.systemd1.Manager.CleanUnit() +org.freedesktop.systemd1.Manager.ClearJobs() +org.freedesktop.systemd1.Manager.ConfirmSpawn +org.freedesktop.systemd1.Manager.ControlGroup +org.freedesktop.systemd1.Manager.CtrlAltDelBurstAction +org.freedesktop.systemd1.Manager.DefaultBlockIOAccounting +org.freedesktop.systemd1.Manager.DefaultCPUAccounting +org.freedesktop.systemd1.Manager.DefaultLimitAS +org.freedesktop.systemd1.Manager.DefaultLimitASSoft +org.freedesktop.systemd1.Manager.DefaultLimitCORE +org.freedesktop.systemd1.Manager.DefaultLimitCORESoft +org.freedesktop.systemd1.Manager.DefaultLimitCPU +org.freedesktop.systemd1.Manager.DefaultLimitCPUSoft +org.freedesktop.systemd1.Manager.DefaultLimitDATA +org.freedesktop.systemd1.Manager.DefaultLimitDATASoft +org.freedesktop.systemd1.Manager.DefaultLimitFSIZE +org.freedesktop.systemd1.Manager.DefaultLimitFSIZESoft +org.freedesktop.systemd1.Manager.DefaultLimitLOCKS +org.freedesktop.systemd1.Manager.DefaultLimitLOCKSSoft +org.freedesktop.systemd1.Manager.DefaultLimitMEMLOCK +org.freedesktop.systemd1.Manager.DefaultLimitMEMLOCKSoft +org.freedesktop.systemd1.Manager.DefaultLimitMSGQUEUE +org.freedesktop.systemd1.Manager.DefaultLimitMSGQUEUESoft +org.freedesktop.systemd1.Manager.DefaultLimitNICE +org.freedesktop.systemd1.Manager.DefaultLimitNICESoft +org.freedesktop.systemd1.Manager.DefaultLimitNOFILE +org.freedesktop.systemd1.Manager.DefaultLimitNOFILESoft +org.freedesktop.systemd1.Manager.DefaultLimitNPROC +org.freedesktop.systemd1.Manager.DefaultLimitNPROCSoft +org.freedesktop.systemd1.Manager.DefaultLimitRSS +org.freedesktop.systemd1.Manager.DefaultLimitRSSSoft +org.freedesktop.systemd1.Manager.DefaultLimitRTPRIO +org.freedesktop.systemd1.Manager.DefaultLimitRTPRIOSoft +org.freedesktop.systemd1.Manager.DefaultLimitRTTIME +org.freedesktop.systemd1.Manager.DefaultLimitRTTIMESoft +org.freedesktop.systemd1.Manager.DefaultLimitSIGPENDING +org.freedesktop.systemd1.Manager.DefaultLimitSIGPENDINGSoft +org.freedesktop.systemd1.Manager.DefaultLimitSTACK +org.freedesktop.systemd1.Manager.DefaultLimitSTACKSoft +org.freedesktop.systemd1.Manager.DefaultMemoryAccounting +org.freedesktop.systemd1.Manager.DefaultOOMPolicy +org.freedesktop.systemd1.Manager.DefaultOOMScoreAdjust +org.freedesktop.systemd1.Manager.DefaultRestartUSec +org.freedesktop.systemd1.Manager.DefaultStandardError +org.freedesktop.systemd1.Manager.DefaultStandardOutput +org.freedesktop.systemd1.Manager.DefaultStartLimitBurst +org.freedesktop.systemd1.Manager.DefaultStartLimitIntervalUSec +org.freedesktop.systemd1.Manager.DefaultTasksAccounting +org.freedesktop.systemd1.Manager.DefaultTasksMax +org.freedesktop.systemd1.Manager.DefaultTimeoutAbortUSec +org.freedesktop.systemd1.Manager.DefaultTimeoutStartUSec +org.freedesktop.systemd1.Manager.DefaultTimeoutStopUSec +org.freedesktop.systemd1.Manager.DefaultTimerAccuracyUSec +org.freedesktop.systemd1.Manager.DisableUnitFiles() +org.freedesktop.systemd1.Manager.DisableUnitFilesWithFlags() +org.freedesktop.systemd1.Manager.Dump() +org.freedesktop.systemd1.Manager.DumpByFileDescriptor() +org.freedesktop.systemd1.Manager.EnableUnitFiles() +org.freedesktop.systemd1.Manager.EnableUnitFilesWithFlags() +org.freedesktop.systemd1.Manager.EnqueueMarkedJobs() +org.freedesktop.systemd1.Manager.EnqueueUnitJob() +org.freedesktop.systemd1.Manager.Environment +org.freedesktop.systemd1.Manager.Exit() +org.freedesktop.systemd1.Manager.ExitCode +org.freedesktop.systemd1.Manager.Features +org.freedesktop.systemd1.Manager.FinishTimestamp +org.freedesktop.systemd1.Manager.FinishTimestampMonotonic +org.freedesktop.systemd1.Manager.FirmwareTimestamp +org.freedesktop.systemd1.Manager.FirmwareTimestampMonotonic +org.freedesktop.systemd1.Manager.FreezeUnit() +org.freedesktop.systemd1.Manager.GeneratorsFinishTimestamp +org.freedesktop.systemd1.Manager.GeneratorsFinishTimestampMonotonic +org.freedesktop.systemd1.Manager.GeneratorsStartTimestamp +org.freedesktop.systemd1.Manager.GeneratorsStartTimestampMonotonic +org.freedesktop.systemd1.Manager.GetDefaultTarget() +org.freedesktop.systemd1.Manager.GetDynamicUsers() +org.freedesktop.systemd1.Manager.GetJob() +org.freedesktop.systemd1.Manager.GetJobAfter() +org.freedesktop.systemd1.Manager.GetJobBefore() +org.freedesktop.systemd1.Manager.GetUnit() +org.freedesktop.systemd1.Manager.GetUnitByControlGroup() +org.freedesktop.systemd1.Manager.GetUnitByInvocationID() +org.freedesktop.systemd1.Manager.GetUnitByPID() +org.freedesktop.systemd1.Manager.GetUnitFileLinks() +org.freedesktop.systemd1.Manager.GetUnitFileState() +org.freedesktop.systemd1.Manager.GetUnitProcesses() +org.freedesktop.systemd1.Manager.Halt() +org.freedesktop.systemd1.Manager.InitRDGeneratorsFinishTimestamp +org.freedesktop.systemd1.Manager.InitRDGeneratorsFinishTimestampMonotonic +org.freedesktop.systemd1.Manager.InitRDGeneratorsStartTimestamp +org.freedesktop.systemd1.Manager.InitRDGeneratorsStartTimestampMonotonic +org.freedesktop.systemd1.Manager.InitRDSecurityFinishTimestamp +org.freedesktop.systemd1.Manager.InitRDSecurityFinishTimestampMonotonic +org.freedesktop.systemd1.Manager.InitRDSecurityStartTimestamp +org.freedesktop.systemd1.Manager.InitRDSecurityStartTimestampMonotonic +org.freedesktop.systemd1.Manager.InitRDTimestamp +org.freedesktop.systemd1.Manager.InitRDTimestampMonotonic +org.freedesktop.systemd1.Manager.InitRDUnitsLoadFinishTimestamp +org.freedesktop.systemd1.Manager.InitRDUnitsLoadFinishTimestampMonotonic +org.freedesktop.systemd1.Manager.InitRDUnitsLoadStartTimestamp +org.freedesktop.systemd1.Manager.InitRDUnitsLoadStartTimestampMonotonic +org.freedesktop.systemd1.Manager.JobNew +org.freedesktop.systemd1.Manager.JobRemoved +org.freedesktop.systemd1.Manager.KExec() +org.freedesktop.systemd1.Manager.KExecWatchdogUSec +org.freedesktop.systemd1.Manager.KernelTimestamp +org.freedesktop.systemd1.Manager.KernelTimestampMonotonic +org.freedesktop.systemd1.Manager.KillUnit() +org.freedesktop.systemd1.Manager.LinkUnitFiles() +org.freedesktop.systemd1.Manager.ListJobs() +org.freedesktop.systemd1.Manager.ListUnitFiles() +org.freedesktop.systemd1.Manager.ListUnitFilesByPatterns() +org.freedesktop.systemd1.Manager.ListUnits() +org.freedesktop.systemd1.Manager.ListUnitsByNames() +org.freedesktop.systemd1.Manager.ListUnitsByPatterns() +org.freedesktop.systemd1.Manager.ListUnitsFiltered() +org.freedesktop.systemd1.Manager.LoadUnit() +org.freedesktop.systemd1.Manager.LoaderTimestamp +org.freedesktop.systemd1.Manager.LoaderTimestampMonotonic +org.freedesktop.systemd1.Manager.LogLevel +org.freedesktop.systemd1.Manager.LogTarget +org.freedesktop.systemd1.Manager.LookupDynamicUserByName() +org.freedesktop.systemd1.Manager.LookupDynamicUserByUID() +org.freedesktop.systemd1.Manager.MaskUnitFiles() +org.freedesktop.systemd1.Manager.MountImageUnit() +org.freedesktop.systemd1.Manager.NFailedJobs +org.freedesktop.systemd1.Manager.NFailedUnits +org.freedesktop.systemd1.Manager.NInstalledJobs +org.freedesktop.systemd1.Manager.NJobs +org.freedesktop.systemd1.Manager.NNames +org.freedesktop.systemd1.Manager.PowerOff() +org.freedesktop.systemd1.Manager.PresetAllUnitFiles() +org.freedesktop.systemd1.Manager.PresetUnitFiles() +org.freedesktop.systemd1.Manager.PresetUnitFilesWithMode() +org.freedesktop.systemd1.Manager.Progress +org.freedesktop.systemd1.Manager.Reboot() +org.freedesktop.systemd1.Manager.RebootWatchdogUSec +org.freedesktop.systemd1.Manager.ReenableUnitFiles() +org.freedesktop.systemd1.Manager.Reexecute() +org.freedesktop.systemd1.Manager.RefUnit() +org.freedesktop.systemd1.Manager.Reload() +org.freedesktop.systemd1.Manager.ReloadOrRestartUnit() +org.freedesktop.systemd1.Manager.ReloadOrTryRestartUnit() +org.freedesktop.systemd1.Manager.ReloadUnit() +org.freedesktop.systemd1.Manager.Reloading +org.freedesktop.systemd1.Manager.ResetFailed() +org.freedesktop.systemd1.Manager.ResetFailedUnit() +org.freedesktop.systemd1.Manager.RestartUnit() +org.freedesktop.systemd1.Manager.RevertUnitFiles() +org.freedesktop.systemd1.Manager.RuntimeWatchdogUSec +org.freedesktop.systemd1.Manager.SecurityFinishTimestamp +org.freedesktop.systemd1.Manager.SecurityFinishTimestampMonotonic +org.freedesktop.systemd1.Manager.SecurityStartTimestamp +org.freedesktop.systemd1.Manager.SecurityStartTimestampMonotonic +org.freedesktop.systemd1.Manager.ServiceWatchdogs +org.freedesktop.systemd1.Manager.SetDefaultTarget() +org.freedesktop.systemd1.Manager.SetEnvironment() +org.freedesktop.systemd1.Manager.SetExitCode() +org.freedesktop.systemd1.Manager.SetShowStatus() +org.freedesktop.systemd1.Manager.SetUnitProperties() +org.freedesktop.systemd1.Manager.ShowStatus +org.freedesktop.systemd1.Manager.StartTransientUnit() +org.freedesktop.systemd1.Manager.StartUnit() +org.freedesktop.systemd1.Manager.StartUnitReplace() +org.freedesktop.systemd1.Manager.StartUnitWithFlags() +org.freedesktop.systemd1.Manager.StartupFinished +org.freedesktop.systemd1.Manager.StopUnit() +org.freedesktop.systemd1.Manager.Subscribe() +org.freedesktop.systemd1.Manager.SwitchRoot() +org.freedesktop.systemd1.Manager.SystemState +org.freedesktop.systemd1.Manager.Tainted +org.freedesktop.systemd1.Manager.ThawUnit() +org.freedesktop.systemd1.Manager.TimerSlackNSec +org.freedesktop.systemd1.Manager.TryRestartUnit() +org.freedesktop.systemd1.Manager.UnitFilesChanged +org.freedesktop.systemd1.Manager.UnitNew +org.freedesktop.systemd1.Manager.UnitPath +org.freedesktop.systemd1.Manager.UnitRemoved +org.freedesktop.systemd1.Manager.UnitsLoadFinishTimestamp +org.freedesktop.systemd1.Manager.UnitsLoadFinishTimestampMonotonic +org.freedesktop.systemd1.Manager.UnitsLoadStartTimestamp +org.freedesktop.systemd1.Manager.UnitsLoadStartTimestampMonotonic +org.freedesktop.systemd1.Manager.UnitsLoadTimestamp +org.freedesktop.systemd1.Manager.UnitsLoadTimestampMonotonic +org.freedesktop.systemd1.Manager.UnmaskUnitFiles() +org.freedesktop.systemd1.Manager.UnrefUnit() +org.freedesktop.systemd1.Manager.UnsetAndSetEnvironment() +org.freedesktop.systemd1.Manager.UnsetEnvironment() +org.freedesktop.systemd1.Manager.Unsubscribe() +org.freedesktop.systemd1.Manager.UserspaceTimestamp +org.freedesktop.systemd1.Manager.UserspaceTimestampMonotonic +org.freedesktop.systemd1.Manager.Version +org.freedesktop.systemd1.Manager.Virtualization +org.freedesktop.systemd1.Mount.AllowedCPUs +org.freedesktop.systemd1.Mount.AllowedMemoryNodes +org.freedesktop.systemd1.Mount.AmbientCapabilities +org.freedesktop.systemd1.Mount.AppArmorProfile +org.freedesktop.systemd1.Mount.AttachProcesses() +org.freedesktop.systemd1.Mount.BPFProgram +org.freedesktop.systemd1.Mount.BindPaths +org.freedesktop.systemd1.Mount.BindReadOnlyPaths +org.freedesktop.systemd1.Mount.BlockIOAccounting +org.freedesktop.systemd1.Mount.BlockIODeviceWeight +org.freedesktop.systemd1.Mount.BlockIOReadBandwidth +org.freedesktop.systemd1.Mount.BlockIOWeight +org.freedesktop.systemd1.Mount.BlockIOWriteBandwidth +org.freedesktop.systemd1.Mount.CPUAccounting +org.freedesktop.systemd1.Mount.CPUAffinity +org.freedesktop.systemd1.Mount.CPUAffinityFromNUMA +org.freedesktop.systemd1.Mount.CPUQuotaPerSecUSec +org.freedesktop.systemd1.Mount.CPUQuotaPeriodUSec +org.freedesktop.systemd1.Mount.CPUSchedulingPolicy +org.freedesktop.systemd1.Mount.CPUSchedulingPriority +org.freedesktop.systemd1.Mount.CPUSchedulingResetOnFork +org.freedesktop.systemd1.Mount.CPUShares +org.freedesktop.systemd1.Mount.CPUUsageNSec +org.freedesktop.systemd1.Mount.CPUWeight +org.freedesktop.systemd1.Mount.CacheDirectory +org.freedesktop.systemd1.Mount.CacheDirectoryMode +org.freedesktop.systemd1.Mount.CacheDirectorySymlink +org.freedesktop.systemd1.Mount.CapabilityBoundingSet +org.freedesktop.systemd1.Mount.ConfigurationDirectory +org.freedesktop.systemd1.Mount.ConfigurationDirectoryMode +org.freedesktop.systemd1.Mount.ControlGroup +org.freedesktop.systemd1.Mount.ControlPID +org.freedesktop.systemd1.Mount.CoredumpFilter +org.freedesktop.systemd1.Mount.DefaultMemoryLow +org.freedesktop.systemd1.Mount.DefaultMemoryMin +org.freedesktop.systemd1.Mount.Delegate +org.freedesktop.systemd1.Mount.DelegateControllers +org.freedesktop.systemd1.Mount.DeviceAllow +org.freedesktop.systemd1.Mount.DevicePolicy +org.freedesktop.systemd1.Mount.DirectoryMode +org.freedesktop.systemd1.Mount.DisableControllers +org.freedesktop.systemd1.Mount.DynamicUser +org.freedesktop.systemd1.Mount.EffectiveCPUs +org.freedesktop.systemd1.Mount.EffectiveMemoryNodes +org.freedesktop.systemd1.Mount.Environment +org.freedesktop.systemd1.Mount.EnvironmentFiles +org.freedesktop.systemd1.Mount.ExecMount +org.freedesktop.systemd1.Mount.ExecPaths +org.freedesktop.systemd1.Mount.ExecRemount +org.freedesktop.systemd1.Mount.ExecSearchPath +org.freedesktop.systemd1.Mount.ExecUnmount +org.freedesktop.systemd1.Mount.ExtensionImages +org.freedesktop.systemd1.Mount.FinalKillSignal +org.freedesktop.systemd1.Mount.ForceUnmount +org.freedesktop.systemd1.Mount.GID +org.freedesktop.systemd1.Mount.GetProcesses() +org.freedesktop.systemd1.Mount.Group +org.freedesktop.systemd1.Mount.IOAccounting +org.freedesktop.systemd1.Mount.IODeviceLatencyTargetUSec +org.freedesktop.systemd1.Mount.IODeviceWeight +org.freedesktop.systemd1.Mount.IOReadBandwidthMax +org.freedesktop.systemd1.Mount.IOReadBytes +org.freedesktop.systemd1.Mount.IOReadIOPSMax +org.freedesktop.systemd1.Mount.IOReadOperations +org.freedesktop.systemd1.Mount.IOSchedulingClass +org.freedesktop.systemd1.Mount.IOSchedulingPriority +org.freedesktop.systemd1.Mount.IOWeight +org.freedesktop.systemd1.Mount.IOWriteBandwidthMax +org.freedesktop.systemd1.Mount.IOWriteBytes +org.freedesktop.systemd1.Mount.IOWriteIOPSMax +org.freedesktop.systemd1.Mount.IOWriteOperations +org.freedesktop.systemd1.Mount.IPAccounting +org.freedesktop.systemd1.Mount.IPAddressAllow +org.freedesktop.systemd1.Mount.IPAddressDeny +org.freedesktop.systemd1.Mount.IPCNamespacePath +org.freedesktop.systemd1.Mount.IPEgressBytes +org.freedesktop.systemd1.Mount.IPEgressFilterPath +org.freedesktop.systemd1.Mount.IPEgressPackets +org.freedesktop.systemd1.Mount.IPIngressBytes +org.freedesktop.systemd1.Mount.IPIngressFilterPath +org.freedesktop.systemd1.Mount.IPIngressPackets +org.freedesktop.systemd1.Mount.IgnoreSIGPIPE +org.freedesktop.systemd1.Mount.InaccessiblePaths +org.freedesktop.systemd1.Mount.KeyringMode +org.freedesktop.systemd1.Mount.KillMode +org.freedesktop.systemd1.Mount.KillSignal +org.freedesktop.systemd1.Mount.LazyUnmount +org.freedesktop.systemd1.Mount.LimitAS +org.freedesktop.systemd1.Mount.LimitASSoft +org.freedesktop.systemd1.Mount.LimitCORE +org.freedesktop.systemd1.Mount.LimitCORESoft +org.freedesktop.systemd1.Mount.LimitCPU +org.freedesktop.systemd1.Mount.LimitCPUSoft +org.freedesktop.systemd1.Mount.LimitDATA +org.freedesktop.systemd1.Mount.LimitDATASoft +org.freedesktop.systemd1.Mount.LimitFSIZE +org.freedesktop.systemd1.Mount.LimitFSIZESoft +org.freedesktop.systemd1.Mount.LimitLOCKS +org.freedesktop.systemd1.Mount.LimitLOCKSSoft +org.freedesktop.systemd1.Mount.LimitMEMLOCK +org.freedesktop.systemd1.Mount.LimitMEMLOCKSoft +org.freedesktop.systemd1.Mount.LimitMSGQUEUE +org.freedesktop.systemd1.Mount.LimitMSGQUEUESoft +org.freedesktop.systemd1.Mount.LimitNICE +org.freedesktop.systemd1.Mount.LimitNICESoft +org.freedesktop.systemd1.Mount.LimitNOFILE +org.freedesktop.systemd1.Mount.LimitNOFILESoft +org.freedesktop.systemd1.Mount.LimitNPROC +org.freedesktop.systemd1.Mount.LimitNPROCSoft +org.freedesktop.systemd1.Mount.LimitRSS +org.freedesktop.systemd1.Mount.LimitRSSSoft +org.freedesktop.systemd1.Mount.LimitRTPRIO +org.freedesktop.systemd1.Mount.LimitRTPRIOSoft +org.freedesktop.systemd1.Mount.LimitRTTIME +org.freedesktop.systemd1.Mount.LimitRTTIMESoft +org.freedesktop.systemd1.Mount.LimitSIGPENDING +org.freedesktop.systemd1.Mount.LimitSIGPENDINGSoft +org.freedesktop.systemd1.Mount.LimitSTACK +org.freedesktop.systemd1.Mount.LimitSTACKSoft +org.freedesktop.systemd1.Mount.LoadCredential +org.freedesktop.systemd1.Mount.LoadCredentialEncrypted +org.freedesktop.systemd1.Mount.LockPersonality +org.freedesktop.systemd1.Mount.LogExtraFields +org.freedesktop.systemd1.Mount.LogLevelMax +org.freedesktop.systemd1.Mount.LogNamespace +org.freedesktop.systemd1.Mount.LogRateLimitBurst +org.freedesktop.systemd1.Mount.LogRateLimitIntervalUSec +org.freedesktop.systemd1.Mount.LogsDirectory +org.freedesktop.systemd1.Mount.LogsDirectoryMode +org.freedesktop.systemd1.Mount.LogsDirectorySymlink +org.freedesktop.systemd1.Mount.ManagedOOMMemoryPressure +org.freedesktop.systemd1.Mount.ManagedOOMMemoryPressureLimit +org.freedesktop.systemd1.Mount.ManagedOOMPreference +org.freedesktop.systemd1.Mount.ManagedOOMSwap +org.freedesktop.systemd1.Mount.MemoryAccounting +org.freedesktop.systemd1.Mount.MemoryAvailable +org.freedesktop.systemd1.Mount.MemoryCurrent +org.freedesktop.systemd1.Mount.MemoryDenyWriteExecute +org.freedesktop.systemd1.Mount.MemoryHigh +org.freedesktop.systemd1.Mount.MemoryLimit +org.freedesktop.systemd1.Mount.MemoryLow +org.freedesktop.systemd1.Mount.MemoryMax +org.freedesktop.systemd1.Mount.MemoryMin +org.freedesktop.systemd1.Mount.MemorySwapMax +org.freedesktop.systemd1.Mount.MountAPIVFS +org.freedesktop.systemd1.Mount.MountFlags +org.freedesktop.systemd1.Mount.MountImages +org.freedesktop.systemd1.Mount.NUMAMask +org.freedesktop.systemd1.Mount.NUMAPolicy +org.freedesktop.systemd1.Mount.NetworkNamespacePath +org.freedesktop.systemd1.Mount.Nice +org.freedesktop.systemd1.Mount.NoExecPaths +org.freedesktop.systemd1.Mount.NoNewPrivileges +org.freedesktop.systemd1.Mount.NonBlocking +org.freedesktop.systemd1.Mount.OOMScoreAdjust +org.freedesktop.systemd1.Mount.Options +org.freedesktop.systemd1.Mount.PAMName +org.freedesktop.systemd1.Mount.PassEnvironment +org.freedesktop.systemd1.Mount.Personality +org.freedesktop.systemd1.Mount.PrivateDevices +org.freedesktop.systemd1.Mount.PrivateIPC +org.freedesktop.systemd1.Mount.PrivateMounts +org.freedesktop.systemd1.Mount.PrivateNetwork +org.freedesktop.systemd1.Mount.PrivateTmp +org.freedesktop.systemd1.Mount.PrivateUsers +org.freedesktop.systemd1.Mount.ProcSubset +org.freedesktop.systemd1.Mount.ProtectClock +org.freedesktop.systemd1.Mount.ProtectControlGroups +org.freedesktop.systemd1.Mount.ProtectHome +org.freedesktop.systemd1.Mount.ProtectHostname +org.freedesktop.systemd1.Mount.ProtectKernelLogs +org.freedesktop.systemd1.Mount.ProtectKernelModules +org.freedesktop.systemd1.Mount.ProtectKernelTunables +org.freedesktop.systemd1.Mount.ProtectProc +org.freedesktop.systemd1.Mount.ProtectSystem +org.freedesktop.systemd1.Mount.ReadOnlyPaths +org.freedesktop.systemd1.Mount.ReadWriteOnly +org.freedesktop.systemd1.Mount.ReadWritePaths +org.freedesktop.systemd1.Mount.RemoveIPC +org.freedesktop.systemd1.Mount.RestartKillSignal +org.freedesktop.systemd1.Mount.RestrictAddressFamilies +org.freedesktop.systemd1.Mount.RestrictFileSystems +org.freedesktop.systemd1.Mount.RestrictNamespaces +org.freedesktop.systemd1.Mount.RestrictNetworkInterfaces +org.freedesktop.systemd1.Mount.RestrictRealtime +org.freedesktop.systemd1.Mount.RestrictSUIDSGID +org.freedesktop.systemd1.Mount.Result +org.freedesktop.systemd1.Mount.RootDirectory +org.freedesktop.systemd1.Mount.RootHash +org.freedesktop.systemd1.Mount.RootHashPath +org.freedesktop.systemd1.Mount.RootHashSignature +org.freedesktop.systemd1.Mount.RootHashSignaturePath +org.freedesktop.systemd1.Mount.RootImage +org.freedesktop.systemd1.Mount.RootImageOptions +org.freedesktop.systemd1.Mount.RootVerity +org.freedesktop.systemd1.Mount.RuntimeDirectory +org.freedesktop.systemd1.Mount.RuntimeDirectoryMode +org.freedesktop.systemd1.Mount.RuntimeDirectoryPreserve +org.freedesktop.systemd1.Mount.RuntimeDirectorySymlink +org.freedesktop.systemd1.Mount.SELinuxContext +org.freedesktop.systemd1.Mount.SameProcessGroup +org.freedesktop.systemd1.Mount.SecureBits +org.freedesktop.systemd1.Mount.SendSIGHUP +org.freedesktop.systemd1.Mount.SendSIGKILL +org.freedesktop.systemd1.Mount.SetCredential +org.freedesktop.systemd1.Mount.SetCredentialEncrypted +org.freedesktop.systemd1.Mount.Slice +org.freedesktop.systemd1.Mount.SloppyOptions +org.freedesktop.systemd1.Mount.SmackProcessLabel +org.freedesktop.systemd1.Mount.SocketBindAllow +org.freedesktop.systemd1.Mount.SocketBindDeny +org.freedesktop.systemd1.Mount.StandardError +org.freedesktop.systemd1.Mount.StandardErrorFileDescriptorName +org.freedesktop.systemd1.Mount.StandardInput +org.freedesktop.systemd1.Mount.StandardInputData +org.freedesktop.systemd1.Mount.StandardInputFileDescriptorName +org.freedesktop.systemd1.Mount.StandardOutput +org.freedesktop.systemd1.Mount.StandardOutputFileDescriptorName +org.freedesktop.systemd1.Mount.StartupAllowedCPUs +org.freedesktop.systemd1.Mount.StartupAllowedMemoryNodes +org.freedesktop.systemd1.Mount.StartupBlockIOWeight +org.freedesktop.systemd1.Mount.StartupCPUShares +org.freedesktop.systemd1.Mount.StartupCPUWeight +org.freedesktop.systemd1.Mount.StartupIOWeight +org.freedesktop.systemd1.Mount.StateDirectory +org.freedesktop.systemd1.Mount.StateDirectoryMode +org.freedesktop.systemd1.Mount.StateDirectorySymlink +org.freedesktop.systemd1.Mount.SupplementaryGroups +org.freedesktop.systemd1.Mount.SyslogFacility +org.freedesktop.systemd1.Mount.SyslogIdentifier +org.freedesktop.systemd1.Mount.SyslogLevel +org.freedesktop.systemd1.Mount.SyslogLevelPrefix +org.freedesktop.systemd1.Mount.SyslogPriority +org.freedesktop.systemd1.Mount.SystemCallArchitectures +org.freedesktop.systemd1.Mount.SystemCallErrorNumber +org.freedesktop.systemd1.Mount.SystemCallFilter +org.freedesktop.systemd1.Mount.SystemCallLog +org.freedesktop.systemd1.Mount.TTYColumns +org.freedesktop.systemd1.Mount.TTYPath +org.freedesktop.systemd1.Mount.TTYReset +org.freedesktop.systemd1.Mount.TTYRows +org.freedesktop.systemd1.Mount.TTYVHangup +org.freedesktop.systemd1.Mount.TTYVTDisallocate +org.freedesktop.systemd1.Mount.TasksAccounting +org.freedesktop.systemd1.Mount.TasksCurrent +org.freedesktop.systemd1.Mount.TasksMax +org.freedesktop.systemd1.Mount.TemporaryFileSystem +org.freedesktop.systemd1.Mount.TimeoutCleanUSec +org.freedesktop.systemd1.Mount.TimeoutUSec +org.freedesktop.systemd1.Mount.TimerSlackNSec +org.freedesktop.systemd1.Mount.Type +org.freedesktop.systemd1.Mount.UID +org.freedesktop.systemd1.Mount.UMask +org.freedesktop.systemd1.Mount.UnsetEnvironment +org.freedesktop.systemd1.Mount.User +org.freedesktop.systemd1.Mount.UtmpIdentifier +org.freedesktop.systemd1.Mount.UtmpMode +org.freedesktop.systemd1.Mount.WatchdogSignal +org.freedesktop.systemd1.Mount.What +org.freedesktop.systemd1.Mount.Where +org.freedesktop.systemd1.Mount.WorkingDirectory +org.freedesktop.systemd1.Path.DirectoryMode +org.freedesktop.systemd1.Path.MakeDirectory +org.freedesktop.systemd1.Path.Paths +org.freedesktop.systemd1.Path.Result +org.freedesktop.systemd1.Path.TriggerLimitBurst +org.freedesktop.systemd1.Path.TriggerLimitIntervalUSec +org.freedesktop.systemd1.Path.Unit +org.freedesktop.systemd1.Scope.Abandon() +org.freedesktop.systemd1.Scope.AllowedCPUs +org.freedesktop.systemd1.Scope.AllowedMemoryNodes +org.freedesktop.systemd1.Scope.AttachProcesses() +org.freedesktop.systemd1.Scope.BPFProgram +org.freedesktop.systemd1.Scope.BlockIOAccounting +org.freedesktop.systemd1.Scope.BlockIODeviceWeight +org.freedesktop.systemd1.Scope.BlockIOReadBandwidth +org.freedesktop.systemd1.Scope.BlockIOWeight +org.freedesktop.systemd1.Scope.BlockIOWriteBandwidth +org.freedesktop.systemd1.Scope.CPUAccounting +org.freedesktop.systemd1.Scope.CPUQuotaPerSecUSec +org.freedesktop.systemd1.Scope.CPUQuotaPeriodUSec +org.freedesktop.systemd1.Scope.CPUShares +org.freedesktop.systemd1.Scope.CPUUsageNSec +org.freedesktop.systemd1.Scope.CPUWeight +org.freedesktop.systemd1.Scope.ControlGroup +org.freedesktop.systemd1.Scope.Controller +org.freedesktop.systemd1.Scope.DefaultMemoryLow +org.freedesktop.systemd1.Scope.DefaultMemoryMin +org.freedesktop.systemd1.Scope.Delegate +org.freedesktop.systemd1.Scope.DelegateControllers +org.freedesktop.systemd1.Scope.DeviceAllow +org.freedesktop.systemd1.Scope.DevicePolicy +org.freedesktop.systemd1.Scope.DisableControllers +org.freedesktop.systemd1.Scope.EffectiveCPUs +org.freedesktop.systemd1.Scope.EffectiveMemoryNodes +org.freedesktop.systemd1.Scope.FinalKillSignal +org.freedesktop.systemd1.Scope.GetProcesses() +org.freedesktop.systemd1.Scope.IOAccounting +org.freedesktop.systemd1.Scope.IODeviceLatencyTargetUSec +org.freedesktop.systemd1.Scope.IODeviceWeight +org.freedesktop.systemd1.Scope.IOReadBandwidthMax +org.freedesktop.systemd1.Scope.IOReadBytes +org.freedesktop.systemd1.Scope.IOReadIOPSMax +org.freedesktop.systemd1.Scope.IOReadOperations +org.freedesktop.systemd1.Scope.IOWeight +org.freedesktop.systemd1.Scope.IOWriteBandwidthMax +org.freedesktop.systemd1.Scope.IOWriteBytes +org.freedesktop.systemd1.Scope.IOWriteIOPSMax +org.freedesktop.systemd1.Scope.IOWriteOperations +org.freedesktop.systemd1.Scope.IPAccounting +org.freedesktop.systemd1.Scope.IPAddressAllow +org.freedesktop.systemd1.Scope.IPAddressDeny +org.freedesktop.systemd1.Scope.IPEgressBytes +org.freedesktop.systemd1.Scope.IPEgressFilterPath +org.freedesktop.systemd1.Scope.IPEgressPackets +org.freedesktop.systemd1.Scope.IPIngressBytes +org.freedesktop.systemd1.Scope.IPIngressFilterPath +org.freedesktop.systemd1.Scope.IPIngressPackets +org.freedesktop.systemd1.Scope.KillMode +org.freedesktop.systemd1.Scope.KillSignal +org.freedesktop.systemd1.Scope.ManagedOOMMemoryPressure +org.freedesktop.systemd1.Scope.ManagedOOMMemoryPressureLimit +org.freedesktop.systemd1.Scope.ManagedOOMPreference +org.freedesktop.systemd1.Scope.ManagedOOMSwap +org.freedesktop.systemd1.Scope.MemoryAccounting +org.freedesktop.systemd1.Scope.MemoryAvailable +org.freedesktop.systemd1.Scope.MemoryCurrent +org.freedesktop.systemd1.Scope.MemoryHigh +org.freedesktop.systemd1.Scope.MemoryLimit +org.freedesktop.systemd1.Scope.MemoryLow +org.freedesktop.systemd1.Scope.MemoryMax +org.freedesktop.systemd1.Scope.MemoryMin +org.freedesktop.systemd1.Scope.MemorySwapMax +org.freedesktop.systemd1.Scope.RequestStop +org.freedesktop.systemd1.Scope.RestartKillSignal +org.freedesktop.systemd1.Scope.RestrictNetworkInterfaces +org.freedesktop.systemd1.Scope.Result +org.freedesktop.systemd1.Scope.RuntimeMaxUSec +org.freedesktop.systemd1.Scope.RuntimeRandomizedExtraUSec +org.freedesktop.systemd1.Scope.SendSIGHUP +org.freedesktop.systemd1.Scope.SendSIGKILL +org.freedesktop.systemd1.Scope.Slice +org.freedesktop.systemd1.Scope.SocketBindAllow +org.freedesktop.systemd1.Scope.SocketBindDeny +org.freedesktop.systemd1.Scope.StartupAllowedCPUs +org.freedesktop.systemd1.Scope.StartupAllowedMemoryNodes +org.freedesktop.systemd1.Scope.StartupBlockIOWeight +org.freedesktop.systemd1.Scope.StartupCPUShares +org.freedesktop.systemd1.Scope.StartupCPUWeight +org.freedesktop.systemd1.Scope.StartupIOWeight +org.freedesktop.systemd1.Scope.TasksAccounting +org.freedesktop.systemd1.Scope.TasksCurrent +org.freedesktop.systemd1.Scope.TasksMax +org.freedesktop.systemd1.Scope.TimeoutStopUSec +org.freedesktop.systemd1.Scope.WatchdogSignal +org.freedesktop.systemd1.Service.AllowedCPUs +org.freedesktop.systemd1.Service.AllowedMemoryNodes +org.freedesktop.systemd1.Service.AmbientCapabilities +org.freedesktop.systemd1.Service.AppArmorProfile +org.freedesktop.systemd1.Service.AttachProcesses() +org.freedesktop.systemd1.Service.BPFProgram +org.freedesktop.systemd1.Service.BindMount() +org.freedesktop.systemd1.Service.BindPaths +org.freedesktop.systemd1.Service.BindReadOnlyPaths +org.freedesktop.systemd1.Service.BlockIOAccounting +org.freedesktop.systemd1.Service.BlockIODeviceWeight +org.freedesktop.systemd1.Service.BlockIOReadBandwidth +org.freedesktop.systemd1.Service.BlockIOWeight +org.freedesktop.systemd1.Service.BlockIOWriteBandwidth +org.freedesktop.systemd1.Service.BusName +org.freedesktop.systemd1.Service.CPUAccounting +org.freedesktop.systemd1.Service.CPUAffinity +org.freedesktop.systemd1.Service.CPUAffinityFromNUMA +org.freedesktop.systemd1.Service.CPUQuotaPerSecUSec +org.freedesktop.systemd1.Service.CPUQuotaPeriodUSec +org.freedesktop.systemd1.Service.CPUSchedulingPolicy +org.freedesktop.systemd1.Service.CPUSchedulingPriority +org.freedesktop.systemd1.Service.CPUSchedulingResetOnFork +org.freedesktop.systemd1.Service.CPUShares +org.freedesktop.systemd1.Service.CPUUsageNSec +org.freedesktop.systemd1.Service.CPUWeight +org.freedesktop.systemd1.Service.CacheDirectory +org.freedesktop.systemd1.Service.CacheDirectoryMode +org.freedesktop.systemd1.Service.CacheDirectorySymlink +org.freedesktop.systemd1.Service.CapabilityBoundingSet +org.freedesktop.systemd1.Service.CleanResult +org.freedesktop.systemd1.Service.ConfigurationDirectory +org.freedesktop.systemd1.Service.ConfigurationDirectoryMode +org.freedesktop.systemd1.Service.ControlGroup +org.freedesktop.systemd1.Service.ControlPID +org.freedesktop.systemd1.Service.CoredumpFilter +org.freedesktop.systemd1.Service.DefaultMemoryLow +org.freedesktop.systemd1.Service.DefaultMemoryMin +org.freedesktop.systemd1.Service.Delegate +org.freedesktop.systemd1.Service.DelegateControllers +org.freedesktop.systemd1.Service.DeviceAllow +org.freedesktop.systemd1.Service.DevicePolicy +org.freedesktop.systemd1.Service.DisableControllers +org.freedesktop.systemd1.Service.DynamicUser +org.freedesktop.systemd1.Service.EffectiveCPUs +org.freedesktop.systemd1.Service.EffectiveMemoryNodes +org.freedesktop.systemd1.Service.Environment +org.freedesktop.systemd1.Service.EnvironmentFiles +org.freedesktop.systemd1.Service.ExecCondition +org.freedesktop.systemd1.Service.ExecConditionEx +org.freedesktop.systemd1.Service.ExecMainCode +org.freedesktop.systemd1.Service.ExecMainExitTimestamp +org.freedesktop.systemd1.Service.ExecMainExitTimestampMonotonic +org.freedesktop.systemd1.Service.ExecMainPID +org.freedesktop.systemd1.Service.ExecMainStartTimestamp +org.freedesktop.systemd1.Service.ExecMainStartTimestampMonotonic +org.freedesktop.systemd1.Service.ExecMainStatus +org.freedesktop.systemd1.Service.ExecPaths +org.freedesktop.systemd1.Service.ExecReload +org.freedesktop.systemd1.Service.ExecReloadEx +org.freedesktop.systemd1.Service.ExecSearchPath +org.freedesktop.systemd1.Service.ExecStart +org.freedesktop.systemd1.Service.ExecStartEx +org.freedesktop.systemd1.Service.ExecStartPost +org.freedesktop.systemd1.Service.ExecStartPostEx +org.freedesktop.systemd1.Service.ExecStartPre +org.freedesktop.systemd1.Service.ExecStartPreEx +org.freedesktop.systemd1.Service.ExecStop +org.freedesktop.systemd1.Service.ExecStopEx +org.freedesktop.systemd1.Service.ExecStopPost +org.freedesktop.systemd1.Service.ExecStopPostEx +org.freedesktop.systemd1.Service.ExitType +org.freedesktop.systemd1.Service.ExtensionImages +org.freedesktop.systemd1.Service.FileDescriptorStoreMax +org.freedesktop.systemd1.Service.FinalKillSignal +org.freedesktop.systemd1.Service.GID +org.freedesktop.systemd1.Service.GetProcesses() +org.freedesktop.systemd1.Service.Group +org.freedesktop.systemd1.Service.GuessMainPID +org.freedesktop.systemd1.Service.IOAccounting +org.freedesktop.systemd1.Service.IODeviceLatencyTargetUSec +org.freedesktop.systemd1.Service.IODeviceWeight +org.freedesktop.systemd1.Service.IOReadBandwidthMax +org.freedesktop.systemd1.Service.IOReadBytes +org.freedesktop.systemd1.Service.IOReadIOPSMax +org.freedesktop.systemd1.Service.IOReadOperations +org.freedesktop.systemd1.Service.IOSchedulingClass +org.freedesktop.systemd1.Service.IOSchedulingPriority +org.freedesktop.systemd1.Service.IOWeight +org.freedesktop.systemd1.Service.IOWriteBandwidthMax +org.freedesktop.systemd1.Service.IOWriteBytes +org.freedesktop.systemd1.Service.IOWriteIOPSMax +org.freedesktop.systemd1.Service.IOWriteOperations +org.freedesktop.systemd1.Service.IPAccounting +org.freedesktop.systemd1.Service.IPAddressAllow +org.freedesktop.systemd1.Service.IPAddressDeny +org.freedesktop.systemd1.Service.IPCNamespacePath +org.freedesktop.systemd1.Service.IPEgressBytes +org.freedesktop.systemd1.Service.IPEgressFilterPath +org.freedesktop.systemd1.Service.IPEgressPackets +org.freedesktop.systemd1.Service.IPIngressBytes +org.freedesktop.systemd1.Service.IPIngressFilterPath +org.freedesktop.systemd1.Service.IPIngressPackets +org.freedesktop.systemd1.Service.IgnoreSIGPIPE +org.freedesktop.systemd1.Service.InaccessiblePaths +org.freedesktop.systemd1.Service.KeyringMode +org.freedesktop.systemd1.Service.KillMode +org.freedesktop.systemd1.Service.KillSignal +org.freedesktop.systemd1.Service.LimitAS +org.freedesktop.systemd1.Service.LimitASSoft +org.freedesktop.systemd1.Service.LimitCORE +org.freedesktop.systemd1.Service.LimitCORESoft +org.freedesktop.systemd1.Service.LimitCPU +org.freedesktop.systemd1.Service.LimitCPUSoft +org.freedesktop.systemd1.Service.LimitDATA +org.freedesktop.systemd1.Service.LimitDATASoft +org.freedesktop.systemd1.Service.LimitFSIZE +org.freedesktop.systemd1.Service.LimitFSIZESoft +org.freedesktop.systemd1.Service.LimitLOCKS +org.freedesktop.systemd1.Service.LimitLOCKSSoft +org.freedesktop.systemd1.Service.LimitMEMLOCK +org.freedesktop.systemd1.Service.LimitMEMLOCKSoft +org.freedesktop.systemd1.Service.LimitMSGQUEUE +org.freedesktop.systemd1.Service.LimitMSGQUEUESoft +org.freedesktop.systemd1.Service.LimitNICE +org.freedesktop.systemd1.Service.LimitNICESoft +org.freedesktop.systemd1.Service.LimitNOFILE +org.freedesktop.systemd1.Service.LimitNOFILESoft +org.freedesktop.systemd1.Service.LimitNPROC +org.freedesktop.systemd1.Service.LimitNPROCSoft +org.freedesktop.systemd1.Service.LimitRSS +org.freedesktop.systemd1.Service.LimitRSSSoft +org.freedesktop.systemd1.Service.LimitRTPRIO +org.freedesktop.systemd1.Service.LimitRTPRIOSoft +org.freedesktop.systemd1.Service.LimitRTTIME +org.freedesktop.systemd1.Service.LimitRTTIMESoft +org.freedesktop.systemd1.Service.LimitSIGPENDING +org.freedesktop.systemd1.Service.LimitSIGPENDINGSoft +org.freedesktop.systemd1.Service.LimitSTACK +org.freedesktop.systemd1.Service.LimitSTACKSoft +org.freedesktop.systemd1.Service.LoadCredential +org.freedesktop.systemd1.Service.LoadCredentialEncrypted +org.freedesktop.systemd1.Service.LockPersonality +org.freedesktop.systemd1.Service.LogExtraFields +org.freedesktop.systemd1.Service.LogLevelMax +org.freedesktop.systemd1.Service.LogNamespace +org.freedesktop.systemd1.Service.LogRateLimitBurst +org.freedesktop.systemd1.Service.LogRateLimitIntervalUSec +org.freedesktop.systemd1.Service.LogsDirectory +org.freedesktop.systemd1.Service.LogsDirectoryMode +org.freedesktop.systemd1.Service.LogsDirectorySymlink +org.freedesktop.systemd1.Service.MainPID +org.freedesktop.systemd1.Service.ManagedOOMMemoryPressure +org.freedesktop.systemd1.Service.ManagedOOMMemoryPressureLimit +org.freedesktop.systemd1.Service.ManagedOOMPreference +org.freedesktop.systemd1.Service.ManagedOOMSwap +org.freedesktop.systemd1.Service.MemoryAccounting +org.freedesktop.systemd1.Service.MemoryAvailable +org.freedesktop.systemd1.Service.MemoryCurrent +org.freedesktop.systemd1.Service.MemoryDenyWriteExecute +org.freedesktop.systemd1.Service.MemoryHigh +org.freedesktop.systemd1.Service.MemoryLimit +org.freedesktop.systemd1.Service.MemoryLow +org.freedesktop.systemd1.Service.MemoryMax +org.freedesktop.systemd1.Service.MemoryMin +org.freedesktop.systemd1.Service.MemorySwapMax +org.freedesktop.systemd1.Service.MountAPIVFS +org.freedesktop.systemd1.Service.MountFlags +org.freedesktop.systemd1.Service.MountImage() +org.freedesktop.systemd1.Service.MountImages +org.freedesktop.systemd1.Service.NFileDescriptorStore +org.freedesktop.systemd1.Service.NRestarts +org.freedesktop.systemd1.Service.NUMAMask +org.freedesktop.systemd1.Service.NUMAPolicy +org.freedesktop.systemd1.Service.NetworkNamespacePath +org.freedesktop.systemd1.Service.Nice +org.freedesktop.systemd1.Service.NoExecPaths +org.freedesktop.systemd1.Service.NoNewPrivileges +org.freedesktop.systemd1.Service.NonBlocking +org.freedesktop.systemd1.Service.NotifyAccess +org.freedesktop.systemd1.Service.OOMPolicy +org.freedesktop.systemd1.Service.OOMScoreAdjust +org.freedesktop.systemd1.Service.PAMName +org.freedesktop.systemd1.Service.PIDFile +org.freedesktop.systemd1.Service.PassEnvironment +org.freedesktop.systemd1.Service.Personality +org.freedesktop.systemd1.Service.PrivateDevices +org.freedesktop.systemd1.Service.PrivateIPC +org.freedesktop.systemd1.Service.PrivateMounts +org.freedesktop.systemd1.Service.PrivateNetwork +org.freedesktop.systemd1.Service.PrivateTmp +org.freedesktop.systemd1.Service.PrivateUsers +org.freedesktop.systemd1.Service.ProcSubset +org.freedesktop.systemd1.Service.ProtectClock +org.freedesktop.systemd1.Service.ProtectControlGroups +org.freedesktop.systemd1.Service.ProtectHome +org.freedesktop.systemd1.Service.ProtectHostname +org.freedesktop.systemd1.Service.ProtectKernelLogs +org.freedesktop.systemd1.Service.ProtectKernelModules +org.freedesktop.systemd1.Service.ProtectKernelTunables +org.freedesktop.systemd1.Service.ProtectProc +org.freedesktop.systemd1.Service.ProtectSystem +org.freedesktop.systemd1.Service.ReadOnlyPaths +org.freedesktop.systemd1.Service.ReadWritePaths +org.freedesktop.systemd1.Service.ReloadResult +org.freedesktop.systemd1.Service.RemainAfterExit +org.freedesktop.systemd1.Service.RemoveIPC +org.freedesktop.systemd1.Service.Restart +org.freedesktop.systemd1.Service.RestartForceExitStatus +org.freedesktop.systemd1.Service.RestartKillSignal +org.freedesktop.systemd1.Service.RestartPreventExitStatus +org.freedesktop.systemd1.Service.RestartUSec +org.freedesktop.systemd1.Service.RestrictAddressFamilies +org.freedesktop.systemd1.Service.RestrictFileSystems +org.freedesktop.systemd1.Service.RestrictNamespaces +org.freedesktop.systemd1.Service.RestrictNetworkInterfaces +org.freedesktop.systemd1.Service.RestrictRealtime +org.freedesktop.systemd1.Service.RestrictSUIDSGID +org.freedesktop.systemd1.Service.Result +org.freedesktop.systemd1.Service.RootDirectory +org.freedesktop.systemd1.Service.RootDirectoryStartOnly +org.freedesktop.systemd1.Service.RootHash +org.freedesktop.systemd1.Service.RootHashPath +org.freedesktop.systemd1.Service.RootHashSignature +org.freedesktop.systemd1.Service.RootHashSignaturePath +org.freedesktop.systemd1.Service.RootImage +org.freedesktop.systemd1.Service.RootImageOptions +org.freedesktop.systemd1.Service.RootVerity +org.freedesktop.systemd1.Service.RuntimeDirectory +org.freedesktop.systemd1.Service.RuntimeDirectoryMode +org.freedesktop.systemd1.Service.RuntimeDirectoryPreserve +org.freedesktop.systemd1.Service.RuntimeDirectorySymlink +org.freedesktop.systemd1.Service.RuntimeMaxUSec +org.freedesktop.systemd1.Service.RuntimeRandomizedExtraUSec +org.freedesktop.systemd1.Service.SELinuxContext +org.freedesktop.systemd1.Service.SameProcessGroup +org.freedesktop.systemd1.Service.SecureBits +org.freedesktop.systemd1.Service.SendSIGHUP +org.freedesktop.systemd1.Service.SendSIGKILL +org.freedesktop.systemd1.Service.SetCredential +org.freedesktop.systemd1.Service.SetCredentialEncrypted +org.freedesktop.systemd1.Service.Slice +org.freedesktop.systemd1.Service.SmackProcessLabel +org.freedesktop.systemd1.Service.SocketBindAllow +org.freedesktop.systemd1.Service.SocketBindDeny +org.freedesktop.systemd1.Service.StandardError +org.freedesktop.systemd1.Service.StandardErrorFileDescriptorName +org.freedesktop.systemd1.Service.StandardInput +org.freedesktop.systemd1.Service.StandardInputData +org.freedesktop.systemd1.Service.StandardInputFileDescriptorName +org.freedesktop.systemd1.Service.StandardOutput +org.freedesktop.systemd1.Service.StandardOutputFileDescriptorName +org.freedesktop.systemd1.Service.StartupAllowedCPUs +org.freedesktop.systemd1.Service.StartupAllowedMemoryNodes +org.freedesktop.systemd1.Service.StartupBlockIOWeight +org.freedesktop.systemd1.Service.StartupCPUShares +org.freedesktop.systemd1.Service.StartupCPUWeight +org.freedesktop.systemd1.Service.StartupIOWeight +org.freedesktop.systemd1.Service.StateDirectory +org.freedesktop.systemd1.Service.StateDirectoryMode +org.freedesktop.systemd1.Service.StateDirectorySymlink +org.freedesktop.systemd1.Service.StatusErrno +org.freedesktop.systemd1.Service.StatusText +org.freedesktop.systemd1.Service.SuccessExitStatus +org.freedesktop.systemd1.Service.SupplementaryGroups +org.freedesktop.systemd1.Service.SyslogFacility +org.freedesktop.systemd1.Service.SyslogIdentifier +org.freedesktop.systemd1.Service.SyslogLevel +org.freedesktop.systemd1.Service.SyslogLevelPrefix +org.freedesktop.systemd1.Service.SyslogPriority +org.freedesktop.systemd1.Service.SystemCallArchitectures +org.freedesktop.systemd1.Service.SystemCallErrorNumber +org.freedesktop.systemd1.Service.SystemCallFilter +org.freedesktop.systemd1.Service.SystemCallLog +org.freedesktop.systemd1.Service.TTYColumns +org.freedesktop.systemd1.Service.TTYPath +org.freedesktop.systemd1.Service.TTYReset +org.freedesktop.systemd1.Service.TTYRows +org.freedesktop.systemd1.Service.TTYVHangup +org.freedesktop.systemd1.Service.TTYVTDisallocate +org.freedesktop.systemd1.Service.TasksAccounting +org.freedesktop.systemd1.Service.TasksCurrent +org.freedesktop.systemd1.Service.TasksMax +org.freedesktop.systemd1.Service.TemporaryFileSystem +org.freedesktop.systemd1.Service.TimeoutAbortUSec +org.freedesktop.systemd1.Service.TimeoutCleanUSec +org.freedesktop.systemd1.Service.TimeoutStartFailureMode +org.freedesktop.systemd1.Service.TimeoutStartUSec +org.freedesktop.systemd1.Service.TimeoutStopFailureMode +org.freedesktop.systemd1.Service.TimeoutStopUSec +org.freedesktop.systemd1.Service.TimerSlackNSec +org.freedesktop.systemd1.Service.Type +org.freedesktop.systemd1.Service.UID +org.freedesktop.systemd1.Service.UMask +org.freedesktop.systemd1.Service.USBFunctionDescriptors +org.freedesktop.systemd1.Service.USBFunctionStrings +org.freedesktop.systemd1.Service.UnsetEnvironment +org.freedesktop.systemd1.Service.User +org.freedesktop.systemd1.Service.UtmpIdentifier +org.freedesktop.systemd1.Service.UtmpMode +org.freedesktop.systemd1.Service.WatchdogSignal +org.freedesktop.systemd1.Service.WatchdogTimestamp +org.freedesktop.systemd1.Service.WatchdogTimestampMonotonic +org.freedesktop.systemd1.Service.WatchdogUSec +org.freedesktop.systemd1.Service.WorkingDirectory +org.freedesktop.systemd1.Slice.AllowedCPUs +org.freedesktop.systemd1.Slice.AllowedMemoryNodes +org.freedesktop.systemd1.Slice.AttachProcesses() +org.freedesktop.systemd1.Slice.BPFProgram +org.freedesktop.systemd1.Slice.BlockIOAccounting +org.freedesktop.systemd1.Slice.BlockIODeviceWeight +org.freedesktop.systemd1.Slice.BlockIOReadBandwidth +org.freedesktop.systemd1.Slice.BlockIOWeight +org.freedesktop.systemd1.Slice.BlockIOWriteBandwidth +org.freedesktop.systemd1.Slice.CPUAccounting +org.freedesktop.systemd1.Slice.CPUQuotaPerSecUSec +org.freedesktop.systemd1.Slice.CPUQuotaPeriodUSec +org.freedesktop.systemd1.Slice.CPUShares +org.freedesktop.systemd1.Slice.CPUUsageNSec +org.freedesktop.systemd1.Slice.CPUWeight +org.freedesktop.systemd1.Slice.ControlGroup +org.freedesktop.systemd1.Slice.DefaultMemoryLow +org.freedesktop.systemd1.Slice.DefaultMemoryMin +org.freedesktop.systemd1.Slice.Delegate +org.freedesktop.systemd1.Slice.DelegateControllers +org.freedesktop.systemd1.Slice.DeviceAllow +org.freedesktop.systemd1.Slice.DevicePolicy +org.freedesktop.systemd1.Slice.DisableControllers +org.freedesktop.systemd1.Slice.EffectiveCPUs +org.freedesktop.systemd1.Slice.EffectiveMemoryNodes +org.freedesktop.systemd1.Slice.GetProcesses() +org.freedesktop.systemd1.Slice.IOAccounting +org.freedesktop.systemd1.Slice.IODeviceLatencyTargetUSec +org.freedesktop.systemd1.Slice.IODeviceWeight +org.freedesktop.systemd1.Slice.IOReadBandwidthMax +org.freedesktop.systemd1.Slice.IOReadBytes +org.freedesktop.systemd1.Slice.IOReadIOPSMax +org.freedesktop.systemd1.Slice.IOReadOperations +org.freedesktop.systemd1.Slice.IOWeight +org.freedesktop.systemd1.Slice.IOWriteBandwidthMax +org.freedesktop.systemd1.Slice.IOWriteBytes +org.freedesktop.systemd1.Slice.IOWriteIOPSMax +org.freedesktop.systemd1.Slice.IOWriteOperations +org.freedesktop.systemd1.Slice.IPAccounting +org.freedesktop.systemd1.Slice.IPAddressAllow +org.freedesktop.systemd1.Slice.IPAddressDeny +org.freedesktop.systemd1.Slice.IPEgressBytes +org.freedesktop.systemd1.Slice.IPEgressFilterPath +org.freedesktop.systemd1.Slice.IPEgressPackets +org.freedesktop.systemd1.Slice.IPIngressBytes +org.freedesktop.systemd1.Slice.IPIngressFilterPath +org.freedesktop.systemd1.Slice.IPIngressPackets +org.freedesktop.systemd1.Slice.ManagedOOMMemoryPressure +org.freedesktop.systemd1.Slice.ManagedOOMMemoryPressureLimit +org.freedesktop.systemd1.Slice.ManagedOOMPreference +org.freedesktop.systemd1.Slice.ManagedOOMSwap +org.freedesktop.systemd1.Slice.MemoryAccounting +org.freedesktop.systemd1.Slice.MemoryAvailable +org.freedesktop.systemd1.Slice.MemoryCurrent +org.freedesktop.systemd1.Slice.MemoryHigh +org.freedesktop.systemd1.Slice.MemoryLimit +org.freedesktop.systemd1.Slice.MemoryLow +org.freedesktop.systemd1.Slice.MemoryMax +org.freedesktop.systemd1.Slice.MemoryMin +org.freedesktop.systemd1.Slice.MemorySwapMax +org.freedesktop.systemd1.Slice.RestrictNetworkInterfaces +org.freedesktop.systemd1.Slice.Slice +org.freedesktop.systemd1.Slice.SocketBindAllow +org.freedesktop.systemd1.Slice.SocketBindDeny +org.freedesktop.systemd1.Slice.StartupAllowedCPUs +org.freedesktop.systemd1.Slice.StartupAllowedMemoryNodes +org.freedesktop.systemd1.Slice.StartupBlockIOWeight +org.freedesktop.systemd1.Slice.StartupCPUShares +org.freedesktop.systemd1.Slice.StartupCPUWeight +org.freedesktop.systemd1.Slice.StartupIOWeight +org.freedesktop.systemd1.Slice.TasksAccounting +org.freedesktop.systemd1.Slice.TasksCurrent +org.freedesktop.systemd1.Slice.TasksMax +org.freedesktop.systemd1.Socket.Accept +org.freedesktop.systemd1.Socket.AllowedCPUs +org.freedesktop.systemd1.Socket.AllowedMemoryNodes +org.freedesktop.systemd1.Socket.AmbientCapabilities +org.freedesktop.systemd1.Socket.AppArmorProfile +org.freedesktop.systemd1.Socket.AttachProcesses() +org.freedesktop.systemd1.Socket.BPFProgram +org.freedesktop.systemd1.Socket.Backlog +org.freedesktop.systemd1.Socket.BindIPv6Only +org.freedesktop.systemd1.Socket.BindPaths +org.freedesktop.systemd1.Socket.BindReadOnlyPaths +org.freedesktop.systemd1.Socket.BindToDevice +org.freedesktop.systemd1.Socket.BlockIOAccounting +org.freedesktop.systemd1.Socket.BlockIODeviceWeight +org.freedesktop.systemd1.Socket.BlockIOReadBandwidth +org.freedesktop.systemd1.Socket.BlockIOWeight +org.freedesktop.systemd1.Socket.BlockIOWriteBandwidth +org.freedesktop.systemd1.Socket.Broadcast +org.freedesktop.systemd1.Socket.CPUAccounting +org.freedesktop.systemd1.Socket.CPUAffinity +org.freedesktop.systemd1.Socket.CPUAffinityFromNUMA +org.freedesktop.systemd1.Socket.CPUQuotaPerSecUSec +org.freedesktop.systemd1.Socket.CPUQuotaPeriodUSec +org.freedesktop.systemd1.Socket.CPUSchedulingPolicy +org.freedesktop.systemd1.Socket.CPUSchedulingPriority +org.freedesktop.systemd1.Socket.CPUSchedulingResetOnFork +org.freedesktop.systemd1.Socket.CPUShares +org.freedesktop.systemd1.Socket.CPUUsageNSec +org.freedesktop.systemd1.Socket.CPUWeight +org.freedesktop.systemd1.Socket.CacheDirectory +org.freedesktop.systemd1.Socket.CacheDirectoryMode +org.freedesktop.systemd1.Socket.CacheDirectorySymlink +org.freedesktop.systemd1.Socket.CapabilityBoundingSet +org.freedesktop.systemd1.Socket.ConfigurationDirectory +org.freedesktop.systemd1.Socket.ConfigurationDirectoryMode +org.freedesktop.systemd1.Socket.ControlGroup +org.freedesktop.systemd1.Socket.ControlPID +org.freedesktop.systemd1.Socket.CoredumpFilter +org.freedesktop.systemd1.Socket.DefaultMemoryLow +org.freedesktop.systemd1.Socket.DefaultMemoryMin +org.freedesktop.systemd1.Socket.DeferAcceptUSec +org.freedesktop.systemd1.Socket.Delegate +org.freedesktop.systemd1.Socket.DelegateControllers +org.freedesktop.systemd1.Socket.DeviceAllow +org.freedesktop.systemd1.Socket.DevicePolicy +org.freedesktop.systemd1.Socket.DirectoryMode +org.freedesktop.systemd1.Socket.DisableControllers +org.freedesktop.systemd1.Socket.DynamicUser +org.freedesktop.systemd1.Socket.EffectiveCPUs +org.freedesktop.systemd1.Socket.EffectiveMemoryNodes +org.freedesktop.systemd1.Socket.Environment +org.freedesktop.systemd1.Socket.EnvironmentFiles +org.freedesktop.systemd1.Socket.ExecPaths +org.freedesktop.systemd1.Socket.ExecSearchPath +org.freedesktop.systemd1.Socket.ExecStartPost +org.freedesktop.systemd1.Socket.ExecStartPre +org.freedesktop.systemd1.Socket.ExecStopPost +org.freedesktop.systemd1.Socket.ExecStopPre +org.freedesktop.systemd1.Socket.ExtensionImages +org.freedesktop.systemd1.Socket.FileDescriptorName +org.freedesktop.systemd1.Socket.FinalKillSignal +org.freedesktop.systemd1.Socket.FlushPending +org.freedesktop.systemd1.Socket.FreeBind +org.freedesktop.systemd1.Socket.GID +org.freedesktop.systemd1.Socket.GetProcesses() +org.freedesktop.systemd1.Socket.Group +org.freedesktop.systemd1.Socket.IOAccounting +org.freedesktop.systemd1.Socket.IODeviceLatencyTargetUSec +org.freedesktop.systemd1.Socket.IODeviceWeight +org.freedesktop.systemd1.Socket.IOReadBandwidthMax +org.freedesktop.systemd1.Socket.IOReadBytes +org.freedesktop.systemd1.Socket.IOReadIOPSMax +org.freedesktop.systemd1.Socket.IOReadOperations +org.freedesktop.systemd1.Socket.IOSchedulingClass +org.freedesktop.systemd1.Socket.IOSchedulingPriority +org.freedesktop.systemd1.Socket.IOWeight +org.freedesktop.systemd1.Socket.IOWriteBandwidthMax +org.freedesktop.systemd1.Socket.IOWriteBytes +org.freedesktop.systemd1.Socket.IOWriteIOPSMax +org.freedesktop.systemd1.Socket.IOWriteOperations +org.freedesktop.systemd1.Socket.IPAccounting +org.freedesktop.systemd1.Socket.IPAddressAllow +org.freedesktop.systemd1.Socket.IPAddressDeny +org.freedesktop.systemd1.Socket.IPCNamespacePath +org.freedesktop.systemd1.Socket.IPEgressBytes +org.freedesktop.systemd1.Socket.IPEgressFilterPath +org.freedesktop.systemd1.Socket.IPEgressPackets +org.freedesktop.systemd1.Socket.IPIngressBytes +org.freedesktop.systemd1.Socket.IPIngressFilterPath +org.freedesktop.systemd1.Socket.IPIngressPackets +org.freedesktop.systemd1.Socket.IPTOS +org.freedesktop.systemd1.Socket.IPTTL +org.freedesktop.systemd1.Socket.IgnoreSIGPIPE +org.freedesktop.systemd1.Socket.InaccessiblePaths +org.freedesktop.systemd1.Socket.KeepAlive +org.freedesktop.systemd1.Socket.KeepAliveIntervalUSec +org.freedesktop.systemd1.Socket.KeepAliveProbes +org.freedesktop.systemd1.Socket.KeepAliveTimeUSec +org.freedesktop.systemd1.Socket.KeyringMode +org.freedesktop.systemd1.Socket.KillMode +org.freedesktop.systemd1.Socket.KillSignal +org.freedesktop.systemd1.Socket.LimitAS +org.freedesktop.systemd1.Socket.LimitASSoft +org.freedesktop.systemd1.Socket.LimitCORE +org.freedesktop.systemd1.Socket.LimitCORESoft +org.freedesktop.systemd1.Socket.LimitCPU +org.freedesktop.systemd1.Socket.LimitCPUSoft +org.freedesktop.systemd1.Socket.LimitDATA +org.freedesktop.systemd1.Socket.LimitDATASoft +org.freedesktop.systemd1.Socket.LimitFSIZE +org.freedesktop.systemd1.Socket.LimitFSIZESoft +org.freedesktop.systemd1.Socket.LimitLOCKS +org.freedesktop.systemd1.Socket.LimitLOCKSSoft +org.freedesktop.systemd1.Socket.LimitMEMLOCK +org.freedesktop.systemd1.Socket.LimitMEMLOCKSoft +org.freedesktop.systemd1.Socket.LimitMSGQUEUE +org.freedesktop.systemd1.Socket.LimitMSGQUEUESoft +org.freedesktop.systemd1.Socket.LimitNICE +org.freedesktop.systemd1.Socket.LimitNICESoft +org.freedesktop.systemd1.Socket.LimitNOFILE +org.freedesktop.systemd1.Socket.LimitNOFILESoft +org.freedesktop.systemd1.Socket.LimitNPROC +org.freedesktop.systemd1.Socket.LimitNPROCSoft +org.freedesktop.systemd1.Socket.LimitRSS +org.freedesktop.systemd1.Socket.LimitRSSSoft +org.freedesktop.systemd1.Socket.LimitRTPRIO +org.freedesktop.systemd1.Socket.LimitRTPRIOSoft +org.freedesktop.systemd1.Socket.LimitRTTIME +org.freedesktop.systemd1.Socket.LimitRTTIMESoft +org.freedesktop.systemd1.Socket.LimitSIGPENDING +org.freedesktop.systemd1.Socket.LimitSIGPENDINGSoft +org.freedesktop.systemd1.Socket.LimitSTACK +org.freedesktop.systemd1.Socket.LimitSTACKSoft +org.freedesktop.systemd1.Socket.Listen +org.freedesktop.systemd1.Socket.LoadCredential +org.freedesktop.systemd1.Socket.LoadCredentialEncrypted +org.freedesktop.systemd1.Socket.LockPersonality +org.freedesktop.systemd1.Socket.LogExtraFields +org.freedesktop.systemd1.Socket.LogLevelMax +org.freedesktop.systemd1.Socket.LogNamespace +org.freedesktop.systemd1.Socket.LogRateLimitBurst +org.freedesktop.systemd1.Socket.LogRateLimitIntervalUSec +org.freedesktop.systemd1.Socket.LogsDirectory +org.freedesktop.systemd1.Socket.LogsDirectoryMode +org.freedesktop.systemd1.Socket.LogsDirectorySymlink +org.freedesktop.systemd1.Socket.ManagedOOMMemoryPressure +org.freedesktop.systemd1.Socket.ManagedOOMMemoryPressureLimit +org.freedesktop.systemd1.Socket.ManagedOOMPreference +org.freedesktop.systemd1.Socket.ManagedOOMSwap +org.freedesktop.systemd1.Socket.Mark +org.freedesktop.systemd1.Socket.MaxConnections +org.freedesktop.systemd1.Socket.MaxConnectionsPerSource +org.freedesktop.systemd1.Socket.MemoryAccounting +org.freedesktop.systemd1.Socket.MemoryAvailable +org.freedesktop.systemd1.Socket.MemoryCurrent +org.freedesktop.systemd1.Socket.MemoryDenyWriteExecute +org.freedesktop.systemd1.Socket.MemoryHigh +org.freedesktop.systemd1.Socket.MemoryLimit +org.freedesktop.systemd1.Socket.MemoryLow +org.freedesktop.systemd1.Socket.MemoryMax +org.freedesktop.systemd1.Socket.MemoryMin +org.freedesktop.systemd1.Socket.MemorySwapMax +org.freedesktop.systemd1.Socket.MessageQueueMaxMessages +org.freedesktop.systemd1.Socket.MessageQueueMessageSize +org.freedesktop.systemd1.Socket.MountAPIVFS +org.freedesktop.systemd1.Socket.MountFlags +org.freedesktop.systemd1.Socket.MountImages +org.freedesktop.systemd1.Socket.NAccepted +org.freedesktop.systemd1.Socket.NConnections +org.freedesktop.systemd1.Socket.NRefused +org.freedesktop.systemd1.Socket.NUMAMask +org.freedesktop.systemd1.Socket.NUMAPolicy +org.freedesktop.systemd1.Socket.NetworkNamespacePath +org.freedesktop.systemd1.Socket.Nice +org.freedesktop.systemd1.Socket.NoDelay +org.freedesktop.systemd1.Socket.NoExecPaths +org.freedesktop.systemd1.Socket.NoNewPrivileges +org.freedesktop.systemd1.Socket.NonBlocking +org.freedesktop.systemd1.Socket.OOMScoreAdjust +org.freedesktop.systemd1.Socket.PAMName +org.freedesktop.systemd1.Socket.PassCredentials +org.freedesktop.systemd1.Socket.PassEnvironment +org.freedesktop.systemd1.Socket.PassPacketInfo +org.freedesktop.systemd1.Socket.PassSecurity +org.freedesktop.systemd1.Socket.Personality +org.freedesktop.systemd1.Socket.PipeSize +org.freedesktop.systemd1.Socket.Priority +org.freedesktop.systemd1.Socket.PrivateDevices +org.freedesktop.systemd1.Socket.PrivateIPC +org.freedesktop.systemd1.Socket.PrivateMounts +org.freedesktop.systemd1.Socket.PrivateNetwork +org.freedesktop.systemd1.Socket.PrivateTmp +org.freedesktop.systemd1.Socket.PrivateUsers +org.freedesktop.systemd1.Socket.ProcSubset +org.freedesktop.systemd1.Socket.ProtectClock +org.freedesktop.systemd1.Socket.ProtectControlGroups +org.freedesktop.systemd1.Socket.ProtectHome +org.freedesktop.systemd1.Socket.ProtectHostname +org.freedesktop.systemd1.Socket.ProtectKernelLogs +org.freedesktop.systemd1.Socket.ProtectKernelModules +org.freedesktop.systemd1.Socket.ProtectKernelTunables +org.freedesktop.systemd1.Socket.ProtectProc +org.freedesktop.systemd1.Socket.ProtectSystem +org.freedesktop.systemd1.Socket.ReadOnlyPaths +org.freedesktop.systemd1.Socket.ReadWritePaths +org.freedesktop.systemd1.Socket.ReceiveBuffer +org.freedesktop.systemd1.Socket.RemoveIPC +org.freedesktop.systemd1.Socket.RemoveOnStop +org.freedesktop.systemd1.Socket.RestartKillSignal +org.freedesktop.systemd1.Socket.RestrictAddressFamilies +org.freedesktop.systemd1.Socket.RestrictFileSystems +org.freedesktop.systemd1.Socket.RestrictNamespaces +org.freedesktop.systemd1.Socket.RestrictNetworkInterfaces +org.freedesktop.systemd1.Socket.RestrictRealtime +org.freedesktop.systemd1.Socket.RestrictSUIDSGID +org.freedesktop.systemd1.Socket.Result +org.freedesktop.systemd1.Socket.ReusePort +org.freedesktop.systemd1.Socket.RootDirectory +org.freedesktop.systemd1.Socket.RootHash +org.freedesktop.systemd1.Socket.RootHashPath +org.freedesktop.systemd1.Socket.RootHashSignature +org.freedesktop.systemd1.Socket.RootHashSignaturePath +org.freedesktop.systemd1.Socket.RootImage +org.freedesktop.systemd1.Socket.RootImageOptions +org.freedesktop.systemd1.Socket.RootVerity +org.freedesktop.systemd1.Socket.RuntimeDirectory +org.freedesktop.systemd1.Socket.RuntimeDirectoryMode +org.freedesktop.systemd1.Socket.RuntimeDirectoryPreserve +org.freedesktop.systemd1.Socket.RuntimeDirectorySymlink +org.freedesktop.systemd1.Socket.SELinuxContext +org.freedesktop.systemd1.Socket.SameProcessGroup +org.freedesktop.systemd1.Socket.SecureBits +org.freedesktop.systemd1.Socket.SendBuffer +org.freedesktop.systemd1.Socket.SendSIGHUP +org.freedesktop.systemd1.Socket.SendSIGKILL +org.freedesktop.systemd1.Socket.SetCredential +org.freedesktop.systemd1.Socket.SetCredentialEncrypted +org.freedesktop.systemd1.Socket.Slice +org.freedesktop.systemd1.Socket.SmackLabel +org.freedesktop.systemd1.Socket.SmackLabelIPIn +org.freedesktop.systemd1.Socket.SmackLabelIPOut +org.freedesktop.systemd1.Socket.SmackProcessLabel +org.freedesktop.systemd1.Socket.SocketBindAllow +org.freedesktop.systemd1.Socket.SocketBindDeny +org.freedesktop.systemd1.Socket.SocketGroup +org.freedesktop.systemd1.Socket.SocketMode +org.freedesktop.systemd1.Socket.SocketProtocol +org.freedesktop.systemd1.Socket.SocketUser +org.freedesktop.systemd1.Socket.StandardError +org.freedesktop.systemd1.Socket.StandardErrorFileDescriptorName +org.freedesktop.systemd1.Socket.StandardInput +org.freedesktop.systemd1.Socket.StandardInputData +org.freedesktop.systemd1.Socket.StandardInputFileDescriptorName +org.freedesktop.systemd1.Socket.StandardOutput +org.freedesktop.systemd1.Socket.StandardOutputFileDescriptorName +org.freedesktop.systemd1.Socket.StartupAllowedCPUs +org.freedesktop.systemd1.Socket.StartupAllowedMemoryNodes +org.freedesktop.systemd1.Socket.StartupBlockIOWeight +org.freedesktop.systemd1.Socket.StartupCPUShares +org.freedesktop.systemd1.Socket.StartupCPUWeight +org.freedesktop.systemd1.Socket.StartupIOWeight +org.freedesktop.systemd1.Socket.StateDirectory +org.freedesktop.systemd1.Socket.StateDirectoryMode +org.freedesktop.systemd1.Socket.StateDirectorySymlink +org.freedesktop.systemd1.Socket.SupplementaryGroups +org.freedesktop.systemd1.Socket.Symlinks +org.freedesktop.systemd1.Socket.SyslogFacility +org.freedesktop.systemd1.Socket.SyslogIdentifier +org.freedesktop.systemd1.Socket.SyslogLevel +org.freedesktop.systemd1.Socket.SyslogLevelPrefix +org.freedesktop.systemd1.Socket.SyslogPriority +org.freedesktop.systemd1.Socket.SystemCallArchitectures +org.freedesktop.systemd1.Socket.SystemCallErrorNumber +org.freedesktop.systemd1.Socket.SystemCallFilter +org.freedesktop.systemd1.Socket.SystemCallLog +org.freedesktop.systemd1.Socket.TCPCongestion +org.freedesktop.systemd1.Socket.TTYColumns +org.freedesktop.systemd1.Socket.TTYPath +org.freedesktop.systemd1.Socket.TTYReset +org.freedesktop.systemd1.Socket.TTYRows +org.freedesktop.systemd1.Socket.TTYVHangup +org.freedesktop.systemd1.Socket.TTYVTDisallocate +org.freedesktop.systemd1.Socket.TasksAccounting +org.freedesktop.systemd1.Socket.TasksCurrent +org.freedesktop.systemd1.Socket.TasksMax +org.freedesktop.systemd1.Socket.TemporaryFileSystem +org.freedesktop.systemd1.Socket.TimeoutCleanUSec +org.freedesktop.systemd1.Socket.TimeoutUSec +org.freedesktop.systemd1.Socket.TimerSlackNSec +org.freedesktop.systemd1.Socket.Timestamping +org.freedesktop.systemd1.Socket.Transparent +org.freedesktop.systemd1.Socket.TriggerLimitBurst +org.freedesktop.systemd1.Socket.TriggerLimitIntervalUSec +org.freedesktop.systemd1.Socket.UID +org.freedesktop.systemd1.Socket.UMask +org.freedesktop.systemd1.Socket.UnsetEnvironment +org.freedesktop.systemd1.Socket.User +org.freedesktop.systemd1.Socket.UtmpIdentifier +org.freedesktop.systemd1.Socket.UtmpMode +org.freedesktop.systemd1.Socket.WatchdogSignal +org.freedesktop.systemd1.Socket.WorkingDirectory +org.freedesktop.systemd1.Socket.Writable +org.freedesktop.systemd1.Swap.AllowedCPUs +org.freedesktop.systemd1.Swap.AllowedMemoryNodes +org.freedesktop.systemd1.Swap.AmbientCapabilities +org.freedesktop.systemd1.Swap.AppArmorProfile +org.freedesktop.systemd1.Swap.AttachProcesses() +org.freedesktop.systemd1.Swap.BPFProgram +org.freedesktop.systemd1.Swap.BindPaths +org.freedesktop.systemd1.Swap.BindReadOnlyPaths +org.freedesktop.systemd1.Swap.BlockIOAccounting +org.freedesktop.systemd1.Swap.BlockIODeviceWeight +org.freedesktop.systemd1.Swap.BlockIOReadBandwidth +org.freedesktop.systemd1.Swap.BlockIOWeight +org.freedesktop.systemd1.Swap.BlockIOWriteBandwidth +org.freedesktop.systemd1.Swap.CPUAccounting +org.freedesktop.systemd1.Swap.CPUAffinity +org.freedesktop.systemd1.Swap.CPUAffinityFromNUMA +org.freedesktop.systemd1.Swap.CPUQuotaPerSecUSec +org.freedesktop.systemd1.Swap.CPUQuotaPeriodUSec +org.freedesktop.systemd1.Swap.CPUSchedulingPolicy +org.freedesktop.systemd1.Swap.CPUSchedulingPriority +org.freedesktop.systemd1.Swap.CPUSchedulingResetOnFork +org.freedesktop.systemd1.Swap.CPUShares +org.freedesktop.systemd1.Swap.CPUUsageNSec +org.freedesktop.systemd1.Swap.CPUWeight +org.freedesktop.systemd1.Swap.CacheDirectory +org.freedesktop.systemd1.Swap.CacheDirectoryMode +org.freedesktop.systemd1.Swap.CacheDirectorySymlink +org.freedesktop.systemd1.Swap.CapabilityBoundingSet +org.freedesktop.systemd1.Swap.ConfigurationDirectory +org.freedesktop.systemd1.Swap.ConfigurationDirectoryMode +org.freedesktop.systemd1.Swap.ControlGroup +org.freedesktop.systemd1.Swap.ControlPID +org.freedesktop.systemd1.Swap.CoredumpFilter +org.freedesktop.systemd1.Swap.DefaultMemoryLow +org.freedesktop.systemd1.Swap.DefaultMemoryMin +org.freedesktop.systemd1.Swap.Delegate +org.freedesktop.systemd1.Swap.DelegateControllers +org.freedesktop.systemd1.Swap.DeviceAllow +org.freedesktop.systemd1.Swap.DevicePolicy +org.freedesktop.systemd1.Swap.DisableControllers +org.freedesktop.systemd1.Swap.DynamicUser +org.freedesktop.systemd1.Swap.EffectiveCPUs +org.freedesktop.systemd1.Swap.EffectiveMemoryNodes +org.freedesktop.systemd1.Swap.Environment +org.freedesktop.systemd1.Swap.EnvironmentFiles +org.freedesktop.systemd1.Swap.ExecActivate +org.freedesktop.systemd1.Swap.ExecDeactivate +org.freedesktop.systemd1.Swap.ExecPaths +org.freedesktop.systemd1.Swap.ExecSearchPath +org.freedesktop.systemd1.Swap.ExtensionImages +org.freedesktop.systemd1.Swap.FinalKillSignal +org.freedesktop.systemd1.Swap.GID +org.freedesktop.systemd1.Swap.GetProcesses() +org.freedesktop.systemd1.Swap.Group +org.freedesktop.systemd1.Swap.IOAccounting +org.freedesktop.systemd1.Swap.IODeviceLatencyTargetUSec +org.freedesktop.systemd1.Swap.IODeviceWeight +org.freedesktop.systemd1.Swap.IOReadBandwidthMax +org.freedesktop.systemd1.Swap.IOReadBytes +org.freedesktop.systemd1.Swap.IOReadIOPSMax +org.freedesktop.systemd1.Swap.IOReadOperations +org.freedesktop.systemd1.Swap.IOSchedulingClass +org.freedesktop.systemd1.Swap.IOSchedulingPriority +org.freedesktop.systemd1.Swap.IOWeight +org.freedesktop.systemd1.Swap.IOWriteBandwidthMax +org.freedesktop.systemd1.Swap.IOWriteBytes +org.freedesktop.systemd1.Swap.IOWriteIOPSMax +org.freedesktop.systemd1.Swap.IOWriteOperations +org.freedesktop.systemd1.Swap.IPAccounting +org.freedesktop.systemd1.Swap.IPAddressAllow +org.freedesktop.systemd1.Swap.IPAddressDeny +org.freedesktop.systemd1.Swap.IPCNamespacePath +org.freedesktop.systemd1.Swap.IPEgressBytes +org.freedesktop.systemd1.Swap.IPEgressFilterPath +org.freedesktop.systemd1.Swap.IPEgressPackets +org.freedesktop.systemd1.Swap.IPIngressBytes +org.freedesktop.systemd1.Swap.IPIngressFilterPath +org.freedesktop.systemd1.Swap.IPIngressPackets +org.freedesktop.systemd1.Swap.IgnoreSIGPIPE +org.freedesktop.systemd1.Swap.InaccessiblePaths +org.freedesktop.systemd1.Swap.KeyringMode +org.freedesktop.systemd1.Swap.KillMode +org.freedesktop.systemd1.Swap.KillSignal +org.freedesktop.systemd1.Swap.LimitAS +org.freedesktop.systemd1.Swap.LimitASSoft +org.freedesktop.systemd1.Swap.LimitCORE +org.freedesktop.systemd1.Swap.LimitCORESoft +org.freedesktop.systemd1.Swap.LimitCPU +org.freedesktop.systemd1.Swap.LimitCPUSoft +org.freedesktop.systemd1.Swap.LimitDATA +org.freedesktop.systemd1.Swap.LimitDATASoft +org.freedesktop.systemd1.Swap.LimitFSIZE +org.freedesktop.systemd1.Swap.LimitFSIZESoft +org.freedesktop.systemd1.Swap.LimitLOCKS +org.freedesktop.systemd1.Swap.LimitLOCKSSoft +org.freedesktop.systemd1.Swap.LimitMEMLOCK +org.freedesktop.systemd1.Swap.LimitMEMLOCKSoft +org.freedesktop.systemd1.Swap.LimitMSGQUEUE +org.freedesktop.systemd1.Swap.LimitMSGQUEUESoft +org.freedesktop.systemd1.Swap.LimitNICE +org.freedesktop.systemd1.Swap.LimitNICESoft +org.freedesktop.systemd1.Swap.LimitNOFILE +org.freedesktop.systemd1.Swap.LimitNOFILESoft +org.freedesktop.systemd1.Swap.LimitNPROC +org.freedesktop.systemd1.Swap.LimitNPROCSoft +org.freedesktop.systemd1.Swap.LimitRSS +org.freedesktop.systemd1.Swap.LimitRSSSoft +org.freedesktop.systemd1.Swap.LimitRTPRIO +org.freedesktop.systemd1.Swap.LimitRTPRIOSoft +org.freedesktop.systemd1.Swap.LimitRTTIME +org.freedesktop.systemd1.Swap.LimitRTTIMESoft +org.freedesktop.systemd1.Swap.LimitSIGPENDING +org.freedesktop.systemd1.Swap.LimitSIGPENDINGSoft +org.freedesktop.systemd1.Swap.LimitSTACK +org.freedesktop.systemd1.Swap.LimitSTACKSoft +org.freedesktop.systemd1.Swap.LoadCredential +org.freedesktop.systemd1.Swap.LoadCredentialEncrypted +org.freedesktop.systemd1.Swap.LockPersonality +org.freedesktop.systemd1.Swap.LogExtraFields +org.freedesktop.systemd1.Swap.LogLevelMax +org.freedesktop.systemd1.Swap.LogNamespace +org.freedesktop.systemd1.Swap.LogRateLimitBurst +org.freedesktop.systemd1.Swap.LogRateLimitIntervalUSec +org.freedesktop.systemd1.Swap.LogsDirectory +org.freedesktop.systemd1.Swap.LogsDirectoryMode +org.freedesktop.systemd1.Swap.LogsDirectorySymlink +org.freedesktop.systemd1.Swap.ManagedOOMMemoryPressure +org.freedesktop.systemd1.Swap.ManagedOOMMemoryPressureLimit +org.freedesktop.systemd1.Swap.ManagedOOMPreference +org.freedesktop.systemd1.Swap.ManagedOOMSwap +org.freedesktop.systemd1.Swap.MemoryAccounting +org.freedesktop.systemd1.Swap.MemoryAvailable +org.freedesktop.systemd1.Swap.MemoryCurrent +org.freedesktop.systemd1.Swap.MemoryDenyWriteExecute +org.freedesktop.systemd1.Swap.MemoryHigh +org.freedesktop.systemd1.Swap.MemoryLimit +org.freedesktop.systemd1.Swap.MemoryLow +org.freedesktop.systemd1.Swap.MemoryMax +org.freedesktop.systemd1.Swap.MemoryMin +org.freedesktop.systemd1.Swap.MemorySwapMax +org.freedesktop.systemd1.Swap.MountAPIVFS +org.freedesktop.systemd1.Swap.MountFlags +org.freedesktop.systemd1.Swap.MountImages +org.freedesktop.systemd1.Swap.NUMAMask +org.freedesktop.systemd1.Swap.NUMAPolicy +org.freedesktop.systemd1.Swap.NetworkNamespacePath +org.freedesktop.systemd1.Swap.Nice +org.freedesktop.systemd1.Swap.NoExecPaths +org.freedesktop.systemd1.Swap.NoNewPrivileges +org.freedesktop.systemd1.Swap.NonBlocking +org.freedesktop.systemd1.Swap.OOMScoreAdjust +org.freedesktop.systemd1.Swap.Options +org.freedesktop.systemd1.Swap.PAMName +org.freedesktop.systemd1.Swap.PassEnvironment +org.freedesktop.systemd1.Swap.Personality +org.freedesktop.systemd1.Swap.Priority +org.freedesktop.systemd1.Swap.PrivateDevices +org.freedesktop.systemd1.Swap.PrivateIPC +org.freedesktop.systemd1.Swap.PrivateMounts +org.freedesktop.systemd1.Swap.PrivateNetwork +org.freedesktop.systemd1.Swap.PrivateTmp +org.freedesktop.systemd1.Swap.PrivateUsers +org.freedesktop.systemd1.Swap.ProcSubset +org.freedesktop.systemd1.Swap.ProtectClock +org.freedesktop.systemd1.Swap.ProtectControlGroups +org.freedesktop.systemd1.Swap.ProtectHome +org.freedesktop.systemd1.Swap.ProtectHostname +org.freedesktop.systemd1.Swap.ProtectKernelLogs +org.freedesktop.systemd1.Swap.ProtectKernelModules +org.freedesktop.systemd1.Swap.ProtectKernelTunables +org.freedesktop.systemd1.Swap.ProtectProc +org.freedesktop.systemd1.Swap.ProtectSystem +org.freedesktop.systemd1.Swap.ReadOnlyPaths +org.freedesktop.systemd1.Swap.ReadWritePaths +org.freedesktop.systemd1.Swap.RemoveIPC +org.freedesktop.systemd1.Swap.RestartKillSignal +org.freedesktop.systemd1.Swap.RestrictAddressFamilies +org.freedesktop.systemd1.Swap.RestrictFileSystems +org.freedesktop.systemd1.Swap.RestrictNamespaces +org.freedesktop.systemd1.Swap.RestrictNetworkInterfaces +org.freedesktop.systemd1.Swap.RestrictRealtime +org.freedesktop.systemd1.Swap.RestrictSUIDSGID +org.freedesktop.systemd1.Swap.Result +org.freedesktop.systemd1.Swap.RootDirectory +org.freedesktop.systemd1.Swap.RootHash +org.freedesktop.systemd1.Swap.RootHashPath +org.freedesktop.systemd1.Swap.RootHashSignature +org.freedesktop.systemd1.Swap.RootHashSignaturePath +org.freedesktop.systemd1.Swap.RootImage +org.freedesktop.systemd1.Swap.RootImageOptions +org.freedesktop.systemd1.Swap.RootVerity +org.freedesktop.systemd1.Swap.RuntimeDirectory +org.freedesktop.systemd1.Swap.RuntimeDirectoryMode +org.freedesktop.systemd1.Swap.RuntimeDirectoryPreserve +org.freedesktop.systemd1.Swap.RuntimeDirectorySymlink +org.freedesktop.systemd1.Swap.SELinuxContext +org.freedesktop.systemd1.Swap.SameProcessGroup +org.freedesktop.systemd1.Swap.SecureBits +org.freedesktop.systemd1.Swap.SendSIGHUP +org.freedesktop.systemd1.Swap.SendSIGKILL +org.freedesktop.systemd1.Swap.SetCredential +org.freedesktop.systemd1.Swap.SetCredentialEncrypted +org.freedesktop.systemd1.Swap.Slice +org.freedesktop.systemd1.Swap.SmackProcessLabel +org.freedesktop.systemd1.Swap.SocketBindAllow +org.freedesktop.systemd1.Swap.SocketBindDeny +org.freedesktop.systemd1.Swap.StandardError +org.freedesktop.systemd1.Swap.StandardErrorFileDescriptorName +org.freedesktop.systemd1.Swap.StandardInput +org.freedesktop.systemd1.Swap.StandardInputData +org.freedesktop.systemd1.Swap.StandardInputFileDescriptorName +org.freedesktop.systemd1.Swap.StandardOutput +org.freedesktop.systemd1.Swap.StandardOutputFileDescriptorName +org.freedesktop.systemd1.Swap.StartupAllowedCPUs +org.freedesktop.systemd1.Swap.StartupAllowedMemoryNodes +org.freedesktop.systemd1.Swap.StartupBlockIOWeight +org.freedesktop.systemd1.Swap.StartupCPUShares +org.freedesktop.systemd1.Swap.StartupCPUWeight +org.freedesktop.systemd1.Swap.StartupIOWeight +org.freedesktop.systemd1.Swap.StateDirectory +org.freedesktop.systemd1.Swap.StateDirectoryMode +org.freedesktop.systemd1.Swap.StateDirectorySymlink +org.freedesktop.systemd1.Swap.SupplementaryGroups +org.freedesktop.systemd1.Swap.SyslogFacility +org.freedesktop.systemd1.Swap.SyslogIdentifier +org.freedesktop.systemd1.Swap.SyslogLevel +org.freedesktop.systemd1.Swap.SyslogLevelPrefix +org.freedesktop.systemd1.Swap.SyslogPriority +org.freedesktop.systemd1.Swap.SystemCallArchitectures +org.freedesktop.systemd1.Swap.SystemCallErrorNumber +org.freedesktop.systemd1.Swap.SystemCallFilter +org.freedesktop.systemd1.Swap.SystemCallLog +org.freedesktop.systemd1.Swap.TTYColumns +org.freedesktop.systemd1.Swap.TTYPath +org.freedesktop.systemd1.Swap.TTYReset +org.freedesktop.systemd1.Swap.TTYRows +org.freedesktop.systemd1.Swap.TTYVHangup +org.freedesktop.systemd1.Swap.TTYVTDisallocate +org.freedesktop.systemd1.Swap.TasksAccounting +org.freedesktop.systemd1.Swap.TasksCurrent +org.freedesktop.systemd1.Swap.TasksMax +org.freedesktop.systemd1.Swap.TemporaryFileSystem +org.freedesktop.systemd1.Swap.TimeoutCleanUSec +org.freedesktop.systemd1.Swap.TimeoutUSec +org.freedesktop.systemd1.Swap.TimerSlackNSec +org.freedesktop.systemd1.Swap.UID +org.freedesktop.systemd1.Swap.UMask +org.freedesktop.systemd1.Swap.UnsetEnvironment +org.freedesktop.systemd1.Swap.User +org.freedesktop.systemd1.Swap.UtmpIdentifier +org.freedesktop.systemd1.Swap.UtmpMode +org.freedesktop.systemd1.Swap.WatchdogSignal +org.freedesktop.systemd1.Swap.What +org.freedesktop.systemd1.Swap.WorkingDirectory +org.freedesktop.systemd1.Timer.AccuracyUSec +org.freedesktop.systemd1.Timer.FixedRandomDelay +org.freedesktop.systemd1.Timer.LastTriggerUSec +org.freedesktop.systemd1.Timer.LastTriggerUSecMonotonic +org.freedesktop.systemd1.Timer.NextElapseUSecMonotonic +org.freedesktop.systemd1.Timer.NextElapseUSecRealtime +org.freedesktop.systemd1.Timer.OnClockChange +org.freedesktop.systemd1.Timer.OnTimezoneChange +org.freedesktop.systemd1.Timer.Persistent +org.freedesktop.systemd1.Timer.RandomizedDelayUSec +org.freedesktop.systemd1.Timer.RemainAfterElapse +org.freedesktop.systemd1.Timer.Result +org.freedesktop.systemd1.Timer.TimersCalendar +org.freedesktop.systemd1.Timer.TimersMonotonic +org.freedesktop.systemd1.Timer.Unit +org.freedesktop.systemd1.Timer.WakeSystem +org.freedesktop.systemd1.Unit.ActiveEnterTimestamp +org.freedesktop.systemd1.Unit.ActiveEnterTimestampMonotonic +org.freedesktop.systemd1.Unit.ActiveExitTimestamp +org.freedesktop.systemd1.Unit.ActiveExitTimestampMonotonic +org.freedesktop.systemd1.Unit.ActiveState +org.freedesktop.systemd1.Unit.After +org.freedesktop.systemd1.Unit.AllowIsolate +org.freedesktop.systemd1.Unit.AssertResult +org.freedesktop.systemd1.Unit.AssertTimestamp +org.freedesktop.systemd1.Unit.AssertTimestampMonotonic +org.freedesktop.systemd1.Unit.Asserts +org.freedesktop.systemd1.Unit.Before +org.freedesktop.systemd1.Unit.BindsTo +org.freedesktop.systemd1.Unit.BoundBy +org.freedesktop.systemd1.Unit.CanClean +org.freedesktop.systemd1.Unit.CanFreeze +org.freedesktop.systemd1.Unit.CanIsolate +org.freedesktop.systemd1.Unit.CanReload +org.freedesktop.systemd1.Unit.CanStart +org.freedesktop.systemd1.Unit.CanStop +org.freedesktop.systemd1.Unit.Clean() +org.freedesktop.systemd1.Unit.CollectMode +org.freedesktop.systemd1.Unit.ConditionResult +org.freedesktop.systemd1.Unit.ConditionTimestamp +org.freedesktop.systemd1.Unit.ConditionTimestampMonotonic +org.freedesktop.systemd1.Unit.Conditions +org.freedesktop.systemd1.Unit.ConflictedBy +org.freedesktop.systemd1.Unit.Conflicts +org.freedesktop.systemd1.Unit.ConsistsOf +org.freedesktop.systemd1.Unit.DefaultDependencies +org.freedesktop.systemd1.Unit.Description +org.freedesktop.systemd1.Unit.Documentation +org.freedesktop.systemd1.Unit.DropInPaths +org.freedesktop.systemd1.Unit.EnqueueJob() +org.freedesktop.systemd1.Unit.FailureAction +org.freedesktop.systemd1.Unit.FailureActionExitStatus +org.freedesktop.systemd1.Unit.Following +org.freedesktop.systemd1.Unit.FragmentPath +org.freedesktop.systemd1.Unit.Freeze() +org.freedesktop.systemd1.Unit.FreezerState +org.freedesktop.systemd1.Unit.Id +org.freedesktop.systemd1.Unit.IgnoreOnIsolate +org.freedesktop.systemd1.Unit.InactiveEnterTimestamp +org.freedesktop.systemd1.Unit.InactiveEnterTimestampMonotonic +org.freedesktop.systemd1.Unit.InactiveExitTimestamp +org.freedesktop.systemd1.Unit.InactiveExitTimestampMonotonic +org.freedesktop.systemd1.Unit.InvocationID +org.freedesktop.systemd1.Unit.Job +org.freedesktop.systemd1.Unit.JobRunningTimeoutUSec +org.freedesktop.systemd1.Unit.JobTimeoutAction +org.freedesktop.systemd1.Unit.JobTimeoutRebootArgument +org.freedesktop.systemd1.Unit.JobTimeoutUSec +org.freedesktop.systemd1.Unit.JoinsNamespaceOf +org.freedesktop.systemd1.Unit.Kill() +org.freedesktop.systemd1.Unit.LoadError +org.freedesktop.systemd1.Unit.LoadState +org.freedesktop.systemd1.Unit.Markers +org.freedesktop.systemd1.Unit.Names +org.freedesktop.systemd1.Unit.NeedDaemonReload +org.freedesktop.systemd1.Unit.OnFailure +org.freedesktop.systemd1.Unit.OnFailureJobMode +org.freedesktop.systemd1.Unit.OnFailureOf +org.freedesktop.systemd1.Unit.OnSuccess +org.freedesktop.systemd1.Unit.OnSuccessJobMode +org.freedesktop.systemd1.Unit.OnSuccessOf +org.freedesktop.systemd1.Unit.PartOf +org.freedesktop.systemd1.Unit.Perpetual +org.freedesktop.systemd1.Unit.PropagatesReloadTo +org.freedesktop.systemd1.Unit.PropagatesStopTo +org.freedesktop.systemd1.Unit.RebootArgument +org.freedesktop.systemd1.Unit.Ref() +org.freedesktop.systemd1.Unit.Refs +org.freedesktop.systemd1.Unit.RefuseManualStart +org.freedesktop.systemd1.Unit.RefuseManualStop +org.freedesktop.systemd1.Unit.Reload() +org.freedesktop.systemd1.Unit.ReloadOrRestart() +org.freedesktop.systemd1.Unit.ReloadOrTryRestart() +org.freedesktop.systemd1.Unit.ReloadPropagatedFrom +org.freedesktop.systemd1.Unit.RequiredBy +org.freedesktop.systemd1.Unit.Requires +org.freedesktop.systemd1.Unit.RequiresMountsFor +org.freedesktop.systemd1.Unit.Requisite +org.freedesktop.systemd1.Unit.RequisiteOf +org.freedesktop.systemd1.Unit.ResetFailed() +org.freedesktop.systemd1.Unit.Restart() +org.freedesktop.systemd1.Unit.SetProperties() +org.freedesktop.systemd1.Unit.SliceOf +org.freedesktop.systemd1.Unit.SourcePath +org.freedesktop.systemd1.Unit.Start() +org.freedesktop.systemd1.Unit.StartLimitAction +org.freedesktop.systemd1.Unit.StartLimitBurst +org.freedesktop.systemd1.Unit.StartLimitIntervalUSec +org.freedesktop.systemd1.Unit.StateChangeTimestamp +org.freedesktop.systemd1.Unit.StateChangeTimestampMonotonic +org.freedesktop.systemd1.Unit.Stop() +org.freedesktop.systemd1.Unit.StopPropagatedFrom +org.freedesktop.systemd1.Unit.StopWhenUnneeded +org.freedesktop.systemd1.Unit.SubState +org.freedesktop.systemd1.Unit.SuccessAction +org.freedesktop.systemd1.Unit.SuccessActionExitStatus +org.freedesktop.systemd1.Unit.Thaw() +org.freedesktop.systemd1.Unit.Transient +org.freedesktop.systemd1.Unit.TriggeredBy +org.freedesktop.systemd1.Unit.Triggers +org.freedesktop.systemd1.Unit.TryRestart() +org.freedesktop.systemd1.Unit.UnitFilePreset +org.freedesktop.systemd1.Unit.UnitFileState +org.freedesktop.systemd1.Unit.Unref() +org.freedesktop.systemd1.Unit.WantedBy +org.freedesktop.systemd1.Unit.Wants +org.freedesktop.timedate1.CanNTP +org.freedesktop.timedate1.ListTimezones() +org.freedesktop.timedate1.LocalRTC +org.freedesktop.timedate1.NTP +org.freedesktop.timedate1.NTPSynchronized +org.freedesktop.timedate1.RTCTimeUSec +org.freedesktop.timedate1.SetLocalRTC() +org.freedesktop.timedate1.SetNTP() +org.freedesktop.timedate1.SetTime() +org.freedesktop.timedate1.SetTimezone() +org.freedesktop.timedate1.TimeUSec +org.freedesktop.timedate1.Timezone diff --git a/tools/debug-sd-boot.sh b/tools/debug-sd-boot.sh new file mode 100755 index 0000000..0420dbd --- /dev/null +++ b/tools/debug-sd-boot.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later + +set -e + +if [[ $# -lt 2 ]]; then + echo "Usage: ${0} TARGET INPUT [GDBSCRIPT]" + echo "Debug systemd-boot/stub in QEMU." + echo + echo "TARGET should point to the EFI binary to be examined inside the" + echo "build directory (systemd-boot\$ARCH.efi or linux\$arch.efi.stub)." + echo + echo "INPUT should point to the QEMU serial output pipe. This is used to" + echo "extract the location of the symbols. For this to work, QEMU must" + echo "be run with '-s -serial pipe:PATH'. Note that QEMU will append" + echo ".in/.out to the path, while this script expects the out pipe directly." + echo + echo "If GDBSCRIPT is empty, gdb is run directly attached to the boot" + echo "loader, otherwise a script is generated in the given path that allows" + echo "attaching manually like this:" + echo " (gdb) source GDBSCRIPT" + echo " (gdb) target remote :1234" + echo + echo "Example usage:" + echo " mkfifo /tmp/sdboot.{in,out}" + echo " qemu-system-x86_64 [...] -s -serial pipe:/tmp/sdboot" + echo " ./tools/debug-sd-boot.sh ./build/src/boot/efi/systemd-bootx64.efi \\" + echo " /tmp/sdboot.out" + exit 1 +fi + +binary=$(realpath "${1}") +if [[ "${1}" =~ systemd-boot([[:alnum:]]+).efi ]]; then + target="systemd-boot" + symbols=$(realpath "${1%efi}elf") +elif [[ "${1}" =~ linux([[:alnum:]]+).efi.stub ]]; then + target="systemd-stub" + symbols=$(realpath "${1%efi.stub}elf.stub") +else + echo "Cannot detect EFI binary '${1}'." + exit 1 +fi + +case "${BASH_REMATCH[1]}" in + ia32) arch="i386";; + x64) arch="i386:x86-64";; + aa64) arch="aarch64";; + arm|riscv64) arch="${BASH_REMATCH[1]}";; + *) + echo "Unknown EFI arch '${BASH_REMATCH[1]}'." + exit 1 +esac + +# system-boot/stub will print out a line like this to inform us where it was loaded: +# systemd-boot@0xC0DE +while read -r line; do + if [[ "${line}" =~ ${target}@(0x[[:xdigit:]]+) ]]; then + loaded_base="${BASH_REMATCH[1]}" + break + fi +done <"${2}" + +if [[ -z "${loaded_base}" ]]; then + echo "Could not determine loaded image base." + exit 1 +fi + +if [[ -z "${3}" ]]; then + gdb_script=$(mktemp /tmp/debug-sd-boot.XXXXXX.gdb) + trap 'rm -f "${gdb_script}"' EXIT +else + gdb_script="${3}" +fi + +cat >"${gdb_script}" <<EOF +file ${binary} +symbol-file ${symbols} -o ${loaded_base} +set architecture ${arch} +EOF + +if [[ -z "${3}" ]]; then + gdb -x "${gdb_script}" -ex "target remote :1234" +else + echo "GDB script written to '${gdb_script}'." +fi diff --git a/tools/dump-auxv.py b/tools/dump-auxv.py new file mode 100644 index 0000000..d6dbcb1 --- /dev/null +++ b/tools/dump-auxv.py @@ -0,0 +1,141 @@ +#!/usr/bin/python +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# Note: the no-value-for-parameter here is expected, as the click module +# decorators modify function arguments which pylint doesn't know +# pylint: disable=no-value-for-parameter + +""" +A program to parse auxv (e.g. /proc/self/auxv). + +By default, current arch is assumed, but options can be used to override the +endianness and word size. +""" + +import struct + +import click + +# From /usr/include/elf.h +AT_AUXV = { + 'AT_NULL' : 0, # End of vector + 'AT_IGNORE' : 1, # Entry should be ignored + 'AT_EXECFD' : 2, # File descriptor of program + 'AT_PHDR' : 3, # Program headers for program + 'AT_PHENT' : 4, # Size of program header entry + 'AT_PHNUM' : 5, # Number of program headers + 'AT_PAGESZ' : 6, # System page size + 'AT_BASE' : 7, # Base address of interpreter + 'AT_FLAGS' : 8, # Flags + 'AT_ENTRY' : 9, # Entry point of program + 'AT_NOTELF' : 10, # Program is not ELF + 'AT_UID' : 11, # Real uid + 'AT_EUID' : 12, # Effective uid + 'AT_GID' : 13, # Real gid + 'AT_EGID' : 14, # Effective gid + 'AT_CLKTCK' : 17, # Frequency of times() + + # Some more special a_type values describing the hardware. + 'AT_PLATFORM' : 15, # String identifying platform. + 'AT_HWCAP' : 16, # Machine-dependent hints about processor capabilities. + + # This entry gives some information about the FPU initialization performed by the kernel. + 'AT_FPUCW' : 18, # Used FPU control word. + + # Cache block sizes. + 'AT_DCACHEBSIZE' : 19, # Data cache block size. + 'AT_ICACHEBSIZE' : 20, # Instruction cache block size. + 'AT_UCACHEBSIZE' : 21, # Unified cache block size. + + # A special ignored value for PPC, used by the kernel to control the + # interpretation of the AUXV. Must be > 16. + 'AT_IGNOREPPC' : 22, # Entry should be ignored. + + 'AT_SECURE' : 23, # Boolean, was exec setuid-like? + + 'AT_BASE_PLATFORM' : 24, # String identifying real platforms. + + 'AT_RANDOM' : 25, # Address of 16 random bytes. + + 'AT_HWCAP2' : 26, # More machine-dependent hints about processor capabilities. + + 'AT_EXECFN' : 31, # Filename of executable. + + # Pointer to the global system page used for system calls and other nice things. + 'AT_SYSINFO' : 32, + 'AT_SYSINFO_EHDR' : 33, + + # Shapes of the caches. Bits 0-3 contains associativity; bits 4-7 contains + # log2 of line size; mask those to get cache size. + 'AT_L1I_CACHESHAPE' : 34, + 'AT_L1D_CACHESHAPE' : 35, + 'AT_L2_CACHESHAPE' : 36, + 'AT_L3_CACHESHAPE' : 37, + + # Shapes of the caches, with more room to describe them. + # GEOMETRY are comprised of cache line size in bytes in the bottom 16 bits + # and the cache associativity in the next 16 bits. + 'AT_L1I_CACHESIZE' : 40, + 'AT_L1I_CACHEGEOMETRY' : 41, + 'AT_L1D_CACHESIZE' : 42, + 'AT_L1D_CACHEGEOMETRY' : 43, + 'AT_L2_CACHESIZE' : 44, + 'AT_L2_CACHEGEOMETRY' : 45, + 'AT_L3_CACHESIZE' : 46, + 'AT_L3_CACHEGEOMETRY' : 47, + + 'AT_MINSIGSTKSZ' : 51, # Stack needed for signal delivery +} +AT_AUXV_NAMES = {v:k for k,v in AT_AUXV.items()} + +@click.command(help=__doc__) +@click.option('-b', '--big-endian', 'endian', + flag_value='>', + help='Input is big-endian') +@click.option('-l', '--little-endian', 'endian', + flag_value='<', + help='Input is little-endian') +@click.option('-3', '--32', 'field_width', + flag_value=32, + help='Input is 32-bit') +@click.option('-6', '--64', 'field_width', + flag_value=64, + help='Input is 64-bit') +@click.argument('file', + type=click.File(mode='rb')) +def dump(endian, field_width, file): + data = file.read() + + if field_width is None: + field_width = struct.calcsize('P') * 8 + if endian is None: + endian = '@' + + width = {32:'II', 64:'QQ'}[field_width] + + format_str = f'{endian}{width}' + print(f'# {format_str=}') + + seen_null = False + + for item in struct.iter_unpack(format_str, data): + key, val = item + name = AT_AUXV_NAMES.get(key, f'unknown ({key})') + if name.endswith(('UID', 'GID')): + pref, fmt = '', 'd' + else: + pref, fmt = '0x', 'x' + + if seen_null: + print('# trailing garbage after AT_NULL') + + print(f'{name:18} = {pref}{val:{fmt}}') + + if name == 'AT_NULL': + seen_null = True + + if not seen_null: + print('# array not terminated with AT_NULL') + +if __name__ == '__main__': + dump() diff --git a/tools/elf2efi.py b/tools/elf2efi.py new file mode 100755 index 0000000..54f64fa --- /dev/null +++ b/tools/elf2efi.py @@ -0,0 +1,699 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-or-later + +# Convert ELF static PIE to PE/EFI image. + +# To do so we simply copy desired ELF sections while preserving their memory layout to ensure that +# code still runs as expected. We then translate ELF relocations to PE relocations so that the EFI +# loader/firmware can properly load the binary to any address at runtime. +# +# To make this as painless as possible we only operate on static PIEs as they should only contain +# base relocations that are easy to handle as they have a one-to-one mapping to PE relocations. +# +# EDK2 does a similar process using their GenFw tool. The main difference is that they use the +# --emit-relocs linker flag, which emits a lot of different (static) ELF relocation types that have +# to be handled differently for each architecture and is overall more work than its worth. +# +# Note that on arches where binutils has PE support (x86/x86_64 mostly, aarch64 only recently) +# objcopy can be used to convert ELF to PE. But this will still not convert ELF relocations, making +# the resulting binary useless. gnu-efi relies on this method and contains a stub that performs the +# ELF dynamic relocations at runtime. + +# pylint: disable=attribute-defined-outside-init + +import argparse +import hashlib +import io +import os +import pathlib +import time +import typing +from ctypes import ( + c_char, + c_uint8, + c_uint16, + c_uint32, + c_uint64, + LittleEndianStructure, + sizeof, +) + +from elftools.elf.constants import SH_FLAGS +from elftools.elf.elffile import ELFFile +from elftools.elf.enums import ( + ENUM_DT_FLAGS_1, + ENUM_RELOC_TYPE_AARCH64, + ENUM_RELOC_TYPE_ARM, + ENUM_RELOC_TYPE_i386, + ENUM_RELOC_TYPE_x64, +) +from elftools.elf.relocation import ( + Relocation as ElfRelocation, + RelocationTable as ElfRelocationTable, +) + + +class PeCoffHeader(LittleEndianStructure): + _fields_ = ( + ("Machine", c_uint16), + ("NumberOfSections", c_uint16), + ("TimeDateStamp", c_uint32), + ("PointerToSymbolTable", c_uint32), + ("NumberOfSymbols", c_uint32), + ("SizeOfOptionalHeader", c_uint16), + ("Characteristics", c_uint16), + ) + + +class PeDataDirectory(LittleEndianStructure): + _fields_ = ( + ("VirtualAddress", c_uint32), + ("Size", c_uint32), + ) + + +class PeRelocationBlock(LittleEndianStructure): + _fields_ = ( + ("PageRVA", c_uint32), + ("BlockSize", c_uint32), + ) + + def __init__(self, PageRVA: int): + super().__init__(PageRVA) + self.entries: typing.List[PeRelocationEntry] = [] + + +class PeRelocationEntry(LittleEndianStructure): + _fields_ = ( + ("Offset", c_uint16, 12), + ("Type", c_uint16, 4), + ) + + +class PeOptionalHeaderStart(LittleEndianStructure): + _fields_ = ( + ("Magic", c_uint16), + ("MajorLinkerVersion", c_uint8), + ("MinorLinkerVersion", c_uint8), + ("SizeOfCode", c_uint32), + ("SizeOfInitializedData", c_uint32), + ("SizeOfUninitializedData", c_uint32), + ("AddressOfEntryPoint", c_uint32), + ("BaseOfCode", c_uint32), + ) + + +class PeOptionalHeaderMiddle(LittleEndianStructure): + _fields_ = ( + ("SectionAlignment", c_uint32), + ("FileAlignment", c_uint32), + ("MajorOperatingSystemVersion", c_uint16), + ("MinorOperatingSystemVersion", c_uint16), + ("MajorImageVersion", c_uint16), + ("MinorImageVersion", c_uint16), + ("MajorSubsystemVersion", c_uint16), + ("MinorSubsystemVersion", c_uint16), + ("Win32VersionValue", c_uint32), + ("SizeOfImage", c_uint32), + ("SizeOfHeaders", c_uint32), + ("CheckSum", c_uint32), + ("Subsystem", c_uint16), + ("DllCharacteristics", c_uint16), + ) + + +class PeOptionalHeaderEnd(LittleEndianStructure): + _fields_ = ( + ("LoaderFlags", c_uint32), + ("NumberOfRvaAndSizes", c_uint32), + ("ExportTable", PeDataDirectory), + ("ImportTable", PeDataDirectory), + ("ResourceTable", PeDataDirectory), + ("ExceptionTable", PeDataDirectory), + ("CertificateTable", PeDataDirectory), + ("BaseRelocationTable", PeDataDirectory), + ("Debug", PeDataDirectory), + ("Architecture", PeDataDirectory), + ("GlobalPtr", PeDataDirectory), + ("TLSTable", PeDataDirectory), + ("LoadConfigTable", PeDataDirectory), + ("BoundImport", PeDataDirectory), + ("IAT", PeDataDirectory), + ("DelayImportDescriptor", PeDataDirectory), + ("CLRRuntimeHeader", PeDataDirectory), + ("Reserved", PeDataDirectory), + ) + + +class PeOptionalHeader(LittleEndianStructure): + pass + + +class PeOptionalHeader32(PeOptionalHeader): + _anonymous_ = ("Start", "Middle", "End") + _fields_ = ( + ("Start", PeOptionalHeaderStart), + ("BaseOfData", c_uint32), + ("ImageBase", c_uint32), + ("Middle", PeOptionalHeaderMiddle), + ("SizeOfStackReserve", c_uint32), + ("SizeOfStackCommit", c_uint32), + ("SizeOfHeapReserve", c_uint32), + ("SizeOfHeapCommit", c_uint32), + ("End", PeOptionalHeaderEnd), + ) + + +class PeOptionalHeader32Plus(PeOptionalHeader): + _anonymous_ = ("Start", "Middle", "End") + _fields_ = ( + ("Start", PeOptionalHeaderStart), + ("ImageBase", c_uint64), + ("Middle", PeOptionalHeaderMiddle), + ("SizeOfStackReserve", c_uint64), + ("SizeOfStackCommit", c_uint64), + ("SizeOfHeapReserve", c_uint64), + ("SizeOfHeapCommit", c_uint64), + ("End", PeOptionalHeaderEnd), + ) + + +class PeSection(LittleEndianStructure): + _fields_ = ( + ("Name", c_char * 8), + ("VirtualSize", c_uint32), + ("VirtualAddress", c_uint32), + ("SizeOfRawData", c_uint32), + ("PointerToRawData", c_uint32), + ("PointerToRelocations", c_uint32), + ("PointerToLinenumbers", c_uint32), + ("NumberOfRelocations", c_uint16), + ("NumberOfLinenumbers", c_uint16), + ("Characteristics", c_uint32), + ) + + def __init__(self): + super().__init__() + self.data = bytearray() + + +N_DATA_DIRECTORY_ENTRIES = 16 + +assert sizeof(PeSection) == 40 +assert sizeof(PeCoffHeader) == 20 +assert sizeof(PeOptionalHeader32) == 224 +assert sizeof(PeOptionalHeader32Plus) == 240 + +PE_CHARACTERISTICS_RX = 0x60000020 # CNT_CODE|MEM_READ|MEM_EXECUTE +PE_CHARACTERISTICS_RW = 0xC0000040 # CNT_INITIALIZED_DATA|MEM_READ|MEM_WRITE +PE_CHARACTERISTICS_R = 0x40000040 # CNT_INITIALIZED_DATA|MEM_READ + +IGNORE_SECTIONS = [ + ".eh_frame", + ".eh_frame_hdr", + ".ARM.exidx", +] + +IGNORE_SECTION_TYPES = [ + "SHT_DYNAMIC", + "SHT_DYNSYM", + "SHT_GNU_ATTRIBUTES", + "SHT_GNU_HASH", + "SHT_HASH", + "SHT_NOTE", + "SHT_REL", + "SHT_RELA", + "SHT_RELR", + "SHT_STRTAB", + "SHT_SYMTAB", +] + +# EFI mandates 4KiB memory pages. +SECTION_ALIGNMENT = 4096 +FILE_ALIGNMENT = 512 + +# Nobody cares about DOS headers, so put the PE header right after. +PE_OFFSET = 64 +PE_MAGIC = b"PE\0\0" + + +def align_to(x: int, align: int) -> int: + return (x + align - 1) & ~(align - 1) + + +def align_down(x: int, align: int) -> int: + return x & ~(align - 1) + + +def next_section_address(sections: typing.List[PeSection]) -> int: + return align_to( + sections[-1].VirtualAddress + sections[-1].VirtualSize, SECTION_ALIGNMENT + ) + + +def iter_copy_sections(elf: ELFFile) -> typing.Iterator[PeSection]: + pe_s = None + + # This is essentially the same as copying by ELF load segments, except that we assemble them + # manually, so that we can easily strip unwanted sections. We try to only discard things we know + # about so that there are no surprises. + + relro = None + for elf_seg in elf.iter_segments(): + if elf_seg["p_type"] == "PT_LOAD" and elf_seg["p_align"] != SECTION_ALIGNMENT: + raise RuntimeError("ELF segments are not properly aligned.") + elif elf_seg["p_type"] == "PT_GNU_RELRO": + relro = elf_seg + + for elf_s in elf.iter_sections(): + if ( + elf_s["sh_flags"] & SH_FLAGS.SHF_ALLOC == 0 + or elf_s["sh_type"] in IGNORE_SECTION_TYPES + or elf_s.name in IGNORE_SECTIONS + ): + continue + if elf_s["sh_type"] not in ["SHT_PROGBITS", "SHT_NOBITS"]: + raise RuntimeError(f"Unknown section {elf_s.name}.") + + if elf_s["sh_flags"] & SH_FLAGS.SHF_EXECINSTR: + rwx = PE_CHARACTERISTICS_RX + elif elf_s["sh_flags"] & SH_FLAGS.SHF_WRITE: + rwx = PE_CHARACTERISTICS_RW + else: + rwx = PE_CHARACTERISTICS_R + + # PE images are always relro. + if relro and relro.section_in_segment(elf_s): + rwx = PE_CHARACTERISTICS_R + + if pe_s and pe_s.Characteristics != rwx: + yield pe_s + pe_s = None + + if pe_s: + # Insert padding to properly align the section. + pad_len = elf_s["sh_addr"] - pe_s.VirtualAddress - len(pe_s.data) + pe_s.data += bytearray(pad_len) + elf_s.data() + else: + pe_s = PeSection() + pe_s.VirtualAddress = elf_s["sh_addr"] + pe_s.Characteristics = rwx + pe_s.data = elf_s.data() + + if pe_s: + yield pe_s + + +def convert_sections(elf: ELFFile, opt: PeOptionalHeader) -> typing.List[PeSection]: + last_vma = 0 + sections = [] + + for pe_s in iter_copy_sections(elf): + # Truncate the VMA to the nearest page and insert appropriate padding. This should not + # cause any overlap as this is pretty much how ELF *segments* are loaded/mmapped anyways. + # The ELF sections inside should also be properly aligned as we reuse the ELF VMA layout + # for the PE image. + vma = pe_s.VirtualAddress + pe_s.VirtualAddress = align_down(vma, SECTION_ALIGNMENT) + pe_s.data = bytearray(vma - pe_s.VirtualAddress) + pe_s.data + + pe_s.VirtualSize = len(pe_s.data) + pe_s.SizeOfRawData = align_to(len(pe_s.data), FILE_ALIGNMENT) + pe_s.Name = { + PE_CHARACTERISTICS_RX: b".text", + PE_CHARACTERISTICS_RW: b".data", + PE_CHARACTERISTICS_R: b".rodata", + }[pe_s.Characteristics] + + # This can happen if not building with `-z separate-code`. + if pe_s.VirtualAddress < last_vma: + raise RuntimeError("Overlapping PE sections.") + last_vma = pe_s.VirtualAddress + pe_s.VirtualSize + + if pe_s.Name == b".text": + opt.BaseOfCode = pe_s.VirtualAddress + opt.SizeOfCode += pe_s.VirtualSize + else: + opt.SizeOfInitializedData += pe_s.VirtualSize + + if pe_s.Name == b".data" and isinstance(opt, PeOptionalHeader32): + opt.BaseOfData = pe_s.VirtualAddress + + sections.append(pe_s) + + return sections + + +def copy_sections( + elf: ELFFile, + opt: PeOptionalHeader, + input_names: str, + sections: typing.List[PeSection], +): + for name in input_names.split(","): + elf_s = elf.get_section_by_name(name) + if not elf_s: + continue + if elf_s.data_alignment > 1 and SECTION_ALIGNMENT % elf_s.data_alignment != 0: + raise RuntimeError(f"ELF section {name} is not aligned.") + if elf_s["sh_flags"] & (SH_FLAGS.SHF_EXECINSTR | SH_FLAGS.SHF_WRITE) != 0: + raise RuntimeError(f"ELF section {name} is not read-only data.") + + pe_s = PeSection() + pe_s.Name = name.encode() + pe_s.data = elf_s.data() + pe_s.VirtualAddress = next_section_address(sections) + pe_s.VirtualSize = len(elf_s.data()) + pe_s.SizeOfRawData = align_to(len(elf_s.data()), FILE_ALIGNMENT) + pe_s.Characteristics = PE_CHARACTERISTICS_R + opt.SizeOfInitializedData += pe_s.VirtualSize + sections.append(pe_s) + + +def apply_elf_relative_relocation( + reloc: ElfRelocation, + image_base: int, + sections: typing.List[PeSection], + addend_size: int, +): + # fmt: off + [target] = [ + pe_s for pe_s in sections + if pe_s.VirtualAddress <= reloc["r_offset"] < pe_s.VirtualAddress + len(pe_s.data) + ] + # fmt: on + + addend_offset = reloc["r_offset"] - target.VirtualAddress + + if reloc.is_RELA(): + addend = reloc["r_addend"] + else: + addend = target.data[addend_offset : addend_offset + addend_size] + addend = int.from_bytes(addend, byteorder="little") + + value = (image_base + addend).to_bytes(addend_size, byteorder="little") + target.data[addend_offset : addend_offset + addend_size] = value + + +def convert_elf_reloc_table( + elf: ELFFile, + elf_reloc_table: ElfRelocationTable, + elf_image_base: int, + sections: typing.List[PeSection], + pe_reloc_blocks: typing.Dict[int, PeRelocationBlock], +): + NONE_RELOC = { + "EM_386": ENUM_RELOC_TYPE_i386["R_386_NONE"], + "EM_AARCH64": ENUM_RELOC_TYPE_AARCH64["R_AARCH64_NONE"], + "EM_ARM": ENUM_RELOC_TYPE_ARM["R_ARM_NONE"], + "EM_LOONGARCH": 0, + "EM_RISCV": 0, + "EM_X86_64": ENUM_RELOC_TYPE_x64["R_X86_64_NONE"], + }[elf["e_machine"]] + + RELATIVE_RELOC = { + "EM_386": ENUM_RELOC_TYPE_i386["R_386_RELATIVE"], + "EM_AARCH64": ENUM_RELOC_TYPE_AARCH64["R_AARCH64_RELATIVE"], + "EM_ARM": ENUM_RELOC_TYPE_ARM["R_ARM_RELATIVE"], + "EM_LOONGARCH": 3, + "EM_RISCV": 3, + "EM_X86_64": ENUM_RELOC_TYPE_x64["R_X86_64_RELATIVE"], + }[elf["e_machine"]] + + for reloc in elf_reloc_table.iter_relocations(): + if reloc["r_info_type"] == NONE_RELOC: + continue + + if reloc["r_info_type"] == RELATIVE_RELOC: + apply_elf_relative_relocation( + reloc, elf_image_base, sections, elf.elfclass // 8 + ) + + # Now that the ELF relocation has been applied, we can create a PE relocation. + block_rva = reloc["r_offset"] & ~0xFFF + if block_rva not in pe_reloc_blocks: + pe_reloc_blocks[block_rva] = PeRelocationBlock(block_rva) + + entry = PeRelocationEntry() + entry.Offset = reloc["r_offset"] & 0xFFF + # REL_BASED_HIGHLOW or REL_BASED_DIR64 + entry.Type = 3 if elf.elfclass == 32 else 10 + pe_reloc_blocks[block_rva].entries.append(entry) + + continue + + raise RuntimeError(f"Unsupported relocation {reloc}") + + +def convert_elf_relocations( + elf: ELFFile, + opt: PeOptionalHeader, + sections: typing.List[PeSection], + minimum_sections: int, +) -> typing.Optional[PeSection]: + dynamic = elf.get_section_by_name(".dynamic") + if dynamic is None: + raise RuntimeError("ELF .dynamic section is missing.") + + [flags_tag] = dynamic.iter_tags("DT_FLAGS_1") + if not flags_tag["d_val"] & ENUM_DT_FLAGS_1["DF_1_PIE"]: + raise RuntimeError("ELF file is not a PIE.") + + # This checks that the ELF image base is 0. + symtab = elf.get_section_by_name(".symtab") + if symtab: + exe_start = symtab.get_symbol_by_name("__executable_start") + if exe_start and exe_start[0]["st_value"] != 0: + raise RuntimeError("Unexpected ELF image base.") + + opt.SizeOfHeaders = align_to( + PE_OFFSET + + len(PE_MAGIC) + + sizeof(PeCoffHeader) + + sizeof(opt) + + sizeof(PeSection) * max(len(sections) + 1, minimum_sections), + FILE_ALIGNMENT, + ) + + # We use the basic VMA layout from the ELF image in the PE image. This could cause the first + # section to overlap the PE image headers during runtime at VMA 0. We can simply apply a fixed + # offset relative to the PE image base when applying/converting ELF relocations. Afterwards we + # just have to apply the offset to the PE addresses so that the PE relocations work correctly on + # the ELF portions of the image. + segment_offset = 0 + if sections[0].VirtualAddress < opt.SizeOfHeaders: + segment_offset = align_to( + opt.SizeOfHeaders - sections[0].VirtualAddress, SECTION_ALIGNMENT + ) + + opt.AddressOfEntryPoint = elf["e_entry"] + segment_offset + opt.BaseOfCode += segment_offset + if isinstance(opt, PeOptionalHeader32): + opt.BaseOfData += segment_offset + + pe_reloc_blocks: typing.Dict[int, PeRelocationBlock] = {} + for reloc_type, reloc_table in dynamic.get_relocation_tables().items(): + if reloc_type not in ["REL", "RELA"]: + raise RuntimeError("Unsupported relocation type {elf_reloc_type}.") + convert_elf_reloc_table( + elf, reloc_table, opt.ImageBase + segment_offset, sections, pe_reloc_blocks + ) + + for pe_s in sections: + pe_s.VirtualAddress += segment_offset + + if len(pe_reloc_blocks) == 0: + return None + + data = bytearray() + for rva in sorted(pe_reloc_blocks): + block = pe_reloc_blocks[rva] + n_relocs = len(block.entries) + + # Each block must start on a 32-bit boundary. Because each entry is 16 bits + # the len has to be even. We pad by adding a none relocation. + if n_relocs % 2 != 0: + n_relocs += 1 + block.entries.append(PeRelocationEntry()) + + block.PageRVA += segment_offset + block.BlockSize = ( + sizeof(PeRelocationBlock) + sizeof(PeRelocationEntry) * n_relocs + ) + data += block + for entry in sorted(block.entries, key=lambda e: e.Offset): + data += entry + + pe_reloc_s = PeSection() + pe_reloc_s.Name = b".reloc" + pe_reloc_s.data = data + pe_reloc_s.VirtualAddress = next_section_address(sections) + pe_reloc_s.VirtualSize = len(data) + pe_reloc_s.SizeOfRawData = align_to(len(data), FILE_ALIGNMENT) + # CNT_INITIALIZED_DATA|MEM_READ|MEM_DISCARDABLE + pe_reloc_s.Characteristics = 0x42000040 + + sections.append(pe_reloc_s) + opt.SizeOfInitializedData += pe_reloc_s.VirtualSize + return pe_reloc_s + + +def write_pe( + file, coff: PeCoffHeader, opt: PeOptionalHeader, sections: typing.List[PeSection] +): + file.write(b"MZ") + file.seek(0x3C, io.SEEK_SET) + file.write(PE_OFFSET.to_bytes(2, byteorder="little")) + file.seek(PE_OFFSET, io.SEEK_SET) + file.write(PE_MAGIC) + file.write(coff) + file.write(opt) + + offset = opt.SizeOfHeaders + for pe_s in sorted(sections, key=lambda s: s.VirtualAddress): + if pe_s.VirtualAddress < opt.SizeOfHeaders: + # Linker script should make sure this does not happen. + raise RuntimeError(f"Section {pe_s.Name} overlapping PE headers.") + + pe_s.PointerToRawData = offset + file.write(pe_s) + offset = align_to(offset + len(pe_s.data), FILE_ALIGNMENT) + + assert file.tell() <= opt.SizeOfHeaders + + for pe_s in sections: + file.seek(pe_s.PointerToRawData, io.SEEK_SET) + file.write(pe_s.data) + + file.truncate(offset) + + +def elf2efi(args: argparse.Namespace): + elf = ELFFile(args.ELF) + if not elf.little_endian: + raise RuntimeError("ELF file is not little-endian.") + if elf["e_type"] not in ["ET_DYN", "ET_EXEC"]: + raise RuntimeError("Unsupported ELF type.") + + pe_arch = { + "EM_386": 0x014C, + "EM_AARCH64": 0xAA64, + "EM_ARM": 0x01C2, + "EM_LOONGARCH": 0x6232 if elf.elfclass == 32 else 0x6264, + "EM_RISCV": 0x5032 if elf.elfclass == 32 else 0x5064, + "EM_X86_64": 0x8664, + }.get(elf["e_machine"]) + if pe_arch is None: + raise RuntimeError(f"Unsupported ELF arch {elf['e_machine']}") + + coff = PeCoffHeader() + opt = PeOptionalHeader32() if elf.elfclass == 32 else PeOptionalHeader32Plus() + + # We relocate to a unique image base to reduce the chances for runtime relocation to occur. + base_name = pathlib.Path(args.PE.name).name.encode() + opt.ImageBase = int(hashlib.sha1(base_name).hexdigest()[0:8], 16) + if elf.elfclass == 32: + opt.ImageBase = (0x400000 + opt.ImageBase) & 0xFFFF0000 + else: + opt.ImageBase = (0x100000000 + opt.ImageBase) & 0x1FFFF0000 + + sections = convert_sections(elf, opt) + copy_sections(elf, opt, args.copy_sections, sections) + pe_reloc_s = convert_elf_relocations(elf, opt, sections, args.minimum_sections) + + coff.Machine = pe_arch + coff.NumberOfSections = len(sections) + coff.TimeDateStamp = int(os.environ.get("SOURCE_DATE_EPOCH", time.time())) + coff.SizeOfOptionalHeader = sizeof(opt) + # EXECUTABLE_IMAGE|LINE_NUMS_STRIPPED|LOCAL_SYMS_STRIPPED|DEBUG_STRIPPED + # and (32BIT_MACHINE or LARGE_ADDRESS_AWARE) + coff.Characteristics = 0x30E if elf.elfclass == 32 else 0x22E + + opt.SectionAlignment = SECTION_ALIGNMENT + opt.FileAlignment = FILE_ALIGNMENT + opt.MajorImageVersion = args.version_major + opt.MinorImageVersion = args.version_minor + opt.MajorSubsystemVersion = args.efi_major + opt.MinorSubsystemVersion = args.efi_minor + opt.Subsystem = args.subsystem + opt.Magic = 0x10B if elf.elfclass == 32 else 0x20B + opt.SizeOfImage = next_section_address(sections) + + # DYNAMIC_BASE|NX_COMPAT|HIGH_ENTROPY_VA or DYNAMIC_BASE|NX_COMPAT + opt.DllCharacteristics = 0x160 if elf.elfclass == 64 else 0x140 + + # These values are taken from a natively built PE binary (although, unused by EDK2/EFI). + opt.SizeOfStackReserve = 0x100000 + opt.SizeOfStackCommit = 0x001000 + opt.SizeOfHeapReserve = 0x100000 + opt.SizeOfHeapCommit = 0x001000 + + opt.NumberOfRvaAndSizes = N_DATA_DIRECTORY_ENTRIES + if pe_reloc_s: + opt.BaseRelocationTable = PeDataDirectory( + pe_reloc_s.VirtualAddress, pe_reloc_s.VirtualSize + ) + + write_pe(args.PE, coff, opt, sections) + + +def main(): + parser = argparse.ArgumentParser(description="Convert ELF binaries to PE/EFI") + parser.add_argument( + "--version-major", + type=int, + default=0, + help="Major image version of EFI image", + ) + parser.add_argument( + "--version-minor", + type=int, + default=0, + help="Minor image version of EFI image", + ) + parser.add_argument( + "--efi-major", + type=int, + default=0, + help="Minimum major EFI subsystem version", + ) + parser.add_argument( + "--efi-minor", + type=int, + default=0, + help="Minimum minor EFI subsystem version", + ) + parser.add_argument( + "--subsystem", + type=int, + default=10, + help="PE subsystem", + ) + parser.add_argument( + "ELF", + type=argparse.FileType("rb"), + help="Input ELF file", + ) + parser.add_argument( + "PE", + type=argparse.FileType("wb"), + help="Output PE/EFI file", + ) + parser.add_argument( + "--minimum-sections", + type=int, + default=0, + help="Minimum number of sections to leave space for", + ) + parser.add_argument( + "--copy-sections", + type=str, + default="", + help="Copy these sections if found", + ) + + elf2efi(parser.parse_args()) + + +if __name__ == "__main__": + main() diff --git a/tools/find-build-dir.sh b/tools/find-build-dir.sh new file mode 100755 index 0000000..79a79fc --- /dev/null +++ b/tools/find-build-dir.sh @@ -0,0 +1,33 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1-or-later +set -eu + +# Try to guess the build directory: +# we look for subdirectories of the parent directory that look like ninja build dirs. + +if [ -n "${BUILD_DIR:=}" ]; then + realpath "$BUILD_DIR" + exit 0 +fi + +root="$(dirname "$(realpath "$0")")" + +found= +for i in "$root"/../*/build.ninja; do + c="$(dirname "$i")" + [ -d "$c" ] || continue + [ "$(basename "$c")" != mkosi.builddir ] || continue + + if [ -n "$found" ]; then + echo "Found multiple candidates, specify build directory with \$BUILD_DIR" >&2 + exit 2 + fi + found="$c" +done + +if [ -z "$found" ]; then + echo "Specify build directory with \$BUILD_DIR" >&2 + exit 1 +fi + +realpath "$found" diff --git a/tools/find-double-newline.sh b/tools/find-double-newline.sh new file mode 100755 index 0000000..2999a58 --- /dev/null +++ b/tools/find-double-newline.sh @@ -0,0 +1,43 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1-or-later + +set -eu + +TOP="$(git rev-parse --show-toplevel)" + +case "${1:-}" in + recdiff) + if [ "${2:-}" = "" ] ; then + DIR="$TOP" + else + DIR="$2" + fi + + find "$DIR" -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec "$0" diff \{\} \; + ;; + + recpatch) + if [ "${2:-}" = "" ] ; then + DIR="$TOP" + else + DIR="$2" + fi + + find "$DIR" -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec "$0" patch \{\} \; + ;; + + diff) + T="$(mktemp)" + sed '/^$/N;/^\n$/D' <"${2:?}" >"$T" + diff -u "$2" "$T" + rm -f "$T" + ;; + + patch) + sed -i '/^$/N;/^\n$/D' "${2:?}" + ;; + + *) + echo "Expected recdiff|recpatch|diff|patch as verb." >&2 + ;; +esac diff --git a/tools/find-tabs.sh b/tools/find-tabs.sh new file mode 100755 index 0000000..6cea339 --- /dev/null +++ b/tools/find-tabs.sh @@ -0,0 +1,43 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1-or-later + +set -eu + +TOP="$(git rev-parse --show-toplevel)" + +case "${1:-}" in + recdiff) + if [ "${2:-}" = "" ] ; then + DIR="$TOP" + else + DIR="$2" + fi + + find "$DIR" -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec "$0" diff \{\} \; + ;; + + recpatch) + if [ "${2:-}" = "" ] ; then + DIR="$TOP" + else + DIR="$2" + fi + + find "$DIR" -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec "$0" patch \{\} \; + ;; + + diff) + T="$(mktemp)" + sed 's/\t/ /g' <"${2:?}" >"$T" + diff -u "$2" "$T" + rm -f "$T" + ;; + + patch) + sed -i 's/\t/ /g' "${2:?}" + ;; + + *) + echo "Expected recdiff|recpatch|diff|patch as verb." >&2 + ;; +esac diff --git a/tools/function_ignorelist b/tools/function_ignorelist new file mode 100644 index 0000000..d29479d --- /dev/null +++ b/tools/function_ignorelist @@ -0,0 +1,34 @@ +sd_booted +sd_get_seats +sd_get_sessions +sd_get_uids +sd_is_fifo +sd_is_socket +sd_is_socket_inet +sd_is_socket_unix +sd_is_mq +sd_listen_fds +sd_login_monitor_new +sd_login_monitor_unref +sd_login_monitor_flush +sd_login_monitor_get_fd +sd_notify +sd_notifyf +sd_pid_get_session +sd_pid_get_unit +sd_pid_get_owner_uid +sd_readahead +sd_seat_get_active +sd_seat_get_sessions +sd_seat_can_multi_session +sd_session_is_active +sd_session_get_uid +sd_session_get_seat +sd_session_get_service +sd_session_get_type +sd_session_get_class +sd_session_get_display +sd_uid_get_state +sd_uid_is_on_seat +sd_uid_get_sessions +sd_uid_get_seats diff --git a/tools/gdb-sd_dump_hashmaps.py b/tools/gdb-sd_dump_hashmaps.py new file mode 100644 index 0000000..57f825a --- /dev/null +++ b/tools/gdb-sd_dump_hashmaps.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-or-later +# pylint: disable=consider-using-f-string + +import gdb + +class sd_dump_hashmaps(gdb.Command): + "dump systemd's hashmaps" + + def __init__(self): + super().__init__("sd_dump_hashmaps", gdb.COMMAND_DATA, gdb.COMPLETE_NONE) + + def invoke(self, arg, _from_tty): + d = gdb.parse_and_eval("hashmap_debug_list") + hashmap_type_info = gdb.parse_and_eval("hashmap_type_info") + uchar_t = gdb.lookup_type("unsigned char") + ulong_t = gdb.lookup_type("unsigned long") + debug_offset = gdb.parse_and_eval("(unsigned long)&((HashmapBase*)0)->debug") + + print("type, hash, indirect, entries, max_entries, buckets, creator") + while d: + h = gdb.parse_and_eval(f"(HashmapBase*)((char*){int(d.cast(ulong_t))} - {debug_offset})") + + if h["has_indirect"]: + storage_ptr = h["indirect"]["storage"].cast(uchar_t.pointer()) + n_entries = h["indirect"]["n_entries"] + n_buckets = h["indirect"]["n_buckets"] + else: + storage_ptr = h["direct"]["storage"].cast(uchar_t.pointer()) + n_entries = h["n_direct_entries"] + n_buckets = hashmap_type_info[h["type"]]["n_direct_buckets"] + + t = ["plain", "ordered", "set"][int(h["type"])] + + print(f'{t}, {h["hash_ops"]}, {bool(h["has_indirect"])}, {n_entries}, {d["max_entries"]}, {n_buckets}, {d["func"].string()}, {d["file"].string()}:{d["line"]}') + + if arg != "" and n_entries > 0: + dib_raw_addr = storage_ptr + hashmap_type_info[h["type"]]["entry_size"] * n_buckets + + histogram = {} + for i in range(0, n_buckets): + dib = int(dib_raw_addr[i]) + histogram[dib] = histogram.get(dib, 0) + 1 + + for dib in sorted(histogram): + if dib != 255: + print(f"{dib:>3} {histogram[dib]:>8} {float(histogram[dib]/n_entries):.0%} of entries") + else: + print(f"{dib:>3} {histogram[dib]:>8} {float(histogram[dib]/n_buckets):.0%} of slots") + s = sum(dib*count for (dib, count) in histogram.items() if dib != 255) / n_entries + print(f"mean DIB of entries: {s}") + + blocks = [] + current_len = 1 + prev = int(dib_raw_addr[0]) + for i in range(1, n_buckets): + dib = int(dib_raw_addr[i]) + if (dib == 255) != (prev == 255): + if prev != 255: + blocks += [[i, current_len]] + current_len = 1 + else: + current_len += 1 + + prev = dib + if prev != 255: + blocks += [[i, current_len]] + # a block may be wrapped around + if len(blocks) > 1 and blocks[0][0] == blocks[0][1] and blocks[-1][0] == n_buckets - 1: + blocks[0][1] += blocks[-1][1] + blocks = blocks[0:-1] + print("max block: {}".format(max(blocks, key=lambda a: a[1]))) + print("sum block lens: {}".format(sum(b[1] for b in blocks))) + print("mean block len: {}".format(sum(b[1] for b in blocks) / len(blocks))) + + d = d["debug_list_next"] + +sd_dump_hashmaps() diff --git a/tools/generate-gperfs.py b/tools/generate-gperfs.py new file mode 100755 index 0000000..3887bb6 --- /dev/null +++ b/tools/generate-gperfs.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-or-later +# pylint: disable=unbalanced-tuple-unpacking,consider-using-f-string,consider-using-with + +""" +Generate %-from-name.gperf from %-list.txt +""" + +import sys + +if __name__ == '__main__': + if len(sys.argv) != 4: + sys.exit(f'Usage: {sys.argv[0]} name prefix file') + + name, prefix, file = sys.argv[1:] + + print("""\ +%{ +#if __GNUC__ >= 7 +_Pragma("GCC diagnostic ignored \\"-Wimplicit-fallthrough\\"") +#endif +%}""") + print(f"""\ +struct {name}_name {{ const char* name; int id; }}; +%null-strings +%%""") + + for line in open(file): + print("{0}, {1}{0}".format(line.rstrip(), prefix)) diff --git a/tools/git-contrib.sh b/tools/git-contrib.sh new file mode 100755 index 0000000..6371d49 --- /dev/null +++ b/tools/git-contrib.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1-or-later +set -eu + +tag="$(git describe --abbrev=0 --match 'v[0-9][0-9][0-9]')" +( + # authors + git log --pretty=tformat:%aN -s "${tag}.." + # Co-authors (drop empty line and mail addresses) + git log --pretty='tformat:%(trailers:key=Co-authored-by,valueonly)' -s "${tag}.." | sed -e '/^[[:space:]]*$/ d' | sed -e 's/ <.*@.*>$//' +) | + grep -v noreply@weblate.org | + sed 's/ / /g; s/--/-/g; s/.*/\0,/' | + sort -u | tr '\n' ' ' | sed -e "s/^/Contributions from: /g" -e "s/,\s*$/\n/g" | fold -w 72 -s | + sed -e "s/^/ /g" -e "s/\s*$//g" diff --git a/tools/list-discoverable-partitions.py b/tools/list-discoverable-partitions.py new file mode 100644 index 0000000..a19bf1d --- /dev/null +++ b/tools/list-discoverable-partitions.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-or-later + +import re +import sys +import uuid + +HEADER = '''\ +| Name | Partition Type UUID | Allowed File Systems | Explanation | +|------|---------------------|----------------------|-------------| +''' + +ARCHITECTURES = { + 'ALPHA': 'Alpha', + 'ARC': 'ARC', + 'ARM': '32-bit ARM', + 'ARM64': '64-bit ARM/AArch64', + 'IA64': 'Itanium/IA-64', + 'LOONGARCH64': 'LoongArch 64-bit', + 'MIPS_LE': '32-bit MIPS LittleEndian (mipsel)', + 'MIPS64_LE': '64-bit MIPS LittleEndian (mips64el)', + 'PARISC': 'HPPA/PARISC', + 'PPC': '32-bit PowerPC', + 'PPC64': '64-bit PowerPC BigEndian', + 'PPC64_LE': '64-bit PowerPC LittleEndian', + 'RISCV32': 'RISC-V 32-bit', + 'RISCV64': 'RISC-V 64-bit', + 'S390': 's390', + 'S390X': 's390x', + 'TILEGX': 'TILE-Gx', + 'X86': 'x86', + 'X86_64': 'amd64/x86_64', +} + +TYPES = { + 'ROOT' : 'Root Partition', + 'ROOT_VERITY' : 'Root Verity Partition', + 'ROOT_VERITY_SIG' : 'Root Verity Signature Partition', + 'USR' : '`/usr/` Partition', + 'USR_VERITY' : '`/usr/` Verity Partition', + 'USR_VERITY_SIG' : '`/usr/` Verity Signature Partition', + + 'ESP': 'EFI System Partition', + 'SRV': 'Server Data Partition', + 'VAR': 'Variable Data Partition', + 'TMP': 'Temporary Data Partition', + 'SWAP': 'Swap', + 'HOME': 'Home Partition', + 'USER_HOME': 'Per-user Home Partition', + 'LINUX_GENERIC': 'Generic Linux Data Partition', + 'XBOOTLDR': 'Extended Boot Loader Partition', +} + +DESCRIPTIONS = { + 'ROOT': ( + 'Any native, optionally in LUKS', + 'On systems with matching architecture, the first partition with this type UUID on the disk ' + 'containing the active EFI ESP is automatically mounted to the root directory `/`. ' + 'If the partition is encrypted with LUKS or has dm-verity integrity data (see below), the ' + 'device mapper file will be named `/dev/mapper/root`.'), + 'USR': ( + 'Any native, optionally in LUKS', + 'Similar semantics to root partition, but just the `/usr/` partition.'), + 'ROOT_VERITY': ( + 'A dm-verity superblock followed by hash data', + 'Contains dm-verity integrity hash data for the matching root partition. If this feature is ' + 'used the partition UUID of the root partition should be the first 128 bits of the root hash ' + 'of the dm-verity hash data, and the partition UUID of this dm-verity partition should be the ' + 'final 128 bits of it, so that the root partition and its Verity partition can be discovered ' + 'easily, simply by specifying the root hash.'), + 'USR_VERITY': ( + 'A dm-verity superblock followed by hash data', + 'Similar semantics to root Verity partition, but just for the `/usr/` partition.'), + 'ROOT_VERITY_SIG': ( + 'A serialized JSON object, see below', + 'Contains a root hash and a PKCS#7 signature for it, permitting signed dm-verity GPT images.'), + 'USR_VERITY_SIG': ( + 'A serialized JSON object, see below', + 'Similar semantics to root Verity signature partition, but just for the `/usr/` partition.'), + + 'ESP': ( + 'VFAT', + 'The ESP used for the current boot is automatically mounted to `/efi/` (or `/boot/` as ' + 'fallback), unless a different partition is mounted there (possibly via `/etc/fstab`, or ' + 'because the Extended Boot Loader Partition — see below — exists) or the directory is ' + 'non-empty on the root disk. This partition type is defined by the ' + '[UEFI Specification](http://www.uefi.org/specifications).'), + 'XBOOTLDR': ( + 'Typically VFAT', + 'The Extended Boot Loader Partition (XBOOTLDR) used for the current boot is automatically ' + 'mounted to `/boot/`, unless a different partition is mounted there (possibly via ' + '`/etc/fstab`) or the directory is non-empty on the root disk. This partition type ' + 'is defined by the [Boot Loader ' + 'Specification](https://uapi-group.org/specifications/specs/boot_loader_specification).'), + 'SWAP': ( + 'Swap, optionally in LUKS', + 'All swap partitions on the disk containing the root partition are automatically enabled. ' + 'If the partition is encrypted with LUKS, the device mapper file will be named ' + '`/dev/mapper/swap`. This partition type predates the Discoverable Partitions Specification.'), + 'HOME': ( + 'Any native, optionally in LUKS', + 'The first partition with this type UUID on the disk containing the root partition is ' + 'automatically mounted to `/home/`. If the partition is encrypted with LUKS, the device ' + 'mapper file will be named `/dev/mapper/home`.'), + 'SRV': ( + 'Any native, optionally in LUKS', + 'The first partition with this type UUID on the disk containing the root partition is ' + 'automatically mounted to `/srv/`. If the partition is encrypted with LUKS, the device ' + 'mapper file will be named `/dev/mapper/srv`.'), + 'VAR': ( + 'Any native, optionally in LUKS', + 'The first partition with this type UUID on the disk containing the root partition is ' + 'automatically mounted to `/var/` — under the condition that its partition UUID matches ' + 'the first 128 bits of `HMAC-SHA256(machine-id, 0x4d21b016b53445c2a9fb5c16e091fd2d)` ' + '(i.e. the SHA256 HMAC hash of the binary type UUID keyed by the machine ID as read from ' + '[`/etc/machine-id`](https://www.freedesktop.org/software/systemd/man/machine-id.html). ' + 'This special requirement is made because `/var/` (unlike the other partition types ' + 'listed here) is inherently private to a specific installation and cannot possibly be ' + 'shared between multiple OS installations on the same disk, and thus should be bound to ' + 'a specific instance of the OS, identified by its machine ID. If the partition is ' + 'encrypted with LUKS, the device mapper file will be named `/dev/mapper/var`.'), + 'TMP': ( + 'Any native, optionally in LUKS', + 'The first partition with this type UUID on the disk containing the root partition is ' + 'automatically mounted to `/var/tmp/`. If the partition is encrypted with LUKS, the ' + 'device mapper file will be named `/dev/mapper/tmp`. Note that the intended mount point ' + 'is indeed `/var/tmp/`, not `/tmp/`. The latter is typically maintained in memory via ' + '`tmpfs` and does not require a partition on disk. In some cases it might be ' + 'desirable to make `/tmp/` persistent too, in which case it is recommended to make it ' + 'a symlink or bind mount to `/var/tmp/`, thus not requiring its own partition type UUID.'), + 'USER_HOME': ( + 'Any native, optionally in LUKS', + 'A home partition of a user, managed by ' + '[`systemd-homed`](https://www.freedesktop.org/software/systemd/man/systemd-homed.html).'), + 'LINUX_GENERIC': ( + 'Any native, optionally in LUKS', + 'No automatic mounting takes place for other Linux data partitions. This partition type ' + 'should be used for all partitions that carry Linux file systems. The installer needs ' + 'to mount them explicitly via entries in `/etc/fstab`. Optionally, these partitions may ' + 'be encrypted with LUKS. This partition type predates the Discoverable Partitions Specification.'), +} + +def extract(file): + for line in file: + # print(line) + m = re.match(r'^#define\s+SD_GPT_(.*SD_ID128_MAKE\(.*\))', line) + if not m: + continue + + name = line.split()[1] + if m2 := re.match(r'^(ROOT|USR)_([A-Z0-9]+|X86_64|PPC64_LE|MIPS_LE|MIPS64_LE)(|_VERITY|_VERITY_SIG)\s+SD_ID128_MAKE\((.*)\)', m.group(1)): + ptype, arch, suffix, u = m2.groups() + u = uuid.UUID(u.replace(',', '')) + assert arch in ARCHITECTURES, f'{arch} not in f{ARCHITECTURES}' + ptype = f'{type}{suffix}' + assert ptype in TYPES + + yield name, ptype, arch, u + + elif m2 := re.match(r'(\w+)\s+SD_ID128_MAKE\((.*)\)', m.group(1)): + ptype, u = m2.groups() + u = uuid.UUID(u.replace(',', '')) + yield name, ptype, None, u + + else: + raise ValueError(f'Failed to match: {m.group(1)}') + +def generate(defines): + prevtype = None + + print(HEADER, end='') + + uuids = set() + + for name, ptype, arch, puuid in defines: + tdesc = TYPES[ptype] + adesc = '' if arch is None else f' ({ARCHITECTURES[arch]})' + + # Let's make sure that we didn't select&paste the same value twice + assert puuid not in uuids + uuids.add(puuid) + + if ptype != prevtype: + prevtype = ptype + morea, moreb = DESCRIPTIONS[ptype] + else: + morea = moreb = 'ditto' + + print(f'| _{tdesc}{adesc}_ | `{puuid}` `{name}` | {morea} | {moreb} |') + +if __name__ == '__main__': + known = extract(sys.stdin) + generate(known) diff --git a/tools/make-autosuspend-rules.py b/tools/make-autosuspend-rules.py new file mode 100755 index 0000000..b1b4cef --- /dev/null +++ b/tools/make-autosuspend-rules.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-or-later + +# Generate autosuspend rules for devices that have been tested to work properly +# with autosuspend by the Chromium OS team. Based on +# https://chromium.googlesource.com/chromiumos/platform2/+/master/power_manager/udev/gen_autosuspend_rules.py + +import chromiumos.gen_autosuspend_rules + +print('# pci:v<00VENDOR>d<00DEVICE> (8 uppercase hexadecimal digits twice)') +for entry in chromiumos.gen_autosuspend_rules.PCI_IDS: + vendor, device = entry.split(':') + vendor = int(vendor, 16) + device = int(device, 16) + print(f'pci:v{vendor:08X}d{device:08X}*') + +print('# usb:v<VEND>p<PROD> (4 uppercase hexadecimal digits twice)') +for entry in chromiumos.gen_autosuspend_rules.USB_IDS: + vendor, product = entry.split(':') + vendor = int(vendor, 16) + product = int(product, 16) + print(f'usb:v{vendor:04X}p{product:04X}*') + +print(' ID_AUTOSUSPEND=1') diff --git a/tools/make-directive-index.py b/tools/make-directive-index.py new file mode 100755 index 0000000..5398b45 --- /dev/null +++ b/tools/make-directive-index.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-or-later + +import collections +import re +import sys +from copy import deepcopy + +from xml_helper import tree, xml_parse, xml_print + +COLOPHON = '''\ +This index contains {count} entries in {sections} sections, +referring to {pages} individual manual pages. +''' + +def _extract_directives(directive_groups, formatting, page): + t = xml_parse(page) + section = t.find('./refmeta/manvolnum').text + pagename = t.find('./refmeta/refentrytitle').text + + storopt = directive_groups['options'] + for variablelist in t.iterfind('.//variablelist'): + klass = variablelist.attrib.get('class') + searchpath = variablelist.attrib.get('xpath','./varlistentry/term/varname') + storvar = directive_groups[klass or 'miscellaneous'] + # <option>s go in OPTIONS, unless class is specified + for xpath, stor in ((searchpath, storvar), + ('./varlistentry/term/option', + storvar if klass else storopt)): + for name in variablelist.iterfind(xpath): + text = re.sub(r'([= ]).*', r'\1', name.text).rstrip() + if text.startswith('-'): + # for options, merge options with and without mandatory arg + text = text.partition('=')[0] + stor[text].append((pagename, section)) + if text not in formatting: + # use element as formatted display + if name.text[-1] in "= '": + name.clear() + else: + name.tail = '' + name.text = text + formatting[text] = name + extra = variablelist.attrib.get('extra-ref') + if extra: + stor[extra].append((pagename, section)) + if extra not in formatting: + elt = tree.Element("varname") + elt.text= extra + formatting[extra] = elt + + storfile = directive_groups['filenames'] + for xpath, absolute_only in (('.//refsynopsisdiv//filename', False), + ('.//refsynopsisdiv//command', False), + ('.//filename', True)): + for name in t.iterfind(xpath): + if absolute_only and not (name.text and name.text.startswith('/')): + continue + if name.attrib.get('index') == 'false': + continue + name.tail = '' + if name.text: + if name.text.endswith('*'): + name.text = name.text[:-1] + if not name.text.startswith('.'): + text = name.text.partition(' ')[0] + if text != name.text: + name.clear() + name.text = text + if text.endswith('/'): + text = text[:-1] + storfile[text].append((pagename, section)) + if text not in formatting: + # use element as formatted display + formatting[text] = name + else: + text = ' '.join(name.itertext()) + storfile[text].append((pagename, section)) + formatting[text] = name + + for name in t.iterfind('.//constant'): + if name.attrib.get('index') == 'false': + continue + name.tail = '' + if name.text.startswith('('): # a cast, strip it + name.text = name.text.partition(' ')[2] + klass = name.attrib.get('class') or 'constants' + storfile = directive_groups[klass] + storfile[name.text].append((pagename, section)) + formatting[name.text] = name + + storfile = directive_groups['specifiers'] + for name in t.iterfind(".//table[@class='specifiers']//entry/literal"): + if name.text[0] != '%' or name.getparent().text is not None: + continue + if name.attrib.get('index') == 'false': + continue + storfile[name.text].append((pagename, section)) + formatting[name.text] = name + for name in t.iterfind(".//literal[@class='specifiers']"): + storfile[name.text].append((pagename, section)) + formatting[name.text] = name + +def _make_section(template, name, directives, formatting): + varlist = template.find(f".//*[@id='{name}']") + for varname, manpages in sorted(directives.items()): + entry = tree.SubElement(varlist, 'varlistentry') + term = tree.SubElement(entry, 'term') + display = deepcopy(formatting[varname]) + term.append(display) + + para = tree.SubElement(tree.SubElement(entry, 'listitem'), 'para') + + b = None + for manpage, manvolume in sorted(set(manpages)): + if b is not None: + b.tail = ', ' + b = tree.SubElement(para, 'citerefentry') + c = tree.SubElement(b, 'refentrytitle') + c.text = manpage + c.attrib['target'] = varname + d = tree.SubElement(b, 'manvolnum') + d.text = manvolume + entry.tail = '\n\n' + +def _make_colophon(template, groups): + count = 0 + pages = set() + for group in groups: + count += len(group) + for pagelist in group.values(): + pages |= set(pagelist) + + para = template.find(".//para[@id='colophon']") + para.text = COLOPHON.format(count=count, + sections=len(groups), + pages=len(pages)) + +def _make_page(template, directive_groups, formatting): + """Create an XML tree from directive_groups. + + directive_groups = { + 'class': {'variable': [('manpage', 'manvolume'), ...], + 'variable2': ...}, + ... + } + """ + for name, directives in directive_groups.items(): + _make_section(template, name, directives, formatting) + + _make_colophon(template, directive_groups.values()) + + return template + +def make_page(template_path, xml_files): + "Extract directives from xml_files and return XML index tree." + template = xml_parse(template_path) + names = [vl.get('id') for vl in template.iterfind('.//variablelist')] + directive_groups = {name:collections.defaultdict(list) + for name in names} + formatting = {} + for page in xml_files: + try: + _extract_directives(directive_groups, formatting, page) + except Exception as e: + raise ValueError("failed to process " + page) from e + + return _make_page(template, directive_groups, formatting) + +if __name__ == '__main__': + with open(sys.argv[1], 'wb') as f: + _template_path = sys.argv[2] + _xml_files = sys.argv[3:] + _xml = make_page(_template_path, _xml_files) + f.write(xml_print(_xml)) diff --git a/tools/make-man-index.py b/tools/make-man-index.py new file mode 100755 index 0000000..579dd40 --- /dev/null +++ b/tools/make-man-index.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-or-later + +import collections +import re +import sys + +from xml_helper import tree, xml_parse, xml_print + +MDASH = ' — ' if sys.version_info.major >= 3 else ' -- ' + +TEMPLATE = '''\ +<refentry id="systemd.index"> + + <refentryinfo> + <title>systemd.index</title> + <productname>systemd</productname> + </refentryinfo> + + <refmeta> + <refentrytitle>systemd.index</refentrytitle> + <manvolnum>7</manvolnum> + </refmeta> + + <refnamediv> + <refname>systemd.index</refname> + <refpurpose>List all manpages from the systemd project</refpurpose> + </refnamediv> +</refentry> +''' + +SUMMARY = '''\ + <refsect1> + <title>See Also</title> + <para> + <citerefentry><refentrytitle>systemd.directives</refentrytitle><manvolnum>7</manvolnum></citerefentry> + </para> + + <para id='counts' /> + </refsect1> +''' + +COUNTS = '\ +This index contains {count} entries, referring to {pages} individual manual pages.' + + +def check_id(page, t): + page_id = t.getroot().get('id') + if not re.search('/' + page_id + '[.]', page): + raise ValueError(f"id='{page_id}' is not the same as page name '{page}'") + +def make_index(pages): + index = collections.defaultdict(list) + for p in pages: + t = xml_parse(p) + check_id(p, t) + section = t.find('./refmeta/manvolnum').text + refname = t.find('./refnamediv/refname').text + purpose_text = ' '.join(t.find('./refnamediv/refpurpose').itertext()) + purpose = ' '.join(purpose_text.split()) + for f in t.findall('./refnamediv/refname'): + infos = (f.text, section, purpose, refname) + index[f.text[0].upper()].append(infos) + return index + +def add_letter(template, letter, pages): + refsect1 = tree.SubElement(template, 'refsect1') + title = tree.SubElement(refsect1, 'title') + title.text = letter + para = tree.SubElement(refsect1, 'para') + for info in sorted(pages, key=lambda info: str.lower(info[0])): + refname, section, purpose, _realname = info + + b = tree.SubElement(para, 'citerefentry') + c = tree.SubElement(b, 'refentrytitle') + c.text = refname + d = tree.SubElement(b, 'manvolnum') + d.text = section + + b.tail = MDASH + purpose # + ' (' + p + ')' + + tree.SubElement(para, 'sbr') + +def add_summary(template, indexpages): + count = 0 + pages = set() + for group in indexpages: + count += len(group) + for info in group: + _refname, section, _purpose, realname = info + pages.add((realname, section)) + + refsect1 = tree.fromstring(SUMMARY) + template.append(refsect1) + + para = template.find(".//para[@id='counts']") + para.text = COUNTS.format(count=count, pages=len(pages)) + +def make_page(*xml_files): + template = tree.fromstring(TEMPLATE) + index = make_index(xml_files) + + for letter in sorted(index): + add_letter(template, letter, index[letter]) + + add_summary(template, index.values()) + + return template + +if __name__ == '__main__': + with open(sys.argv[1], 'wb') as file: + file.write(xml_print(make_page(*sys.argv[2:]))) diff --git a/tools/meson-build.sh b/tools/meson-build.sh new file mode 100755 index 0000000..2366df2 --- /dev/null +++ b/tools/meson-build.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1-or-later +set -eux + +sourcedir="${1:?}" +builddir="${2:?}" +target="${3:?}" +c_args="${4:?}" +cpp_args="${5:?}" +options="${6:?}" +CC="${7:?}" +CXX="$8" + +if [ ! -f "$builddir/build.ninja" ]; then + # shellcheck disable=SC2086 + CC="$CC" CXX="$CXX" meson setup -Dc_args="$c_args" -Dcpp_args="$cpp_args" "$builddir" "$sourcedir" $options +fi + +# Locate ninja binary, on CentOS 7 it is called ninja-build, so use that name if available. +command -v ninja-build >/dev/null && ninja="ninja-build" || ninja="ninja" +"$ninja" -C "$builddir" "$target" diff --git a/tools/meson-render-jinja2.py b/tools/meson-render-jinja2.py new file mode 100755 index 0000000..3a3d912 --- /dev/null +++ b/tools/meson-render-jinja2.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-or-later +# pylint: disable=consider-using-with + +import ast +import os +import re +import sys + +import jinja2 + +def parse_config_h(filename): + # Parse config.h file generated by meson. + ans = {} + for line in open(filename): + m = re.match(r'#define\s+(\w+)\s+(.*)', line) + if not m: + continue + a, b = m.groups() + if b and b[0] in '0123456789"': + b = ast.literal_eval(b) + ans[a] = b + return ans + +def render(filename, defines): + text = open(filename).read() + template = jinja2.Template(text, + trim_blocks=True, + lstrip_blocks=True, + keep_trailing_newline=True, + undefined=jinja2.StrictUndefined) + return template.render(defines) + +def main(): + defines = parse_config_h(sys.argv[1]) + defines.update(parse_config_h(sys.argv[2])) + output = render(sys.argv[3], defines) + with open(sys.argv[4], 'w') as f: + f.write(output) + info = os.stat(sys.argv[3]) + os.chmod(sys.argv[4], info.st_mode) + +if __name__ == '__main__': + main() diff --git a/tools/meson-vcs-tag.sh b/tools/meson-vcs-tag.sh new file mode 100755 index 0000000..4a8dc89 --- /dev/null +++ b/tools/meson-vcs-tag.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later + +set -u +set -o pipefail + +dir="${1:?}" +fallback="${2:?}" +version_tag="${3:-}" + +if [ -n "${version_tag}" ]; then + # If -Dversion_tag= was used, just use that without further changes. + echo "${version_tag}" +else + # Check that we have either .git/ (a normal clone) or a .git file (a work-tree) + # and that we don't get confused if a tarball is extracted in a higher-level + # git repository. + # + # If the working tree has no tags (CI builds), the first git-describe will fail + # and we fall back to project_version-commitid instead. + + c='' + if [ -e "${dir}/.git" ]; then + c="$(git -C "$dir" describe --abbrev=7 --dirty=^ 2>/dev/null)" + if [ -z "$c" ]; then + # This call might still fail with permission issues + suffix="$(git -C "$dir" describe --always --abbrev=7 --dirty=^ 2>/dev/null)" + [ -n "$suffix" ] && c="${fallback}-${suffix}" + fi + fi + [ -z "$c" ] && c="${fallback}" + echo "$c" | sed 's/^v//; s/-rc/~rc/' +fi diff --git a/tools/oss-fuzz.sh b/tools/oss-fuzz.sh new file mode 100755 index 0000000..df3d39e --- /dev/null +++ b/tools/oss-fuzz.sh @@ -0,0 +1,143 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later + +set -ex + +export LC_CTYPE=C.UTF-8 + +export CC=${CC:-clang} +export CXX=${CXX:-clang++} +clang_version="$($CC --version | sed -nr 's/.*version ([^ ]+?) .*/\1/p' | sed -r 's/-$//')" + +SANITIZER=${SANITIZER:-address -fsanitize-address-use-after-scope} +flags="-O1 -fno-omit-frame-pointer -g -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -fsanitize=$SANITIZER" + +clang_lib="/usr/lib64/clang/${clang_version}/lib/linux" +[ -d "$clang_lib" ] || clang_lib="/usr/lib/clang/${clang_version}/lib/linux" + +export CFLAGS=${CFLAGS:-$flags} +export CXXFLAGS=${CXXFLAGS:-$flags} +export LDFLAGS=${LDFLAGS:--L${clang_lib}} + +export WORK=${WORK:-$(pwd)} +export OUT=${OUT:-$(pwd)/out} +mkdir -p "$OUT" + +build="$WORK/build" +rm -rf "$build" +mkdir -p "$build" + +meson_args=("-Db_lundef=false") + +if [ -z "$FUZZING_ENGINE" ]; then + meson_args+=("-Dllvm-fuzz=true") +else + meson_args+=("-Doss-fuzz=true" "--auto-features=disabled") + + apt-get update + apt-get install -y gperf m4 gettext python3-pip \ + libcap-dev libmount-dev \ + pkg-config wget python3-jinja2 zipmerge zstd + + if [[ "$ARCHITECTURE" == i386 ]]; then + apt-get install -y pkg-config:i386 libcap-dev:i386 libmount-dev:i386 + fi + + pip3 install -r .github/workflows/requirements.txt --require-hashes + + # https://github.com/google/oss-fuzz/issues/6868 + ORIG_PYTHONPATH=$(python3 -c 'import sys;print(":".join(sys.path[1:]))') + export PYTHONPATH="$ORIG_PYTHONPATH:/usr/lib/python3/dist-packages/" + + if [[ "$SANITIZER" == undefined ]]; then + additional_ubsan_checks=pointer-overflow,alignment + UBSAN_FLAGS="-fsanitize=$additional_ubsan_checks -fno-sanitize-recover=$additional_ubsan_checks" + CFLAGS="$CFLAGS $UBSAN_FLAGS" + CXXFLAGS="$CXXFLAGS $UBSAN_FLAGS" + fi + + if [[ "$SANITIZER" == introspector ]]; then + # fuzz-introspector passes -fuse-ld=gold and -flto using CFLAGS/LDFLAGS and due to + # https://github.com/mesonbuild/meson/issues/6377#issuecomment-575977919 and + # https://github.com/mesonbuild/meson/issues/6377 it doesn't mix well with meson. + # It's possible to build systemd with duct tape there using something like + # https://github.com/google/oss-fuzz/pull/7583#issuecomment-1104011067 but + # apparently even with gold and lto some parts of systemd are missing from + # reports (presumably due to https://github.com/google/oss-fuzz/issues/7598). + # Let's just fail here for now to make it clear that fuzz-introspector isn't supported. + exit 1 + fi +fi + +if ! meson setup "$build" "${meson_args[@]}"; then + cat "$build/meson-logs/meson-log.txt" + exit 1 +fi + +ninja -v -C "$build" fuzzers + +# Compressed BCD files are kept in test/test-bcd so let's unpack them +# and put them all in the seed corpus. +bcd=$(mktemp -d) +for i in test/test-bcd/*.zst; do + unzstd "$i" -o "$bcd/$(basename "${i%.zst}")"; +done +zip -jqr "$OUT/fuzz-bcd_seed_corpus.zip" "$bcd" +rm -rf "$bcd" + +hosts=$(mktemp) +wget -O "$hosts" https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts +zip -jq "$OUT/fuzz-etc-hosts_seed_corpus.zip" "$hosts" +rm -rf "$hosts" + +# The seed corpus is a separate flat archive for each fuzzer, +# with a fixed name ${fuzzer}_seed_corpus.zip. +for d in test/fuzz/fuzz-*; do + fuzzer="$(basename "$d")" + # Include the build-generated corpora if any as well + readarray -t generated < <(find "$build/test/fuzz" -maxdepth 1 -name "${fuzzer}*" -type f) + zip -jqr "$OUT/${fuzzer}_seed_corpus.zip" "$d" "${generated[@]}" +done + +# get fuzz-dns-packet corpus +df="$build/dns-fuzzing" +git clone --depth 1 https://github.com/CZ-NIC/dns-fuzzing "$df" +zip -jqr "$OUT/fuzz-dns-packet_seed_corpus.zip" "$df/packet" + +install -Dt "$OUT/src/shared/" \ + "$build"/src/shared/libsystemd-shared-*.so \ + "$build"/src/core/libsystemd-core-*.so + +# Most i386 libraries have to be brought to the runtime environment somehow. Ideally they +# should be linked statically but since it isn't possible another way to keep them close +# to the fuzz targets is used here. The dependencies are copied to "$OUT/src/shared" and +# then 'rpath' is tweaked to make it possible for the linker to find them there. "$OUT/src/shared" +# is chosen because the runtime search path of all the fuzz targets already points to it +# to load "libsystemd-shared" and "libsystemd-core". Stuff like that should be avoided on +# x86_64 because it tends to break coverage reports, fuzz-introspector, CIFuzz and so on. +if [[ "$ARCHITECTURE" == i386 ]]; then + for lib_path in $(ldd "$OUT"/src/shared/libsystemd-shared-*.so | awk '/=> \/lib/ { print $3 }'); do + lib_name=$(basename "$lib_path") + cp "$lib_path" "$OUT/src/shared" + patchelf --set-rpath \$ORIGIN "$OUT/src/shared/$lib_name" + done + patchelf --set-rpath \$ORIGIN "$OUT"/src/shared/libsystemd-shared-*.so +fi + +wget -O "$OUT/fuzz-json.dict" https://raw.githubusercontent.com/rc0r/afl-fuzz/master/dictionaries/json.dict + +find "$build" -maxdepth 1 -type f -executable -name "fuzz-*" -exec mv {} "$OUT" \; +find src -type f -name "fuzz-*.dict" -exec cp {} "$OUT" \; +cp src/fuzz/*.options "$OUT" + +if [[ "$MERGE_WITH_OSS_FUZZ_CORPORA" == "yes" ]]; then + for f in "$OUT/"fuzz-*; do + [[ -x "$f" ]] || continue + fuzzer=$(basename "$f") + t=$(mktemp) + if wget -O "$t" "https://storage.googleapis.com/systemd-backup.clusterfuzz-external.appspot.com/corpus/libFuzzer/systemd_${fuzzer}/public.zip"; then + zipmerge "$OUT/${fuzzer}_seed_corpus.zip" "$t" + fi + rm -rf "$t" + done +fi diff --git a/tools/sync-docs.py b/tools/sync-docs.py new file mode 100755 index 0000000..95436e2 --- /dev/null +++ b/tools/sync-docs.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-or-later + +from argparse import ArgumentParser +import glob +import json +import os +import re +import subprocess +import sys + +import requests + +BASE_URL = "https://www.freedesktop.org/software/systemd/man/" +JQUERY_URL = "https://code.jquery.com/jquery-3.7.1.min.js" +SCRIPT_TAG = '<script src="{}"></script>' + +NAV_JS = """ +$(document).ready(function() { + $.getJSON("../index.json", function(data) { + data.sort().reverse(); + + var [filename, dirname] = window.location.pathname.split("/").reverse(); + + var items = []; + $.each( data, function(_, version) { + if (version == dirname) { + items.push( "<option selected value='" + version + "'>" + "systemd " + version + "</option>"); + } else if (dirname == "latest" && version == data[0]) { + items.push( "<option selected value='" + version + "'>" + "systemd " + version + "</option>"); + } else { + items.push( "<option value='" + version + "'>" + "systemd " + version + "</option>"); + } + }); + + $("span:first").html($( "<select/>", { + id: "version-selector", + html: items.join( "" ) + })); + + $("#version-selector").on("change", function() { + window.location.assign("../" + $(this).val() + "/" + filename); + }); + }); +}); +""" + + +def process_file(filename): + with open(filename) as f: + contents = f.read() + + if SCRIPT_TAG.format("../nav.js") in contents: + return + + body_tag = re.search("<body[^>]*>", contents) + new_contents = ( + contents[: body_tag.end()] + + SCRIPT_TAG.format(JQUERY_URL) + + SCRIPT_TAG.format("../nav.js") + + contents[body_tag.end() :] + ) + + with open(filename, "w") as f: + f.write(new_contents) + + +def update_index_file(version, index_filename): + response = requests.get(BASE_URL + "index.json") + if response.status_code == 404: + index = [] + elif response.ok: + index = response.json() + else: + sys.exit(f"Error getting index: {response.status_code} {response.reason}") + + if version not in index: + index.insert(0, version) + + with open(index_filename, "w") as f: + json.dump(index, f) + + +def get_latest_version(): + tags = subprocess.check_output(["git", "tag", "-l", "v*"], text=True).split() + versions = [] + for tag in tags: + m = re.match("v?(\d+).*", tag) + if m: + versions.append(int(m.group(1))) + return max(versions) + + +def main(version, directory, www_target): + index_filename = os.path.join(directory, "index.json") + nav_filename = os.path.join(directory, "nav.js") + + current_branch = subprocess.check_output(["git", "branch", "--show-current"], text=True).strip() + + if current_branch != 'main' and not current_branch.endswith("-stable"): + sys.exit("doc-sync should only be run from main or a stable branch") + + for filename in glob.glob(os.path.join(directory, "*.html")): + process_file(filename) + + if current_branch == "main": + version = "devel" + dirs = ["devel"] + elif int(version) == get_latest_version(): + dirs = [version, "latest"] + else: + dirs = [version] + + with open(nav_filename, "w") as f: + f.write(NAV_JS) + + update_index_file(version, index_filename) + + for d in dirs: + subprocess.check_call( + [ + "rsync", + "-rlv", + "--delete-excluded", + "--include=*.html", + "--exclude=*", + "--omit-dir-times", + directory + "/", # copy contents of directory + os.path.join(www_target, "man", d), + ] + ) + + subprocess.check_call( + [ + "rsync", + "-v", + os.path.join(directory, "index.json"), + os.path.join(directory, "nav.js"), + os.path.join(www_target, "man"), + ] + ) + + +if __name__ == "__main__": + parser = ArgumentParser() + parser.add_argument("--version", required=True) + parser.add_argument("directory") + parser.add_argument("www_target") + + args = parser.parse_args() + main(args.version, args.directory, args.www_target) diff --git a/tools/update-dbus-docs.py b/tools/update-dbus-docs.py new file mode 100755 index 0000000..008f7d4 --- /dev/null +++ b/tools/update-dbus-docs.py @@ -0,0 +1,365 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-or-later +# pylint: disable=superfluous-parens,consider-using-with + +import argparse +import collections +import sys +import os +import subprocess +import io + +try: + from lxml import etree +except ModuleNotFoundError as e: + etree = e + +try: + from shlex import join as shlex_join +except ImportError as e: + shlex_join = e + +try: + from shlex import quote as shlex_quote +except ImportError as e: + shlex_quote = e + +class NoCommand(Exception): + pass + +BORING_INTERFACES = [ + 'org.freedesktop.DBus.Peer', + 'org.freedesktop.DBus.Introspectable', + 'org.freedesktop.DBus.Properties', +] +RED = '\x1b[31m' +GREEN = '\x1b[32m' +YELLOW = '\x1b[33m' +RESET = '\x1b[39m' + +arguments = None + +def xml_parser(): + return etree.XMLParser(no_network=True, + remove_comments=False, + strip_cdata=False, + resolve_entities=False) + +def print_method(declarations, elem, *, prefix, file, is_signal=False): + name = elem.get('name') + klass = 'signal' if is_signal else 'method' + declarations[klass].append(name) + + # @org.freedesktop.systemd1.Privileged("true") + # SetShowStatus(in s mode); + + for anno in elem.findall('./annotation'): + anno_name = anno.get('name') + anno_value = anno.get('value') + print(f'''{prefix}@{anno_name}("{anno_value}")''', file=file) + + print(f'''{prefix}{name}(''', file=file, end='') + lead = ',\n' + prefix + ' ' * len(name) + ' ' + + for num, arg in enumerate(elem.findall('./arg')): + argname = arg.get('name') + + if argname is None: + if arguments.print_errors: + print(f'method {name}: argument {num+1} has no name', file=sys.stderr) + argname = 'UNNAMED' + + argtype = arg.get('type') + if not is_signal: + direction = arg.get('direction') + print(f'''{lead if num > 0 else ''}{direction:3} {argtype} {argname}''', file=file, end='') + else: + print(f'''{lead if num > 0 else ''}{argtype} {argname}''', file=file, end='') + + print(');', file=file) + +ACCESS_MAP = { + 'read' : 'readonly', + 'write' : 'readwrite', +} + +def value_ellipsis(prop_type): + if prop_type == 's': + return "'...'" + if prop_type[0] == 'a': + inner = value_ellipsis(prop_type[1:]) + return f"[{inner}{', ...' if inner != '...' else ''}]" + return '...' + +def print_property(declarations, elem, *, prefix, file): + prop_name = elem.get('name') + prop_type = elem.get('type') + prop_access = elem.get('access') + + declarations['property'].append(prop_name) + + # @org.freedesktop.DBus.Property.EmitsChangedSignal("false") + # @org.freedesktop.systemd1.Privileged("true") + # readwrite b EnableWallMessages = false; + + for anno in elem.findall('./annotation'): + anno_name = anno.get('name') + anno_value = anno.get('value') + print(f'''{prefix}@{anno_name}("{anno_value}")''', file=file) + + prop_access = ACCESS_MAP.get(prop_access, prop_access) + print(f'''{prefix}{prop_access} {prop_type} {prop_name} = {value_ellipsis(prop_type)};''', file=file) + +def print_interface(iface, *, prefix, file, print_boring, only_interface, declarations): + name = iface.get('name') + + is_boring = (name in BORING_INTERFACES or + only_interface is not None and name != only_interface) + + if is_boring and print_boring: + print(f'''{prefix}interface {name} {{ ... }};''', file=file) + + elif not is_boring and not print_boring: + print(f'''{prefix}interface {name} {{''', file=file) + prefix2 = prefix + ' ' + + for num, elem in enumerate(iface.findall('./method')): + if num == 0: + print(f'''{prefix2}methods:''', file=file) + print_method(declarations, elem, prefix=prefix2 + ' ', file=file) + + for num, elem in enumerate(iface.findall('./signal')): + if num == 0: + print(f'''{prefix2}signals:''', file=file) + print_method(declarations, elem, prefix=prefix2 + ' ', file=file, is_signal=True) + + for num, elem in enumerate(iface.findall('./property')): + if num == 0: + print(f'''{prefix2}properties:''', file=file) + print_property(declarations, elem, prefix=prefix2 + ' ', file=file) + + print(f'''{prefix}}};''', file=file) + +def check_documented(document, declarations, stats, interface, missing_version): + missing = [] + + sections = document.findall("refsect1") + history_section = document.find("refsect1[title = 'History']") + if history_section is not None: + sections.remove(history_section) + + for klass, items in declarations.items(): + stats['total'] += len(items) + + for item in items: + if klass == 'method': + elem = 'function' + item_repr = f'{item}()' + elif klass == 'signal': + elem = 'function' + item_repr = item + elif klass == 'property': + elem = 'varname' + item_repr = item + else: + assert False, (klass, item) + + predicate = f".//{elem}[. = '{item_repr}']" + if not any(section.find(predicate) is not None for section in sections): + if arguments.print_errors: + print(f'{klass} {item} is not documented :(') + missing.append((klass, item)) + + if history_section is None or history_section.find(predicate) is None: + missing_version.append(f"{interface}.{item_repr}") + + stats['missing'] += len(missing) + + return missing + +def xml_to_text(destination, xml, *, only_interface=None): + file = io.StringIO() + + declarations = collections.defaultdict(list) + interfaces = [] + + print(f'''node {destination} {{''', file=file) + + for print_boring in [False, True]: + for iface in xml.findall('./interface'): + print_interface(iface, prefix=' ', file=file, + print_boring=print_boring, + only_interface=only_interface, + declarations=declarations) + name = iface.get('name') + if not name in BORING_INTERFACES: + interfaces.append(name) + + print('''};''', file=file) + + return file.getvalue(), declarations, interfaces + +def subst_output(document, programlisting, stats, missing_version): + executable = programlisting.get('executable', None) + if executable is None: + # Not our thing + return + executable = programlisting.get('executable') + node = programlisting.get('node') + interface = programlisting.get('interface') + + argv = [f'{arguments.build_dir}/{executable}', f'--bus-introspect={interface}'] + if isinstance(shlex_join, Exception): + print(f'COMMAND: {" ".join(shlex_quote(arg) for arg in argv)}') + else: + print(f'COMMAND: {shlex_join(argv)}') + + try: + out = subprocess.check_output(argv, universal_newlines=True) + except FileNotFoundError: + print(f'{executable} not found, ignoring', file=sys.stderr) + return + + xml = etree.fromstring(out, parser=xml_parser()) + + new_text, declarations, interfaces = xml_to_text(node, xml, only_interface=interface) + programlisting.text = '\n' + new_text + ' ' + + if declarations: + missing = check_documented(document, declarations, stats, interface, missing_version) + parent = programlisting.getparent() + + # delete old comments + for child in parent: + if child.tag is etree.Comment and 'Autogenerated' in child.text: + parent.remove(child) + if child.tag is etree.Comment and 'not documented' in child.text: + parent.remove(child) + if child.tag == "variablelist" and child.attrib.get("generated", False) == "True": + parent.remove(child) + + # insert pointer for systemd-directives generation + the_tail = programlisting.tail #tail is erased by addnext, so save it here. + prev_element = etree.Comment("Autogenerated cross-references for systemd.directives, do not edit") + programlisting.addnext(prev_element) + programlisting.tail = the_tail + + for interface in interfaces: + variablelist = etree.Element("variablelist") + variablelist.attrib['class'] = 'dbus-interface' + variablelist.attrib['generated'] = 'True' + variablelist.attrib['extra-ref'] = interface + + prev_element.addnext(variablelist) + prev_element.tail = the_tail + prev_element = variablelist + + for decl_type,decl_list in declarations.items(): + for declaration in decl_list: + variablelist = etree.Element("variablelist") + variablelist.attrib['class'] = 'dbus-'+decl_type + variablelist.attrib['generated'] = 'True' + if decl_type == 'method' : + variablelist.attrib['extra-ref'] = declaration + '()' + else: + variablelist.attrib['extra-ref'] = declaration + + prev_element.addnext(variablelist) + prev_element.tail = the_tail + prev_element = variablelist + + last_element = etree.Comment("End of Autogenerated section") + prev_element.addnext(last_element) + prev_element.tail = the_tail + last_element.tail = the_tail + + # insert comments for undocumented items + for item in reversed(missing): + comment = etree.Comment(f'{item[0]} {item[1]} is not documented!') + comment.tail = programlisting.tail + parent.insert(parent.index(programlisting) + 1, comment) + +def process(page, missing_version): + src = open(page).read() + xml = etree.fromstring(src, parser=xml_parser()) + + # print('parsing {}'.format(name), file=sys.stderr) + if xml.tag != 'refentry': + return None + + stats = collections.Counter() + + pls = xml.findall('.//programlisting') + for pl in pls: + subst_output(xml, pl, stats, missing_version) + + out_text = etree.tostring(xml, encoding='unicode') + # massage format to avoid some lxml whitespace handling idiosyncrasies + # https://bugs.launchpad.net/lxml/+bug/526799 + out_text = (src[:src.find('<refentryinfo')] + + out_text[out_text.find('<refentryinfo'):] + + '\n') + + if not arguments.test: + with open(page, 'w') as out: + out.write(out_text) + + return { "stats" : stats, "modified" : out_text != src } + +def parse_args(): + p = argparse.ArgumentParser() + p.add_argument('--test', action='store_true', + help='only verify that everything is up2date') + p.add_argument('--build-dir', default='build') + p.add_argument('pages', nargs='+') + opts = p.parse_args() + opts.print_errors = not opts.test + return opts + +def main(): + # pylint: disable=global-statement + global arguments + arguments = parse_args() + + for item in (etree, shlex_quote): + if isinstance(item, Exception): + print(item, file=sys.stderr) + sys.exit(77 if arguments.test else 1) + + if not os.path.exists(f'{arguments.build_dir}/systemd'): + sys.exit(f"{arguments.build_dir}/systemd doesn't exist. Use --build-dir=.") + + missing_version = [] + stats = {page.split('/')[-1] : process(page, missing_version) for page in arguments.pages} + + ignore_list = open(os.path.join(os.path.dirname(__file__), 'dbus_ignorelist')).read().split() + missing_version = [x for x in missing_version if x not in ignore_list] + + for missing in missing_version: + print(f"{RED}Missing version information for {missing}{RESET}") + + if missing_version: + sys.exit(1) + + # Let's print all statistics at the end + mlen = max(len(page) for page in stats) + total = sum((item['stats'] for item in stats.values()), collections.Counter()) + total = 'total', { "stats" : total, "modified" : False } + modified = [] + classification = 'OUTDATED' if arguments.test else 'MODIFIED' + for page, info in sorted(stats.items()) + [total]: + m = info['stats']['missing'] + t = info['stats']['total'] + p = page + ':' + c = classification if info['modified'] else '' + if c: + modified.append(page) + color = RED if m > t/2 else (YELLOW if m else GREEN) + print(f'{color}{p:{mlen + 1}} {t - m}/{t} {c}{RESET}') + + if arguments.test and modified: + sys.exit(f'Outdated pages: {", ".join(modified)}\n' + f'Hint: ninja -C {arguments.build_dir} update-dbus-docs') + +if __name__ == '__main__': + main() diff --git a/tools/update-hwdb-autosuspend.sh b/tools/update-hwdb-autosuspend.sh new file mode 100755 index 0000000..75aecb7 --- /dev/null +++ b/tools/update-hwdb-autosuspend.sh @@ -0,0 +1,17 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1-or-later +set -eu + +cd "${1:?}" + +(curl --fail -L 'https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/power_manager/udev/gen_autosuspend_rules.py?format=TEXT'; echo) \ + | base64 -d >tools/chromiumos/gen_autosuspend_rules.py + +(cat <<EOF +# This file is part of systemd. +# +# Rules to autosuspend known fingerprint readers (pulled from libfprint). +# +EOF +curl --fail -L 'https://gitlab.freedesktop.org/libfprint/libfprint/-/raw/master/data/autosuspend.hwdb') \ + >hwdb.d/60-autosuspend-fingerprint-reader.hwdb diff --git a/tools/update-hwdb.sh b/tools/update-hwdb.sh new file mode 100755 index 0000000..096a100 --- /dev/null +++ b/tools/update-hwdb.sh @@ -0,0 +1,33 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1-or-later +set -eu + +cd "${1:?}" + +unset permissive +if [ "${2:-}" = "-p" ]; then + permissive=1 + shift +else + permissive=0 +fi + +if [ "${2:-}" != "-n" ]; then ( + [ -z "$permissive" ] || set +e + set -x + + curl --fail -L -o usb.ids 'http://www.linux-usb.org/usb.ids' + curl --fail -L -o pci.ids 'http://pci-ids.ucw.cz/v2.2/pci.ids' + curl --fail -L -o ma-large.txt 'http://standards-oui.ieee.org/oui/oui.txt' + curl --fail -L -o ma-medium.txt 'http://standards-oui.ieee.org/oui28/mam.txt' + curl --fail -L -o ma-small.txt 'http://standards-oui.ieee.org/oui36/oui36.txt' + curl --fail -L -o pnp_id_registry.csv 'https://uefi.org/uefi-pnp-export' + curl --fail -L -o acpi_id_registry.csv 'https://uefi.org/uefi-acpi-export' +) fi + +set -x +./acpi-update.py >20-acpi-vendor.hwdb.base +patch -p0 -o- 20-acpi-vendor.hwdb.base <20-acpi-vendor.hwdb.patch >20-acpi-vendor.hwdb +diff -u 20-acpi-vendor.hwdb.base 20-acpi-vendor.hwdb >20-acpi-vendor.hwdb.patch && exit 1 + +./ids_parser.py diff --git a/tools/update-man-rules.py b/tools/update-man-rules.py new file mode 100755 index 0000000..1c2c9a8 --- /dev/null +++ b/tools/update-man-rules.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-or-later + +import collections +import glob +import pprint +import sys +from pathlib import Path + +from xml_helper import xml_parse + + +def man(page, number): + return f'{page}.{number}' + +def add_rules(rules, name): + xml = xml_parse(name) + # print('parsing {}'.format(name), file=sys.stderr) + if xml.getroot().tag != 'refentry': + return + conditional = xml.getroot().get('conditional') or '' + rulegroup = rules[conditional] + refmeta = xml.find('./refmeta') + title = refmeta.find('./refentrytitle').text + number = refmeta.find('./manvolnum').text + refnames = xml.findall('./refnamediv/refname') + target = man(refnames[0].text, number) + if title != refnames[0].text: + raise ValueError('refmeta and refnamediv disagree: ' + name) + for refname in refnames: + assert all(refname not in group + for group in rules.values()), "duplicate page name" + alias = man(refname.text, number) + rulegroup[alias] = target + # print('{} => {} [{}]'.format(alias, target, conditional), file=sys.stderr) + +def create_rules(xml_files): + " {conditional => {alias-name => source-name}} " + rules = collections.defaultdict(dict) + for name in xml_files: + try: + add_rules(rules, name) + except Exception: + print("Failed to process", name, file=sys.stderr) + raise + return rules + +def mjoin(files): + return ' \\\n\t'.join(sorted(files) or '#') + +MESON_HEADER = '''\ +# SPDX-License-Identifier: LGPL-2.1-or-later + +# Do not edit. Generated by update-man-rules.py. +# Update with: +# ninja -C build update-man-rules +manpages = [''' + +MESON_FOOTER = '''\ +] +# Really, do not edit. +''' + +def make_mesonfile(rules, _dist_files): + # reformat rules as + # grouped = [ [name, section, [alias...], condition], ...] + # + # but first create a dictionary like + # lists = { (name, condition) => [alias...] + grouped = collections.defaultdict(list) + for condition, items in rules.items(): + for alias, name in items.items(): + group = grouped[(name, condition)] + if name != alias: + group.append(alias) + + lines = [ [p[0][:-2], p[0][-1], sorted(a[:-2] for a in aliases), p[1]] + for p, aliases in sorted(grouped.items()) ] + return '\n'.join((MESON_HEADER, pprint.pformat(lines)[1:-1], MESON_FOOTER)) + +def main(): + source_glob = sys.argv[1] + target = Path(sys.argv[2]) + + pages = glob.glob(source_glob) + pages = (p for p in pages + if Path(p).name not in { + 'systemd.directives.xml', + 'systemd.index.xml', + 'directives-template.xml'}) + + rules = create_rules(pages) + dist_files = (Path(p).name for p in pages) + text = make_mesonfile(rules, dist_files) + + tmp = target.with_suffix('.tmp') + tmp.write_text(text) + tmp.rename(target) + +if __name__ == '__main__': + main() diff --git a/tools/update-syscall-tables.sh b/tools/update-syscall-tables.sh new file mode 100755 index 0000000..fb861e1 --- /dev/null +++ b/tools/update-syscall-tables.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1-or-later +set -eu + +cd "${1:?}" && shift + +curl --fail -L -o syscall-list.txt 'https://raw.githubusercontent.com/hrw/syscalls-table/master/data/syscall-names.text' + +for arch in "$@"; do + curl --fail -L -o "syscalls-$arch.txt" "https://raw.githubusercontent.com/hrw/syscalls-table/master/data/tables/syscalls-$arch" +done diff --git a/tools/xml_helper.py b/tools/xml_helper.py new file mode 100755 index 0000000..6f71350 --- /dev/null +++ b/tools/xml_helper.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-or-later + +from lxml import etree as tree + + +class CustomResolver(tree.Resolver): + def resolve(self, url, _id, context): + if 'custom-entities.ent' in url: + return self.resolve_filename('man/custom-entities.ent', context) + if 'ethtool-link-mode' in url: + return self.resolve_filename('src/shared/ethtool-link-mode.xml', context) + + return None + +_parser = tree.XMLParser() +# pylint: disable=no-member +_parser.resolvers.add(CustomResolver()) + +def xml_parse(page): + doc = tree.parse(page, _parser) + doc.xinclude() + return doc + +def xml_print(xml): + return tree.tostring(xml, pretty_print=True, encoding='utf-8') |