kameleon-builder 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. data/.editorconfig +0 -0
  2. data/.env +63 -15
  3. data/.gitignore +1 -0
  4. data/README.rst +4 -2
  5. data/Vagrantfile +13 -52
  6. data/bin/kameleon +5 -0
  7. data/completion/_kameleon.zsh +18 -0
  8. data/completion/kameleon.bash +13 -0
  9. data/completion/kameleon.fish +10 -0
  10. data/contrib/polipo_env.sh +2 -0
  11. data/contrib/steps/export/save_as_g5k.yaml +63 -0
  12. data/contrib/steps/setup/add_to_sudoers.yaml +5 -0
  13. data/docs/Makefile +10 -6
  14. data/docs/README.md +17 -0
  15. data/docs/source/_static/kameleon-logo.png +0 -0
  16. data/docs/source/_static/kameleon-logo.xcf +0 -0
  17. data/docs/source/_static/kameleon-long.png +0 -0
  18. data/docs/source/aliases.rst +4 -2
  19. data/docs/source/checkpoint.rst +2 -0
  20. data/docs/source/commands.rst +4 -3
  21. data/docs/source/conf.py +15 -7
  22. data/docs/source/context.rst +7 -4
  23. data/docs/source/faq.rst +39 -1
  24. data/docs/source/getting_started.rst +227 -1
  25. data/docs/source/grid5000_tutorial.rst +110 -0
  26. data/docs/source/index.rst +7 -2
  27. data/docs/source/installation.rst +12 -4
  28. data/docs/source/persistent_cache.rst +34 -0
  29. data/docs/source/recipe.rst +23 -16
  30. data/docs/source/use_cases.rst +93 -0
  31. data/docs/source/workspace.rst +2 -0
  32. data/kameleon-builder.gemspec +7 -1
  33. data/lib/kameleon.rb +3 -6
  34. data/lib/kameleon/cli.rb +104 -50
  35. data/lib/kameleon/compat.rb +39 -0
  36. data/lib/kameleon/context.rb +43 -13
  37. data/lib/kameleon/engine.rb +118 -77
  38. data/lib/kameleon/environment.rb +3 -5
  39. data/lib/kameleon/error.rb +15 -9
  40. data/lib/kameleon/logger.rb +7 -4
  41. data/lib/kameleon/persistent_cache.rb +139 -0
  42. data/lib/kameleon/recipe.rb +200 -81
  43. data/lib/kameleon/shell.rb +51 -16
  44. data/omnibus/.gitignore +11 -0
  45. data/omnibus/.kitchen.yml +25 -0
  46. data/omnibus/Berksfile +9 -0
  47. data/omnibus/Berksfile.lock +25 -0
  48. data/omnibus/Gemfile +12 -0
  49. data/omnibus/README.md +94 -0
  50. data/omnibus/config/projects/kameleon.rb +23 -0
  51. data/omnibus/config/software/kameleon.rb +24 -0
  52. data/omnibus/config/software/polipo.rb +30 -0
  53. data/omnibus/config/software/ruby.rb +158 -0
  54. data/omnibus/files/mac_dmg/Resources/background.png +0 -0
  55. data/omnibus/files/mac_dmg/Resources/icon.png +0 -0
  56. data/omnibus/files/mac_pkg/Resources/background.png +0 -0
  57. data/omnibus/files/mac_pkg/Resources/license.html +1 -0
  58. data/omnibus/files/mac_pkg/Resources/welcome.html +9 -0
  59. data/omnibus/omnibus.rb +27 -0
  60. data/omnibus/package-scripts/kameleon/makeselfinst +27 -0
  61. data/omnibus/package-scripts/kameleon/postrm +9 -0
  62. data/templates/archlinux-desktop.yaml +25 -0
  63. data/templates/archlinux.yaml +106 -0
  64. data/templates/debian-testing.yaml +25 -0
  65. data/templates/debian7-desktop.yaml +25 -0
  66. data/templates/{debian-wheezy-docker.yaml → debian7-docker.yaml} +30 -16
  67. data/templates/debian7-g5k.yaml +97 -0
  68. data/templates/debian7-oar-dev.yaml +51 -0
  69. data/templates/debian7.yaml +128 -0
  70. data/templates/extend.erb +23 -0
  71. data/templates/fedora-rawhide.yaml +30 -0
  72. data/templates/fedora20-desktop.yaml +21 -0
  73. data/templates/fedora20.yaml +105 -0
  74. data/templates/{debian-wheezy-chroot.yaml → old-debian7.yaml} +51 -38
  75. data/templates/{aliases → steps/aliases}/defaults.yaml +37 -12
  76. data/templates/steps/bootstrap/archlinux/arch_bootstrap.yaml +219 -0
  77. data/templates/steps/bootstrap/archlinux/install_bootloader.yaml +46 -0
  78. data/templates/steps/bootstrap/archlinux/populate_disk.yaml +39 -0
  79. data/templates/steps/bootstrap/debian/debootstrap.yaml +18 -10
  80. data/templates/steps/bootstrap/debian/debootstrap_arm.yaml +31 -0
  81. data/templates/steps/bootstrap/fedora/liveos_bootstrap.yaml +123 -0
  82. data/templates/steps/bootstrap/g5k_reserv.yaml +70 -0
  83. data/templates/steps/bootstrap/initialize_disk_chroot.yaml +84 -0
  84. data/templates/steps/bootstrap/initialize_disk_qemu.yaml +72 -0
  85. data/templates/steps/bootstrap/install_bootloader.yaml +42 -0
  86. data/templates/steps/bootstrap/prepare_chroot.yaml +126 -0
  87. data/templates/steps/bootstrap/prepare_docker.yaml +19 -8
  88. data/templates/steps/bootstrap/prepare_qemu.yaml +47 -0
  89. data/templates/steps/bootstrap/start_chroot.yaml +11 -2
  90. data/templates/steps/bootstrap/start_docker.yaml +2 -2
  91. data/templates/steps/bootstrap/start_qemu.yaml +75 -0
  92. data/templates/steps/bootstrap/ubuntu/debootstrap.yaml +27 -0
  93. data/templates/steps/breakpoint.yaml +2 -0
  94. data/templates/{checkpoints → steps/checkpoints}/docker.yaml +0 -0
  95. data/templates/steps/checkpoints/qcow2.yaml +38 -0
  96. data/templates/steps/checkpoints/qemu.yaml +39 -0
  97. data/templates/steps/export/clean_appliance.yaml +7 -1
  98. data/templates/steps/export/compact_qcow_img.yaml +12 -0
  99. data/templates/steps/export/save_appliance.yaml +58 -0
  100. data/templates/steps/export/save_appliance_from_g5k.yaml +47 -0
  101. data/templates/steps/export/save_vagrant_box.yaml +29 -0
  102. data/templates/steps/setup/archlinux/configure_keyboard.yaml +9 -0
  103. data/templates/steps/setup/archlinux/configure_network.yaml +9 -0
  104. data/templates/steps/setup/archlinux/configure_ruby.yaml +7 -0
  105. data/templates/steps/setup/archlinux/configure_system.yaml +20 -0
  106. data/templates/steps/setup/archlinux/install_dev_tools.yaml +18 -0
  107. data/templates/steps/setup/archlinux/install_gnome.yaml +27 -0
  108. data/templates/steps/setup/archlinux/install_software.yaml +9 -0
  109. data/templates/steps/setup/archlinux/install_yaourt.yaml +29 -0
  110. data/templates/steps/setup/autologin.yaml +16 -0
  111. data/templates/steps/setup/create_group.yaml +12 -0
  112. data/templates/steps/setup/create_user.yaml +9 -10
  113. data/templates/steps/setup/debian/configure_apt.yaml +65 -0
  114. data/templates/steps/setup/debian/configure_kernel.yaml +18 -0
  115. data/templates/steps/setup/debian/{keyboard_config.yaml → configure_keyboard.yaml} +1 -1
  116. data/templates/steps/setup/debian/{network_config.yaml → configure_network.yaml} +0 -0
  117. data/templates/steps/setup/debian/{system_config.yaml → configure_system.yaml} +0 -0
  118. data/templates/steps/setup/debian/install_gnome.yaml +13 -0
  119. data/templates/steps/setup/debian/install_kde.yaml +13 -0
  120. data/templates/steps/setup/debian/install_software.yaml +2 -0
  121. data/templates/steps/setup/debian/oar/oar_debian_config_frontend.yaml +8 -0
  122. data/templates/steps/setup/debian/oar/oar_debian_config_node.yaml +5 -0
  123. data/templates/steps/setup/debian/oar/oar_debian_config_server.yaml +5 -0
  124. data/templates/steps/setup/debian/oar/oar_prereq_install.yaml +16 -0
  125. data/templates/steps/setup/debian/setup_vagrant_box.yaml +52 -0
  126. data/templates/steps/setup/debian/upgrade_system.yaml +15 -0
  127. data/templates/steps/setup/fedora/configure_network.yaml +30 -0
  128. data/templates/steps/setup/fedora/configure_system.yaml +59 -0
  129. data/templates/steps/setup/fedora/install_software.yaml +3 -0
  130. data/templates/steps/setup/fedora/update_system.yaml +10 -0
  131. data/templates/steps/setup/oar/oar_config_devel.yaml +21 -0
  132. data/templates/steps/setup/oar/oar_config_frontend.yaml +38 -0
  133. data/templates/steps/setup/oar/oar_config_node.yaml +4 -0
  134. data/templates/steps/setup/oar/oar_config_server.yaml +25 -0
  135. data/templates/steps/setup/oar/oar_config_system.yaml +34 -0
  136. data/templates/steps/setup/oar/oar_devel_prereq_install.yaml +5 -0
  137. data/templates/steps/setup/oar/oar_git_install.yaml +21 -0
  138. data/templates/steps/setup/ubuntu/configure_apt.yaml +67 -0
  139. data/templates/ubuntu-12.04-desktop.yaml +25 -0
  140. data/templates/ubuntu-12.04.yaml +128 -0
  141. data/templates/ubuntu-14.04-desktop.yaml +27 -0
  142. data/templates/ubuntu-14.04.yaml +25 -0
  143. data/templates/vagrant-debian7.yaml +31 -0
  144. data/version.txt +1 -1
  145. metadata +155 -28
  146. checksums.yaml +0 -7
  147. data/templates/checkpoints/qcow2.yaml +0 -44
  148. data/templates/fedora-docker.yaml +0 -96
  149. data/templates/steps/bootstrap/fedora/docker_bootstrap.yaml +0 -25
  150. data/templates/steps/bootstrap/fedora/yum_bootstrap.yaml +0 -22
  151. data/templates/steps/bootstrap/prepare_appliance_with_nbd.yaml +0 -93
  152. data/templates/steps/export/build_appliance_from_docker.yaml +0 -105
  153. data/templates/steps/export/save_appliance_from_nbd.yaml +0 -54
  154. data/templates/steps/setup/debian/kernel_install.yaml +0 -20
  155. data/templates/steps/setup/debian/software_install.yaml +0 -15
  156. data/templates/steps/setup/fedora/kernel_install.yaml +0 -27
  157. data/templates/steps/setup/fedora/software_install.yaml +0 -10
