Skip to content

Commit bb863f3

Browse files
author
Steve Ramage
committed
feat: add support for new options such as Link.RxMaxCoalescedFrames=,FooOverUDP.UDPSourcePort=,Service.CapabilityBoundingSet= (Resolves #375)
1 parent 97aa1c9 commit bb863f3

File tree

4 files changed

+215
-0
lines changed

4 files changed

+215
-0
lines changed

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/SemanticDataRepository.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ class SemanticDataRepository private constructor() {
155155
validatorMap.putAll(NetworkAddressOptionValue.validators)
156156
validatorMap.putAll(InAddrPrefixesOptionValue.validators)
157157
validatorMap.putAll(UIntOptionValues.validators)
158+
validatorMap.putAll(SimpleGrammarOptionValues.validators)
158159
fileClassToSectionNameToKeyValuesFromDoc["unit"]?.remove(SCOPE_KEYWORD)
159160
fileClassToSectionToKeyAndValidatorMap["unit"]?.remove(SCOPE_KEYWORD)
160161
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues
2+
3+
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.Validator
4+
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.*
5+
6+
7+
8+
class SimpleGrammarOptionValues(validatorName: String, grammar: Combinator) : GrammarOptionValue(validatorName, grammar) {
9+
10+
11+
companion object {
12+
13+
val Capabilities = FlexibleLiteralChoiceTerminal(
14+
"CAP_AUDIT_CONTROL",
15+
"CAP_AUDIT_READ",
16+
"CAP_AUDIT_WRITE",
17+
"CAP_BLOCK_SUSPEND",
18+
"CAP_BPF",
19+
"CAP_CHECKPOINT_RESTORE",
20+
"CAP_CHOWN",
21+
"CAP_DAC_OVERRIDE",
22+
"CAP_DAC_READ_SEARCH",
23+
"CAP_FOWNER",
24+
"CAP_FSETID",
25+
"CAP_IPC_LOCK",
26+
"CAP_IPC_OWNER",
27+
"CAP_KILL",
28+
"CAP_LEASE",
29+
"CAP_LINUX_IMMUTABLE",
30+
"CAP_MAC_ADMIN",
31+
"CAP_MAC_OVERRIDE",
32+
"CAP_MKNOD",
33+
"CAP_NET_ADMIN",
34+
"CAP_NET_BIND_SERVICE",
35+
"CAP_NET_BROADCAST",
36+
"CAP_NET_RAW",
37+
"CAP_PERFMON",
38+
"CAP_SETGID",
39+
"CAP_SETFCAP",
40+
"CAP_SETPCAP",
41+
"CAP_SETUID",
42+
"CAP_SYS_ADMIN",
43+
"CAP_SYS_BOOT",
44+
"CAP_SYS_CHROOT",
45+
"CAP_SYS_MODULE",
46+
"CAP_SYS_NICE",
47+
"CAP_SYS_PACCT",
48+
"CAP_SYS_PTRACE",
49+
"CAP_SYS_RAWIO",
50+
"CAP_SYS_RESOURCE",
51+
"CAP_SYS_TIME",
52+
"CAP_SYS_TTY_CONFIG",
53+
"CAP_SYSLOG",
54+
"CAP_WAKE_ALARM"
55+
)
56+
57+
val validators = mapOf(
58+
Validator("config_parse_ip_port", "0") to SimpleGrammarOptionValues("config_parse_ip_port", SequenceCombinator(IntegerTerminal(0, 65536 ), EOF())),
59+
Validator("config_parse_coalesce_u32", "0") to SimpleGrammarOptionValues("config_parse_coalesce_u32",
60+
SequenceCombinator(
61+
AlternativeCombinator(
62+
// Handles hex
63+
SequenceCombinator(LiteralChoiceTerminal("0x"), OneOrMore(RegexTerminal("[0-9a-zA-Z]{1,8}", "[0-9a-fA-F]{1,8}"))),
64+
// Handles oct and dec formats (although not up to 32 bits for octal)
65+
IntegerTerminal(0, 4_294_967_296),
66+
),
67+
EOF())),
68+
69+
Validator("config_parse_capability_set", "0") to SimpleGrammarOptionValues("config_parse_capability_set",
70+
71+
SequenceCombinator(
72+
AlternativeCombinator(
73+
SequenceCombinator(ZeroOrOne(FlexibleLiteralChoiceTerminal("~")), Capabilities, ZeroOrMore(SequenceCombinator(WhitespaceTerminal(), Capabilities))),
74+
FlexibleLiteralChoiceTerminal("~"),
75+
),
76+
EOF())),
77+
)
78+
79+
}
80+
}
81+
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
package net.sjrx.intellij.plugins.systemdunitfiles.inspections
2+
3+
import junit.framework.TestCase
4+
import net.sjrx.intellij.plugins.systemdunitfiles.AbstractUnitFileTest
5+
6+
class InvalidValueInspectionForSimpleGrammarOptionValue : AbstractUnitFileTest() {
7+
8+
fun testNoWarningWhenValidPortsSpecified() {
9+
// Fixture Setup
10+
// language="unit file (systemd)"
11+
val file="""
12+
[FooOverUDP]
13+
Port=0
14+
Port=1
15+
Port=32768
16+
Port=65535
17+
""".trimIndent()
18+
19+
// Execute SUT
20+
setupFileInEditor("file.netdev", file)
21+
enableInspection(InvalidValueInspection::class.java)
22+
val highlights = myFixture.doHighlighting()
23+
24+
// Verification
25+
assertSize(0, highlights)
26+
}
27+
28+
fun testWarningsWhenInvalidPortsSpecified() {
29+
// Fixture Setup
30+
// language="unit file (systemd)"
31+
val file="""
32+
[FooOverUDP]
33+
Port=-1
34+
Port=a
35+
Port=65536
36+
37+
""".trimIndent()
38+
39+
// Execute SUT
40+
setupFileInEditor("file.netdev", file)
41+
enableInspection(InvalidValueInspection::class.java)
42+
val highlights = myFixture.doHighlighting()
43+
44+
// Verification
45+
assertSize(3, highlights)
46+
}
47+
48+
fun testNoWarningWhenValidCoalescedUint32Specified() {
49+
// Fixture Setup
50+
// language="unit file (systemd)"
51+
val file="""
52+
[Link]
53+
RxMaxCoalescedFrames=0
54+
RxMaxCoalescedFrames=0x0
55+
RxMaxCoalescedFrames=0x1
56+
RxMaxCoalescedFrames=0xab
57+
RxMaxCoalescedFrames=0xAB
58+
RxMaxCoalescedFrames=0455
59+
RxMaxCoalescedFrames=4294967295
60+
""".trimIndent()
61+
62+
// Execute SUT
63+
setupFileInEditor("file.link", file)
64+
enableInspection(InvalidValueInspection::class.java)
65+
val highlights = myFixture.doHighlighting()
66+
67+
// Verification
68+
assertSize(0, highlights)
69+
}
70+
71+
fun testWarningsWhenInvalidCoalescedUint32Specified() {
72+
// Fixture Setup
73+
// language="unit file (systemd)"
74+
val file="""
75+
[Link]
76+
RxMaxCoalescedFrames=-1
77+
RxMaxCoalescedFrames=0xABZ
78+
RxMaxCoalescedFrames=4294967296
79+
""".trimIndent()
80+
81+
// Execute SUT
82+
setupFileInEditor("file.link", file)
83+
enableInspection(InvalidValueInspection::class.java)
84+
val highlights = myFixture.doHighlighting()
85+
86+
// Verification
87+
assertSize(3, highlights)
88+
}
89+
90+
fun testNoWarningValidCapabilitiesAreSet() {
91+
// Fixture Setup
92+
// language="unit file (systemd)"
93+
val file="""
94+
[Service]
95+
CapabilityBoundingSet=CAP_SYS_ADMIN
96+
CapabilityBoundingSet=CAP_CHOWN
97+
CapabilityBoundingSet=CAP_DAC_OVERRIDE
98+
CapabilityBoundingSet=CAP_MKNOD CAP_NET_ADMIN CAP_NET_RAW
99+
CapabilityBoundingSet=~CAP_MAC_OVERRIDE
100+
CapabilityBoundingSet=~
101+
""".trimIndent()
102+
103+
// Execute SUT
104+
setupFileInEditor("file.service", file)
105+
enableInspection(InvalidValueInspection::class.java)
106+
val highlights = myFixture.doHighlighting()
107+
108+
// Verification
109+
assertSize(0, highlights)
110+
}
111+
112+
fun testWarningsWhenInValidCapabilitiesAreSet() {
113+
// Fixture Setup
114+
// language="unit file (systemd)"
115+
val file="""
116+
[Service]
117+
CapabilityBoundingSet=CAP_CHOWNER
118+
CapabilityBoundingSet=CAP_AUDIT_CONTROLCAP_SETGID
119+
CapabilityBoundingSet=HELLO
120+
CapabilityBoundingSet=CAP_SYS_BOOT ~CAP_SYS_TIME CAP_SYSLOG
121+
""".trimIndent()
122+
123+
// Execute SUT
124+
setupFileInEditor("file.service", file)
125+
enableInspection(InvalidValueInspection::class.java)
126+
val highlights = myFixture.doHighlighting()
127+
128+
// Verification
129+
assertSize(4, highlights)
130+
}
131+
132+
}

src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/InvalidValueInspectionTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class InvalidValueInspectionTest : AbstractUnitFileTest() {
2222
TTYReset=false
2323
TTYReset=f
2424
TTYReset=off
25+
CacheDirectoryQuota=
2526
2627
""".trimIndent()
2728

0 commit comments

Comments
 (0)