]> gitweb.fluxo.info Git - puppet-runit.git/commitdiff
Initial commit
authorMarkus Strauss <Markus@ITstrauss.eu>
Fri, 28 Oct 2011 00:34:29 +0000 (20:34 -0400)
committerMarkus Strauss <Markus@ITstrauss.eu>
Fri, 28 Oct 2011 00:34:29 +0000 (20:34 -0400)
manifests/directory.pp [new file with mode: 0644]
manifests/init.pp [new file with mode: 0644]
manifests/service.pp [new file with mode: 0644]
manifests/service/enabled.pp [new file with mode: 0644]
manifests/service/env.pp [new file with mode: 0644]
templates/logger_run.erb [new file with mode: 0644]

diff --git a/manifests/directory.pp b/manifests/directory.pp
new file mode 100644 (file)
index 0000000..45e3401
--- /dev/null
@@ -0,0 +1,7 @@
+define runit::directory( $ensure = directory ) {
+  
+  if !defined( File[$name] ) {
+    file{ $name: ensure => $ensure }
+  }
+  
+}
diff --git a/manifests/init.pp b/manifests/init.pp
new file mode 100644 (file)
index 0000000..95e8253
--- /dev/null
@@ -0,0 +1,18 @@
+class runit( $ensure = present ) {
+  
+  package { runit: ensure => $ensure }
+  
+  if $ensure == present {
+
+    file {
+      '/etc/sv':
+        ensure => directory,
+        ;
+      '/etc/service':
+        ensure => directory,
+        ;
+    }
+
+  }
+  
+}
diff --git a/manifests/service.pp b/manifests/service.pp
new file mode 100644 (file)
index 0000000..56433fd
--- /dev/null
@@ -0,0 +1,52 @@
+define runit::service (
+  $user    = root,       # the service's user name
+  $group   = root,       # the service's group name
+  $enable  = true,       # shall the service be linked to /etc/service
+  $ensure  = present,    # shall the service be present in /etc/sv
+  $logger  = false,      # shall we setup an logging service
+  # either one of these must be given:
+  $source  = undef,      # either source or content must be defined; 
+  $content = undef       # this will be the run script /etc/sv/$name/run
+) {
+
+  # resource defaults
+  File { owner => root, group => root, mode => 644 }
+
+  $svbase = "/etc/sv/${name}"
+  
+  # creating the logging sub-service, if requested
+  if $logger == true {
+    runit::service{ "${name}/log":
+      user => $user, group => $group, enable => false, ensure => $ensure, logger => false,
+      content => template('runit/logger_run.erb'),
+    }
+  }
+  
+  # the main service stuff
+  file {
+    "${svbase}":
+      ensure => $ensure ? {
+        present => directory,
+        default => absent,
+        },
+        purge => true,
+      ;
+    "${svbase}/run":
+      content => $content,
+      source  => $source,
+      ensure  => $ensure,
+      mode    => 755,
+      ;
+  }
+
+  # eventually enabling the service
+  if $ensure == present and $enable == true {
+    $_ensure_enabled = present
+  } else {
+    $_ensure_enabled = absent
+  }
+
+  debug( "Service ${name}: ${_ensure_enabled}" )
+
+  runit::service::enabled { $name: ensure => $_ensure_enabled }
+}
diff --git a/manifests/service/enabled.pp b/manifests/service/enabled.pp
new file mode 100644 (file)
index 0000000..1a71f4d
--- /dev/null
@@ -0,0 +1,30 @@
+define runit::service::enabled( $ensure = present ) {
+
+  # enabling the service by creating a symlink in /etc/service
+  file { "/etc/service/${name}":
+    target => "/etc/sv/${name}",
+    ensure => $ensure ? {
+      present => link,
+      default => absent,
+    },
+  }
+  
+  if $ensure == present {
+
+    # subscribe to any run file changes
+    File["/etc/sv/${name}/run"] ~> Runit::Service::Enabled[$name]
+
+    # we also require notification from all environment variables
+    Runit::Service::Env <| service == $name |> {
+      notify +> Runit::Service::Enabled[$name]
+    }
+
+    exec { "sv restart ${name}":
+      subscribe   => File["/etc/service/${name}"],
+      command     => "/usr/bin/sv -w 60 restart /etc/sv/${name}",
+      refreshonly => true,
+    }
+
+  }
+  
+}
diff --git a/manifests/service/env.pp b/manifests/service/env.pp
new file mode 100644 (file)
index 0000000..3e22d7a
--- /dev/null
@@ -0,0 +1,22 @@
+# the env $name must be unique
+define runit::service::env( $service, $value, $ensure = present ) {
+  
+  $envdir = "/etc/sv/${service}/env"
+  
+  # create this directory if at least one environment variable is defined
+  if !defined( File["/etc/sv/${service}/env"] ) {
+    file{ "/etc/sv/${service}/env":
+      ensure  => directory,
+      # all unmanaged envs. will be removed
+      recurse => true,
+      purge   => true,
+    }
+  }
+  
+  # runit::directory { $envdir: }
+  file { "${envdir}/${name}":
+    ensure => $ensure,
+    content => "${value}\n",
+  }
+
+}
diff --git a/templates/logger_run.erb b/templates/logger_run.erb
new file mode 100644 (file)
index 0000000..3c377ca
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh
+logdir=$(<<%= svbase %>/env/Service_Root)/log/<%= name %>
+mkdir -p $logdir
+chown <%= user %>:<%= group %> $logdir
+exec chpst -u <%= user %>:<%= group %> svlogd -tt $logdir