From f4e44700bde6f53edfa5998c81d86a356cec2715 Mon Sep 17 00:00:00 2001
From: liamjbennett <lbennett@opentable.com>
Date: Wed, 21 Oct 2015 15:24:09 +0100
Subject: [PATCH 1/2] Adding windows support.

This should allow the user to be able to install the sensu client on
windows platforms.
---
 lib/puppet/provider/package/sensu_gem.rb      |  7 +-
 lib/puppet/provider/sensu_api_config/json.rb  |  2 +-
 .../provider/sensu_client_config/json.rb      |  2 +-
 .../provider/sensu_rabbitmq_config/json.rb    |  2 +-
 .../provider/sensu_redis_config/json.rb       |  2 +-
 manifests/api/config.pp                       | 21 ++--
 manifests/api/service.pp                      | 12 ++-
 manifests/check.pp                            | 28 +++++-
 manifests/client/config.pp                    |  9 +-
 manifests/client/service.pp                   | 22 +++++
 manifests/init.pp                             | 20 ++++
 manifests/package.pp                          | 98 ++++++++++++-------
 manifests/rabbitmq/config.pp                  | 56 ++++++-----
 manifests/redis/config.pp                     |  9 +-
 manifests/server/service.pp                   | 12 ++-
 templates/sensu-client.erb                    |  8 ++
 16 files changed, 211 insertions(+), 99 deletions(-)
 create mode 100644 templates/sensu-client.erb

diff --git a/lib/puppet/provider/package/sensu_gem.rb b/lib/puppet/provider/package/sensu_gem.rb
index 51e1439295..876da847ba 100644
--- a/lib/puppet/provider/package/sensu_gem.rb
+++ b/lib/puppet/provider/package/sensu_gem.rb
@@ -11,7 +11,12 @@
 
   has_feature :versionable, :install_options
 
-  commands :gemcmd => "/opt/sensu/embedded/bin/gem"
+  commands :gemcmd =>
+    if File.exists?("#{ENV['SYSTEMDRIVE']}\\opt\\sensu\\embedded\\bin\\gem.bat")
+      "#{ENV['SYSTEMDRIVE']}\\opt\\sensu\\embedded\\bin\\gem.bat"
+    else
+      "/opt/sensu/embedded/bin/gem"
+    end
 
   def uninstall
     command = [command(:gemcmd), "uninstall"]
diff --git a/lib/puppet/provider/sensu_api_config/json.rb b/lib/puppet/provider/sensu_api_config/json.rb
index f04f9de65c..c280f20107 100644
--- a/lib/puppet/provider/sensu_api_config/json.rb
+++ b/lib/puppet/provider/sensu_api_config/json.rb
@@ -71,7 +71,7 @@ def port
   end
 
   def config_file
-    "#{resource[:base_path]}/api.json"
+    File.join(resource[:base_path], 'api.json').gsub(File::SEPARATOR, File::ALT_SEPARATOR || File::SEPARATOR)
   end
 
   # Public: Set the port that the API should listen on.
diff --git a/lib/puppet/provider/sensu_client_config/json.rb b/lib/puppet/provider/sensu_client_config/json.rb
index 467be4017f..d2605dd413 100644
--- a/lib/puppet/provider/sensu_client_config/json.rb
+++ b/lib/puppet/provider/sensu_client_config/json.rb
@@ -25,7 +25,7 @@ def flush
   end
 
   def config_file
-    "#{resource[:base_path]}/client.json"
+    File.join(resource[:base_path], 'client.json').gsub(File::SEPARATOR, File::ALT_SEPARATOR || File::SEPARATOR)
   end
 
   def pre_create
diff --git a/lib/puppet/provider/sensu_rabbitmq_config/json.rb b/lib/puppet/provider/sensu_rabbitmq_config/json.rb
index 96e3a8903b..7939e10c5a 100644
--- a/lib/puppet/provider/sensu_rabbitmq_config/json.rb
+++ b/lib/puppet/provider/sensu_rabbitmq_config/json.rb
@@ -94,7 +94,7 @@ def ssl_cert_chain=(value)
   end
 
   def config_file
