Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,24 @@ fun getAllAIGeneratedValidators(): Map<Validator, OptionValueInformation> {
Validator("config_parse_unit_condition_string", "CONDITION_MEMORY_PRESSURE") to ConfigParseUnitConditionPressureOptionValue() as OptionValueInformation,
Validator("config_parse_unit_condition_string", "CONDITION_CPU_PRESSURE") to ConfigParseUnitConditionPressureOptionValue() as OptionValueInformation,
Validator("config_parse_unit_condition_string", "CONDITION_IO_PRESSURE") to ConfigParseUnitConditionPressureOptionValue() as OptionValueInformation,
// The .network/.netdev/.link [Match] conditions (config_parse_net_condition). Same runtime checks as
// the [Unit] conditions above (condition_test_net dispatches to the same functions), reusing the
// shared parameter grammars; only the marker prefix differs (netCondition = `!` only).
Validator("config_parse_net_condition", "CONDITION_HOST") to ConfigParseNetConditionHostOptionValue() as OptionValueInformation,
Validator("config_parse_net_condition", "CONDITION_VIRTUALIZATION") to ConfigParseNetConditionVirtualizationOptionValue() as OptionValueInformation,
Validator("config_parse_net_condition", "CONDITION_KERNEL_COMMAND_LINE") to ConfigParseNetConditionKernelCommandLineOptionValue() as OptionValueInformation,
Validator("config_parse_net_condition", "CONDITION_VERSION") to ConfigParseNetConditionVersionOptionValue() as OptionValueInformation,
Validator("config_parse_net_condition", "CONDITION_CREDENTIAL") to ConfigParseNetConditionCredentialOptionValue() as OptionValueInformation,
Validator("config_parse_net_condition", "CONDITION_ARCHITECTURE") to ConfigParseNetConditionArchitectureOptionValue() as OptionValueInformation,
Validator("config_parse_net_condition", "CONDITION_FIRMWARE") to ConfigParseNetConditionFirmwareOptionValue() as OptionValueInformation,
Validator("config_parse_net_condition", "CONDITION_MACHINE_TAG") to ConfigParseNetConditionMachineTagOptionValue() as OptionValueInformation,
// Traffic-control Handle=/Parent=/ClassId= (.network [QDisc]/[*Class]). The QDISC_KIND_*/TCLASS_KIND_*
// ltype only selects which struct is allocated, not how the value parses, so each registers once under
// the `*` wildcard and covers every kind.
Validator("config_parse_qdisc_handle", "*") to ConfigParseQdiscHandleOptionValue() as OptionValueInformation,
Validator("config_parse_qdisc_parent", "*") to ConfigParseQdiscParentOptionValue() as OptionValueInformation,
Validator("config_parse_tclass_parent", "*") to ConfigParseTclassParentOptionValue() as OptionValueInformation,
Validator("config_parse_tclass_classid", "*") to ConfigParseTclassClassidOptionValue() as OptionValueInformation,

// Enumerations and address forms that had no validator (#509).
Validator("config_parse_netdev_kind", "0") to ConfigParseNetdevKindOptionValue() as OptionValueInformation,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,65 +1,27 @@
package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.ai

import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.SimpleGrammarOptionValues
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.FlexibleLiteralChoiceTerminal
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.CONDITION_ARCHITECTURE
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.conditionString

/*
* [Unit] ConditionArchitecture= / AssertArchitecture=.
*
* man https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html#ConditionArchitecture=
* parser https://github.com/systemd/systemd/blob/a8e93919c3/src/core/load-fragment.c config_parse_unit_condition_string (CONDITION_ARCHITECTURE)
* check https://github.com/systemd/systemd/blob/a8e93919c3/src/shared/condition.c condition_test_architecture_parameter
* values https://github.com/systemd/systemd/blob/a8e93919c3/src/basic/architecture.c architecture_table
* parser https://github.com/systemd/systemd/blob/048970650c/src/core/load-fragment.c config_parse_unit_condition_string (CONDITION_ARCHITECTURE)
* check https://github.com/systemd/systemd/blob/048970650c/src/shared/condition.c condition_test_architecture_parameter
* values https://github.com/systemd/systemd/blob/048970650c/src/basic/architecture.c architecture_table
*/

/**
* Validator for `[Unit] ConditionArchitecture=` / `AssertArchitecture=`.
*
* C function: config_parse_unit_condition_string with ltype CONDITION_ARCHITECTURE; the parameter is
* checked by condition_test_architecture_parameter (src/shared/condition.c), which accepts the literal
* `native` or any name in architecture_table (src/basic/architecture.c).
* checked by condition_test_architecture_parameter, which accepts the literal `native` or any name in
* architecture_table. The value grammar is shared with the `.network`/`.netdev`/`.link` `[Match]`
* Architecture= key — see [CONDITION_ARCHITECTURE].
*/
class ConfigParseUnitConditionArchitectureOptionValue : SimpleGrammarOptionValues(
"config_parse_unit_condition_string",
conditionString(ARCHITECTURE)
) {
companion object {
private val ARCHITECTURE = FlexibleLiteralChoiceTerminal(
"native",
"alpha",
"arc",
"arc-be",
"arm",
"arm-be",
"arm64",
"arm64-be",
"cris",
"ia64",
"loongarch64",
"m68k",
"mips",
"mips-le",
"mips64",
"mips64-le",
"nios2",
"parisc",
"parisc64",
"ppc",
"ppc-le",
"ppc64",
"ppc64-le",
"riscv32",
"riscv64",
"s390",
"s390x",
"sh",
"sh64",
"sparc",
"sparc64",
"tilegx",
"x86",
"x86-64",
)
}
}
conditionString(CONDITION_ARCHITECTURE)
)
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.ai