@@ -0,0 +1,39 @@
1
+ require 'securerandom'
2
+ require 'yaml'
3
+
4
+ YAML::ENGINE.yamler = 'syck' if (defined?(Syck) || defined?(YAML::Syck)) && defined?(YAML::ENGINE)
5
+
6
+ if RUBY_VERSION < "1.9.3"
7
+ # Backport of missing SecureRandom methods from 1.9
8
+ # Snippet from http://softover.com/UUID_in_Ruby_1.8
9
+ module SecureRandom
10
+ class << self
11
+ def method_missing(method_sym, *arguments, &block)
12
+ case method_sym
13
+ when :urlsafe_base64
14
+ r19_urlsafe_base64(*arguments)
15
+ when :uuid
16
+ r19_uuid(*arguments)
17
+ else
18
+ super
19
+ end
20
+ end
21
+
22
+ private
23
+ def r19_urlsafe_base64(n=nil, padding=false)
24
+ s = [random_bytes(n)].pack("m*")
25
+ s.delete!("\n")
26
+ s.tr!("+/", "-_")
27
+ s.delete!("=") if !padding
28
+ s
29
+ end
30
+
31
+ def r19_uuid
32
+ ary = random_bytes(16).unpack("NnnnnN")
33
+ ary[2] = (ary[2] & 0x0fff) | 0x4000
34
+ ary[3] = (ary[3] & 0x3fff) | 0x8000
35
+ "%08x-%04x-%04x-%04x-%04x%08x" % ary
36
+ end
37
+ end
38
+ end
39
+ end
@@ -14,13 +14,27 @@ module Kameleon
14
14
  @local_workdir = local_workdir
