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 @@ -320,6 +320,28 @@ fun getAllAIGeneratedValidators(): Map<Validator, OptionValueInformation> {
// legitimate value; ConditionCPUFeature= alone accounted for 110 false positives in a 6.7k-unit corpus.
Validator("config_parse_unit_condition_string", "CONDITION_CONTROL_GROUP_CONTROLLER") to ConfigParseUnitConditionControlGroupControllerOptionValue() as OptionValueInformation,
Validator("config_parse_unit_condition_string", "CONDITION_CPU_FEATURE") to ConfigParseUnitConditionCpuFeatureOptionValue() as OptionValueInformation,
// Structured [Unit] Condition*=/Assert*= parameters, each modelled on its condition_test_* runtime check.
Validator("config_parse_unit_condition_string", "CONDITION_CPUS") to ConfigParseUnitConditionCpusOptionValue() as OptionValueInformation,
Validator("config_parse_unit_condition_string", "CONDITION_MEMORY") to ConfigParseUnitConditionMemoryOptionValue() as OptionValueInformation,
Validator("config_parse_unit_condition_string", "CONDITION_CREDENTIAL") to ConfigParseUnitConditionCredentialOptionValue() as OptionValueInformation,
Validator("config_parse_unit_condition_string", "CONDITION_KERNEL_MODULE_LOADED") to ConfigParseUnitConditionKernelModuleLoadedOptionValue() as OptionValueInformation,
Validator("config_parse_unit_condition_string", "CONDITION_USER") to ConfigParseUnitConditionUserOptionValue() as OptionValueInformation,
Validator("config_parse_unit_condition_string", "CONDITION_GROUP") to ConfigParseUnitConditionGroupOptionValue() as OptionValueInformation,
Validator("config_parse_unit_condition_string", "CONDITION_FIRMWARE") to ConfigParseUnitConditionFirmwareOptionValue() as OptionValueInformation,
// Conditions whose parameter systemd stores verbatim (fnmatch globs, kernel-cmdline/env words, version
// globs): config parsing imposes no shape, so these accept any non-empty value by design.
Validator("config_parse_unit_condition_string", "CONDITION_HOST") to ConfigParseUnitConditionHostOptionValue() as OptionValueInformation,
Validator("config_parse_unit_condition_string", "CONDITION_MACHINE_TAG") to ConfigParseUnitConditionMachineTagOptionValue() as OptionValueInformation,
Validator("config_parse_unit_condition_string", "CONDITION_KERNEL_COMMAND_LINE") to ConfigParseUnitConditionKernelCommandLineOptionValue() as OptionValueInformation,
Validator("config_parse_unit_condition_string", "CONDITION_ENVIRONMENT") to ConfigParseUnitConditionEnvironmentOptionValue() as OptionValueInformation,
Validator("config_parse_unit_condition_string", "CONDITION_VERSION") to ConfigParseUnitConditionVersionOptionValue() as OptionValueInformation,
// Structured Condition*= parameters with their own leaf grammars (batch 2).
Validator("config_parse_unit_condition_string", "CONDITION_FRACTION") to ConfigParseUnitConditionFractionOptionValue() as OptionValueInformation,
Validator("config_parse_unit_condition_string", "CONDITION_OS_RELEASE") to ConfigParseUnitConditionOsReleaseOptionValue() as OptionValueInformation,
// The three pressure conditions all dispatch to condition_test_psi, so they share one grammar.
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,

// 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
@@ -0,0 +1,28 @@
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.comparisonPrefixed
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.conditionString
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.unsignedNumber

/*
* [Unit] ConditionCPUs= / AssertCPUs=.
*
* man https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html#ConditionCPUs=
* parser https://github.com/systemd/systemd/blob/048970650c/src/core/load-fragment.c config_parse_unit_condition_string (CONDITION_CPUS)
* check https://github.com/systemd/systemd/blob/048970650c/src/shared/condition.c condition_test_cpus
*/

/**
* Validator for `[Unit] ConditionCPUs=` / `AssertCPUs=`.
*
* C function: config_parse_unit_condition_string with ltype CONDITION_CPUS. condition_test_cpus
* (src/shared/condition.c) reads an optional comparison operator via parse_compare_operator(&p, 0) —
* defaulting to `>=` when none is given — and then the number of CPUs with safe_atou(). safe_atou()
* passes base 0 to strtoul(), so the count may be written decimal, `0x` hex or leading-zero octal;
* [unsignedNumber] models exactly that, bounded by the `unsigned` range.
*/
class ConfigParseUnitConditionCpusOptionValue : SimpleGrammarOptionValues(
"config_parse_unit_condition_string",
conditionString(comparisonPrefixed(unsignedNumber(4_294_967_296L)))
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
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.conditionString

/*
* [Unit] ConditionCredential= / AssertCredential=.
*
* man https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html#ConditionCredential=
* parser https://github.com/systemd/systemd/blob/048970650c/src/core/load-fragment.c config_parse_unit_condition_string (CONDITION_CREDENTIAL)
* check https://github.com/systemd/systemd/blob/048970650c/src/shared/condition.c condition_test_credential
* https://github.com/systemd/systemd/blob/048970650c/src/shared/creds-util.c credential_name_valid
*/

/**
* Validator for `[Unit] ConditionCredential=` / `AssertCredential=`.
*
* C function: config_parse_unit_condition_string with ltype CONDITION_CREDENTIAL. condition_test_credential
* (src/shared/condition.c) rejects the parameter outright unless credential_name_valid() accepts it, so
* that is the whole shape rule. credential_name_valid() (src/shared/creds-util.c) is
* filename_is_valid() && fdname_is_valid():
*
* - filename_is_valid(): non-empty, not "." or "..", no "/", at most NAME_MAX (255) bytes.
* - fdname_is_valid(): every byte printable ASCII (>= 0x20 and < 0x7F), no ":".
*
* Together: one to 255 printable-ASCII characters, none of them `/` or `:`, and not the reserved
* names `.` or `..`. Space (0x20) is a printable character, so it is allowed inside a name.
*/
class ConfigParseUnitConditionCredentialOptionValue : SimpleGrammarOptionValues(
"config_parse_unit_condition_string",
conditionString(
RegexTerminal(".+", "(?!\\.\\.?\$)[\\x20-\\x7E&&[^/:]]{1,255}")
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
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.conditionString

/*
* [Unit] ConditionEnvironment= / AssertEnvironment=.
*
* man https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html#ConditionEnvironment=
* parser https://github.com/systemd/systemd/blob/048970650c/src/core/load-fragment.c config_parse_unit_condition_string (CONDITION_ENVIRONMENT)
* check https://github.com/systemd/systemd/blob/048970650c/src/shared/condition.c condition_test_environment
*/

/**
* Validator for `[Unit] ConditionEnvironment=` / `AssertEnvironment=`.
*
* C function: config_parse_unit_condition_string with ltype CONDITION_ENVIRONMENT. condition_test_environment
* (src/shared/condition.c) matches the parameter against the manager's environment block — either a bare
* variable name or a full `NAME=value`. The parameter is stored and compared verbatim with no validity
* check, so any non-empty string is legitimate — see [ANY_CONDITION_ARGUMENT].
*/
class ConfigParseUnitConditionEnvironmentOptionValue : SimpleGrammarOptionValues(
"config_parse_unit_condition_string",
conditionString(ANY_CONDITION_ARGUMENT)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
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.conditionString

/*
* [Unit] ConditionFirmware= / AssertFirmware=.
*
* man https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html#ConditionFirmware=
* parser https://github.com/systemd/systemd/blob/048970650c/src/core/load-fragment.c config_parse_unit_condition_string (CONDITION_FIRMWARE)
* check https://github.com/systemd/systemd/blob/048970650c/src/shared/condition.c condition_test_firmware
*/

/**
* Validator for `[Unit] ConditionFirmware=` / `AssertFirmware=`.
*
* C function: config_parse_unit_condition_string with ltype CONDITION_FIRMWARE. condition_test_firmware
* (src/shared/condition.c) recognises exactly four forms and reports "unsupported" for anything else:
*
* - `uefi`
* - `device-tree`
* - `device-tree-compatible(DTC)` — the parser takes everything up to the last `)`, which must end the value
* - `smbios-field(FIELD OP VALUE)` — likewise closed by the last `)`
*
* The two parenthesised forms are matched as `keyword(` + argument + `)`; the argument is modelled loosely
* (any non-empty run without `)`), which covers every real device-tree compatible string and SMBIOS field
* expression. The rare case of a `)` inside the argument (the parser's strrchr() would keep it) is not
* modelled, matching the plugin's preference for never flagging a value systemd accepts over covering an
* exotic spelling.
*/
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"),
)
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
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.PERMYRIAD_PERCENTAGE
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.WhitespaceTerminal
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.conditionString

/*
* [Unit] ConditionFraction= / AssertFraction=.
*
* man https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html#ConditionFraction=
* parser https://github.com/systemd/systemd/blob/048970650c/src/core/load-fragment.c config_parse_unit_condition_string (CONDITION_FRACTION)
* check https://github.com/systemd/systemd/blob/048970650c/src/shared/condition.c condition_test_fraction
*/

/**
* Validator for `[Unit] ConditionFraction=` / `AssertFraction=`.
*
* C function: config_parse_unit_condition_string with ltype CONDITION_FRACTION. condition_test_fraction
* (src/shared/condition.c) reads `[TAG ]PERCENT`: the mandatory trailing field is a percentage parsed by
* parse_permyriad(), and an optional leading whitespace-separated field is a hash-salt tag (any word).
* More than two fields is "trailing garbage".
*
* The tag is any single non-whitespace token; the percentage is a [PERMYRIAD_PERCENTAGE]. The
* "tag + percent" alternative is listed first so it is tried before the bare percent (a lone token that
* fails to be a percentage is rejected, as systemd rejects it).
*/
class ConfigParseUnitConditionFractionOptionValue : SimpleGrammarOptionValues(
"config_parse_unit_condition_string",
conditionString(
AlternativeCombinator(
SequenceCombinator(RegexTerminal("\\S+", "\\S+"), WhitespaceTerminal(), PERMYRIAD_PERCENTAGE),
PERMYRIAD_PERCENTAGE,
)
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
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.conditionString

/*
* [Unit] ConditionGroup= / AssertGroup=.
*
* man https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html#ConditionGroup=
* parser https://github.com/systemd/systemd/blob/048970650c/src/core/load-fragment.c config_parse_unit_condition_string (CONDITION_GROUP)
* check https://github.com/systemd/systemd/blob/048970650c/src/shared/condition.c condition_test_group
*/

/**
* Validator for `[Unit] ConditionGroup=` / `AssertGroup=`.
*
* C function: config_parse_unit_condition_string with ltype CONDITION_GROUP. condition_test_group
* (src/shared/condition.c) accepts a numeric GID (parse_gid) or a group name (in_group / a `root`
* match under PID 1). Both forms are a non-empty run of characters with no `:` or `/`, no control
* characters, and no leading or trailing whitespace — the same lenient rule the plugin applies to
* User=/Group= (config_parse_user_group_compat), with a numeric GID a special case of that shape.
*/
class ConfigParseUnitConditionGroupOptionValue : SimpleGrammarOptionValues(
"config_parse_unit_condition_string",
conditionString(
RegexTerminal(".+", "[^\\s:/\\x00-\\x1F](?:[^:/\\x00-\\x1F]*[^\\s:/\\x00-\\x1F])?")
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
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.conditionString

/*
* [Unit] ConditionHost= / AssertHost=.
*
* man https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html#ConditionHost=
* parser https://github.com/systemd/systemd/blob/048970650c/src/core/load-fragment.c config_parse_unit_condition_string (CONDITION_HOST)
* check https://github.com/systemd/systemd/blob/048970650c/src/shared/condition.c condition_test_host
*/

/**
* Validator for `[Unit] ConditionHost=` / `AssertHost=`.
*
* C function: config_parse_unit_condition_string with ltype CONDITION_HOST. condition_test_host
* (src/shared/condition.c) treats the parameter either as a 128-bit machine/boot/product ID or, failing
* that, as an fnmatch() glob against the hostname. Any non-empty string is a legitimate glob, so there
* is no shape to enforce beyond non-emptiness — see [ANY_CONDITION_ARGUMENT].
*/
class ConfigParseUnitConditionHostOptionValue : SimpleGrammarOptionValues(
"config_parse_unit_condition_string",
conditionString(ANY_CONDITION_ARGUMENT)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
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.conditionString

/*
* [Unit] ConditionKernelCommandLine= / AssertKernelCommandLine=.
*
* man https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html#ConditionKernelCommandLine=
* parser https://github.com/systemd/systemd/blob/048970650c/src/core/load-fragment.c config_parse_unit_condition_string (CONDITION_KERNEL_COMMAND_LINE)
* check https://github.com/systemd/systemd/blob/048970650c/src/shared/condition.c condition_test_kernel_command_line
*/

/**
* Validator for `[Unit] ConditionKernelCommandLine=` / `AssertKernelCommandLine=`.
*
* C function: config_parse_unit_condition_string with ltype CONDITION_KERNEL_COMMAND_LINE.
* condition_test_kernel_command_line (src/shared/condition.c) matches the parameter against the words on
* the kernel command line — either a bare option name or a full `name=value`. Any non-empty string is a
* legitimate parameter, so only non-emptiness can be checked — see [ANY_CONDITION_ARGUMENT].
*/
class ConfigParseUnitConditionKernelCommandLineOptionValue : SimpleGrammarOptionValues(
"config_parse_unit_condition_string",
conditionString(ANY_CONDITION_ARGUMENT)
)
Loading
Loading