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
|
require 'puppet/provider/parsedfile'
Puppet::Type.type(:mailalias).provide(
:aliases,
parent: Puppet::Provider::ParsedFile,
default_target: '/etc/aliases',
filetype: :flat,
) do
desc 'The alias provider for mailalias.'
text_line :comment, match: %r{^#}
text_line :blank, match: %r{^\s*$}
record_line :aliases, fields: ['name', 'recipient'], separator: %r{\s*:\s*}, block_eval: :instance do
def post_parse(record)
if record[:recipient]
record[:recipient] = record[:recipient].split(%r{\s*,\s*(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)}).map { |d| d.gsub(%r{^['"]|['"]$}, '') }
end
record
end
def process(line)
ret = {}
records = line.split(':', 4)
ret[:name] = records[0].strip
if records.length == 4 && records[2].strip == 'include'
ret[:file] = records[3].strip
else
records = line.split(':', 2)
ret[:recipient] = records[1].strip
end
ret
end
def to_line(record)
if record[:recipient]
dest = record[:recipient].map { |d|
# Quote aliases that have non-alpha chars
if %r{[^-+\w@.]}.match?(d)
'"%s"' % d
else
d
end
}.join(',')
"#{record[:name]}: #{dest}"
elsif record[:file]
"#{record[:name]}: :include: #{record[:file]}"
end
end
end
end
|