15
15
  @shell = Kameleon::Shell.new(@name, @cmd, @workdir, @local_workdir)
16
16
  @logger.debug("Initialize new ctx (#{name})")
17
+ @log_on_progress = false
17
18
 
18
19
  instance_variables.each do |v|
19
20
  @logger.debug(" #{v} = #{instance_variable_get(v)}")
20
21
  end
21
- # Start the shell process
22
- @shell.start
23
- execute("echo The '#{name}_context' has been initialized", :log_level => "info")
22
+
23
+ @cache = Kameleon::Persistent_cache.instance
24
+ end
25
+
26
+ def do_log(out, log_level)
27
+ if @log_on_progress
28
+ log_progress(log_level, out)
29
+ @log_on_progress = false if out.match(/\n$/)
30
+ else
31
+ if out.match(/\n$/)
32
+ out.split( /\r?\n/ ).each {|m| log(log_level, m) }
33
+ else
34
+ log_progress(log_level, out)
35
+ @log_on_progress = true
36
+ end
37
+ end
24
38
  end
25
39
 
26
40
  def log(log_level, msg)
@@ -29,42 +43,58 @@ module Kameleon
29
43
  @logger.debug msg if log_level == "debug"
30
44
  end
31
45
 
46
+ def log_progress(log_level, msg)
47
+ @logger.progress_info msg if log_level == "info"
48
+ @logger.progress_error msg if log_level == "error"
49
+ @logger.debug msg if log_level == "debug"
50
+ end
51
+
32
52
  def execute(cmd, kwargs = {})