-    "#{resource[:base_path]}/rabbitmq.json"
+    File.join(resource[:base_path],'rabbitmq.json').gsub(File::SEPARATOR, File::ALT_SEPARATOR || File::SEPARATOR)
   end
 
   def port
diff --git a/lib/puppet/provider/sensu_redis_config/json.rb b/lib/puppet/provider/sensu_redis_config/json.rb
index 5901c60e98..ab09f64bfb 100644
--- a/lib/puppet/provider/sensu_redis_config/json.rb
+++ b/lib/puppet/provider/sensu_redis_config/json.rb
@@ -26,7 +26,7 @@ def pre_create
   end
 
   def config_file
-    "#{resource[:base_path]}/redis.json"
+    File.join(resource[:base_path], 'redis.json').gsub(File::SEPARATOR, File::ALT_SEPARATOR || File::SEPARATOR)
   end
 
   def destroy
diff --git a/manifests/api/config.pp b/manifests/api/config.pp
index d9d7cc52bc..80dc4adea6 100644
--- a/manifests/api/config.pp
+++ b/manifests/api/config.pp
@@ -14,20 +14,21 @@
     $ensure = 'present'
   }
 
-  file { '/etc/sensu/conf.d/api.json':
+  file { "${sensu::etc_dir}/conf.d/api.json":
     ensure => $ensure,
-    owner  => 'sensu',
-    group  => 'sensu',
-    mode   => '0440',
+    owner  => $sensu::user,
+    group  => $sensu::group,
+    mode   => $sensu::file_mode,
   }
 
   sensu_api_config { $::fqdn:
-    ensure   => $ensure,
-    bind     => $sensu::api_bind,
-    host     => $sensu::api_host,
-    port     => $sensu::api_port,
-    user     => $sensu::api_user,
-    password => $sensu::api_password,
+    ensure    => $ensure,
+    base_path => "${sensu::etc_dir}/conf.d",
+    bind      => $sensu::api_bind,
+    host      => $sensu::api_host,
+    port      => $sensu::api_port,
+    user      => $sensu::api_user,
+    password  => $sensu::api_password,
   }
 
 }
diff --git a/manifests/api/service.pp b/manifests/api/service.pp
index 687a9a443a..780c93d58f 100644
--- a/manifests/api/service.pp
+++ b/manifests/api/service.pp
@@ -31,11 +31,13 @@
       }
     }
 
-    service { 'sensu-api':
-      ensure     => $ensure,
-      enable     => $enable,
-      hasrestart => $hasrestart,
-      subscribe  => [ Class['sensu::package'], Class['sensu::api::config'], Class['sensu::redis::config'] ],
+    if $::osfamily != 'windows' {
+      service { 'sensu-api':
+        ensure     => $ensure,
+        enable     => $enable,
+        hasrestart => $hasrestart,
+        subscribe  => [ Class['sensu::package'], Class['sensu::api::config'], Class['sensu::redis::config'] ],
+      }
     }
   }
 }
diff --git a/manifests/check.pp b/manifests/check.pp
index e3e3f509d4..bbff46ec0c 100644
--- a/manifests/check.pp
+++ b/manifests/check.pp
@@ -129,16 +129,34 @@
 
   $check_name = regsubst(regsubst($name, ' ', '_', 'G'), '[\(\)]', '', 'G')
 
-  file { "/etc/sensu/conf.d/checks/${check_name}.json":
+  case $::osfamily {
+    'windows': {
+      $etc_dir = 'C:/opt/sensu'
+      $conf_dir = "${etc_dir}/conf.d"
+      $user = undef
+      $group = undef
+      $file_mode = undef
+    }
+    default: {
+      $etc_dir = '/etc/sensu'
+      $conf_dir = "${etc_dir}/conf.d"
+      $user = 'sensu'
+      $group = 'sensu'
+      $file_mode = '0440'
+    }
+  }
+
+  file { "${conf_dir}/checks/${check_name}.json":
     ensure => $ensure,
-    owner  => 'sensu',
-    group  => 'sensu',
-    mode   => '0440',
+    owner  => $user,
+    group  => $group,
+    mode   => $file_mode,
     before => Sensu_check[$check_name],
   }
 
   sensu_check { $check_name:
     ensure              => $ensure,
+    base_path           => "${conf_dir}/checks",
     type                => $type,
     standalone          => $standalone,
     command             => $command,
@@ -157,7 +175,7 @@
     dependencies        => $dependencies,
     custom              => $custom,
     subdue              => $subdue,
-    require             => File['/etc/sensu/conf.d/checks'],
+    require             => File["${conf_dir}/checks"],
     notify              => $::sensu::check_notify,
     ttl                 => $ttl,
   }
diff --git a/manifests/client/config.pp b/manifests/client/config.pp
index b3dfa2d9e3..223ce08f91 100644
--- a/manifests/client/config.pp
+++ b/manifests/client/config.pp
@@ -14,15 +14,16 @@
     $ensure = 'present'
   }
 