import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.SimpleGrammarOptionValues
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.RegexTerminal
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.CONDITION_CREDENTIAL
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.conditionString

/*
Expand Down Expand Up @@ -29,7 +29,5 @@ import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.gram
*/
class ConfigParseUnitConditionCredentialOptionValue : SimpleGrammarOptionValues(
"config_parse_unit_condition_string",
conditionString(
RegexTerminal(".+", "(?!\\.\\.?\$)[\\x20-\\x7E&&[^/:]]{1,255}")
)
conditionString(CONDITION_CREDENTIAL)
)
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.ai

import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.SimpleGrammarOptionValues
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.AlternativeCombinator
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.FlexibleLiteralChoiceTerminal
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.LiteralChoiceTerminal
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.RegexTerminal
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.SequenceCombinator
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.CONDITION_FIRMWARE
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.conditionString

/*
Expand Down Expand Up @@ -35,19 +31,5 @@ import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.gram
*/
class ConfigParseUnitConditionFirmwareOptionValue : SimpleGrammarOptionValues(
"config_parse_unit_condition_string",
conditionString(
AlternativeCombinator(
SequenceCombinator(
LiteralChoiceTerminal("device-tree-compatible("),
RegexTerminal("[^)]+", "[^)]+"),
LiteralChoiceTerminal(")"),
),
SequenceCombinator(
LiteralChoiceTerminal("smbios-field("),
RegexTerminal("[^)]+", "[^)]+"),
LiteralChoiceTerminal(")"),
),
FlexibleLiteralChoiceTerminal("device-tree", "uefi"),
)
)
conditionString(CONDITION_FIRMWARE)
)
Original file line number Diff line number Diff line change
@@ -1,80 +1,27 @@
package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.ai

import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.SimpleGrammarOptionValues
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.AlternativeCombinator
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.BOOLEAN
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.FlexibleLiteralChoiceTerminal
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.CONDITION_VIRTUALIZATION
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.conditionString

/*
* [Unit] ConditionVirtualization= / AssertVirtualization=.
*
* man https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html#ConditionVirtualization=
* parser https://github.com/systemd/systemd/blob/a8e93919c3/src/core/load-fragment.c config_parse_unit_condition_string (CONDITION_VIRTUALIZATION)
* check https://github.com/systemd/systemd/blob/a8e93919c3/src/shared/condition.c condition_test_virtualization
* values https://github.com/systemd/systemd/blob/a8e93919c3/src/basic/virt.c virtualization_table
*
* The check tries, in order: the literal "private-users", parse_boolean(), the categories "vm" and
* "container", and finally an exact id from the table — so all four groups are one choice set here.
* parser https://github.com/systemd/systemd/blob/048970650c/src/core/load-fragment.c config_parse_unit_condition_string (CONDITION_VIRTUALIZATION)
* check https://github.com/systemd/systemd/blob/048970650c/src/shared/condition.c condition_test_virtualization
* values https://github.com/systemd/systemd/blob/048970650c/src/basic/virt.c virtualization_table
*/

