modules/package2/package2.rb in nuri-0.5.3 vs modules/package2/package2.rb in nuri-0.5.4

- old
+ new

@@ -2,69 +2,239 @@ class Sfp::Module::Package2 include Sfp::Resource def update_state - to_model + provider = @model['provider'].strip + if provider != self.provider + case provider + when 'apt' + self.extend(AptPackage) + when 'tar' + self.extend(TarPackage) + else + self.extend(GenericPackage) + end + end - @state['installed'] = installed? - @state['version'] = version? + get_state end - ############################## - # - # Action methods (see Package2.sfp) - # - ############################## + def provider + nil + end - @@lock = Mutex.new + module GenericPackage + def provider + nil + end - def installed? - name = @model['name'].to_s.strip - if name.length > 0 - data = `/usr/bin/dpkg-query -W #{name} 2>/dev/null`.strip.chop.split(' ') - (data[0].to_s == name) - else + def get_state + end + + def install(p={}) false end - end - def version? - name = @model['name'].to_s.strip - if name.length > 0 - data = `/usr/bin/dpkg-query -W #{name} 2>/dev/null`.strip.chop.split(' ') - (data[0].to_s == name ? data[1] : "") - else - "" + def uninstall(p={}) + false end end - def install(p={}) - name = @model['name'].to_s.strip - if name.length <= 0 - false - elsif installed? - true - else - shell "dpkg --configure -a; apt-get -y --purge autoremove" - if shell "apt-get -y install #{name}" - true + module TarPackage + def provider + 'tar' + end + + def get_state + to_model + @state['installed'] = installed? + @state['version'] = version? + @state['home'] = (@state['installed'] ? @model['home'] : '') + end + + def install(p={}) + home = @model['home'].strip + return false if home.length <= 0 + + # create home directory if not exist + shell "rm -rf #{home} && mkdir -p #{home}" if not ::File.directory?(home) + if not ::File.directory?(home) + log.info "Target directory #{home} cannot be created." + return false + end + + file = url.split('/').last + dest = "#{home}/#{file}" + download(url, dest) + + # if downloaded file is not exist, then return false + if not ::File.exist?(dest) + log.error "Failed to download file from #{url}" + return false + end + + # extract tar file, and then delete it + shell "cd #{home} && tar xvzf #{file} && rm -f #{file}" + + basename = case ::File.extname(file) + when '.gz' + ::File.basename(file, '.tar.gz') + when '.tgz' + ::File.basename(file, '.tgz') else - shell "dpkg --configure -a; apt-get -y update && apt-get -y install #{name}" + file end + + shell "bash -c 'cd #{home}/#{basename} && shopt -s dotglob && mv -f * .. && cd .. && rm -rf #{basename}'" + + File.open("#{home}/#{signature}", 'w') { |f| f.write(Time.now.to_s) } + + if not ::File.exist?(version_file) + File.open(version_file, 'w') { |f| f.write(@model['version']) } + end + + installed? end + + def uninstall(p={}) + shell "rm -rf #{@model['home']}" if ::File.exist?(@model['home']) + not installed? + end + + def installed? + ::File.file?("#{@model['home']}/#{signature}") + end + + def version? + if ::File.file?(version_file) + File.read(version_file).strip + else + '' + end + end + + def version_file + "#{@model['home']}/VERSION" + end + + def signature + ".nuri.package" + end + + def url + "#{@model['source']}/#{@model['name']}-#{@model['version']}.tar.gz" + end end - def uninstall(package) - name = @model['name'].to_s.strip - if name.length <= 0 - false - elsif not installed? - true - else - shell "dpkg --configure -a; apt-get -y --purge autoremove" - shell "apt-get -y --purge remove #{name} && apt-get -y --purge autoremove && apt-get -y --purge autoremove" + module AptPackage + def provider + 'apt' end + + def get_state + to_model + + @state['installed'] = installed? + @state['version'] = version? + end + + ############################## + # + # Action methods (see Package2.sfp) + # + ############################## + + @@lock = Mutex.new + + def installed?(p={}) + name = (p.has_key?(:name) ? p[:name] : @model['name'].to_s.strip) + if name.length > 0 + data = `/usr/bin/dpkg-query -W #{name} 2>/dev/null`.strip.chop.split(' ') + (data[0].to_s == name) + else + false + end + end + + def version?(p={}) + name = (p.has_key?(:name) ? p[:name] : @model['name'].to_s.strip) + if name.length > 0 + data = `/usr/bin/dpkg-query -W #{name} 2>/dev/null`.strip.chop.split(' ') + (data[0].to_s == name ? data[1] : "") + else + "" + end + end + + def install(p={}) + return false if not repo_installed? + + name = @model['name'].to_s.strip + if name.length <= 0 + false + elsif installed? + true + else + shell "dpkg --configure -a; apt-get -y --purge autoremove" + if not shell "apt-get -y install #{name}" + shell "dpkg --configure -a; apt-get -y update && apt-get -y install #{name}" + end + installed? + end + end + + def uninstall(package) + name = @model['name'].to_s.strip + if name.length <= 0 + false + elsif not installed? + true + else + shell "dpkg --configure -a; apt-get -y --purge autoremove" + shell "apt-get -y --purge remove #{name} && apt-get -y --purge autoremove && apt-get -y --purge autoremove" + not installed? + end + end + + ############################## + # + # Helper methods + # + ############################## + + def repo_installed? + if @model['provider'] == 'apt' + case @model['source'].strip + when 'default', '' + true + else + apt_repo_installed? + end + else + true + end + end + + def apt_repo_installed? + type, _ = @model['source'].split(':') + if type == 'ppa' + repos = `/bin/bash #{File.dirname(__FILE__)}/apt-repo-list.sh`.strip.split("\n") + if not repos.include?(@model['source']) + log.info "Missing APT repository: #{@model['source']}" + if not installed?({:name => 'python-software-properties'}) + shell "apt-get install -y python-software-properties" + end + log.info "Adding APT repository: #{@model['source']}" + shell "add-apt-repository #{model['source']} && apt-get update" + else + false + end + else + false + end + end + end =begin protected def installed?