Hi,

I'm very new to Ruby, and pretty new to Puppet so apologies if this is a 
bit Puppet custom type development 101.

We currently have a whole bunch of Windows services that are written in 
.Net.  They are really simple and so we don't bother creating MSI installs 
for them and just use InstallUtil.exe called from a script.
I'm looking at creating a simple Puppet type and provider that will allow 
me to install the service (via InstallUtil) if it doesn't already exist (as 
opposed to using an exec resource in which it is hard to determine if the 
service exists as a conditional).

Now, there are many different flavours of .Net in use, and some are 32bit, 
some 64 bit.  This means that I need to be able to specify what version of 
installutil.exe to use.
Currently the type has a bunch of parameters (not properties) to specify 
this.  E.g.
dotnetwinservice {'MyService':
    ensure        => present,
    dotnetversion => '4.0.30319',
    sixtyfourbit  => false,
    path          => 'c:\program files(x86)\myapp\myapp.exe',
}

My question is, in the provider code what is the best way to dynamically 
determine the installutil path?  All of the examples i can find setting a 
command are not dynamic (i.e. the full command path is known without 
looking at parameter values).

My provider code looks like the below...
The INSTALLUTIL value is currently hard coded. I'd like to do something 
like the commented out code but it doesn't appear as though either 
@property_hash or @resource have values at the time of execution (I get 
undefined method [] for nil:nilClass error).

Puppet::Type.type(:dotnetwinservice).provide(:dotnetwinservice) do
    desc "DotNet Windows Service"

  confine     :operatingsystem => :windows
  defaultfor  :operatingsystem => :windows

  #dotnetframeworkversion = @resource[:sixtyfourbit] ? 'Framework64' : 
'Framework'
  #installutilpath = 
"#{ENV['SYSTEMROOT']}\\Microsoft.NET\\Framework\\#{@resource[:dotnetversion]}\\InstallUtil.exe"

  #INSTALLUTIL = 
  #  if File.exists?(installutilpath)
  #    installutilpath
  #  else
  #    raise Puppet::Error.new("Cannot find installutil.exe for 
dotnetversion #{@property_hash[:dotnetversion]} at #{installutilpath} " )
  #  end
  
  INSTALLUTIL = 
"#{ENV['SYSTEMROOT']}\\Microsoft.NET\\Framework\\v4.0.30319\\InstallUtil.exe"
  
  commands :installutil => INSTALLUTIL

  
  def create
      installutil("/unattended", @resource[:path])
  end

  def destroy
      installutil("/u", "/unattended", @resource[:path])
  end

  def exists?
      Win32::Service.exists?( @resource[:name] )
  end

end

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to puppet-users+unsubscr...@googlegroups.com.
To post to this group, send email to puppet-users@googlegroups.com.
Visit this group at http://groups.google.com/group/puppet-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to