53
+ lazyload_shell
33
54
  cmd_with_prefix = "#{@exec_prefix} #{cmd}"
34
55
  cmd_with_prefix.split( /\r?\n/ ).each {|m| @logger.debug "+ #{m}" }
35
56
  log_level = kwargs.fetch(:log_level, "info")
36
57
  exit_status = @shell.execute(cmd_with_prefix, kwargs) do |out, err|
37
- out.split( /\r?\n/ ).each {|m| log(log_level, m) } unless out.nil?
38
- err.split( /\r?\n/ ).each {|m| log("error", m) } unless err.nil?
58
+ do_log(out, log_level) unless out.nil?
59
+ do_log(err, "error") unless err.nil?
39
60
  end
40
61
  @logger.debug("Exit status : #{exit_status}")
41
62
  fail ExecError unless exit_status.eql? 0
42
- rescue ShellError => e
43
- @logger.error(e.message)
44
- fail ExecError
63
+ rescue ShellError, Errno::EPIPE => e
64
+ @logger.debug("Shell cmd failed to launch: #{@shell.shell_cmd}")
65
+ raise ShellError, e.message + ". Check the cmd argument of the '#{@name}_context'."
45
66
  end
46
67
 
47
68
  def pipe(cmd, other_cmd, other_ctx)
