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 @@ -94,6 +94,7 @@ fun getAllAIGeneratedValidators(): Map<Validator, OptionValueInformation> {
Validator("config_parse_flow_label", "0") to ConfigParseFlowLabelOptionValue() as OptionValueInformation,
Validator("config_parse_fou_encap_type", "0") to ConfigParseFouEncapTypeOptionValue() as OptionValueInformation,
Validator("config_parse_fou_tunnel_address", "0") to ConfigParseFouTunnelAddressOptionValue() as OptionValueInformation,
Validator("config_parse_fq_codel_size", "QDISC_KIND_FQ_CODEL") to ConfigParseFqCodelSizeOptionValue() as OptionValueInformation,
Validator("config_parse_fq_pie_packet_limit", "QDISC_KIND_FQ_PIE") to ConfigParseFqPiePacketLimitOptionValue() as OptionValueInformation,
Validator("config_parse_geneve_df", "0") to ConfigParseGeneveDfOptionValue() as OptionValueInformation,
Validator("config_parse_geneve_flow_label", "0") to ConfigParseGeneveFlowLabelOptionValue() as OptionValueInformation,
Expand All @@ -103,6 +104,8 @@ fun getAllAIGeneratedValidators(): Map<Validator, OptionValueInformation> {
Validator("config_parse_htb_class_size", "TCLASS_KIND_HTB") to ConfigParseHtbClassSizeOptionValue() as OptionValueInformation,
Validator("config_parse_iaid", "AF_INET6") to ConfigParseIaidOptionValue() as OptionValueInformation,
Validator("config_parse_iaid", "AF_INET") to ConfigParseIaidOptionValue() as OptionValueInformation,
Validator("config_parse_iec_size", "0") to ConfigParseIecSizeOptionValue() as OptionValueInformation,
Validator("config_parse_int", "0") to ConfigParseIntOptionValue() as OptionValueInformation,
Validator("config_parse_in_addr_non_null", "AF_INET") to ConfigParseInAddrNonNullOptionValue() as OptionValueInformation,
Validator("config_parse_ip_masquerade", "0") to ConfigParseIpMasqueradeOptionValue() as OptionValueInformation,
Validator("config_parse_ip_protocol", "true") to ConfigParseIpProtocolOptionValue() as OptionValueInformation,
Expand All @@ -113,6 +116,7 @@ fun getAllAIGeneratedValidators(): Map<Validator, OptionValueInformation> {
Validator("config_parse_ipv6_privacy_extensions", "0") to ConfigParseIpv6PrivacyExtensionsOptionValue() as OptionValueInformation,
Validator("config_parse_ipvlan_flags", "0") to ConfigParseIpvlanFlagsOptionValue() as OptionValueInformation,
Validator("config_parse_ipvlan_mode", "0") to ConfigParseIpvlanModeOptionValue() as OptionValueInformation,
Validator("config_parse_job_mode", "0") to ConfigParseJobModeOptionValue() as OptionValueInformation,
Validator("config_parse_job_mode_isolate", "0") to ConfigParseJobModeIsolateOptionValue() as OptionValueInformation,
Validator("config_parse_keep_configuration", "0") to ConfigParseKeepConfigurationOptionValue() as OptionValueInformation,
Validator("config_parse_l2tp_encap_type", "0") to ConfigParseL2tpEncapTypeOptionValue() as OptionValueInformation,
Expand Down Expand Up @@ -162,6 +166,7 @@ fun getAllAIGeneratedValidators(): Map<Validator, OptionValueInformation> {
Validator("config_parse_protect_home", "0") to ConfigParseProtectHomeOptionValue() as OptionValueInformation,
Validator("config_parse_protect_system", "0") to ConfigParseProtectSystemOptionValue() as OptionValueInformation,
Validator("config_parse_qfq_weight", "TCLASS_KIND_QFQ") to ConfigParseQfqWeightOptionValue() as OptionValueInformation,
Validator("config_parse_reboot_parameter", "0") to ConfigParseRebootParameterOptionValue() as OptionValueInformation,
Validator("config_parse_restrict_network_interfaces", "0") to ConfigParseRestrictNetworkInterfacesOptionValue() as OptionValueInformation,
Validator("config_parse_ring_buffer_or_channel", "0") to ConfigParseRingBufferOrChannelOptionValue() as OptionValueInformation,
Validator("config_parse_route_prefix_preference", "0") to ConfigParseRoutePrefixPreferenceOptionValue() as OptionValueInformation,
Expand Down Expand Up @@ -197,6 +202,7 @@ fun getAllAIGeneratedValidators(): Map<Validator, OptionValueInformation> {
Validator("config_parse_unit_condition_string", "CONDITION_CPU_FEATURE") to ConfigParseUnitConditionStringOptionValue() as OptionValueInformation,
Validator("config_parse_unit_condition_string", "CONDITION_FIRST_BOOT") to ConfigParseUnitConditionStringOptionValue() as OptionValueInformation,
Validator("config_parse_unit_env_file", "0") to ConfigParseUnitEnvFileOptionValue() as OptionValueInformation,
Validator("config_parse_unit_mounts_for", "0") to ConfigParseUnitMountsForOptionValue() as OptionValueInformation,
Validator("config_parse_unit_slice", "0") to ConfigParseUnitSliceOptionValue() as OptionValueInformation,
Validator("config_parse_use_domains", "0") to ConfigParseUseDomainsOptionValue() as OptionValueInformation,
Validator("config_parse_userns_chown", "0") to ConfigParseUsernsChownOptionValue() as OptionValueInformation,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
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.*

/**
* Validator for the [FairQueueingControlledDelay] size-style options: MemoryLimitBytes=,
* QuantumBytes= (and the deprecated MemoryLimit / Quantum aliases).
*
* C function: config_parse_fq_codel_size(QDISC_KIND_FQ_CODEL) in src/network/tc/fq-codel.c.
* After branching on the lvalue it calls parse_size(rvalue, 1024, &sz). Same IEC byte shape
* as the other parse_size-based validators.
*/
class ConfigParseFqCodelSizeOptionValue : SimpleGrammarOptionValues(
"config_parse_fq_codel_size",
SequenceCombinator(
OptionalWhitespacePrefix(BYTES),
EOF()
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
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.*

/**
* Validator for generic IEC byte-size options parsed by config_parse_iec_size.
*
* C function: config_parse_iec_size in src/shared/conf-parser.c. Delegates to
* parse_size(rvalue, 1024, &v) and additionally requires the result to fit in a size_t.
* Same IEC byte syntax used by tbf_size / fq_size / htb_class_size.
*/
class ConfigParseIecSizeOptionValue : SimpleGrammarOptionValues(
"config_parse_iec_size",
SequenceCombinator(
OptionalWhitespacePrefix(BYTES),
EOF()
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
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.*

/**
* Validator for generic signed-integer options parsed by config_parse_int.
*
* C function: defined via DEFINE_PARSER(int, int, safe_atoi) in src/shared/conf-parser.c.
* Accepts a signed 32-bit integer.
*/
class ConfigParseIntOptionValue : SimpleGrammarOptionValues(
"config_parse_int",
SequenceCombinator(
IntegerTerminal(Int.MIN_VALUE.toLong(), Int.MAX_VALUE.toLong() + 1L),
EOF()
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
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.*

/**
* Validator for job-mode options (e.g. OnFailureJobMode=, OnSuccessJobMode=).
*
* C function: config_parse_job_mode, expanded via DEFINE_CONFIG_PARSE_ENUM in
* src/core/load-fragment.c. Accepts exactly the entries of job_mode_table in
* src/basic/unit-def.c.
*/
class ConfigParseJobModeOptionValue : SimpleGrammarOptionValues(
"config_parse_job_mode",
SequenceCombinator(
LiteralChoiceTerminal(
"fail",
"lenient",
"replace",
"replace-irreversibly",
"isolate",
"flush",
"ignore-dependencies",
"ignore-requirements",
"triggering",
"restart-dependencies"
),
EOF()
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
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.*

/**
* Validator for RebootArgument= / RebootParameter= keys.
*
* C function: config_parse_reboot_parameter in src/core/load-fragment.c → reboot_parameter_is_valid
* in src/shared/reboot-util.c. After unit_full_printf specifier expansion, the result must:
* - pass ascii_is_valid (printable ASCII)
* - have length ≤ NAME_MAX (255)
*
* Grammar allows printable ASCII (0x20..0x7E) including "%" for specifier syntax; length cap
* of 255 is enforced via a regex quantifier.
*/
class ConfigParseRebootParameterOptionValue : SimpleGrammarOptionValues(
"config_parse_reboot_parameter",
SequenceCombinator(
RegexTerminal("[\\x20-\\x7E]{1,255}", "[\\x20-\\x7E]{1,255}"),
EOF()
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +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.*

/**
* Validator for RequiresMountsFor= / WantsMountsFor=.
*
* C function: config_parse_unit_mounts_for in src/core/load-fragment.c. Tokenizes rvalue with
* extract_first_word (whitespace-separated, EXTRACT_UNQUOTE), expands unit specifiers via
* unit_path_printf, then requires each path to be absolute via path_simplify_and_warn with
* PATH_CHECK_ABSOLUTE.
*
* The grammar allows any non-whitespace path that starts with "/", and accepts "%X" specifiers
* inline since the C parser expands them before the absolute-path check.
*/
class ConfigParseUnitMountsForOptionValue : SimpleGrammarOptionValues(
"config_parse_unit_mounts_for",
SequenceCombinator(
RegexTerminal("/\\S*", "/\\S*"),
ZeroOrMore(SequenceCombinator(
WhitespaceTerminal(),
RegexTerminal("/\\S*", "/\\S*")
)),
EOF()
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package net.sjrx.intellij.plugins.systemdunitfiles.inspections.ai

import net.sjrx.intellij.plugins.systemdunitfiles.AbstractUnitFileTest
import net.sjrx.intellij.plugins.systemdunitfiles.inspections.InvalidValueInspection
import org.junit.Test

class ConfigParseFqCodelSizeOptionValueTest : AbstractUnitFileTest() {

@Test
fun testValidValues() {
// language="unit file (systemd)"
val file = """
[FairQueueingControlledDelay]
MemoryLimitBytes=32M
QuantumBytes=1500
MemoryLimit=64M
Quantum=2K
""".trimIndent()

setupFileInEditor("file.network", file)
enableInspection(InvalidValueInspection::class.java)
val highlights = myFixture.doHighlighting()

assertSize(0, highlights)
}

@Test
fun testInvalidValues() {
// language="unit file (systemd)"
val file = """
[FairQueueingControlledDelay]
MemoryLimitBytes=<error descr="Invalid value">abc</error>
QuantumBytes=<error descr="Invalid value">-1</error>
MemoryLimit=<error descr="Invalid value">10X</error>
""".trimIndent()

setupFileInEditor("file.network", file)
enableInspection(InvalidValueInspection::class.java)
val highlights = myFixture.doHighlighting()

assertSize(3, highlights)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package net.sjrx.intellij.plugins.systemdunitfiles.inspections.ai

import net.sjrx.intellij.plugins.systemdunitfiles.AbstractUnitFileTest
import net.sjrx.intellij.plugins.systemdunitfiles.inspections.InvalidValueInspection
import org.junit.Test

class ConfigParseIecSizeOptionValueTest : AbstractUnitFileTest() {

@Test
fun testValidValues() {
// language="unit file (systemd)"
val file = """
[Socket]
ReceiveBuffer=4096
SendBuffer=64K
PipeSize=1M
ReceiveBuffer=2G
""".trimIndent()

setupFileInEditor("file.socket", file)
enableInspection(InvalidValueInspection::class.java)
val highlights = myFixture.doHighlighting()

assertSize(0, highlights)
}

@Test
fun testInvalidValues() {
// language="unit file (systemd)"
val file = """
[Socket]
ReceiveBuffer=<error descr="Invalid value">abc</error>
SendBuffer=<error descr="Invalid value">-1</error>
PipeSize=<error descr="Invalid value">10X</error>
""".trimIndent()

setupFileInEditor("file.socket", file)
enableInspection(InvalidValueInspection::class.java)
val highlights = myFixture.doHighlighting()

assertSize(3, highlights)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package net.sjrx.intellij.plugins.systemdunitfiles.inspections.ai

import net.sjrx.intellij.plugins.systemdunitfiles.AbstractUnitFileTest
import net.sjrx.intellij.plugins.systemdunitfiles.inspections.InvalidValueInspection
import org.junit.Test

class ConfigParseIntOptionValueTest : AbstractUnitFileTest() {

@Test
fun testValidValues() {
// language="unit file (systemd)"
val file = """
[Socket]
Priority=0
IPTTL=64
Mark=-1
Priority=2147483647
IPTTL=-2147483648
""".trimIndent()

setupFileInEditor("file.socket", file)
enableInspection(InvalidValueInspection::class.java)
val highlights = myFixture.doHighlighting()

assertSize(0, highlights)
}

@Test
fun testInvalidValues() {
// language="unit file (systemd)"
val file = """
[Socket]
Priority=<error descr="Invalid value">abc</error>
IPTTL=<error descr="Invalid value">1.5</error>
Mark=<error descr="Invalid value">2147483648</error>
Priority=<error descr="Invalid value">10 20</error>
""".trimIndent()

setupFileInEditor("file.socket", file)
enableInspection(InvalidValueInspection::class.java)
val highlights = myFixture.doHighlighting()

assertSize(4, highlights)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package net.sjrx.intellij.plugins.systemdunitfiles.inspections.ai

import net.sjrx.intellij.plugins.systemdunitfiles.AbstractUnitFileTest
import net.sjrx.intellij.plugins.systemdunitfiles.inspections.InvalidValueInspection
import org.junit.Test

class ConfigParseJobModeOptionValueTest : AbstractUnitFileTest() {

@Test
fun testValidValues() {
// language="unit file (systemd)"
val file = """
[Unit]
OnSuccessJobMode=fail
OnFailureJobMode=replace
OnSuccessJobMode=replace-irreversibly
OnFailureJobMode=isolate
OnSuccessJobMode=flush
OnFailureJobMode=ignore-dependencies
OnSuccessJobMode=ignore-requirements
OnFailureJobMode=triggering
OnSuccessJobMode=restart-dependencies
OnFailureJobMode=lenient
""".trimIndent()

setupFileInEditor("file.service", file)
enableInspection(InvalidValueInspection::class.java)
val highlights = myFixture.doHighlighting()

assertSize(0, highlights)
}

@Test
fun testInvalidValues() {
// language="unit file (systemd)"
val file = """
[Unit]
OnSuccessJobMode=<error descr="Invalid value">unknown</error>
OnFailureJobMode=<error descr="Invalid value">Replace</error>
OnSuccessJobMode=<error descr="Invalid value">fail isolate</error>
OnFailureJobMode=<error descr="Invalid value">replace_irreversibly</error>
""".trimIndent()

setupFileInEditor("file.service", file)
enableInspection(InvalidValueInspection::class.java)
val highlights = myFixture.doHighlighting()

assertSize(4, highlights)
}
}
Loading
Loading