Adding support for a "mailalias" type, with /etc/aliases support initially. I have not yet figured out how to best rebuild the aliases file when necessary.
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@2676 980ebf18-57e1-0310-9a29-db15c13687c0
This commit is contained in:
Родитель
fdfe0a387d
Коммит
2d3c920e0f
|
@ -1,3 +1,5 @@
|
|||
Added a 'mailalias' type for managing mail aliases.
|
||||
|
||||
Added patch by Valentin Vidic that adds the '+>' syntax to
|
||||
resources, so parameter values can be added to.
|
||||
|
||||
|
|
|
@ -295,13 +295,16 @@ class Puppet::Type
|
|||
[self.name, name]
|
||||
end
|
||||
|
||||
if parent = options[:parent]
|
||||
options.delete(:parent)
|
||||
else
|
||||
parent = Puppet::Property
|
||||
end
|
||||
|
||||
# We have to create our own, new block here because we want to define
|
||||
# an initial :retrieve method, if told to, and then eval the passed
|
||||
# block if available.
|
||||
prop = genclass(name,
|
||||
:parent => options[:parent] || Puppet::Property,
|
||||
:hash => @validproperties
|
||||
) do
|
||||
prop = genclass(name, :parent => parent, :hash => @validproperties, :attributes => options) do
|
||||
# If they've passed a retrieve method, then override the retrieve
|
||||
# method on the class.
|
||||
if options[:retrieve]
|
||||
|
@ -322,15 +325,6 @@ class Puppet::Type
|
|||
@properties << prop
|
||||
end
|
||||
|
||||
if options[:event]
|
||||
prop.event = options[:event]
|
||||
end
|
||||
|
||||
# Grr.
|
||||
if options[:required_features]
|
||||
prop.required_features = options[:required_features]
|
||||
end
|
||||
|
||||
# define_method(name) do
|
||||
# @parameters[name].should
|
||||
# end
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
require 'puppet/provider/parsedfile'
|
||||
|
||||
Puppet::Type.type(:mailalias).provide(:aliases,
|
||||
:parent => Puppet::Provider::ParsedFile,
|
||||
:default_target => "/etc/aliases",
|
||||
:filetype => :flat
|
||||
) do
|
||||
text_line :comment, :match => /^#/
|
||||
text_line :blank, :match => /^\s*$/
|
||||
|
||||
record_line :aliases, :fields => %w{name recipient}, :separator => /\s*:\s*/, :block_eval => :instance do
|
||||
def post_parse(record)
|
||||
record[:recipient] = record[:recipient].split(/\s*,\s*/).collect { |d| d.gsub(/^['"]|['"]$/, '') }
|
||||
record
|
||||
end
|
||||
|
||||
def to_line(record)
|
||||
dest = record[:recipient].collect do |d|
|
||||
# Quote aliases that have non-alpha chars
|
||||
if d =~ /[^-\w@.]/
|
||||
'"%s"' % d
|
||||
else
|
||||
d
|
||||
end
|
||||
end.join(",")
|
||||
return "%s: %s" % [record[:name], dest]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# $Id$
|
|
@ -0,0 +1,50 @@
|
|||
module Puppet
|
||||
newtype(:mailalias) do
|
||||
@doc = "Creates an email alias in the local alias database."
|
||||
|
||||
ensurable
|
||||
|
||||
newparam(:name, :namevar => true) do
|
||||
desc "The alias name."
|
||||
end
|
||||
|
||||
newproperty(:recipient, :array_matching => :all) do
|
||||
desc "Where email should should be sent. Multiple values
|
||||
should be specified as an array."
|
||||
|
||||
def is_to_s(value)
|
||||
if value.include?(:absent)
|
||||
super
|
||||
else
|
||||
value.join(",")
|
||||
end
|
||||
end
|
||||
|
||||
def should
|
||||
@should
|
||||
end
|
||||
|
||||
def should_to_s(value)
|
||||
if value.include?(:absent)
|
||||
super
|
||||
else
|
||||
value.join(",")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
newproperty(:target) do
|
||||
desc "The file in which to store the aliases. Only used by
|
||||
those providers that write to disk (i.e., not NetInfo)."
|
||||
|
||||
defaultto { if @resource.class.defaultprovider.ancestors.include?(Puppet::Provider::ParsedFile)
|
||||
@resource.class.defaultprovider.default_target
|
||||
else
|
||||
nil
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# $Id$
|
|
@ -0,0 +1,183 @@
|
|||
# This is the aliases file - it says who gets mail for whom.
|
||||
# It was originally generated by `eximconfig', part of the exim package
|
||||
# distributed with Debian, but it may edited by the mail system administrator.
|
||||
# This file originally generated by eximconfig at Tue Jul 12345 12345:12345:12345 CDT 12345
|
||||
# See exim info section for details of the things that can be configured here.
|
||||
|
||||
# Local aliases
|
||||
eight-phone: 12345@domain.com
|
||||
eight-pager: eight-phone
|
||||
eight-sms: eight-phone
|
||||
cindy-phone: 12345@domain.com
|
||||
cindy-pager: cindy-phone
|
||||
cindy-sms: cindy-phone
|
||||
|
||||
ben-phone: 12345@txt.att.net
|
||||
ben: eight
|
||||
ajax: eight
|
||||
|
||||
teyo: teyo@brainfinger.org
|
||||
|
||||
#----------------#
|
||||
# Family aliases #
|
||||
#----------------#
|
||||
|
||||
smithes: eight,six,two,seven,isaiah,kristen,cindy,three
|
||||
smith: smithes
|
||||
#morris: morrisbpaddlin@hotmail.com
|
||||
#six: grendelwench@hotmail.com
|
||||
two: twosmith@thirddomain.com
|
||||
seven: sevensmith@thirddomain.com
|
||||
isaiah: ismith@thirddomain.com
|
||||
kristen: kristenwells@thirddomain.com
|
||||
one-phone: 12345@otherdomain.com
|
||||
one-pager: one-phone
|
||||
seven-phone: 12345@otherdomain.com
|
||||
seven-pager: seven-phone
|
||||
seven-sms: seven-phone
|
||||
ike-phone: 12345@otherdomain.com
|
||||
ike-page: ike-phone
|
||||
ike-sms: ike-phone
|
||||
six-phone: 12345@otherdomain.com
|
||||
six-page: six-phone
|
||||
six-sms: six-phone
|
||||
three: tferguson@mmc.edu
|
||||
three-phone: 12345@otherdomain.com
|
||||
three-page: three-phone
|
||||
three-sms: three-phone
|
||||
four-phone: 12345@otherdomain.com
|
||||
four-page: four-phone
|
||||
four-sms: four-phone
|
||||
two-phone: 12345@otherdomain.com
|
||||
two-page: two-phone
|
||||
two-sms: two-phone
|
||||
five-phone: 12345@otherdomain.com
|
||||
five-page: five-phone
|
||||
five-sms: five-phone
|
||||
|
||||
#----------------#
|
||||
# work aliases #
|
||||
#----------------#
|
||||
consulting: eight
|
||||
svn: eight
|
||||
info: eight
|
||||
blog: eight
|
||||
paypal: eight
|
||||
trac: puppet-dev
|
||||
dev: eight
|
||||
sales: eight
|
||||
training: eight
|
||||
support: eight
|
||||
faq: eight
|
||||
puppet-docs: eight,nine@domain.com,ten@domain.com,eleven@other.com
|
||||
docs: puppet-docs
|
||||
jobs: eight
|
||||
|
||||
# System stuff
|
||||
postmaster: eight
|
||||
root: eight
|
||||
|
||||
daemon: root
|
||||
bin: root
|
||||
sys: root
|
||||
sync: root
|
||||
games: root
|
||||
man: root
|
||||
lp: root
|
||||
mail: root
|
||||
news: root
|
||||
uucp: root
|
||||
proxy: root
|
||||
postgres: root
|
||||
www-data: root
|
||||
backup: root
|
||||
operator: root
|
||||
list: root
|
||||
irc: root
|
||||
gnats: root
|
||||
nobody: root
|
||||
|
||||
filemaker: eight
|
||||
|
||||
hostmaster: root
|
||||
usenet: root
|
||||
webmaster: root
|
||||
www: root
|
||||
ftp: root
|
||||
abuse: root
|
||||
noc: root
|
||||
security: root
|
||||
|
||||
mailer-daemon: postmaster
|
||||
|
||||
tap: one@two.com,two@three.com,three@four.com,four@five.com,five@six.com
|
||||
|
||||
mailman: "|/var/lib/mailman/mail/mailman post mailman"
|
||||
mailman-admin: "|/var/lib/mailman/mail/mailman admin mailman"
|
||||
mailman-bounces: "|/var/lib/mailman/mail/mailman bounces mailman"
|
||||
mailman-confirm: "|/var/lib/mailman/mail/mailman confirm mailman"
|
||||
mailman-join: "|/var/lib/mailman/mail/mailman join mailman"
|
||||
mailman-leave: "|/var/lib/mailman/mail/mailman leave mailman"
|
||||
mailman-owner: "|/var/lib/mailman/mail/mailman owner mailman"
|
||||
mailman-request: "|/var/lib/mailman/mail/mailman request mailman"
|
||||
mailman-subscribe: "|/var/lib/mailman/mail/mailman subscribe mailman"
|
||||
mailman-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe mailman"
|
||||
|
||||
puppet-dev: "|/var/lib/mailman/mail/mailman post puppet-dev"
|
||||
puppet-dev-admin: "|/var/lib/mailman/mail/mailman admin puppet-dev"
|
||||
puppet-dev-bounces: "|/var/lib/mailman/mail/mailman bounces puppet-dev"
|
||||
puppet-dev-confirm: "|/var/lib/mailman/mail/mailman confirm puppet-dev"
|
||||
puppet-dev-join: "|/var/lib/mailman/mail/mailman join puppet-dev"
|
||||
puppet-dev-leave: "|/var/lib/mailman/mail/mailman leave puppet-dev"
|
||||
puppet-dev-owner: "|/var/lib/mailman/mail/mailman owner puppet-dev"
|
||||
puppet-dev-request: "|/var/lib/mailman/mail/mailman request puppet-dev"
|
||||
puppet-dev-subscribe: "|/var/lib/mailman/mail/mailman subscribe puppet-dev"
|
||||
puppet-dev-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe puppet-dev"
|
||||
|
||||
## puppet-commit mailing list
|
||||
puppet-commit: "|/var/lib/mailman/mail/mailman post puppet-commit"
|
||||
puppet-commit-admin: "|/var/lib/mailman/mail/mailman admin puppet-commit"
|
||||
puppet-commit-bounces: "|/var/lib/mailman/mail/mailman bounces puppet-commit"
|
||||
puppet-commit-confirm: "|/var/lib/mailman/mail/mailman confirm puppet-commit"
|
||||
puppet-commit-join: "|/var/lib/mailman/mail/mailman join puppet-commit"
|
||||
puppet-commit-leave: "|/var/lib/mailman/mail/mailman leave puppet-commit"
|
||||
puppet-commit-owner: "|/var/lib/mailman/mail/mailman owner puppet-commit"
|
||||
puppet-commit-request: "|/var/lib/mailman/mail/mailman request puppet-commit"
|
||||
puppet-commit-subscribe: "|/var/lib/mailman/mail/mailman subscribe puppet-commit"
|
||||
puppet-commit-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe puppet-commit"
|
||||
|
||||
## bnageek mailing list
|
||||
bnageek: "|/var/lib/mailman/mail/mailman post bnageek"
|
||||
bnageek-admin: "|/var/lib/mailman/mail/mailman admin bnageek"
|
||||
bnageek-bounces: "|/var/lib/mailman/mail/mailman bounces bnageek"
|
||||
bnageek-confirm: "|/var/lib/mailman/mail/mailman confirm bnageek"
|
||||
bnageek-join: "|/var/lib/mailman/mail/mailman join bnageek"
|
||||
bnageek-leave: "|/var/lib/mailman/mail/mailman leave bnageek"
|
||||
bnageek-owner: "|/var/lib/mailman/mail/mailman owner bnageek"
|
||||
bnageek-request: "|/var/lib/mailman/mail/mailman request bnageek"
|
||||
bnageek-subscribe: "|/var/lib/mailman/mail/mailman subscribe bnageek"
|
||||
bnageek-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe bnageek"
|
||||
|
||||
## puppet-users mailing list
|
||||
puppet-users: "|/var/lib/mailman/mail/mailman post puppet-users"
|
||||
puppet-users-admin: "|/var/lib/mailman/mail/mailman admin puppet-users"
|
||||
puppet-users-bounces: "|/var/lib/mailman/mail/mailman bounces puppet-users"
|
||||
puppet-users-confirm: "|/var/lib/mailman/mail/mailman confirm puppet-users"
|
||||
puppet-users-join: "|/var/lib/mailman/mail/mailman join puppet-users"
|
||||
puppet-users-leave: "|/var/lib/mailman/mail/mailman leave puppet-users"
|
||||
puppet-users-owner: "|/var/lib/mailman/mail/mailman owner puppet-users"
|
||||
puppet-users-request: "|/var/lib/mailman/mail/mailman request puppet-users"
|
||||
puppet-users-subscribe: "|/var/lib/mailman/mail/mailman subscribe puppet-users"
|
||||
puppet-users-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe puppet-users"
|
||||
|
||||
## puppet-bugs mailing list
|
||||
puppet-bugs: "|/var/lib/mailman/mail/mailman post puppet-bugs"
|
||||
puppet-bugs-admin: "|/var/lib/mailman/mail/mailman admin puppet-bugs"
|
||||
puppet-bugs-bounces: "|/var/lib/mailman/mail/mailman bounces puppet-bugs"
|
||||
puppet-bugs-confirm: "|/var/lib/mailman/mail/mailman confirm puppet-bugs"
|
||||
puppet-bugs-join: "|/var/lib/mailman/mail/mailman join puppet-bugs"
|
||||
puppet-bugs-leave: "|/var/lib/mailman/mail/mailman leave puppet-bugs"
|
||||
puppet-bugs-owner: "|/var/lib/mailman/mail/mailman owner puppet-bugs"
|
||||
puppet-bugs-request: "|/var/lib/mailman/mail/mailman request puppet-bugs"
|
||||
puppet-bugs-subscribe: "|/var/lib/mailman/mail/mailman subscribe puppet-bugs"
|
||||
puppet-bugs-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe puppet-bugs"
|
|
@ -0,0 +1,57 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
$:.unshift("../../../lib") if __FILE__ =~ /\.rb$/
|
||||
|
||||
require 'puppettest'
|
||||
require 'puppettest/fileparsing'
|
||||
require 'puppet/type/mailalias'
|
||||
|
||||
class TestMailaliasAliasesProvider < Test::Unit::TestCase
|
||||
include PuppetTest
|
||||
include PuppetTest::FileParsing
|
||||
|
||||
def setup
|
||||
super
|
||||
@provider = Puppet.type(:mailalias).provider(:aliases)
|
||||
|
||||
@oldfiletype = @provider.filetype
|
||||
|
||||
@alias = mkalias
|
||||
end
|
||||
|
||||
def teardown
|
||||
Puppet::Util::FileType.filetype(:ram).clear
|
||||
@provider.filetype = @oldfiletype
|
||||
@provider.clear
|
||||
super
|
||||
end
|
||||
|
||||
def mkalias(name = "me")
|
||||
if defined? @pcount
|
||||
@pcount += 1
|
||||
else
|
||||
@pcount = 1
|
||||
end
|
||||
args = {
|
||||
:name => name,
|
||||
:recipient => %w{here there}
|
||||
}
|
||||
|
||||
fakeresource = fakeresource(:mailalias, args[:name])
|
||||
|
||||
key = @provider.new(fakeresource)
|
||||
args.each do |p,v|
|
||||
key.send(p.to_s + "=", v)
|
||||
end
|
||||
|
||||
return key
|
||||
end
|
||||
|
||||
def test_data_parsing_and_generating
|
||||
fakedata("data/types/mailalias").each { |file|
|
||||
fakedataparse(file)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
# $Id$
|
|
@ -197,15 +197,13 @@ class TestParsedFile < Test::Unit::TestCase
|
|||
prov.default_target = :default
|
||||
|
||||
# Create a couple of demo files
|
||||
prov.target_object(:file1).write "bill b c"
|
||||
prov.target_object(:file1).write "bill b c\njill b d"
|
||||
|
||||
prov.target_object(:file2).write "jill b d"
|
||||
|
||||
prov.target_object(:default).write "will b d"
|
||||
prov.target_object(:default).write "will b d\n"
|
||||
|
||||
# Create some resources for some of those demo files
|
||||
resource = mkresource "bill", :target => :file1
|
||||
default = mkresource "will", :target => :default
|
||||
resource = mkresource "bill", :target => :file1, :one => "b", :two => "c"
|
||||
default = mkresource "will", :target => :default, :one => "b", :two => "d"
|
||||
|
||||
resources = {"bill" => resource, "will" => default}
|
||||
|
||||
|
@ -215,6 +213,7 @@ class TestParsedFile < Test::Unit::TestCase
|
|||
|
||||
# Make sure we prefetched our resources.
|
||||
assert_equal("b", resource.provider.one, "did not prefetch resource from file1")
|
||||
assert_equal("c", resource.provider.two, "did not prefetch resource from file1")
|
||||
assert_equal("b", default.provider.one, "did not prefetch resource from default")
|
||||
assert_equal("d", default.provider.two, "did not prefetch resource from default")
|
||||
|
||||
|
@ -232,6 +231,20 @@ class TestParsedFile < Test::Unit::TestCase
|
|||
assert(providers.find { |provider| provider.name == name},
|
||||
"Did not return %s in list" % name)
|
||||
end
|
||||
|
||||
# Now modify our resources and write them out, making sure that prefetching
|
||||
# hasn't somehow destroyed this ability
|
||||
resource[:one] = "a"
|
||||
default[:one] = "a"
|
||||
|
||||
|
||||
assert_apply(resource)
|
||||
assert_apply(default)
|
||||
|
||||
assert_equal("bill a c\njill b d\n", prov.target_object(:file1).read,
|
||||
"Did not write changed resource correctly")
|
||||
assert_equal("will a d\n", prov.target_object(:default).read,
|
||||
"Did not write changed default resource correctly")
|
||||
end
|
||||
|
||||
# Make sure we can correctly prefetch on a target.
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
$:.unshift("../../lib") if __FILE__ =~ /\.rb$/
|
||||
|
||||
require 'puppettest'
|
||||
require 'mocha'
|
||||
|
||||
class TestMailAlias < Test::Unit::TestCase
|
||||
include PuppetTest
|
||||
|
||||
def setup
|
||||
super
|
||||
@type = Puppet::Type.type(:mailalias)
|
||||
|
||||
@provider = @type.defaultprovider
|
||||
|
||||
# Make sure they aren't using something funky like netinfo
|
||||
unless @provider.name == :aliases
|
||||
@type.defaultprovider = @type.provider(:aliases)
|
||||
end
|
||||
|
||||
cleanup do @type.defaultprovider = nil end
|
||||
|
||||
if @provider.respond_to?(:default_target=)
|
||||
@default_file = @provider.default_target
|
||||
cleanup do
|
||||
@provider.default_target = @default_file
|
||||
end
|
||||
@target = tempfile()
|
||||
@provider.default_target = @target
|
||||
end
|
||||
end
|
||||
|
||||
# This isn't much of a test, but then, it's not much of a type.
|
||||
def test_recipient_arrays
|
||||
resource = @type.create(:name => "luke", :recipient => "yay", :target => tempfile)
|
||||
resource.provider.expects(:recipient).returns([:absent])
|
||||
values = nil
|
||||
assert_nothing_raised("Could not retrieve mailalias") do
|
||||
values = resource.retrieve.inject({}) { |hash, a| hash[a[0].name] = a[1]; hash }
|
||||
end
|
||||
assert_equal([:absent], values[:recipient])
|
||||
resource.property(:recipient).expects(:set).with(%w{yay})
|
||||
assert_nothing_raised("Could not sync mailalias") do
|
||||
resource.property(:recipient).sync
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# $Id$
|
Загрузка…
Ссылка в новой задаче