summaryrefslogtreecommitdiffstats
path: root/lib/puppet/provider/package/sun.rb
blob: 05bbe97265662d19bbe377776bf11262e5fca8b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# Sun packaging.

require 'puppet/provider/package'

Puppet::Type.type(:package).provide :sun, :parent => Puppet::Provider::Package do
  desc "Sun's packaging system.  Requires that you specify the source for
    the packages you're managing."
  commands :pkginfo => "/usr/bin/pkginfo",
    :pkgadd => "/usr/sbin/pkgadd",
    :pkgrm => "/usr/sbin/pkgrm"

  confine :operatingsystem => :solaris

  defaultfor :operatingsystem => :solaris

  def self.instances
    packages = []
    hash = {}
    names = {
      "PKGINST" => :name,
      "NAME" => nil,
      "CATEGORY" => :category,
      "ARCH" => :platform,
      "VERSION" => :ensure,
      "BASEDIR" => :root,
      "HOTLINE" => nil,
      "EMAIL" => nil,
      "VENDOR" => :vendor,
      "DESC" => :description,
      "PSTAMP" => nil,
      "INSTDATE" => nil,
      "STATUS" => nil,
      "FILES" => nil
    }

    cmd = "#{command(:pkginfo)} -l"

    # list out all of the packages
    execpipe(cmd) { |process|
      # we're using the long listing, so each line is a separate
      # piece of information
      process.each { |line|
        case line
        when /^$/
          hash[:provider] = :sun

          packages << new(hash)
          hash = {}
        when /\s*(\w+):\s+(.+)/
          name = $1
          value = $2
          if names.include?(name)
            hash[names[name]] = value unless names[name].nil?
          end
        when /\s+\d+.+/
          # nothing; we're ignoring the FILES info
        end
      }
    }
    packages
  end

  # Get info on a package, optionally specifying a device.
  def info2hash(device = nil)
    names = {
      "PKGINST" => :name,
      "NAME" => nil,
      "CATEGORY" => :category,
      "ARCH" => :platform,
      "VERSION" => :ensure,
      "BASEDIR" => :root,
      "HOTLINE" => nil,
      "EMAIL" => nil,
      "VSTOCK" => nil,
      "VENDOR" => :vendor,
      "DESC" => :description,
      "PSTAMP" => nil,
      "INSTDATE" => nil,
      "STATUS" => nil,
      "FILES" => nil
    }

    hash = {}
    cmd = "#{command(:pkginfo)} -l"
    cmd += " -d #{device}" if device
    cmd += " #{@resource[:name]}"

    begin
      # list out all of the packages
      execpipe(cmd) { |process|
        # we're using the long listing, so each line is a separate
        # piece of information
        process.readlines.each { |line|
          case line
          when /^$/  # ignore
          when /\s*([A-Z]+):\s+(.+)/
            name = $1
            value = $2
            if names.include?(name)
              hash[names[name]] = value unless names[name].nil?
            end
          when /\s+\d+.+/
            # nothing; we're ignoring the FILES info
          end
        }
      }
      return hash
    rescue Puppet::ExecutionFailure => detail
      return {:ensure => :absent} if detail.message =~ /information for "#{Regexp.escape(@resource[:name])}" was not found/
      puts detail.backtrace if Puppet[:trace]
      raise Puppet::Error, "Unable to get information about package #{@resource[:name]} because of: #{detail}"
    end
  end

  def install
    raise Puppet::Error, "Sun packages must specify a package source" unless @resource[:source]
    cmd = []

    cmd << "-a" << @resource[:adminfile] if @resource[:adminfile]

    cmd << "-r" << @resource[:responsefile] if @resource[:responsefile]

    cmd << "-d" << @resource[:source]
    cmd << "-n" << @resource[:name]

    pkgadd cmd
  end

  # Retrieve the version from the current package file.
  def latest
    hash = info2hash(@resource[:source])
    hash[:ensure]
  end

  def query
    info2hash()
  end

  def uninstall
    command  = ["-n"]

    command << "-a" << @resource[:adminfile] if @resource[:adminfile]

    command << @resource[:name]
    pkgrm command
  end

  # Remove the old package, and install the new one.  This will probably
  # often fail.
  def update
    self.uninstall if (@property_hash[:ensure] || info2hash()[:ensure]) != :absent
    self.install
  end
end