title: How to make chef check for RPM package and then install?
body: <p>I am currently using chef to install the RPM JDK package but the problem is that it does it every single time even if the package is already downloaded and installed. I tried finding an option for checking before installing but there wasn't any. Is there a way to get around this such that I can skip packages that are already installed? Debian's package management skips already installed packages by default, but RPM package manager doesn't seem to do that. </p>
  
  <pre><code>[Tue, 23 Oct 2012 10:34:32 -0500] INFO: Processing remote_file[/var/chef/cache/jdk-1.6-u30-linux-amd64.rpm] action create_if_missing (sun_java::default line 18)
  [Tue, 23 Oct 2012 10:34:36 -0500] INFO: Processing package[jdk-1.6-u30-linux-amd64.rpm] action upgrade (sun_java::default line 25)
  [Tue, 23 Oct 2012 10:37:15 -0500] INFO: Processing bash[update-alternatives java] action nothing (sun_java::default line 40)
  </code></pre>
  
  <p>The recipe is show below:</p>
  
  <pre><code>    urlVersion = "1."+node["sun_java"]["version"].sub(/[u]/, "-u")
      node.default["sun_java"]["rpm_url"] = "http://***/#{urlVersion}/jdk-#{urlVersion}-linux-#{node["sun_java"]["arch"]}.rpm"
  
      #Check that we are using the .rpm file because of the recent change
      if File.extname(File.basename(node["sun_java"]["rpm_url"]))!=".rpm"
        raise "You must use the jdk*.rpm file to install the Sun JDK. You can get it from the jdk*-rpm.bin file by running the command './jdk*-rpm.bin -x'"
      end
  
      javaRPM = File.basename(node["sun_java"]["rpm_url"])
  
      remote_file "#{Chef::Config[:file_cache_path]}/#{javaRPM}" do
        action :create_if_missing
        source node["sun_java"]["rpm_url"]
        mode "0755"
        backup false
      end
  
      package javaRPM do
        action :install
        source "#{Chef::Config[:file_cache_path]}/#{javaRPM}"
        options "--nogpgcheck" # sun/oracle doesn't sign their RPMs o_O
        notifies :run, "bash[update-alternatives java]", :immediately
      end
  
      javaHomeFolder = "/usr/java/jdk1.#{node["sun_java"]["version"].sub(/[u]/, ".0_")}"
      jdkFolder = "#{javaHomeFolder}/bin"
      slaveString = ""
  
      node["sun_java"]["update_slaves"].each do |java_bin|
        slaveString = slaveString + "--slave \"/usr/bin/#{java_bin}\" \"#{java_bin}\" \"#{jdkFolder}/#{java_bin}\" "
      end
  
      bash "update-alternatives java" do
        action :nothing
        code &lt;&lt;-EOH
          update-alternatives --install "/usr/bin/java" "java" "#{jdkFolder}/java" 1 #{slaveString}
          update-alternatives --set java #{jdkFolder}/java
        EOH
      end
  
      #Remove old environment then notify new environment to be created
      ruby_block "delete_environement" do
              block do
                  editBashrc = Chef::Util::FileEdit.new("/etc/profile")
                      editBashrc.search_file_delete_line(/^.*#JAVA_HOME environment settings.*$/)
                      editBashrc.search_file_delete_line(/^.*#Auto-generated by Chef Cookbook sun_java.*$/)
                      editBashrc.search_file_delete_line(/^.*export JAVA_HOME=.*$/)
                      editBashrc.write_file 
              end
              action :create
      end
  
      #create environment of root user
      execute "create_environment" do
        user "root"
        command "echo -e '#JAVA_HOME environment settings\n#Auto-generated by Chef Cookbook sun_java\nexport JAVA_HOME=#{javaHomeFolder}' &gt;&gt; /etc/profile"
      end
  </code></pre>