-
Notifications
You must be signed in to change notification settings - Fork 0
/
systemd.aug
177 lines (138 loc) · 5.71 KB
/
systemd.aug
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
(*
Module: Systemd
Parses systemd unit files.
Author: Dominic Cleal <dcleal@redhat.com>
About: Reference
This lens tries to keep as close as possible to systemd.unit(5) and
systemd.service(5) etc where possible.
About: License
This file is licenced under the LGPL v2+, like the rest of Augeas.
About: Lens Usage
To be documented
About: Configuration files
This lens applies to /lib/systemd/system/* and /etc/systemd/system/*.
See <filter>.
*)
module Systemd =
autoload xfm
(************************************************************************
* Group: USEFUL PRIMITIVES
*************************************************************************)
(* View: eol *)
let eol = Util.eol
(* View: eol_comment
An <IniFile.comment> entry for standalone comment lines (; or #) *)
let comment = IniFile.comment IniFile.comment_re "#"
(* View: eol_comment
An <IniFile.comment> entry for end of line comments (# only) *)
let eol_comment = IniFile.comment "#" "#"
(* View: sep
An <IniFile.sep> entry *)
let sep = IniFile.sep "=" "="
(* Variable: entry_single_kw *)
let entry_single_kw = "Description"
(* Variable: entry_command_kw *)
let entry_command_kw = /Exec[A-Za-z][A-Za-z0-9._-]+/
(* Variable: entry_env_kw *)
let entry_env_kw = "Environment"
(* Variable: entry_multi_kw *)
let entry_multi_kw =
let forbidden = entry_single_kw | entry_command_kw | entry_env_kw
in /[A-Za-z][A-Za-z0-9._-]+/ - forbidden
(* Variable: value_single_re *)
let value_single_re = /[^# \t\n\\][^#\n\\]*[^# \t\n\\]|[^# \t\n\\]/
(* View: sto_value_single
Support multiline values with a backslash *)
let sto_value_single = Util.del_opt_ws ""
. store (value_single_re
. (/\\\\\n/ . value_single_re)*)
(* View: sto_value *)
let sto_value = store /[^# \t\n]*[^# \t\n\\]/
(* Variable: value_sep
Multi-value entries separated by whitespace or backslash and newline *)
let value_sep = del /[ \t]+|[ \t]*\\\\[ \t]*\n[ \t]*/ " "
(* Variable: value_cmd_re
Don't parse @ and - prefix flags *)
let value_cmd_re = /[^#@ \t\n\\-][^#@ \t\n\\-][^# \t\n\\]*/
(* Variable: env_key *)
let env_key = /[A-Za-z0-9_]+(\[[0-9]+\])?/
(************************************************************************
* Group: ENTRIES
*************************************************************************)
(*
Supported entry features, selected by key names:
* multi-value space separated attrs (the default)
* single-value attrs (Description)
* systemd.service: Exec* attrs with flags, command and arguments
* systemd.service: Environment NAME=arg
*)
(* View: entry_fn
Prototype for our various key=value lines, with optional comment *)
let entry_fn (kw:regexp) (val:lens) =
[ key kw . sep . val . (eol_comment|eol) ]
(* View: entry_value
Store a value that doesn't contain spaces *)
let entry_value = [ label "value" . sto_value ]
(* View: entry_single
Entry that takes a single value containing spaces *)
let entry_single = entry_fn entry_single_kw
[ label "value" . sto_value_single ]?
(* View: entry_command
Entry that takes a space separated set of values (the default) *)
let entry_multi = entry_fn entry_multi_kw
( Util.del_opt_ws ""
. Build.opt_list entry_value value_sep )?
(* View: entry_command_flags
Exec* flags "@" and "-". Order is important, see systemd.service(8) *)
let entry_command_flags =
let exit = [ label "ignoreexit" . Util.del_str "-" ]
in let arg0 = [ label "arg0" . Util.del_str "@" ]
in exit? . arg0?
(* View: entry_command
Entry that takes a command, arguments and the optional prefix flags *)
let entry_command =
let cmd = [ label "command" . store value_cmd_re ]
in let arg = [ seq "args" . sto_value ]
in let args = [ counter "args" . label "arguments"
. (value_sep . arg)+ ]
in entry_fn entry_command_kw ( entry_command_flags . cmd . args? )?
(* View: entry_env
Entry that takes a space separated set of ENV=value key/value pairs *)
let entry_env =
let envkv (env_val:lens) = key env_key . Util.del_str "=" . env_val
(* bare has no spaces, and is optionally quoted *)
in let bare = Quote.do_quote_opt (envkv (store /[^#'" \t\n]*[^#'" \t\n\\]/)?)
in let bare_dqval = envkv (store /"[^#" \t\n]*[^#" \t\n\\]"/)
in let bare_sqval = envkv (store /'[^#' \t\n]*[^#' \t\n\\]'/)
(* quoted has at least one space, and must be quoted *)
in let quoted = Quote.do_quote (envkv (store /[^#"'\n]*[ \t]+[^#"'\n]*/))
in let envkv_quoted = [ bare ] | [ bare_dqval ] | [ bare_sqval ] | [ quoted ]
in entry_fn entry_env_kw ( Build.opt_list envkv_quoted value_sep )
(************************************************************************
* Group: LENS
*************************************************************************)
(* View: entry
An <IniFile.entry> *)
let entry = entry_single | entry_multi | entry_command | entry_env | comment
(* View: include
Includes another file at this position *)
let include = [ key ".include" . Util.del_ws_spc . sto_value
. (eol_comment|eol) ]
(* View: title
An <IniFile.title> *)
let title = IniFile.title IniFile.record_re
(* View: record
An <IniFile.record> *)
let record = IniFile.record title (entry|include)
(* View: lns
An <IniFile.lns> *)
let lns = IniFile.lns record (comment|include)
(* View: filter *)
let filter = incl "/usr/lib/systemd/system/*"
. incl "/usr/lib/systemd/system/*/*"
. incl "/etc/systemd/system/*"
. incl "/etc/systemd/system/*/*"
. incl "/etc/systemd/logind.conf"
. incl "/etc/sysconfig/*.systemd"
. Util.stdexcl
let xfm = transform lns filter