Module: Resource

Included in:
Rbbt
Defined in:
lib/rbbt/resource.rb,
lib/rbbt/resource/util.rb,
lib/rbbt/resource/with_key.rb

Defined Under Namespace

Modules: WithKey

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, prev = nil, *args) ⇒ Object



25
26
27
28
29
30
31
# File 'lib/rbbt/resource.rb', line 25

def method_missing(name, prev = nil, *args)
  if prev.nil?
    root.send(name, *args)
  else
    root.send(name, prev, *args)
  end
end

Instance Attribute Details

#pkgdirObject

Returns the value of attribute pkgdir.



19
20
21
# File 'lib/rbbt/resource.rb', line 19

def pkgdir
  @pkgdir
end

#rake_dirsObject

Returns the value of attribute rake_dirs.



19
20
21
# File 'lib/rbbt/resource.rb', line 19

def rake_dirs
  @rake_dirs
end

#remote_serverObject

Returns the value of attribute remote_server.



19
20
21
# File 'lib/rbbt/resource.rb', line 19

def remote_server
  @remote_server
end

#resourcesObject

Returns the value of attribute resources.



19
20
21
# File 'lib/rbbt/resource.rb', line 19

def resources
  @resources
end

#subdirObject

Returns the value of attribute subdir.



19
20
21
# File 'lib/rbbt/resource.rb', line 19

def subdir
  @subdir
end

Class Method Details

.extended(base) ⇒ Object



10
11
12
13
14
15
16
17
# File 'lib/rbbt/resource.rb', line 10

def self.extended(base)
  base.pkgdir = 'rbbt'
  base.subdir = ''
  base.resources = {}
  base.rake_dirs = {}
  base.remote_server = Resource.remote_servers[base.to_s]
  base
end

.remote_serversObject



6
7
8
# File 'lib/rbbt/resource.rb', line 6

def self.remote_servers
  @remote_servers = Rbbt.etc.file_servers.exists? ? Rbbt.etc.file_servers.yaml : {}
end

Instance Method Details

#[](file = nil) ⇒ Object



33
34
35
36
37
38
39
# File 'lib/rbbt/resource.rb', line 33

def [](file = nil)
  if file.nil?
    root
  else
    root.send(file)
  end
end

#claim(path, type, content = nil, &block) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/rbbt/resource.rb', line 41

def claim(path, type, content = nil, &block)
  if type == :rake
    @rake_dirs[path] = content
  else
    @resources[path] = [type, content || block]

    if type == :install
      Log.debug "Preparing software: #{path}"
      path.produce
      software_dir = path.resource.root.software
      set_software_env(software_dir)
    end
  end
end

#get_from_server(path, final_path) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/rbbt/resource.rb', line 56

def get_from_server(path, final_path)
  url = File.join(remote_server, '/resource/', self.to_s, 'get_file')
  url << "?" << Misc.hash2GET_params(:file => path, :create => false)
  begin
    Open.write(final_path, Open.read(url, :nocache => true))
    return true
  rescue
    Log.warn "Could not retrieve (#{self.to_s}) #{ path } from #{ remote_server }"
    Log.error $!.message
    FileUtils.rm final_path if File.exists? final_path
    return false
  end
end

#has_rake(path) ⇒ Object



97
98
99
# File 'lib/rbbt/resource/util.rb', line 97

def has_rake(path)
  !! rake_for(path)
end

#produce(path, force = false) ⇒ Object



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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/rbbt/resource.rb', line 70

def produce(path, force = false)
  case
  when @resources.include?(path)
    type, content = @resources[path]
  when has_rake(path)
    type = :rake
    rake_dir, content = rake_for(path)
    rake_dir = Path.setup(rake_dir.dup, self.pkgdir, self)
  else
    raise "Resource #{ path } does not seem to be claimed: #{ self }"
  end

  final_path = path.respond_to?(:find) ? (force ? path.find(:user) : path.find) : path
  if not File.exists? final_path or force
    Log.medium "Producing: #{ final_path }"
    Misc.lock final_path + '.produce' do
      (remote_server and get_from_server(path, final_path)) or
      begin
        case type
        when :string
          Open.write(final_path, content)
        when :url
          Open.write(final_path, Open.open(content))
        when :proc
          data = case content.arity
                 when 0
                   content.call
                 when 1
                   content.call final_path
                 end
          Open.write(final_path, data) unless data.nil?
        when :rake
          run_rake(path, content, rake_dir)
        when :install
          Log.debug "Installing software: #{path}"
          software_dir = path.resource.root.software.find :user
          preamble = "#!/bin/bash\n\nRBBT_SOFTWARE_DIR=\"\#{software_dir}\"\n\nINSTALL_HELPER_FILE=\"\#{Rbbt.share.install.software.lib.install_helpers.find :lib, caller_lib_dir(__FILE__)}\"\nsource \"$INSTALL_HELPER_FILE\"\n          EOF\n\n          CMD.cmd('bash', :in => preamble + \"\\n\" + Open.read(content))\n\n          set_software_env(software_dir)\n        else\n          raise \"Could not produce \#{ resource }. (\#{ type }, \#{ content })\"\n        end\n      rescue\n        FileUtils.rm_rf final_path if File.exists? final_path\n        raise $!\n      end\n    end\n  end\n\n  path\nend\n"