48
69
  tmp = Tempfile.new("pipe-#{ Kameleon::Utils.generate_slug(cmd)[0..20] }")
49
- @logger.info("Running piped commands")
50
- @logger.info("Saving STDOUT from #{@name}_ctx to local file #{tmp.path}")
70
+ @logger.debug("Running piped commands")
71
+ @logger.debug("Saving STDOUT from #{@name}_ctx to local file #{tmp.path}")
51
72
  execute(cmd, :stdout => tmp)
52
73
  tmp.close
53
- @logger.info("Forwarding #{tmp.path} to STDIN of #{other_ctx.name}_ctx")
54
- dest_pipe_path = "./pipe-#{ Kameleon::Utils.generate_slug(other_cmd)[0..20] }"
74
+ @logger.debug("Forwarding #{tmp.path} to STDIN of #{other_ctx.name}_ctx")
75
+ dest_pipe_path = "${KAMELEON_WORKDIR}/pipe-#{ Kameleon::Utils.generate_slug(other_cmd)[0..20] }"
55
76
  other_ctx.send_file(tmp.path, dest_pipe_path)
56
77
  other_cmd_with_pipe = "cat #{dest_pipe_path} | #{other_cmd} && rm #{dest_pipe_path}"
57
78
  other_ctx.execute(other_cmd_with_pipe)
58
79
  end
59
80
 
81
+ def lazyload_shell()
82
+ unless @shell.started?
83
+ # Start the shell process
84
+ @shell.start
85
+ execute("echo The '#{name}_context' has been initialized", :log_level => "info")
86
+ end
87
+ end
88
+
60
89
  def start_shell
61
90
  #TODO: Load env and history
91
+ lazyload_shell
62
92
  @logger.info("Starting interactive shell")
63
93
  @shell.fork_and_wait
64
94
  end
65
95
 
66
96
  def closed?
67
- @shell.exited?
97
+ return !@shell.started? || @shell.exited?
68
98
  end
69
99
 
70
100
  def close!
@@ -1,6 +1,6 @@
1
1
  require 'kameleon/recipe'
2
2
  require 'kameleon/context'
3
-
3
+ require 'kameleon/persistent_cache'
4
4
 
5
5
  module Kameleon
6
6
 
@@ -9,7 +9,7 @@ module Kameleon
9
9
 
10
10
  def initialize(recipe, options)
11
11
  @options = options
12
- @logger = Log4r::Logger.new("kameleon::[engine]")
12
+ @logger = Log4r::Logger.new("kameleon::[kameleon]")
13
13
  @recipe = recipe
14
14
  @cleaned_sections = []
15
15
  @cwd = @recipe.global["kameleon_cwd"]
@@ -29,6 +29,17 @@ module Kameleon
29
29
  @enable_checkpoint = !@recipe.checkpoint.nil? if @enable_checkpoint
30
30
 
31
31
  @recipe.resolve!
32
+
33
+ if @options[:cache] || @options[:from_cache] then
34
+ @cache = Kameleon::Persistent_cache.instance
35
+ @cache.activated = true
36
+ @cache.cwd = @cwd
37
+ @cache.polipo_path = @options[:proxy_path]
38
+ @cache.check_polipo_binary
39
+ @cache.name = @recipe.name
40
+ #saving_steps_files
41
+ end
42
+
32
43
  @in_context = nil
33
44
  begin
34
45
  @logger.notice("Creating kameleon working directory : #{@cwd}")
@@ -44,6 +55,34 @@ module Kameleon
44
55
  @recipe.global["out_context"]["workdir"],
45
56
  @recipe.global["out_context"]["exec_prefix"],
46
57
  @cwd)
