diff --git a/network/manifests/init.pp b/network/manifests/init.pp index cccd67a..5a06842 100644 --- a/network/manifests/init.pp +++ b/network/manifests/init.pp @@ -567,3 +567,96 @@ class network::manager::disable { } } + +# Define IPv6 prefixes for advertisement +# +# === Sample usage +# +# network::routeradvertisement::ipv6prefix { "em1": +# prefix => "2001:db8:c0de:cafe::/64" +# } +define network::routeradvertisement::ipv6prefix($prefix = "", $description = "") { + case $::operatingsystem { + "centos","redhat": { + file { "/etc/radvd.conf.d": + ensure => directory, + } + + file { "/etc/radvd.conf.d/radvd-${name}.conf": + ensure => present, + mode => "0644", + owner => "root", + group => "root", + content => template("network/radvd.conf.erb"), + require => File["/etc/radvd.conf.d"], + notify => Exec["generate-radvd-conf"], + } + } + "openbsd": { + file { "/etc/rtadvd.conf.d": + ensure => directory, + } + + file { "/etc/rtadvd.conf.d/rtadvd-${name}.conf": + ensure => present, + mode => "0644", + owner => "root", + group => "wheel", + content => template("network/rtadvd.conf.erb"), + before => Service["rtadvd-${name}"], + notify => Service["rtadvd-${name}"], + } + + service { "rtadvd-${name}": + ensure => running, + enable => true, + start => "/usr/sbin/rtadvd -c /etc/rtadvd.conf.d/rtadvd-${name}.conf ${name}", + stop => "/usr/bin/pkill -f \"^/usr/sbin/rtadvd -c [^ ]+ ${name}\$\"", + status => "/usr/bin/pgrep -f \"^/usr/sbin/rtadvd -c [^ ]+ ${name}\$\"", + } + } + default: { + fail("Router advertisement not supported in $::operatingsystem.") + } + } +} + +# Router Advertisement daemon +# +class network::routeradvertisement { + case $::operatingsystem { + "centos","redhat": { + package { "radvd": + ensure => installed, + } + + service { "radvd": + ensure => running, + enable => true, + hasstatus => true, + require => [File["/etc/radvd.conf"], Package["radvd"]], + } + + file { "/etc/radvd.conf": + ensure => present, + mode => "0644", + owner => "root", + group => "root", + require => Exec["generate-radvd-conf"], + notify => Service["radvd"], + } + + exec { "generate-radvd-conf": + command => "/bin/cat /etc/radvd.conf.d/radvd-*.conf >/etc/radvd.conf", + path => "/bin:/usr/bin:/sbin:/usr/sbin", + refreshonly => true, + } + } + "openbsd": { + # Only network::ipv6network is needed for OpenBSD + } + default: { + fail("Router advertisement not supported in $::operatingsystem") + } + } +} diff --git a/network/templates/radvd.conf.erb b/network/templates/radvd.conf.erb new file mode 100644 index 0000000..d1dca27 --- /dev/null +++ b/network/templates/radvd.conf.erb @@ -0,0 +1,16 @@ + +# <%= description %> +interface <%= name %> +{ + AdvSendAdvert on; + MinRtrAdvInterval 3; + MaxRtrAdvInterval 10; + AdvHomeAgentFlag off; + + prefix <%= prefix %> + { + AdvOnLink on; + AdvAutonomous on; + AdvRouterAddr off; + }; +}; diff --git a/network/templates/rtadvd.conf.erb b/network/templates/rtadvd.conf.erb new file mode 100644 index 0000000..2d37a4d --- /dev/null +++ b/network/templates/rtadvd.conf.erb @@ -0,0 +1,4 @@ + +# <%= description %> +<%= name %>:\ + :addr="<%= prefix.split("/").first %>":":prefixlen#<%= prefix.split("/").last %>: