Class: EC2::Platform::Linux::Rsync

Inherits:
Object
  • Object
show all
Defined in:
lib/ec2/platform/linux/rsync.rb

Direct Known Subclasses

Solaris::Rsync

Defined Under Namespace

Classes: Command

Class Method Summary collapse

Class Method Details

.symlinking?Boolean

Returns:

  • (Boolean)


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
# File 'lib/ec2/platform/linux/rsync.rb', line 66

def self.symlinking?
  begin
    src = FileUtil.tempdir('ec2-ami-tools-rsync-test-src')
    dst = FileUtil.tempdir('ec2-ami-tools-rsync-test-dst')
    FileUtils.mkdir(src)
    FileUtils.touch("#{src}/foo")
    FileUtils.symlink("#{src}/foo", "#{src}/bar")
    FileUtils.mkdir("#{src}/baz")
    File.open("#{src}/baz/food", 'w+'){|io| io << IO.read(__FILE__) }
    FileUtils.symlink("#{src}/baz/food", "#{src}/baz/bard")
    FileUtils.mkdir(dst)
    incantation = Command.new.archive.recursive.sparse.links.src("#{src}/").dst("#{dst}")
    `#{incantation.expand} 2>&1`
    rc = $?.exitstatus
    return true if rc == 0
    if rc == 23
      #check that the structure was copied reasonably anyway
      slist = Dir["#{src}/**/**"]
      dlist = Dir["#{dst}/**/**"]
      return false unless dlist == dlist
      slist.each do |sitem|
        ditem = item.gsub(src, dst)
        return false unless dlist.include? ditem 
        if File.file?(sitem) or File.symlink?(sitem)
          @out.print "comparing #{sitem} to #{ditem}" if @out
          return false unless IO.read(ditem) == IO.read(sitem)
        end
        if ['food', 'bard'].include? File.basename(ditem)
          return false unless IO.read(sitem) == IO.read(__FILE__)
        end
      end
      return true
    end
    return false
  rescue Exception
    return false
  ensure
    FileUtils.rm_rf src
    FileUtils.rm_rf dst
  end      
end

.usable?Boolean

Returns:

  • (Boolean)


108
109
110
# File 'lib/ec2/platform/linux/rsync.rb', line 108

def self.usable?()
  @@usable ||= self.symlinking?
end