├── README.markdown └── lib └── puppet └── provider └── package └── homebrew.rb /README.markdown: -------------------------------------------------------------------------------- 1 | This module implements a package provider for the mac homebrew packaging system. 2 | 3 | It assumes the brew command is installed in `/usr/local/bin/brew` 4 | 5 | Example usage: 6 | 7 | ``` 8 | package { "rsync": 9 | ensure => installed, 10 | provider => homebrew 11 | } 12 | 13 | package { "git": 14 | ensure => latest, 15 | provider => homebrew 16 | } 17 | 18 | package { "vim": 19 | ensure => latest, 20 | provider => homebrew, 21 | install_options = ["--override-system-vi"] 22 | } 23 | ``` 24 | -------------------------------------------------------------------------------- /lib/puppet/provider/package/homebrew.rb: -------------------------------------------------------------------------------- 1 | ################################################################################# 2 | # Description: This file provides a puppet package provider for homebrew on Mac 3 | # Author: Patrick.Debois@jedi.be 4 | # URL: http://jedi.be/blog 5 | ################################################################################# 6 | 7 | # Information on how to embed a provider in a module : lib/puppet/provider/package/homebrew.rb 8 | # http://blkperl.blogspot.com/2010/07/provider-errors.html 9 | 10 | require 'puppet/provider/package' 11 | 12 | Puppet::Type.type(:package).provide :homebrew, :parent => Puppet::Provider::Package do 13 | desc "Package management using homebrew on OS X." 14 | 15 | has_feature :install_options 16 | 17 | confine :operatingsystem => :darwin 18 | if Puppet::Util::Package.versioncmp(Puppet.version, '3.0') >= 0 19 | has_command(:brewcmd, "/usr/local/bin/brew") do 20 | environment({ 'HOME' => ENV['HOME'] }) 21 | end 22 | else 23 | commands :brewcmd => "/usr/local/bin/brew" 24 | end 25 | 26 | def self.brewlist(hash) 27 | command = [command(:brewcmd), "list","--versions"] 28 | 29 | if name = hash[:justme] 30 | command << name 31 | end 32 | 33 | begin 34 | list = execute(command, :custom_environment => {'HOME'=>ENV['HOME']}).split("\n").collect do |set| 35 | if brewhash = brewsplit(set) 36 | brewhash[:provider] = :brew 37 | brewhash 38 | else 39 | nil 40 | end 41 | end.compact 42 | rescue Puppet::ExecutionFailure => detail 43 | raise Puppet::Error, "Could not list brews: #{detail}" 44 | end 45 | 46 | if hash[:justme] 47 | return list.shift 48 | else 49 | return list 50 | end 51 | 52 | end 53 | 54 | def install_options 55 | Array(resource[:install_options]).flatten.compact 56 | end 57 | 58 | def self.brewsplit(desc) 59 | split_desc=desc.split(/ /) 60 | name=split_desc[0] 61 | version=split_desc[split_desc.size-1] 62 | if (name.nil? || version.nil?) 63 | Puppet.warning "Could not match #{desc}" 64 | nil 65 | else 66 | return { 67 | :name => name, 68 | :ensure => version 69 | } 70 | end 71 | end 72 | 73 | def self.instances 74 | brewlist(:local => true).collect do |hash| 75 | new(hash) 76 | end 77 | end 78 | 79 | def install 80 | should = @resource.should(:ensure) 81 | 82 | if install_options.any? 83 | output = brewcmd "install", @resource[:name], *install_options 84 | else 85 | output = brewcmd "install", @resource[:name] 86 | end 87 | 88 | if output =~ /^Error: No available formula/ 89 | raise Puppet::ExecutionFailure, "Could not find package #{@resource[:name]}" 90 | end 91 | end 92 | 93 | def query 94 | version = nil 95 | self.class.brewlist(:justme => resource[:name]) 96 | end 97 | 98 | def latest 99 | info = brewcmd :info, "#{@resource[:name]}" 100 | 101 | if $CHILD_STATUS != 0 or info =~ /^Error/ 102 | return nil 103 | end 104 | version=info.split("\n")[0].split(" ")[1] 105 | version 106 | end 107 | 108 | def uninstall 109 | brewcmd :remove,"--force", @resource[:name] 110 | end 111 | 112 | def update 113 | #when you reinstall you get the latest version 114 | install 115 | end 116 | end 117 | 118 | --------------------------------------------------------------------------------