58
+ @logger.notice("Building internal context [in]")
59
+ @in_context = Context.new("in",
60
+ @recipe.global["in_context"]["cmd"],
61
+ @recipe.global["in_context"]["workdir"],
62
+ @recipe.global["in_context"]["exec_prefix"],
63
+ @cwd)
64
+ if @options[:from_cache] then
65
+ begin
66
+ @cache.unpack(@options[:from_cache])
67
+ rescue
68
+ raise BuildError, "Failed to untar the persistent cache file"
69
+ end
70
+ end
71
+ end
72
+
73
+ def saving_steps_files
74
+ @recipe.files.each do |file|
75
+ @logger.notice("File #{file} loaded from the recipe")
76
+ sleep 1
77
+ end
78
+
79
+ end
80
+
81
+ def create_cache_directory(step_name)
82
+ @logger.notice("Creating directory for cache #{step_name}")
83
+ directory_name = @cache.cache_dir + "/#{step_name}"
84
+ FileUtils.mkdir_p directory_name
85
+ directory_name
47
86
  end
48
87
 
49
88
  def create_checkpoint(microstep_id)
@@ -82,16 +121,22 @@ module Kameleon
82
121
  def do_steps(section_name)
83
122
  section = @recipe.sections.fetch(section_name)
84
123
  section.sequence do |macrostep|
124
+
125
+ if @cache then
126
+ # the following function start a polipo web proxy and stops a previous run
127
+ dir_cache = @cache.create_cache_directory(macrostep.name) #unless @options[:from_cache]
128
+ @cache.start_web_proxy_in(dir_cache)
129
+ end
130
+
85
131
  macrostep.sequence do |microstep|
86
132
  @logger.notice("Step #{ microstep.order } : #{ microstep.slug }")
87
- @logger.notice(" ---> #{ microstep.identifier }")
88
133
  if @enable_checkpoint
89
134
  if microstep.on_checkpoint == "skip"
90
135
  @logger.notice(" ---> Skipped")
91
136
  next
92
137
  end
93
138
  if microstep.in_cache && microstep.on_checkpoint == "use_cache"
94
- @logger.notice(" ---> Using cache")
139
+ @logger.notice(" ---> Using cache this time")
95
140
  else
96
141
  @logger.notice(" ---> Running step")
97
142
  microstep.commands.each do |cmd|
@@ -111,6 +156,12 @@ module Kameleon
111
156
  end
112
157
  end
113
158
  @cleaned_sections.push(section.name)
159
+
160
+ if @cache then
161
+ @cache.stop_web_proxy
162
+ @cache.pack unless @options[:from_cache]
163
+ end
164
+
114
165
  end
115
166
 
116
167
  def safe_exec_cmd(cmd, kwargs = {})
@@ -124,41 +175,32 @@ module Kameleon
124
175
  end
125
176
 
126
177
  def exec_cmd(cmd, kwargs = {})
127
- def skip_alert(cmd)
128
- @logger.warn("Skipping cmd '#{cmd.string_cmd}'. The in_context is" \
129
- " not ready yet")
130
- end
131
178
  case cmd.key
132
179
  when "breakpoint"
133
- breakpoint(cmd.value, )
180
+ breakpoint(cmd.value)
134
181
  when "exec_in"
135
182
  skip_alert(cmd) if @in_context.nil?
136
- @in_context.execute(cmd.value, kwargs) unless @in_context.nil?
183
+ @in_context.execute(cmd.value, kwargs)
137
184
  when "exec_out"
138
185
  @out_context.execute(cmd.value, kwargs)
139
186
  when "exec_local"
140
187
  @local_context.execute(cmd.value, kwargs)
141
188
  when "pipe"
142
189
  first_cmd, second_cmd = cmd.value
