summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--manifests/service.pp16
-rw-r--r--manifests/service/enabled.pp29
2 files changed, 33 insertions, 12 deletions
diff --git a/manifests/service.pp b/manifests/service.pp
index 4f886cf..85a7ec5 100644
--- a/manifests/service.pp
+++ b/manifests/service.pp
@@ -18,7 +18,8 @@ define runit::service (
# logging stuff
$logger = true, # shall we setup an logging service; if you use 'command' before,
# all output from command will be logged automatically to $logdir/current
- $_logdir = undef
+ $_logdir = undef,
+ $timeout = 7 # service restart/stop timeouts (only relevant for 'enabled' services)
) {
# using the following construct, because '$logdir = "${rundir}/log"' in the
@@ -57,6 +58,7 @@ define runit::service (
default => absent,
},
purge => true,
+ force => true,
;
"${svbase}/run":
content => $content ? {
@@ -78,14 +80,10 @@ define runit::service (
;
}
- # eventually enabling the service
- if $ensure == present and $enable == true {
- $_ensure_enabled = present
- } else {
- $_ensure_enabled = absent
+ # eventually enabling/disabling the service
+ if $enable == true {
+ debug( "Service ${name}: ${_ensure_enabled}" )
+ runit::service::enabled { $name: ensure => $ensure, timeout => $timeout }
}
- debug( "Service ${name}: ${_ensure_enabled}" )
-
- runit::service::enabled { $name: ensure => $_ensure_enabled }
}
diff --git a/manifests/service/enabled.pp b/manifests/service/enabled.pp
index d750914..1897e69 100644
--- a/manifests/service/enabled.pp
+++ b/manifests/service/enabled.pp
@@ -1,4 +1,4 @@
-define runit::service::enabled( $ensure = present ) {
+define runit::service::enabled( $ensure = present, $timeout ) {
# enabling the service by creating a symlink in /etc/service
file { "/etc/service/${name}":
@@ -21,11 +21,34 @@ define runit::service::enabled( $ensure = present ) {
exec { "sv restart ${name}":
subscribe => File["/etc/service/${name}"],
+ # last command is true, so this resource never fails
+ command => "/usr/bin/sv -w ${timeout} force-restart /etc/sv/${name}; true",
+ # we desperately need the supervise directory to restart a service
+ onlyif => "test -d '/etc/sv/${name}'/supervise",
+ refreshonly => true,
+ }
+
+ } else {
+
+ # Stop the service in THIS sequence:
+ # 1. remove /etc/services link
+ # 2. force-shutdown /etc/sv/*
+ # 3. remove /etc/sv stuff
+ # 4. manage users, groups, whatever
+
+ exec { "sv exit ${name}":
+ require => File["/etc/service/${name}"],
+ before => File["/etc/sv/${name}"],
# we wait a few seconds just in case this is the firstmost service activation
# then the supervise directory need to be created (automically) by runit
- command => "/bin/sleep 3; /usr/bin/sv -w 60 restart /etc/sv/${name}",
- refreshonly => true,
+ command => "/usr/bin/sv -w ${timeout} force-shutdown /etc/sv/${name}; true",
+ # when "/etc/sv/${name}" is not there, do not exec
+ onlyif => "test -d '/etc/sv/${name}'",
}
+
+ # if we have users/groups, we need to remove them AFTER stopping the server
+ User <||> { require +> Exec["sv exit ${name}"] }
+ Group <||> { require +> Exec["sv exit ${name}"] }
}