Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Jan 29th, 2010 | Syntax: None | Size: 14.70 KB | Hits: 26 | Expires: Never
Copy text to clipboard
  1. cat repo.rb
  2. # Define the different repository system.  Each repository system is implemented
  3. # in a module, which then gets used to individually extend each repository object.
  4. # This allows repositories to exist on the same machine using different repository
  5. # systems.                                                                        
  6.  
  7. require 'puppet'
  8.  
  9. Puppet::Type.newtype(:repo) do
  10.         @doc = "Manage repositories.
  11.             Puppet will automatically guess the packaging format that you are
  12.             using based on the platform you are on, but you can override it  
  13.             using the ``provider`` parameter; each provider defines what it  
  14.             requires in order to function, and you must meet those requirements
  15.             to use a given provider."                                          
  16.  
  17.         ensurable do
  18.             desc "What state the repository should be in."
  19.  
  20.             attr_accessor :latest
  21.  
  22.             newvalue(:present, :event => :package_installed) do
  23.                 provider.install                              
  24.             end                                                
  25.  
  26.             newvalue(:absent, :event => :package_removed) do
  27.                 provider.uninstall                          
  28.             end                                            
  29.  
  30.             # Alias the 'present' value.
  31.             aliasvalue(:installed, :present)
  32.  
  33.             defaultto :installed
  34.         end                    
  35.  
  36.  
  37.         newparam(:name) do
  38.             desc "The repository name."
  39.             isnamevar                  
  40.         end                            
  41.                                        
  42.         newparam(:source) do          
  43.             desc "The repository source."
  44.         end                              
  45.  
  46.         newproperty(:refresh) do
  47.             desc "The repository is automatically refreshed."
  48.             newvalues(:Yes, :No)                            
  49.         end                                                  
  50.  
  51.         newproperty(:enabled) do
  52.             desc "The repository is enabled."
  53.             newvalues(:Yes, :No)            
  54.             defaultto(:Yes)                  
  55.         end                                  
  56.  
  57.         newproperty(:priority) do
  58.             desc "The repository priority."
  59.             newvalues(/^\d+$/)            
  60.             validate do |value|
  61.                 if value.is_a?(String) and value =~ /^[-0-9]+$/
  62.                     value = Integer(value)
  63.                 end
  64.                 if value > 100 or value < 1
  65.                         raise ArgumentError, "Priority must be a value 1-99"
  66.                 else
  67.                         super
  68.                 end
  69.  
  70.             end
  71.  
  72.         end
  73.  
  74.         newproperty(:keep_packages) do
  75.             desc "Keep packages."
  76.             newvalues(:Yes, :No)
  77.             defaultto(:No)
  78.         end
  79.  
  80.         # Override retrieve method to be able to call providors properties method
  81.         # Seems to be used only for spec testing
  82.         #def retrieve
  83.         #       provider.properties[:ensure]
  84.         #end
  85. #
  86.         # This only exists for testing.
  87. #        def clear
  88. #            if obj = @parameters[:ensure]
  89. #                obj.latest = nil
  90. #            end
  91. #        end
  92.  
  93. end # Puppet::Type.type(:repo)
  94.  
  95.  
  96. #### zypper repository
  97. --------------------------------------------------------------------------
  98.  
  99.  
  100.  
  101. lib/puppet/provider/repo # cat zypper.rb
  102. require 'puppet/provider/repo'                              
  103. require 'uri'                                              
  104. require 'ruby-debug'                                        
  105.  
  106. # Zypper repository.
  107. Puppet::Type.type(:repo).provide :zypper, :source => :zypper, :parent => Puppet::Provider::Repo do
  108.     desc "Zypper repository support"                                                              
  109.  
  110.     confine :operatingsystem => [:suse, :opensuse]
  111.     defaultfor :operatingsystem => [:suse, :opensuse]
  112.  
  113.     commands :zypper => "/usr/bin/zypper"
  114.  
  115.     # We are going to use flush and precaching
  116.     # type better override the retrieve method
  117.     # type.retrieve -> provider.properties    
  118.     mk_resource_methods                      
  119.  
  120.     # Prefetch our repositoris. yo.
  121.     def self.prefetch(repos)      
  122.         instances.each do |prov|  
  123.                 if repo = repos[prov.name] || repos[prov.name.downcase]
  124.                         repo.provider = prov                          
  125.                 end                                                    
  126.         end                                                            
  127.     end                                                                
  128.  
  129.     ZYPPER_REPO_REGEX = %r{^\d+\s+.*$}
  130.     # | Alias      | Name   | Enabled | Refresh | Priority | Type  | URI   | Service
  131.  
  132.     def self.instances
  133.         repos = []    
  134.         zypper(:lr, "-d").split("\n").each do |line|
  135.                 if match = ZYPPER_REPO_REGEX.match(line)
  136.                         hash = {}                      
  137.                         results = line.split(/\s+\|\s+/)
  138.                         hash[:name] = results[1]        
  139.                         # This sucks but we need to find the keep packages per repo individually
  140.                         data = zypper(:lr, "-d",results[1]).split(/\n/).detect { |line| line.split(/\s:\s/)[0].strip == "Keep Packages" }
  141.                         if data                                                                                                          
  142.                                 key,value = data.split(/\s+:\s+/)                                                                        
  143.                                 if value.strip == "On"                                                                                  
  144.                                         hash[:keep_packages] = "Yes"                                                                    
  145.                                 else                                                                                                    
  146.                                         hash[:keep_packages] = "No"                                                                      
  147.                                 end                                                                                                      
  148.                         end                                                                                                              
  149.                         hash[:enabled] = results[3]                                                                                      
  150.                         hash[:refresh] = results[4]                                                                                      
  151.                         hash[:priority] = results[5]                                                                                    
  152.                         hash[:provider] = self.name                                                                                      
  153.                         hash[:ensure] = :present                                                                                        
  154.                         repos << new(hash)                                                                                              
  155.                 end                                                                                                                      
  156.         end                                                                                                                              
  157.         return repos                                                                                                                    
  158.     end                                                                                                                                  
  159.  
  160.  
  161.     # Does our object exist?
  162.     def exists?            
  163.         if zypper(:lr).split("\n").detect { |line| line.split("\s")[2] == @resource[:name] }
  164.             self.debug "#{@resource[:name]} exists"                                        
  165.             return true                                                                    
  166.         else                                                                                
  167.             self.debug "#{@resource[:name]} does not exist"                                
  168.             return false                                                                    
  169.         end                                                                                
  170.     end                                                                                    
  171.                                                                                            
  172.     # install repository                                                                    
  173.     def install                                                                            
  174.         should = @resource.should(:ensure)                                                  
  175.         self.debug "Ensuring => #{should}"                                                  
  176.         zypper(:ar, @resource[:source], @resource[:name])                                  
  177.         is = self.status                                                                    
  178.         unless is                                                                          
  179.             raise Puppet::Error, "Could not find repository %s" % self.name                
  180.         end                                                                                
  181.     end                                                                                    
  182.                                                                                            
  183.     def uninstall                                                                          
  184.         zypper(:rr, @resource[:name])                                                      
  185.     end                                                                                    
  186.                                                                                            
  187.     def update                                                                              
  188.         args = []                                                                          
  189.         if @resource[:refresh] == :Yes                                                      
  190.             args << '--refresh'                                                            
  191.         else                                                                                
  192.             args << '--no-refresh'                                                          
  193.         end                                                                                
  194.         if @resource[:enabled] == :Yes                                                      
  195.             args << '--enable'                                                              
  196.         else                                                                                
  197.             args << '--disable'                                                            
  198.         end                                                                                
  199.         if @resource[:priority]                                                            
  200.             args << "-p#{@resource[:priority]}"                                            
  201.         end                                                                                
  202.         if @resource[:keep_packages] == :Yes                                                
  203.             args << '-k'                                                                    
  204.         else                                                                                
  205.             args << '-K'                                                                    
  206.         end                                                                                
  207.         args << @resource[:name]                                                            
  208.         zypper(:mr,*args)                                                                  
  209.     end                                                                                    
  210.                                                                                            
  211.     # Apply our changes to zypper, yo.                                                      
  212.     def flush                                                                              
  213.         self.debug "Flushing"                                                              
  214.         # Actually modify the repository                                                    
  215.         self.update                                                                        
  216.  
  217.         # Clear the cache
  218.         @property_hash.clear
  219.     end                    
  220.  
  221.    
  222.     def query
  223.         self.status
  224.     end            
  225.  
  226.     # Look up the current status.
  227.     def status                  
  228.         main = {}                
  229.         zypper(:lr, "-d", @resource[:name]).split("\n").each do |line|
  230.                 results = line.split(/\s+\:\s+/)                      
  231.                 if results[1]                                        
  232.                         value = results[1].strip                      
  233.                         case results[0]                              
  234.                         when "Name"                                  
  235.                                 main[:name] = value                  
  236.                         when "Enabled"
  237.                                 main[:enabled] = value
  238.                         when "Priority"
  239.                                 main[:priority] = value
  240.                         when "Auto-refresh"
  241.                                 if value == "On"
  242.                                         main[:refresh] = "Yes"
  243.                                 else
  244.                                         main[:refresh] = "No"
  245.                                 end
  246.                         when "Keep Packages"
  247.                                 if value == "On"
  248.                                         main[:keep_packages] = "Yes"
  249.                                 else
  250.                                         main[:keep_packages] = "No"
  251.                                 end
  252.                         end
  253.                 end
  254.                 main[:ensure] = :present
  255.         end
  256.         @property_hash.update(main)
  257.         return @property_hash.dup
  258.     end
  259.  
  260.     def properties
  261.         if @property_hash.empty?
  262.             @property_hash = self.status || {:ensure => :absent}
  263.             if @property_hash.empty?
  264.                 @property_hash[:ensure] = :absent
  265.             end
  266.         end
  267.         @property_hash.dup
  268.     end
  269. end