#rake_for(path) ⇒ Object



89
90
91
92
93
94
95
# File 'lib/rbbt/resource/util.rb', line 89

def rake_for(path)
  @rake_dirs.reject{|dir, content|
    !Misc.common_path(dir, path)
  }.sort_by{|dir, content|
    dir.length
  }.last
end

#rootObject



21
22
23
# File 'lib/rbbt/resource.rb', line 21

def root()
  Path.setup @subdir || "", @pkgdir, self
end

#run_rake(path, rakefile, rake_dir) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/rbbt/resource/util.rb', line 101

def run_rake(path, rakefile, rake_dir)
  task = Misc.path_relative_to rake_dir, path
  rakefile = rakefile.produce if rakefile.respond_to? :produce

  rake_dir = rake_dir.find if rake_dir.respond_to? :find

  begin
    require 'rbbt/resource/rake'
    Rake.run(rakefile, rake_dir, task)
  rescue Rake::TaskNotFound
    raise $! if rake_dir.nil? or rake_dir.empty? or rake_dir == "/" or rake_dir == "./"
    task = File.join(File.basename(rake_dir), task)
    rake_dir = File.dirname(rake_dir)
    retry
  end
end

#set_software_env(software_dir) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/rbbt/resource/util.rb', line 31

def set_software_env(software_dir)
  software_dir.find_all.each do |software_dir|
    bin_dir = File.join(software_dir, 'bin')
    opt_dir = File.join(software_dir, 'opt')

    Misc.env_add 'PATH', bin_dir

    FileUtils.mkdir_p opt_dir unless File.exists? opt_dir

    %w(.ld-paths .pkgconfig-paths .aclocal-paths .java-classpaths).each do |file|
      filename = File.join(opt_dir, file)
      begin
        FileUtils.touch filename unless File.exists? filename
      rescue
        Log.warn("Could not touch #{ filename }")
      end
    end

    begin
      if not File.exists? File.join(opt_dir,'.post_install')
        #Open.write(File.join(opt_dir,'.post_install'),"#!/bin/bash\n")
      end
    rescue Exception
      Log.warn("Could not create default .post_install in #{ software_dir }")
    end

    Open.read(File.join opt_dir, '.ld-paths').split(/\n/).each do |line|
      Misc.env_add('LD_LIBRARY_PATH',line.chomp)
      Misc.env_add('LD_RUN_PATH',line.chomp)
    end if File.exists? File.join(opt_dir, '.ld-paths')

    Open.read(File.join opt_dir, '.pkgconfig-paths').split(/\n/).each do |line|
      Misc.env_add('PKG_CONFIG_PATH',line.chomp)
    end if File.exists? File.join(opt_dir, '.pkgconfig-paths')

    Open.read(File.join opt_dir, '.aclocal-paths').split(/\n/).each do |line|
      Misc.env_add('ACLOCAL_FLAGS', "-I#{File.join(opt_dir, line.chomp)}", ' ')
    end if File.exists? File.join(opt_dir, '.aclocal-paths')

    Open.read(File.join opt_dir, '.java-classpaths').split(/\n/).each do |line|
      Misc.env_add('CLASSPATH', "#{File.join(opt_dir,'java', 'lib', line.chomp)}")
    end if File.exists? File.join(opt_dir, '.java-classpaths')

    Dir.glob(File.join opt_dir, 'jars', '*').each do |file|
      Misc.env_add('CLASSPATH', "#{File.expand_path(file)}")
    end

    begin
      File.chmod 0777, File.join(opt_dir, '.post_install')
    rescue
      Log.warn("Could not change permisions of .post_install in #{ software_dir }")
    end

    CMD.cmd(File.join(opt_dir, '.post_install')) if File.exists? File.join(opt_dir, '.post_install')
  end
end

#with_key(key) ⇒ Object



20
21
22
23
24
25
26
27
# File 'lib/rbbt/resource/with_key.rb', line 20

def with_key(key)
  klass = self
  o     = Object.new
  o.extend WithKey
  o.klass = self
  o.key   = key
  o
end