kameleon-builder 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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