From 83f6c2c73d7ba663aa896683eb9ca843b1c13b33 Mon Sep 17 00:00:00 2001 From: Nathan Ward Date: Fri, 14 May 2021 21:59:35 +1200 Subject: [PATCH] Add radsniff support for Debian-like OSes and specifying envfile and pidfile to support any OS --- files/radsniff.service | 13 ------- manifests/params.pp | 10 ++++++ manifests/radsniff.pp | 30 +++++++++++++--- spec/classes/radsniff.rb | 62 +++++++++++++++++++++++++++++++--- templates/radsniff.service.erb | 13 +++++++ 5 files changed, 106 insertions(+), 22 deletions(-) delete mode 100644 files/radsniff.service create mode 100644 templates/radsniff.service.erb diff --git a/files/radsniff.service b/files/radsniff.service deleted file mode 100644 index c60f0db8..00000000 --- a/files/radsniff.service +++ /dev/null @@ -1,13 +0,0 @@ -[Unit] -Description=Capture RADIUS statistics -After=syslog.target network.target -After=radiusd.target - -[Service] -Type=forking -PIDFile=/var/run/radiusd/radsniff.pid -EnvironmentFile=/etc/sysconfig/radsniff -ExecStart=/usr/bin/radsniff -P /var/run/radiusd/radsniff.pid -d /etc/raddb $RADSNIFF_OPTIONS - -[Install] -WantedBy=multi-user.target diff --git a/manifests/params.pp b/manifests/params.pp index 46e47b80..b3f6912d 100644 --- a/manifests/params.pp +++ b/manifests/params.pp @@ -172,4 +172,14 @@ } $radacctdir = "\${logdir}/radacct" + + # Default radsniff environment file location + $fr_radsniff_envfile = $::osfamily ? { + 'RedHat' => '/etc/sysconfig/radsniff', + 'Debian' => '/etc/defaults/radsniff', + default => undef, + } + + # Default radsniff pid file location + $fr_radsniff_pidfile = "/var/run/${fr_service}/radsniff.pid" } diff --git a/manifests/radsniff.pp b/manifests/radsniff.pp index 8f5ee29d..21837064 100644 --- a/manifests/radsniff.pp +++ b/manifests/radsniff.pp @@ -1,20 +1,42 @@ # @summary configure and run radsniff # +# @param envfile path to the environment file, used by the systemd unit # @param options commandline options passed to radsniff when it runs +# @param class freeradius::radsniff ( + Optional[String] $envfile = undef, String $options = '', -) { + Optional[String] $pidfile = undef, +) inherits freeradius::params { unless $::freeradius::utils_support { fail('freeradius::radsniff requires freeradius have utils_support enabled') } - unless $facts['os']['family'] == 'RedHat' { - fail('freeradius::radsniff only supports RedHat like OSes at the moment') + # Calculate the envfile to use - specified, then calculated, then error if none + if $envfile { + $final_envfile = $envfile + } else { + if $freeradius::fr_radsniff_envfile { + $final_envfile = $freeradius::fr_radsniff_envfile + } else { + fail('freeradius::radsniff requires envfile to be explicitly set on this OS') + } + } + + # Calculate the pidfile to use - specified, then calculated, then error if none + if $pidfile { + $final_pidfile = $pidfile + } else { + if $freeradius::fr_radsniff_pidfile { + $final_pidfile = $freeradius::fr_radsniff_pidfile + } else { + fail('freeradius::radsniff requires pidfile to be explicitly set on this OS') + } } $escaped_cmd = $options.regsubst('"','\\\\"','G') - file {'/etc/sysconfig/radsniff': + file { $envfile: content => @("SYSCONFIG"), RADSNIFF_OPTIONS="${escaped_cmd}" | SYSCONFIG diff --git a/spec/classes/radsniff.rb b/spec/classes/radsniff.rb index d4666503..bff7f05e 100644 --- a/spec/classes/radsniff.rb +++ b/spec/classes/radsniff.rb @@ -13,6 +13,14 @@ } end + if os_facts[:osfamily] =~ %r{^RedHat|Debian$} + it do + is_expected.to contain_service('radsniff') + .with_ensure('running') + .with_enable(true) + end + end + case os_facts[:osfamily] when 'RedHat' it do @@ -23,19 +31,63 @@ end it do - is_expected.to contain_service('radsniff') - .with_ensure('running') - .with_enable(true) + is_expected.to contain_systemd__unit_file('radsniff.service') + .with_content(%r{^Pidfile=/var/run/radiusd/radsniff.pid$}) + .with_content(%r{^EnvironmentFile=/etc/sysconfig/radsniff$}) + .with_content(%r{^ExecStart=/usr/bin/radsniff -P /var/run/radiusd/radsniff.pid -d /etc/raddb $RADSNIFF_OPTIONS$}) + .that_notifies('Service[radsniff]') + end + when 'Debian' + it do + is_expected.to contain_file('/etc/defaults/radsniff') + .with_content(%r{RADSNIFF_OPTIONS="radsniff cmd \\"line\\" options"}) + .that_notifies('Service[radsniff]') + .that_requires('Package[freeradius-utils]') end it do is_expected.to contain_systemd__unit_file('radsniff.service') - .with_source('puppet:///modules/freeradius/radsniff.service') + .with_content(%r{^Pidfile=/var/run/freeradius/radsniff.pid$}) + .with_content(%r{^EnvironmentFile=/etc/defaults/radsniff$}) + .with_content(%r{^ExecStart=/usr/bin/radsniff -P /var/run/freeradius/radsniff.pid -d /etc/freeradius $RADSNIFF_OPTIONS$}) .that_notifies('Service[radsniff]') end else it do - is_expected.to compile.and_raise_error(%r{radsniff only supports RedHat}) + is_expected.to compile.and_raise_error(%r{freeradius::radsniff requires envfile to be explicitly set on this OS}) + is_expected.to compile.and_raise_error(%r{freeradius::radsniff requires pidfile to be explicitly set on this OS}) + end + end + + context 'with envfile and pidfile set' do + let(:params) do + super().merge( + envfile: '/test/env/file', + pidfile: '/a/pid/file', + ) + end + + if os_facts[:osfamily] !~ %r{^RedHat|Debian$} + it do + is_expected.to contain_service('radsniff') + .with_ensure('running') + .with_enable(true) + end + end + + it do + is_expected.to contain_file('/test/env/file') + .with_content(%r{RADSNIFF_OPTIONS="radsniff cmd \\"line\\" options"}) + .that_notifies('Service[radsniff]') + .that_requires('Package[freeradius-utils]') + end + + it do + is_expected.to contain_systemd__unit_file('radsniff.service') + .with_content(%r{^Pidfile=/a/pid/file$}) + .with_content(%r{^EnvironmentFile=/test/env/file$}) + .with_content(%r{^ExecStart=/usr/bin/radsniff -P /a/pid/file -d /etc/freeradius $RADSNIFF_OPTIONS$}) + .that_notifies('Service[radsniff]') end end end diff --git a/templates/radsniff.service.erb b/templates/radsniff.service.erb new file mode 100644 index 00000000..93fe7dfd --- /dev/null +++ b/templates/radsniff.service.erb @@ -0,0 +1,13 @@ +[Unit] +Description=Capture RADIUS statistics +After=syslog.target network.target +After=radiusd.target + +[Service] +Type=forking +Pidfile=<%=scope['::freeradius::radsniff::final_pidfile']%> +EnvironmentFile=<%=scope['::freeradius::radsniff::final_envpath']%> +ExecStart=/usr/bin/radsniff -P <%=scope['::freeradius::radsniff::pidpath']%> -d <%=scope['::freeradius::radsniff::fr_basepath']%> $RADSNIFF_OPTIONS + +[Install] +WantedBy=multi-user.target