-  file { '/etc/sensu/conf.d/client.json':
+  file { "${sensu::conf_dir}/client.json":
     ensure => $ensure,
-    owner  => 'sensu',
-    group  => 'sensu',
-    mode   => '0440',
+    owner  => $sensu::user,
+    group  => $sensu::group,
+    mode   => $sensu::file_mode,
   }
 
   sensu_client_config { $::fqdn:
     ensure        => $ensure,
+    base_path     => $sensu::conf_dir,
     client_name   => $sensu::client_name,
     address       => $sensu::client_address,
     socket        => {
diff --git a/manifests/client/service.pp b/manifests/client/service.pp
index f8bfb43aae..3130c76162 100644
--- a/manifests/client/service.pp
+++ b/manifests/client/service.pp
@@ -31,6 +31,28 @@
       }
     }
 
+    if $::osfamily == 'windows' {
+
+      file { 'C:/opt/sensu/bin/sensu-client.xml':
+        ensure  => present,
+        content => template("${module_name}/sensu-client.erb"),
+      }
+
+      $startup_type = $::os_maj_version ? {
+        '2003'  => 'Automatic',
+        default => 'Delayed-Auto',
+      }
+
+      exec { 'install-sensu-client':
+        command => "powershell.exe -ExecutionPolicy RemoteSigned -Command \"New-Service -Name sensu-client -BinaryPathName c:\\opt\\sensu\\bin\\sensu-client.exe -DisplayName 'Sensu Client' -StartupType ${startup_type}\"",
+        unless  => 'powershell.exe -ExecutionPolicy RemoteSigned -Command "Get-Service sensu-client"',
+        path    => $::path,
+        before  => Service['sensu-client'],
+        require => File['C:/opt/sensu/bin/sensu-client.xml'],
+      }
+
+    }
+
     service { 'sensu-client':
       ensure     => $ensure,
       enable     => $enable,
diff --git a/manifests/init.pp b/manifests/init.pp
index 774b656515..fbe37dd725 100644
--- a/manifests/init.pp
+++ b/manifests/init.pp
@@ -439,6 +439,26 @@
   create_resources('::sensu::handler', $handlers)
   create_resources('::sensu::check', $checks)
 
+  case $::osfamily {
+    'Debian','RedHat': {
+      $etc_dir = '/etc/sensu'
+      $conf_dir = "${etc_dir}/conf.d"
+      $user = 'sensu'
+      $group = 'sensu'
+      $dir_mode = '0555'
+      $file_mode = '0440'
+    }
+
+    'windows': {
+      $etc_dir = 'C:/opt/sensu'
+      $conf_dir = "${etc_dir}/conf.d"
+      $user = undef
+      $group = undef
+      $dir_mode = undef
+      $file_mode = undef
+    }
+  }
+
   # Include everything and let each module determine its state.  This allows
   # transitioning to purged config and stopping/disabling services
   anchor { 'sensu::begin': } ->
diff --git a/manifests/package.pp b/manifests/package.pp
index 16436b96f0..fea5656890 100644
--- a/manifests/package.pp
+++ b/manifests/package.pp
@@ -11,6 +11,10 @@
   case $::osfamily {
 
     'Debian': {
+      $pkg_title = 'sensu'
+      $pkg_name = 'sensu'
+      $pkg_source = undef
+
       class { '::sensu::repo::apt': }
       if $sensu::install_repo {
         include ::apt
@@ -22,17 +26,41 @@
     }
 
     'RedHat': {
+      $pkg_title = 'sensu'
+      $pkg_name = 'sensu'
+      $pkg_source = undef
+
       class { '::sensu::repo::yum': }
 
       $pkg_require = undef
     }
 
+    'windows': {
+      $repo_require = undef
+
+      $pkg_version = inline_template("<%= scope.lookupvar('sensu::version').sub(/(.*)\\./, '\\1-') %>")
+      $pkg_title = 'sensu'
+      $pkg_name = 'Sensu'
+      $pkg_source = "C:\\Windows\\Temp\\sensu-${pkg_version}.msi"
+      $pkg_require = "Archive[${pkg_source}]"
+
+      archive { $pkg_source:
+        ensure   => present,
+        provider => faraday,
+        source   => "http://repos.sensuapp.org/msi/sensu-${pkg_version}.msi",
+        creates  => $pkg_source,
+        cleanup  => false,
+      }
+    }
+
     default: { fail("${::osfamily} not supported yet") }
 
   }
 
-  package { 'sensu':
+  package { $pkg_title:
     ensure  => $sensu::version,
+    name    => $pkg_name,
+    source  => $pkg_source,
     require => $pkg_require,
   }
 
@@ -58,73 +86,75 @@
     }
   }
 
-  file { '/etc/default/sensu':
-    ensure  => file,
-    content => template("${module_name}/sensu.erb"),
-    owner   => '0',
-    group   => '0',
-    mode    => '0444',
-    require => Package['sensu'],
+  if $::osfamily != 'windows' {
+    file { '/etc/default/sensu':
+      ensure  => file,
+      content => template("${module_name}/sensu.erb"),
+      owner   => '0',
+      group   => '0',
+      mode    => '0444',
+      require => Package['sensu'],
+    }
   }
 
-  file { [ '/etc/sensu/conf.d', '/etc/sensu/conf.d/handlers', '/etc/sensu/conf.d/checks', '/etc/sensu/conf.d/filters', '/etc/sensu/conf.d/extensions', '/etc/sensu/conf.d/mutators' ]:
+  file { [ $sensu::conf_dir, "${sensu::conf_dir}/handlers", "${sensu::conf_dir}/checks", "${sensu::conf_dir}/filters", "${sensu::conf_dir}/extensions", "${sensu::conf_dir}/mutators" ]:
     ensure  => directory,
-    owner   => 'sensu',
-    group   => 'sensu',
-    mode    => '0555',
+    owner   => $sensu::user,
+    group   => $sensu::group,
+    mode    => $sensu::dir_mode,
     purge   => $sensu::_purge_config,
     recurse => true,
     force   => true,
-    require => Package['sensu'],
+    require => Package[$pkg_name],
   }
 
   if $sensu::manage_handlers_dir {
-    file { '/etc/sensu/handlers':
+    file { "${sensu::etc_dir}/handlers":
       ensure  => directory,
-      mode    => '0555',
-      owner   => 'sensu',
-      group   => 'sensu',
+      mode    => $sensu::dir_mode,
+      owner   => $sensu::user,
+      group   => $sensu::group,
       purge   => $sensu::_purge_handlers,
       recurse => true,
       force   => true,
-      require => Package['sensu'],
+      require => Package[$pkg_name],
     }
   }
 
-  file { ['/etc/sensu/extensions', '/etc/sensu/extensions/handlers']:
+  file { ["${sensu::etc_dir}/extensions", "${sensu::etc_dir}/extensions/handlers"]:
     ensure  => directory,
-    mode    => '0555',
-    owner   => 'sensu',
-    group   => 'sensu',
+    mode    => $sensu::dir_mode,
+    owner   => $sensu::user,
+    group   => $sensu::group,
     purge   => $sensu::_purge_extensions,
     recurse => true,
     force   => true,
-    require => Package['sensu'],
+    require => Package[$pkg_name],
   }
 
   if $sensu::manage_mutators_dir {
-    file { '/etc/sensu/mutators':
+    file { "${sensu::etc_dir}/mutators":
       ensure  => directory,
-      mode    => '0555',
-      owner   => 'sensu',
-      group   => 'sensu',
+      mode    => $sensu::dir_mode,
+      owner   => $sensu::user,
+      group   => $sensu::group,
       purge   => $sensu::_purge_mutators,
       recurse => true,
       force   => true,
-      require => Package['sensu'],
+      require => Package[$pkg_name],
     }
   }
 
   if $sensu::_manage_plugins_dir {
-    file { '/etc/sensu/plugins':
+    file { "${sensu::etc_dir}/plugins":
       ensure  => directory,
-      mode    => '0555',
-      owner   => 'sensu',
-      group   => 'sensu',
+      mode    => $sensu::dir_mode,
+      owner   => $sensu::user,
+      group   => $sensu::group,
       purge   => $sensu::_purge_plugins,
       recurse => true,
       force   => true,
-      require => Package['sensu'],
+      require => Package[$pkg_name],
     }
   }
 
@@ -143,5 +173,5 @@
     }
   }
 
-  file { '/etc/sensu/config.json': ensure => absent }
+  file { "${sensu::etc_dir}/config.json": ensure => absent }
 }
diff --git a/manifests/rabbitmq/config.pp b/manifests/rabbitmq/config.pp
index ac46c4855a..db137a44bf 100644
--- a/manifests/rabbitmq/config.pp
+++ b/manifests/rabbitmq/config.pp
@@ -14,11 +14,13 @@
     $ensure = 'present'
   }
 
+  $ssl_dir = "${sensu::etc_dir}/ssl"
+
   if $sensu::rabbitmq_ssl_cert_chain or $sensu::rabbitmq_ssl_private_key {
-    file { '/etc/sensu/ssl':
+    file { $ssl_dir:
       ensure  => directory,
-      owner   => 'sensu',
-      group   => 'sensu',
+      owner   => $sensu::user,
+      group   => $sensu::group,
       mode    => '0755',
       require => Package['sensu'],
     }
@@ -26,13 +28,13 @@
     # if provided a cert chain, and its a puppet:// URI, source file form the
     # the URI provided
     if $sensu::rabbitmq_ssl_cert_chain and $sensu::rabbitmq_ssl_cert_chain =~ /^puppet:\/\// {
-      file { '/etc/sensu/ssl/cert.pem':
+      file { "${ssl_dir}/cert.pem":
         ensure  => file,
         source  => $sensu::rabbitmq_ssl_cert_chain,
-        owner   => 'sensu',
-        group   => 'sensu',
-        mode    => '0444',
-        require => File['/etc/sensu/ssl'],
+        owner   => $sensu::user,
+        group   => $sensu::group,
+        mode    => $sensu::file_mode,
+        require => File[$ssl_dir],
         before  => Sensu_rabbitmq_config[$::fqdn],
       }
 
@@ -40,13 +42,13 @@
     # else provided a cert chain, and the variable actually contains the cert,
     # create the file with conents of the variable
     } elsif $sensu::rabbitmq_ssl_cert_chain and  $sensu::rabbitmq_ssl_cert_chain =~ /BEGIN CERTIFICATE/ {
-      file { '/etc/sensu/ssl/cert.pem':
+      file { "${ssl_dir}/cert.pem":
         ensure  => file,
         content => $sensu::rabbitmq_ssl_cert_chain,
-        owner   => 'sensu',
-        group   => 'sensu',
-        mode    => '0444',
-        require => File['/etc/sensu/ssl'],
+        owner   => $sensu::user,
+        group   => $sensu::group,
+        mode    => $sensu::file_mode,
+        require => File[$ssl_dir],
         before  => Sensu_rabbitmq_config[$::fqdn],
       }
 
@@ -60,13 +62,13 @@
     # if provided private key, and its a puppet:// URI, source file from the
     # URI provided
     if $sensu::rabbitmq_ssl_private_key and $sensu::rabbitmq_ssl_private_key =~ /^puppet:\/\// {
-      file { '/etc/sensu/ssl/key.pem':
+      file { "${ssl_dir}/key.pem":
         ensure  => file,
         source  => $sensu::rabbitmq_ssl_private_key,
-        owner   => 'sensu',
-        group   => 'sensu',
-        mode    => '0440',
-        require => File['/etc/sensu/ssl'],
+        owner   => $sensu::user,
+        group   => $sensu::group,
+        mode    => $sensu::file_mode,
+        require => File[$ssl_dir],
         before  => Sensu_rabbitmq_config[$::fqdn],
       }
 
@@ -74,13 +76,13 @@
     # else provided private key, and the variable actually contains the key,
     # create file with contents of the variable
     } elsif $sensu::rabbitmq_ssl_private_key and $sensu::rabbitmq_ssl_private_key =~ /BEGIN RSA PRIVATE KEY/ {
-      file { '/etc/sensu/ssl/key.pem':
+      file { "${ssl_dir}/key.pem":
         ensure  => file,
         content => $sensu::rabbitmq_ssl_private_key,
-        owner   => 'sensu',
-        group   => 'sensu',
-        mode    => '0440',
-        require => File['/etc/sensu/ssl'],
+        owner   => $sensu::user,
+        group   => $sensu::group,
+        mode    => $sensu::file_mode,
+        require => File[$ssl_dir],
         before  => Sensu_rabbitmq_config[$::fqdn],
       }
 
@@ -98,11 +100,11 @@
     $enable_ssl = $sensu::rabbitmq_ssl
   }
 
-  file { '/etc/sensu/conf.d/rabbitmq.json':
+  file { "${sensu::conf_dir}/rabbitmq.json":
     ensure => $ensure,
-    owner  => 'sensu',
-    group  => 'sensu',
-    mode   => '0440',
+    owner  => $sensu::user,
+    group  => $sensu::group,
+    mode   => $sensu::file_mode,
     before => Sensu_rabbitmq_config[$::fqdn],
   }
 
diff --git a/manifests/redis/config.pp b/manifests/redis/config.pp
index bfc9dc7292..ab7c40614b 100644
--- a/manifests/redis/config.pp
+++ b/manifests/redis/config.pp
@@ -15,16 +15,17 @@
   }
 
   # redis configuration may contain "secrets"
-  file { '/etc/sensu/conf.d/redis.json':
+  file { "${sensu::etc_dir}/conf.d/redis.json":
     ensure => $ensure,
-    owner  => 'sensu',
-    group  => 'sensu',
-    mode   => '0440',
+    owner  => $sensu::user,
+    group  => $sensu::group,
+    mode   => $sensu::file_mode,
     before => Sensu_redis_config[$::fqdn],
   }
 
   sensu_redis_config { $::fqdn:
     ensure             => $ensure,
+    base_path          => "${sensu::etc_dir}/conf.d",
     host               => $sensu::redis_host,
     port               => $sensu::redis_port,
     password           => $sensu::redis_password,
diff --git a/manifests/server/service.pp b/manifests/server/service.pp
index 6dd5c3cbaa..9e6bfdcc93 100644
--- a/manifests/server/service.pp
+++ b/manifests/server/service.pp
@@ -31,11 +31,13 @@
       }
     }
 
-    service { 'sensu-server':
-      ensure     => $ensure,
-      enable     => $enable,
-      hasrestart => $hasrestart,
-      subscribe  => [ Class['sensu::package'], Class['sensu::api::config'], Class['sensu::redis::config'], Class['sensu::rabbitmq::config'] ],
+    if $::osfamily != 'windows' {
+      service { 'sensu-server':
+        ensure     => $ensure,
+        enable     => $enable,
+        hasrestart => $hasrestart,
+        subscribe  => [ Class['sensu::package'], Class['sensu::api::config'], Class['sensu::redis::config'], Class['sensu::rabbitmq::config'] ],
+      }
     }
   }
 }
diff --git a/templates/sensu-client.erb b/templates/sensu-client.erb
new file mode 100644
index 0000000000..09d2a89201
--- /dev/null
+++ b/templates/sensu-client.erb
@@ -0,0 +1,8 @@
+<!-- Windows service definition for Sensu -->
+<service>
+  <id>sensu-client</id>
+  <name>Sensu Client</name>
+  <description>This service runs a Sensu Client</description>
+  <executable>C:\opt\sensu\embedded\bin\ruby</executable>
+  <arguments>C:\opt\sensu\embedded\bin\sensu-client -l C:\opt\sensu\sensu-client.log -d C:\opt\sensu\conf.d</arguments>
+</service>

From 1f6997d654780bfb24f6a29deae0711422c86e67 Mon Sep 17 00:00:00 2001
From: liamjbennett <lbennett@opentable.com>
Date: Fri, 20 Nov 2015 15:29:59 +0000
Subject: [PATCH 2/2] Refactoring to use remote_file rather the wget for url
 downloads.

We want to use remote_file because wget support on windows isn't great
and remote_file is ruby so supports multiple platforms better.
---
 .fixtures.yml                     |  3 +--
 README.md                         |  3 +--
 manifests/client/service.pp       |  7 +-----
 manifests/package.pp              | 10 ++++----
 manifests/plugin.pp               | 14 +++++++-----
 metadata.json                     |  2 +-
 spec/defines/sensu_plugin_spec.rb | 38 ++++++++++---------------------
 7 files changed, 28 insertions(+), 49 deletions(-)

diff --git a/.fixtures.yml b/.fixtures.yml
index c6f6b24266..bc7e0eb15f 100644
--- a/.fixtures.yml
+++ b/.fixtures.yml
@@ -2,7 +2,6 @@ fixtures:
   repositories:
     apt: git://github.com/puppetlabs/puppetlabs-apt.git
     stdlib: git://github.com/puppetlabs/puppetlabs-stdlib.git
-    wget: git://github.com/maestrodev/puppet-wget.git
+    remote_file: git://github.com/lwf/puppet-remote_file.git
   symlinks:
     sensu: "#{source_dir}"
-
diff --git a/README.md b/README.md
index e6837108d8..6378e843c3 100644
--- a/README.md
+++ b/README.md
@@ -35,7 +35,7 @@ Sensu-Puppet module.
 
 - puppetlabs/apt
 - puppetlabs/stdlib
-- maestrodev/wget
+- lwf/puppet-remote_file
 
 See `metadata.json` for details.
 
@@ -446,4 +446,3 @@ The following puppet modules exist for managing dashboards
 ## License
 
 See LICENSE file.
-
diff --git a/manifests/client/service.pp b/manifests/client/service.pp
index 3130c76162..22c909aad4 100644
--- a/manifests/client/service.pp
+++ b/manifests/client/service.pp
@@ -38,13 +38,8 @@
         content => template("${module_name}/sensu-client.erb"),
       }
 
-      $startup_type = $::os_maj_version ? {
-        '2003'  => 'Automatic',
-        default => 'Delayed-Auto',
-      }
-
       exec { 'install-sensu-client':
-        command => "powershell.exe -ExecutionPolicy RemoteSigned -Command \"New-Service -Name sensu-client -BinaryPathName c:\\opt\\sensu\\bin\\sensu-client.exe -DisplayName 'Sensu Client' -StartupType ${startup_type}\"",
+        command => "powershell.exe -ExecutionPolicy RemoteSigned -Command \"New-Service -Name sensu-client -BinaryPathName c:\\opt\\sensu\\bin\\sensu-client.exe -DisplayName 'Sensu Client' -StartupType Automatic\"",
         unless  => 'powershell.exe -ExecutionPolicy RemoteSigned -Command "Get-Service sensu-client"',
         path    => $::path,
         before  => Service['sensu-client'],
diff --git a/manifests/package.pp b/manifests/package.pp
index fea5656890..1ab8037ef6 100644
--- a/manifests/package.pp
+++ b/manifests/package.pp
@@ -42,14 +42,12 @@
       $pkg_title = 'sensu'
       $pkg_name = 'Sensu'
       $pkg_source = "C:\\Windows\\Temp\\sensu-${pkg_version}.msi"
-      $pkg_require = "Archive[${pkg_source}]"
+      $pkg_require = "Remote_file[${pkg_source}]"
 
-      archive { $pkg_source:
+      remote_file { $pkg_source:
         ensure   => present,
-        provider => faraday,
-        source   => "http://repos.sensuapp.org/msi/sensu-${pkg_version}.msi",
-        creates  => $pkg_source,
-        cleanup  => false,
+        source   => "http://repositories.sensuapp.org/msi/sensu-${pkg_version}.msi",
+        checksum => $::sensu::package_checksum,
       }
     }
 
diff --git a/manifests/plugin.pp b/manifests/plugin.pp
index cea4a4d083..5b7d793d94 100644
--- a/manifests/plugin.pp
+++ b/manifests/plugin.pp
@@ -50,6 +50,7 @@
   $force              = true,
   $pkg_version        = 'latest',
   $pkg_provider       = $::sensu::sensu_plugin_provider,
+  $pkg_checksum       = undef,
   $nocheckcertificate = false,
 ){
 
@@ -93,12 +94,13 @@
           force   => $force,
         }
 
-        wget::fetch { $name:
-          destination        => "${install_path}/${filename}",
-          timeout            => 0,
-          verbose            => false,
-          nocheckcertificate => $nocheckcertificate,
-          require            => File[$install_path],
+        validate_string($pkg_checksum)
+
+        remote_file { $name:
+          ensure   => present,
+          path     => "${install_path}/${filename}",
+          checksum => $pkg_checksum,
+          require  => File[$install_path],
         } ->
         file { "${install_path}/${filename}":
           ensure  => file,
diff --git a/metadata.json b/metadata.json
index ef3507fc20..d0d390ef48 100644
--- a/metadata.json
+++ b/metadata.json
@@ -18,7 +18,7 @@
     { "name": "pe", "version_requirement": ">=3.7.0 < 2015.3.0" }
   ],
   "dependencies": [
-    { "name": "maestrodev/wget", "version_requirement": ">= 1.4.5 <2.0.0" },
+    { "name": "lwf/remote_file", "version_requirement": ">= 1.0.0 <2.0.0" },
     { "name": "puppetlabs/apt", "version_requirement": ">= 2.0.0 <3.0.0" },
     { "name": "puppetlabs/stdlib", "version_requirement": ">=3.2.0 <5.0.0" }
   ]
diff --git a/spec/defines/sensu_plugin_spec.rb b/spec/defines/sensu_plugin_spec.rb
index b7491b1a19..10c80f65fb 100644
--- a/spec/defines/sensu_plugin_spec.rb
+++ b/spec/defines/sensu_plugin_spec.rb
@@ -31,14 +31,14 @@
 
     context 'defaults' do
       let(:params) { {
-        :type => 'url',
+        :type         => 'url',
+        :pkg_checksum => '1d58b78e9785f893889458f8e9fe8627'
       } }
 
-      it { should contain_wget__fetch('https://raw.githubusercontent.com/sensu/sensu-community-plugins/master/plugins/system/check-mem.sh').with(
-        :destination        => '/etc/sensu/plugins/check-mem.sh',
-        :verbose            => false,
-        :timeout            => 0,
-        :nocheckcertificate => false
+      it { should contain_remote_file('https://raw.githubusercontent.com/sensu/sensu-community-plugins/master/plugins/system/check-mem.sh').with(
+        :ensure   => 'present',
+        :path     => '/etc/sensu/plugins/check-mem.sh',
+        :checksum => '1d58b78e9785f893889458f8e9fe8627'
       ) }
 
     end
@@ -46,28 +46,14 @@
     context 'setting params' do
       let(:params) { {
         :type         => 'url',
-        :install_path => '/var/sensu/plugins'
-      } }
-
-      it { should contain_wget__fetch('https://raw.githubusercontent.com/sensu/sensu-community-plugins/master/plugins/system/check-mem.sh').with(
-        'destination' => '/var/sensu/plugins/check-mem.sh',
-        'verbose'     => 'false',
-        'timeout'     => '0'
-      ) }
-
-    end
-
-    context 'nocheckcertificate' do
-      let(:params) { {
-        :type               => 'url',
-        :nocheckcertificate => true,
+        :install_path => '/var/sensu/plugins',
+        :pkg_checksum => '1d58b78e9785f893889458f8e9fe8627'
       } }
 
-      it { should contain_wget__fetch('https://raw.githubusercontent.com/sensu/sensu-community-plugins/master/plugins/system/check-mem.sh').with(
-        'destination'        => '/etc/sensu/plugins/check-mem.sh',
-        'verbose'            => 'false',
-        'timeout'            => '0',
-        'nocheckcertificate' => 'true'
+      it { should contain_remote_file('https://raw.githubusercontent.com/sensu/sensu-community-plugins/master/plugins/system/check-mem.sh').with(
+        :ensure   => 'present',
+        :path     => '/var/sensu/plugins/check-mem.sh',
+        :checksum => '1d58b78e9785f893889458f8e9fe8627'
       ) }
 
     end