143
- if ((first_cmd.key == "exec_in" || second_cmd.key == "exec_in")\
144
- && @in_context.nil?)
145
- skip_alert(cmd)
146
- else
147
- expected_cmds = ["exec_in", "exec_out", "exec_local"]
148
- [first_cmd.key, second_cmd.key].each do |key|
149
- unless expected_cmds.include?(key)
150
- @logger.error("Invalid pipe arguments. Expected "\
151
- "#{expected_cmds} commands")
152
- fail ExecError
153
- end
190
+ expected_cmds = ["exec_in", "exec_out", "exec_local"]
191
+ [first_cmd.key, second_cmd.key].each do |key|
192
+ unless expected_cmds.include?(key)
193
+ @logger.error("Invalid pipe arguments. Expected "\
194
+ "#{expected_cmds} commands")
195
+ fail ExecError
154
196
  end
155
- map = {"exec_in" => @in_context,
156
- "exec_out" => @out_context,
157
- "exec_local" => @local_context,}
158
- first_context = map[first_cmd.key]
159
- second_context = map[second_cmd.key]
160
- first_context.pipe(first_cmd.value, second_cmd.value, second_context)
161
197
  end
198
+ map = {"exec_in" => @in_context,
199
+ "exec_out" => @out_context,
200
+ "exec_local" => @local_context,}
201
+ first_context = map[first_cmd.key]
202
+ second_context = map[second_cmd.key]
203
+ first_context.pipe(first_cmd.value, second_cmd.value, second_context)
162
204
  when "rescue"
163
205
  first_cmd, second_cmd = cmd.value
164
206
  begin
@@ -179,17 +221,17 @@ module Kameleon
179
221
  msg << "Press [r] to retry\n" if enable_retry
180
222
  msg << "Press [c] to continue with execution"
181
223
  msg << "\nPress [a] to abort execution"
182
- msg << "\nPress [l] to switch to local_context shell" unless @local_context.nil?
183
- msg << "\nPress [o] to switch to out_context shell" unless @out_context.nil?
184
- msg << "\nPress [i] to switch to in_context shell" unless @in_context.nil?
224
+ msg << "\nPress [l] to switch to local_context shell"
225
+ msg << "\nPress [o] to switch to out_context shell"
226
+ msg << "\nPress [i] to switch to in_context shell"
185
227
  responses = {"c" => "continue", "a" => "abort"}
186
228
  responses["r"] = "retry" if enable_retry
187
- responses.merge!({"l" => "launch local_context"}) unless @out_context.nil?
188
- responses.merge!({"o" => "launch out_context"}) unless @out_context.nil?
189
- responses.merge!({"i" => "launch in_context"}) unless @in_context.nil?
229
+ responses.merge!({"l" => "launch local_context"})
230
+ responses.merge!({"o" => "launch out_context"})
231
+ responses.merge!({"i" => "launch in_context"})
190
232
  while true
191
233
  msg.split( /\r?\n/ ).each {|m| @logger.notice "#{m}" }
192
- @logger.progress "answer ? [" + responses.keys().join("/") + "]: "
234
+ @logger.progress_notice "answer ? [" + responses.keys().join("/") + "]: "
193
235
  answer = $stdin.gets
194
236
  raise AbortError, "Execution aborted..." if answer.nil?
195
237
  answer.chomp!
@@ -203,13 +245,14 @@ module Kameleon
203
245
  else
204
246
  @in_context.start_shell
205
247
  end
206
- @logger.notice("Getting back to Kameleon ...")
248
+ @logger.notice("Getting back to Kameleon...")
207
249
  elsif answer.eql? "a"
208
250
  raise AbortError, "Execution aborted..."
209
251
  elsif answer.eql? "c"
210
252
  ## resetting the exit status
211
- @in_context.execute("true") unless @in_context.nil?
212
- @out_context.execute("true") unless @out_context.nil?
253
+ @in_context.execute("true")
254
+ @out_context.execute("true")
255
+ @local_context.execute("true")
213
256
  return true
214
257
  elsif answer.eql? "r"
215
258
  @logger.notice("Retrying the previous command...")
@@ -225,39 +268,32 @@ module Kameleon
225
268
  return breakpoint(message, :enable_retry => true)
