{"record":{"id":"84e7ae9991f56ce3","repo":"puppetlabs/puppet","slug":"the-pkg-get-command-is-missing-blastwave-packagin","errorCode":null,"errorMessage":"The pkg-get command is missing; blastwave packaging unavailable","messagePattern":"The pkg-get command is missing; blastwave packaging unavailable","errorType":"exception","errorClass":"Puppet::Error","httpStatus":null,"severity":"error","filePath":"lib/puppet/provider/package/blastwave.rb","lineNumber":19,"sourceCode":"# frozen_string_literal: true\n\n# Packaging using Blastwave's pkg-get program.\nPuppet::Type.type(:package).provide :blastwave, :parent => :sun, :source => :sun do\n  desc \"Package management using Blastwave.org's `pkg-get` command on Solaris.\"\n  pkgget = \"pkg-get\"\n  pkgget = \"/opt/csw/bin/pkg-get\" if FileTest.executable?(\"/opt/csw/bin/pkg-get\")\n\n  confine 'os.family' => :solaris\n\n  commands :pkgget => pkgget\n\n  def pkgget_with_cat(*args)\n    Puppet::Util.withenv(:PAGER => \"/usr/bin/cat\") { pkgget(*args) }\n  end\n\n  def self.extended(mod)\n    unless command(:pkgget) != \"pkg-get\"\n      raise Puppet::Error,\n            _(\"The pkg-get command is missing; blastwave packaging unavailable\")\n    end\n\n    unless Puppet::FileSystem.exist?(\"/var/pkg-get/admin\")\n      Puppet.notice _(\"It is highly recommended you create '/var/pkg-get/admin'.\")\n      Puppet.notice _(\"See /var/pkg-get/admin-fullauto\")\n    end\n  end\n\n  def self.instances(hash = {})\n    blastlist(hash).collect do |bhash|\n      bhash.delete(:avail)\n      new(bhash)\n    end\n  end\n\n  # Turn our blastwave listing into a bunch of hashes.\n  def self.blastlist(hash)","sourceCodeStart":1,"sourceCodeEnd":37,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/provider/package/blastwave.rb#L1-L37","documentation":"The blastwave provider's self.extended hook (blastwave.rb:19) raises Puppet::Error when command(:pkgget) still equals the unresolved default 'pkg-get', i.e. /opt/csw/bin/pkg-get was not found executable when the provider was loaded. Blastwave package management is therefore declared unavailable: the provider refuses to operate instead of shelling out to a missing binary.","triggerScenarios":"A package resource with provider => blastwave (or a solaris node where this provider is selected) on a machine without the OpenCSW pkg-get tool installed at /opt/csw/bin/pkg-get; also when the file exists but is not executable.","commonSituations":"New Solaris zones/minimal installs without OpenCSW; migrations off Blastwave (which is long dead) where leftover manifests still reference the provider; permissions/automount problems hiding /opt/csw.","solutions":["Install pkg-get from OpenCSW (`pkgadd -d http://get.opencsw.org/now CSWpkgget`) so /opt/csw/bin/pkg-get exists and is executable.","Better: migrate the resources off blastwave — use the pkgutil (OpenCSW pkgutil) or Sun provider, since Blastwave is unmaintained.","If the provider should never run on these nodes, add confine/`provider =>` selection so blastwave is not chosen."],"exampleFix":"# before\npackage { 'cswtop': ensure => installed, provider => 'blastwave' }\n\n# after\npackage { 'cswtop': ensure => installed, provider => 'pkgutil' }","handlingStrategy":"validation","validationCode":"# gate the provider on the tool being present\nFileTest.executable?('/opt/csw/bin/pkg-get') or raise 'blastwave pkg-get missing; install CSWpkgget or use pkgutil'","typeGuard":null,"tryCatchPattern":"begin\n  Puppet::Type.type(:package).provider(:blastwave)\nrescue Puppet::Error => e\n  raise unless e.message.include?('pkg-get')\n  # provider unusable; fall back to pkgutil for these resources\n  resources.each { |r| r[:provider] = :pkgutil }\nend","preventionTips":["Stop using the blastwave provider on new hosts — prefer pkgutil/OpenCSW.","Bootstrap CSWpkgget in node provisioning before any puppet run that references blastwave packages.","Add executable-file checks for external tools to your pre-flight scripts."],"tags":["puppet","solaris","blastwave","packages","missing-command"],"backgroundTag":"required-command-missing","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}