/**
* Validator for `[Unit] ConditionVirtualization=` / `AssertVirtualization=`.
*
* C function: config_parse_unit_condition_string with ltype CONDITION_VIRTUALIZATION; the parameter is
* checked by condition_test_virtualization (src/shared/condition.c), which accepts, in order:
* `private-users`, any boolean parse_boolean() understands, the categories `vm` and `container`, and
* finally any id in virtualization_table (src/basic/virt.c).
*
* The boolean is kept as its own [BOOLEAN] alternative rather than folded into the name list: to
* systemd these really are two different branches, and a later formatting or completion pass can only
* tell "this span is a boolean" from "this span is a virtualization id" if the grammar says so.
*
* [BOOLEAN] has to come second. It matches a prefix of the value, so on `none` — a real entry in
* virtualization_table — it would otherwise match the leading `no` and strand `ne`, and under the
* classic engine AlternativeCombinator never backtracks out of a branch that matched.
* checked by condition_test_virtualization, which accepts `private-users`, a boolean, the categories
* `vm`/`container`, or any virtualization_table id. The value grammar is shared with the
* `.network`/`.netdev`/`.link` `[Match]` Virtualization= key — see [CONDITION_VIRTUALIZATION].
*/
class ConfigParseUnitConditionVirtualizationOptionValue : SimpleGrammarOptionValues(
"config_parse_unit_condition_string",
conditionString(AlternativeCombinator(VIRTUALIZATION, BOOLEAN))
) {
companion object {
private val VIRTUALIZATION = FlexibleLiteralChoiceTerminal(
// categories, plus the userns special case
"vm", "container", "private-users",
// virtualization_table — VMs
"none",
"kvm",
"amazon",
"qemu",
"bochs",
"xen",
"uml",
"vmware",
"oracle",
"microsoft",
"zvm",
"parallels",
"bhyve",
"qnx",
"acrn",
"powervm",
"apple",
"sre",
"google",
"vm-other",
// virtualization_table — containers
"systemd-nspawn",
"lxc-libvirt",
"lxc",
"openvz",
"docker",
"podman",
"rkt",
"wsl",
"proot",
"pouch",
"container-other",
)
}
}
conditionString(CONDITION_VIRTUALIZATION)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.ai

import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.SimpleGrammarOptionValues
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.ANY_CONDITION_ARGUMENT
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.CONDITION_ARCHITECTURE
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.CONDITION_CREDENTIAL
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.CONDITION_FIRMWARE
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.CONDITION_VIRTUALIZATION
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.netCondition

/*
* The [Match] Condition keys of .network / .netdev / .link files — config_parse_net_condition.
*
* parser https://github.com/systemd/systemd/blob/048970650c/src/shared/net-condition.c config_parse_net_condition
* checks https://github.com/systemd/systemd/blob/048970650c/src/shared/condition.c condition_test_net (table_net)
* keys systemd-build/build/{networkd-network,netdev,link-config}-gperf.gperf (the Match.* keys)
*
* config_parse_net_condition strips a single optional leading `!` (negate) and stores the rest, which is
* then checked at runtime by exactly the same condition_test_* functions as the matching [Unit]
* Condition*=/Assert*= settings — condition_test_net dispatches all eight shared types to the same leaf
* checks. So each value grammar below is the shared parameter grammar from grammar/Combinators.kt,
* wrapped by [netCondition] (which models the `!`-only prefix) instead of [conditionString] (which also
* handles the `|` trigger the [Unit] parser accepts).
*
* Keys: Match.Host, Match.Virtualization, Match.KernelCommandLine, Match.KernelVersion, Match.Version,
* Match.Credential, Match.Architecture, Match.Firmware, Match.MachineTag.
*/

/** `[Match] Host=` — a hostname, machine/boot/product ID, or fnmatch glob (any non-empty string). */
class ConfigParseNetConditionHostOptionValue : SimpleGrammarOptionValues(
"config_parse_net_condition", netCondition(ANY_CONDITION_ARGUMENT)
)

/** `[Match] Virtualization=` — condition_test_virtualization. */
class ConfigParseNetConditionVirtualizationOptionValue : SimpleGrammarOptionValues(
"config_parse_net_condition", netCondition(CONDITION_VIRTUALIZATION)
)

/** `[Match] KernelCommandLine=` — a bare option or `name=value` (stored verbatim, any non-empty string). */
class ConfigParseNetConditionKernelCommandLineOptionValue : SimpleGrammarOptionValues(
"config_parse_net_condition", netCondition(ANY_CONDITION_ARGUMENT)
)

/** `[Match] KernelVersion=` / `[Match] Version=` — a version comparison list; a bare token is a glob, so
* any non-empty string is valid (condition_test_version). */
class ConfigParseNetConditionVersionOptionValue : SimpleGrammarOptionValues(
"config_parse_net_condition", netCondition(ANY_CONDITION_ARGUMENT)
)

/** `[Match] Credential=` — credential_name_valid. */
class ConfigParseNetConditionCredentialOptionValue : SimpleGrammarOptionValues(
"config_parse_net_condition", netCondition(CONDITION_CREDENTIAL)
)

/** `[Match] Architecture=` — `native` or an architecture_table name. */
class ConfigParseNetConditionArchitectureOptionValue : SimpleGrammarOptionValues(
"config_parse_net_condition", netCondition(CONDITION_ARCHITECTURE)
)

/** `[Match] Firmware=` — uefi / device-tree / device-tree-compatible(...) / smbios-field(...). */
class ConfigParseNetConditionFirmwareOptionValue : SimpleGrammarOptionValues(
"config_parse_net_condition", netCondition(CONDITION_FIRMWARE)
)

/** `[Match] MachineTag=` — an fnmatch glob against /etc/machine-info TAGS (any non-empty string). */
class ConfigParseNetConditionMachineTagOptionValue : SimpleGrammarOptionValues(
"config_parse_net_condition", netCondition(ANY_CONDITION_ARGUMENT)
)
Loading
Loading