226
269
  end
227
270
 
228
- def finish_clean()
271
+ def clean()
229
272
  @recipe.sections.values.each do |section|
230
273
  next if @cleaned_sections.include?(section.name)
231
- begin
232
- @logger.notice("Cleaning #{section.name} section")
233
- section.clean_macrostep.sequence do |microstep|
234
- microstep.commands.each do |cmd|
235
- begin
236
- exec_cmd(cmd)
237
- rescue
238
- @logger.warn("An error occurred while executing : #{cmd.value}")
239
- end
240
- end
241
- end
242
- end
243
- end
244
- end
245
-
246
- def clear
247
- @recipe.sections.values.each do |section|
274
+ map = {"exec_in" => @in_context,
275
+ "exec_out" => @out_context,
276
+ "exec_local" => @local_context}
248
277
  @logger.notice("Cleaning #{section.name} section")
249
278
  section.clean_macrostep.sequence do |microstep|
250
279
  microstep.commands.each do |cmd|
251
- if (cmd.key == "exec_out" || cmd.key == "exec_local")
252
- begin
253
- exec_cmd(cmd)
254
- rescue
255
- @logger.warn("An error occurred while executing : #{cmd.value}")
280
+ if map.keys.include? cmd.key
281
+ unless map[cmd.key].closed?
282
+ begin
283
+ exec_cmd(cmd)
284
+ rescue
285
+ @logger.warn("An error occurred while executing : #{cmd.value}")
286
+ end
256
287
  end
257
288
  end
258
289
  end
259
290
  end
260
291
  end
292
+ @cache.stop_web_proxy if @options[:cache] ## stopping polipo
293
+ end
294
+
295
+ def clear
296
+ clean
261
297
  unless @recipe.checkpoint.nil?
262
298
  @logger.notice("Removing all old checkpoints")
263
299
  cmd = @recipe.checkpoint["clear"]
@@ -291,24 +327,27 @@ module Kameleon
291
327
  end
292
328
  dump_build_recipe
293
329
  begin
294
- do_steps("bootstrap")
295
- @logger.notice("Building internal context [in]")
296
- @in_context = Context.new("in",
297
- @recipe.global["in_context"]["cmd"],
298
- @recipe.global["in_context"]["workdir"],
299
- @recipe.global["in_context"]["exec_prefix"],
300
- @cwd)
301
- do_steps("setup")
302
- do_steps("export")
303
- rescue Exception => e
330
+ ["bootstrap", "setup", "export"].each do |section|
331
+ do_steps(section)
332
+ end
333
+ clean
334
+ rescue AbortError => e
335
+ @logger.error("Aborted...")
304
336
  @logger.warn("Waiting for cleanup before exiting...")
305
- @out_context.reopen if !@out_context.nil?
306
- @in_context.reopen if !@in_context.nil?
307
- @local_context.reopen if !@local_context.nil?
308
- finish_clean
309
- @out_context.close! unless @out_context.nil?
310
- @in_context.close! unless @in_context.nil?
311
- @local_context.close! unless @local_context.nil?
337
+ clean
338
+ raise e
339
+ rescue SystemExit, Interrupt => e
340
+ @logger.error("Interrupted...")
341
+ @out_context.reopen
342
+ @in_context.reopen
343
+ @local_context.reopen
344
+ @logger.warn("Waiting for cleanup before exiting...")
345
+ clean
346
+ raise e
347
+ rescue Exception => e
348
+ @out_context.close!
349
+ @in_context.close!
350
+ @local_context.close!
312
351
  raise e
313
352
  end
314
353
  end
@@ -328,6 +367,8 @@ module Kameleon
328
367
  end
329
368
 
330
369
  def pretty_checkpoints_list
370
+
371
+
331
372
  def find_microstep_slug_by_id(id)
332
373
  @recipe.microsteps.each do |m|
333
374
  return m.slug if m.identifier == id