Looking at the 'host' provider from puppet, it looks like, to use a single
provider, you'll need to both confine it and to use the :operatingsystem
fact to create a case statement inside the provider.
So, yes, you can do what you want but not exactly in the most obvious
fashion.
Something like the following should work (untested):
Puppet::Type.type(:unpack).provide(:zip) do
case Facter.value(:operatingsystem)
when "windows"
...do windows stuff...
when "Solaris"
...do solaris stuff...
else
....do linux stuff....
end
end
Another way of possibly doing this would be to munge the provider name
before calling your provider.
You would use your example #2 above and then use the :operatingsystem fact
to change the provider name. This may be a code smell/horrible practice but
it *should* work (haven't tested this either).
Something like:
newparam(:provider) do
munge do |value|
"#{Facter.value(:operatingsystem)}_#{self[:provider]}"
end
end
If that doesn't work, you might have to hack it into the type initialize
define.
Something like:
def initialize(args)
super
self[:provider] = "#{Facter.value(:operatingsystem)}_#{self[:provider]}"
end
Good luck!
Trevor
On Thu, May 30, 2013 at 6:58 AM, David Campos <[email protected]
> wrote:
> Hello Trevor,
>
> Thanks for the reply. I did knew that I should use confine statement to
> reach that goal but I did not know whether I did need a new provider for
> each OS or if I can share it.
>
> Sample:
>
> File rar-windows.rb
> Puppet::Type.type(:zipfile).provide(:rar, ...)
>
> confine :operatingsystem => :windows
>
> File rar-unix.rb
> Puppet::Type.type(:zipfile).provide(:rar, ...)
>
> confine :operatingsystem => :linux
>
>
> If puppet allows the same provider to be defined twice or more times this
> would work and would be perfect because I could select provider => zip and
> forget about OS.
>
> Sample2
>
> File rar-windows.rb
> Puppet::Type.type(:zipfile).provide(:rar-windows, ...)
>
> confine :operatingsystem => :windows
>
> File rar-unix.rb
> Puppet::Type.type(:zipfile).provide(:rar-unix, ...)
>
> confine :operatingsystem => :linux
>
>
> If the first sample does not work, this would mean that I have to select
> the provider with puppet selectors before sending the parameter into the
> resource.
>
> On Wednesday, May 29, 2013 4:09:04 PM UTC+2, Trevor Vaughan wrote:
>
>> David,
>>
>> You'll need to use confine statements to set the suitability of a
>> particular provider to the OS.
>>
>> See: http://projects.puppetlabs.**com/projects/1/wiki/**
>> Development_Provider_**Development<http://projects.puppetlabs.com/projects/1/wiki/Development_Provider_Development>under
>> 'Suitability'.
>>
>> The new Types and Providers book covers this reasonably well also.
>>
>> Finally, take a look at the 'group' provider in the Puppet core code to
>> see how they go between Windows and other OS's.
>>
>> Good Luck!
>>
>> Trevor
>>
>>
>> On Wed, May 29, 2013 at 5:40 AM, David Campos
>> <[email protected]**>wrote:
>>
>>> Hello all,
>>>
>>> I am developing a few custom providers for some features that I need
>>> into my system (such as dealing with different zipped files or generating
>>> some JSON data based on OS files) and I have hit into a question about "how
>>> to do this for multiple OS?"
>>>
>>> Lets focus into the zipped file provider that should provide a common
>>> method to pack or unpack zipped files (tar, tar.gz, rar, zip or any) backed
>>> on OS tools or native ruby methods. Maybe the ruby approach would be the
>>> most portable one but I will keep that approach aside right now. We end up
>>> with 3 providers for the custom type 'zipfile': zip, rar and tar.
>>>
>>> Those providers may share code but they differ on how to delegate its
>>> functionality to third-party apps (7zip on windows and zip/unzip on linux
>>> as an example). How can I deal with that? Can I clone the provider into
>>> different files such as zip-windows.rb and zip-linux.rb, keep the same
>>> header and use the confine method? Is there any filename -> provider
>>> restriction? Is that the correct approach?
>>>
>>> I have been searching through other core providers like file but I can
>>> not find my answer...
>>>
>>> Thanks
>>>
>>> --
>>> 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...@**googlegroups.com.
>>> To post to this group, send email to [email protected].
>>>
>>> Visit this group at
>>> http://groups.google.com/**group/puppet-users?hl=en<http://groups.google.com/group/puppet-users?hl=en>
>>> .
>>> For more options, visit
>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>
>>> .
>>>
>>>
>>>
>>
>>
>>
>> --
>> Trevor Vaughan
>> Vice President, Onyx Point, Inc
>> (410) 541-6699
>> [email protected]
>>
>>
>> -- This account not approved for unencrypted proprietary information --
>>
> --
> 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 [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/puppet-users?hl=en.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>
--
Trevor Vaughan
Vice President, Onyx Point, Inc
(410) 541-6699
[email protected]
-- This account not approved for unencrypted proprietary information --
--
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/puppet-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.