service_kiosk 0.5.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 (241) hide show
  1. data/Vagrantfile +25 -0
  2. data/bin/kiosk +55 -0
  3. data/bin/start_kiosk.sh +3 -0
  4. data/lib/Procfile.kiosk +1 -0
  5. data/lib/internal_service.rb +59 -0
  6. data/lib/json-simple-1.1.1.jar +0 -0
  7. data/lib/kiosk.rb +57 -0
  8. data/lib/kiosks/logger/output_logger.rb +16 -0
  9. data/lib/mall.rb +77 -0
  10. data/lib/mallcop.rb +9 -0
  11. data/lib/remote_service.rb +61 -0
  12. data/lib/tasks/local_mall.rake +93 -0
  13. data/provision/bootstrap.sh +21 -0
  14. data/provision/manifests/default.pp +49 -0
  15. data/provision/modules/apt/CHANGELOG +83 -0
  16. data/provision/modules/apt/LICENSE +19 -0
  17. data/provision/modules/apt/Modulefile +14 -0
  18. data/provision/modules/apt/README.md +119 -0
  19. data/provision/modules/apt/Rakefile +1 -0
  20. data/provision/modules/apt/manifests/backports.pp +48 -0
  21. data/provision/modules/apt/manifests/builddep.pp +16 -0
  22. data/provision/modules/apt/manifests/conf.pp +18 -0
  23. data/provision/modules/apt/manifests/debian/testing.pp +21 -0
  24. data/provision/modules/apt/manifests/debian/unstable.pp +21 -0
  25. data/provision/modules/apt/manifests/force.pp +24 -0
  26. data/provision/modules/apt/manifests/init.pp +114 -0
  27. data/provision/modules/apt/manifests/key.pp +80 -0
  28. data/provision/modules/apt/manifests/params.pp +23 -0
  29. data/provision/modules/apt/manifests/pin.pp +48 -0
  30. data/provision/modules/apt/manifests/ppa.pp +49 -0
  31. data/provision/modules/apt/manifests/release.pp +17 -0
  32. data/provision/modules/apt/manifests/source.pp +83 -0
  33. data/provision/modules/apt/manifests/update.pp +9 -0
  34. data/provision/modules/apt/spec/classes/apt_spec.rb +129 -0
  35. data/provision/modules/apt/spec/classes/backports_spec.rb +71 -0
  36. data/provision/modules/apt/spec/classes/debian_testing_spec.rb +14 -0
  37. data/provision/modules/apt/spec/classes/debian_unstable_spec.rb +14 -0
  38. data/provision/modules/apt/spec/classes/params_spec.rb +13 -0
  39. data/provision/modules/apt/spec/classes/release_spec.rb +22 -0
  40. data/provision/modules/apt/spec/defines/builddep_spec.rb +18 -0
  41. data/provision/modules/apt/spec/defines/conf_spec.rb +57 -0
  42. data/provision/modules/apt/spec/defines/force_spec.rb +41 -0
  43. data/provision/modules/apt/spec/defines/key_spec.rb +123 -0
  44. data/provision/modules/apt/spec/defines/pin_spec.rb +58 -0
  45. data/provision/modules/apt/spec/defines/ppa_spec.rb +92 -0
  46. data/provision/modules/apt/spec/defines/source_spec.rb +158 -0
  47. data/provision/modules/apt/spec/fixtures/manifests/site.pp +0 -0
  48. data/provision/modules/apt/spec/spec_helper.rb +1 -0
  49. data/provision/modules/apt/templates/pin.pref.erb +5 -0
  50. data/provision/modules/apt/templates/source.list.erb +5 -0
  51. data/provision/modules/apt/tests/builddep.pp +2 -0
  52. data/provision/modules/apt/tests/debian/testing.pp +2 -0
  53. data/provision/modules/apt/tests/debian/unstable.pp +2 -0
  54. data/provision/modules/apt/tests/force.pp +7 -0
  55. data/provision/modules/apt/tests/init.pp +1 -0
  56. data/provision/modules/apt/tests/key.pp +5 -0
  57. data/provision/modules/apt/tests/params.pp +1 -0
  58. data/provision/modules/apt/tests/pin.pp +5 -0
  59. data/provision/modules/apt/tests/ppa.pp +4 -0
  60. data/provision/modules/apt/tests/release.pp +4 -0
  61. data/provision/modules/apt/tests/source.pp +29 -0
  62. data/provision/modules/stdlib/CHANGELOG +177 -0
  63. data/provision/modules/stdlib/LICENSE +19 -0
  64. data/provision/modules/stdlib/Modulefile +11 -0
  65. data/provision/modules/stdlib/README.markdown +929 -0
  66. data/provision/modules/stdlib/README_DEVELOPER.markdown +35 -0
  67. data/provision/modules/stdlib/RELEASE_PROCESS.markdown +24 -0
  68. data/provision/modules/stdlib/Rakefile +2 -0
  69. data/provision/modules/stdlib/lib/facter/pe_version.rb +53 -0
  70. data/provision/modules/stdlib/lib/facter/puppet_vardir.rb +26 -0
  71. data/provision/modules/stdlib/lib/facter/root_home.rb +19 -0
  72. data/provision/modules/stdlib/lib/facter/util/puppet_settings.rb +21 -0
  73. data/provision/modules/stdlib/lib/puppet/parser/functions/abs.rb +36 -0
  74. data/provision/modules/stdlib/lib/puppet/parser/functions/bool2num.rb +49 -0
  75. data/provision/modules/stdlib/lib/puppet/parser/functions/capitalize.rb +34 -0
  76. data/provision/modules/stdlib/lib/puppet/parser/functions/chomp.rb +35 -0
  77. data/provision/modules/stdlib/lib/puppet/parser/functions/chop.rb +37 -0
  78. data/provision/modules/stdlib/lib/puppet/parser/functions/defined_with_params.rb +35 -0
  79. data/provision/modules/stdlib/lib/puppet/parser/functions/delete.rb +46 -0
  80. data/provision/modules/stdlib/lib/puppet/parser/functions/delete_at.rb +49 -0
  81. data/provision/modules/stdlib/lib/puppet/parser/functions/downcase.rb +33 -0
  82. data/provision/modules/stdlib/lib/puppet/parser/functions/empty.rb +28 -0
  83. data/provision/modules/stdlib/lib/puppet/parser/functions/ensure_packages.rb +24 -0
  84. data/provision/modules/stdlib/lib/puppet/parser/functions/ensure_resource.rb +35 -0
  85. data/provision/modules/stdlib/lib/puppet/parser/functions/flatten.rb +33 -0
  86. data/provision/modules/stdlib/lib/puppet/parser/functions/fqdn_rotate.rb +46 -0
  87. data/provision/modules/stdlib/lib/puppet/parser/functions/get_module_path.rb +17 -0
  88. data/provision/modules/stdlib/lib/puppet/parser/functions/getvar.rb +26 -0
  89. data/provision/modules/stdlib/lib/puppet/parser/functions/grep.rb +33 -0
  90. data/provision/modules/stdlib/lib/puppet/parser/functions/has_interface_with.rb +52 -0
  91. data/provision/modules/stdlib/lib/puppet/parser/functions/has_ip_address.rb +25 -0
  92. data/provision/modules/stdlib/lib/puppet/parser/functions/has_ip_network.rb +25 -0
  93. data/provision/modules/stdlib/lib/puppet/parser/functions/has_key.rb +28 -0
  94. data/provision/modules/stdlib/lib/puppet/parser/functions/hash.rb +41 -0
  95. data/provision/modules/stdlib/lib/puppet/parser/functions/is_array.rb +22 -0
  96. data/provision/modules/stdlib/lib/puppet/parser/functions/is_domain_name.rb +47 -0
  97. data/provision/modules/stdlib/lib/puppet/parser/functions/is_float.rb +27 -0
  98. data/provision/modules/stdlib/lib/puppet/parser/functions/is_hash.rb +22 -0
  99. data/provision/modules/stdlib/lib/puppet/parser/functions/is_integer.rb +27 -0
  100. data/provision/modules/stdlib/lib/puppet/parser/functions/is_ip_address.rb +32 -0
  101. data/provision/modules/stdlib/lib/puppet/parser/functions/is_mac_address.rb +27 -0
  102. data/provision/modules/stdlib/lib/puppet/parser/functions/is_numeric.rb +27 -0
  103. data/provision/modules/stdlib/lib/puppet/parser/functions/is_string.rb +26 -0
  104. data/provision/modules/stdlib/lib/puppet/parser/functions/join.rb +41 -0
  105. data/provision/modules/stdlib/lib/puppet/parser/functions/join_keys_to_values.rb +47 -0
  106. data/provision/modules/stdlib/lib/puppet/parser/functions/keys.rb +26 -0
  107. data/provision/modules/stdlib/lib/puppet/parser/functions/loadyaml.rb +20 -0
  108. data/provision/modules/stdlib/lib/puppet/parser/functions/lstrip.rb +33 -0
  109. data/provision/modules/stdlib/lib/puppet/parser/functions/max.rb +13 -0
  110. data/provision/modules/stdlib/lib/puppet/parser/functions/member.rb +44 -0
  111. data/provision/modules/stdlib/lib/puppet/parser/functions/merge.rb +33 -0
  112. data/provision/modules/stdlib/lib/puppet/parser/functions/min.rb +13 -0
  113. data/provision/modules/stdlib/lib/puppet/parser/functions/num2bool.rb +40 -0
  114. data/provision/modules/stdlib/lib/puppet/parser/functions/parsejson.rb +24 -0
  115. data/provision/modules/stdlib/lib/puppet/parser/functions/parseyaml.rb +24 -0
  116. data/provision/modules/stdlib/lib/puppet/parser/functions/pick.rb +29 -0
  117. data/provision/modules/stdlib/lib/puppet/parser/functions/prefix.rb +45 -0
  118. data/provision/modules/stdlib/lib/puppet/parser/functions/range.rb +80 -0
  119. data/provision/modules/stdlib/lib/puppet/parser/functions/reject.rb +31 -0
  120. data/provision/modules/stdlib/lib/puppet/parser/functions/reverse.rb +28 -0
  121. data/provision/modules/stdlib/lib/puppet/parser/functions/rstrip.rb +32 -0
  122. data/provision/modules/stdlib/lib/puppet/parser/functions/shuffle.rb +46 -0
  123. data/provision/modules/stdlib/lib/puppet/parser/functions/size.rb +48 -0
  124. data/provision/modules/stdlib/lib/puppet/parser/functions/sort.rb +27 -0
  125. data/provision/modules/stdlib/lib/puppet/parser/functions/squeeze.rb +36 -0
  126. data/provision/modules/stdlib/lib/puppet/parser/functions/str2bool.rb +41 -0
  127. data/provision/modules/stdlib/lib/puppet/parser/functions/str2saltedsha512.rb +32 -0
  128. data/provision/modules/stdlib/lib/puppet/parser/functions/strftime.rb +107 -0
  129. data/provision/modules/stdlib/lib/puppet/parser/functions/strip.rb +39 -0
  130. data/provision/modules/stdlib/lib/puppet/parser/functions/swapcase.rb +39 -0
  131. data/provision/modules/stdlib/lib/puppet/parser/functions/time.rb +49 -0
  132. data/provision/modules/stdlib/lib/puppet/parser/functions/to_bytes.rb +28 -0
  133. data/provision/modules/stdlib/lib/puppet/parser/functions/type.rb +50 -0
  134. data/provision/modules/stdlib/lib/puppet/parser/functions/unique.rb +51 -0
  135. data/provision/modules/stdlib/lib/puppet/parser/functions/upcase.rb +41 -0
  136. data/provision/modules/stdlib/lib/puppet/parser/functions/uriescape.rb +36 -0
  137. data/provision/modules/stdlib/lib/puppet/parser/functions/validate_absolute_path.rb +56 -0
  138. data/provision/modules/stdlib/lib/puppet/parser/functions/validate_array.rb +33 -0
  139. data/provision/modules/stdlib/lib/puppet/parser/functions/validate_bool.rb +34 -0
  140. data/provision/modules/stdlib/lib/puppet/parser/functions/validate_hash.rb +33 -0
  141. data/provision/modules/stdlib/lib/puppet/parser/functions/validate_re.rb +40 -0
  142. data/provision/modules/stdlib/lib/puppet/parser/functions/validate_slength.rb +52 -0
  143. data/provision/modules/stdlib/lib/puppet/parser/functions/validate_string.rb +33 -0
  144. data/provision/modules/stdlib/lib/puppet/parser/functions/values.rb +39 -0
  145. data/provision/modules/stdlib/lib/puppet/parser/functions/values_at.rb +98 -0
  146. data/provision/modules/stdlib/lib/puppet/parser/functions/zip.rb +65 -0
  147. data/provision/modules/stdlib/lib/puppet/provider/file_line/ruby.rb +59 -0
  148. data/provision/modules/stdlib/lib/puppet/type/anchor.rb +41 -0
  149. data/provision/modules/stdlib/lib/puppet/type/file_line.rb +70 -0
  150. data/provision/modules/stdlib/manifests/init.pp +20 -0
  151. data/provision/modules/stdlib/manifests/stages.pp +43 -0
  152. data/provision/modules/stdlib/spec/functions/defined_with_params_spec.rb +37 -0
  153. data/provision/modules/stdlib/spec/functions/ensure_packages_spec.rb +42 -0
  154. data/provision/modules/stdlib/spec/functions/ensure_resource_spec.rb +40 -0
  155. data/provision/modules/stdlib/spec/monkey_patches/alias_should_to_must.rb +8 -0
  156. data/provision/modules/stdlib/spec/monkey_patches/publicize_methods.rb +10 -0
  157. data/provision/modules/stdlib/spec/spec.opts +6 -0
  158. data/provision/modules/stdlib/spec/spec_helper.rb +28 -0
  159. data/provision/modules/stdlib/spec/unit/facter/pe_version_spec.rb +76 -0
  160. data/provision/modules/stdlib/spec/unit/facter/root_home_spec.rb +40 -0
  161. data/provision/modules/stdlib/spec/unit/facter/util/puppet_settings_spec.rb +35 -0
  162. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/abs_spec.rb +25 -0
  163. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/bool2num_spec.rb +24 -0
  164. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/capitalize_spec.rb +19 -0
  165. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/chomp_spec.rb +19 -0
  166. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/chop_spec.rb +19 -0
  167. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/delete_at_spec.rb +19 -0
  168. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/delete_spec.rb +38 -0
  169. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/downcase_spec.rb +24 -0
  170. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/empty_spec.rb +23 -0
  171. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/flatten_spec.rb +23 -0
  172. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/fqdn_rotate_spec.rb +33 -0
  173. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/get_module_path_spec.rb +46 -0
  174. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/getvar_spec.rb +37 -0
  175. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/grep_spec.rb +19 -0
  176. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/has_interface_with_spec.rb +64 -0
  177. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/has_ip_address_spec.rb +39 -0
  178. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/has_ip_network_spec.rb +36 -0
  179. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/has_key_spec.rb +42 -0
  180. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/hash_spec.rb +19 -0
  181. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/is_array_spec.rb +29 -0
  182. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/is_domain_name_spec.rb +64 -0
  183. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/is_float_spec.rb +29 -0
  184. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/is_hash_spec.rb +29 -0
  185. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/is_integer_spec.rb +29 -0
  186. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/is_ip_address_spec.rb +39 -0
  187. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/is_mac_address_spec.rb +29 -0
  188. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/is_numeric_spec.rb +29 -0
  189. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/is_string_spec.rb +34 -0
  190. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/join_keys_to_values_spec.rb +40 -0
  191. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/join_spec.rb +19 -0
  192. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/keys_spec.rb +21 -0
  193. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/lstrip_spec.rb +19 -0
  194. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/max_spec.rb +23 -0
  195. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/member_spec.rb +24 -0
  196. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/merge_spec.rb +47 -0
  197. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/min_spec.rb +23 -0
  198. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/num2bool_spec.rb +24 -0
  199. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/parsejson_spec.rb +22 -0
  200. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/parseyaml_spec.rb +24 -0
  201. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/pick_spec.rb +34 -0
  202. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/prefix_spec.rb +19 -0
  203. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/range_spec.rb +34 -0
  204. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/reject_spec.rb +20 -0
  205. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/reverse_spec.rb +19 -0
  206. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/rstrip_spec.rb +24 -0
  207. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/shuffle_spec.rb +24 -0
  208. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/size_spec.rb +24 -0
  209. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/sort_spec.rb +24 -0
  210. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/squeeze_spec.rb +24 -0
  211. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/str2bool_spec.rb +24 -0
  212. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/str2saltedsha512_spec.rb +45 -0
  213. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/strftime_spec.rb +29 -0
  214. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/strip_spec.rb +18 -0
  215. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/swapcase_spec.rb +19 -0
  216. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/time_spec.rb +29 -0
  217. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/to_bytes_spec.rb +58 -0
  218. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/type_spec.rb +43 -0
  219. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/unique_spec.rb +24 -0
  220. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/upcase_spec.rb +24 -0
  221. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/uriescape_spec.rb +24 -0
  222. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/validate_absolute_path_spec.rb +83 -0
  223. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/validate_array_spec.rb +38 -0
  224. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/validate_bool_spec.rb +51 -0
  225. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/validate_hash_spec.rb +43 -0
  226. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/validate_re_spec.rb +76 -0
  227. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/validate_slength_spec.rb +48 -0
  228. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/validate_string_spec.rb +60 -0
  229. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/values_at_spec.rb +38 -0
  230. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/values_spec.rb +31 -0
  231. data/provision/modules/stdlib/spec/unit/puppet/parser/functions/zip_spec.rb +15 -0
  232. data/provision/modules/stdlib/spec/unit/puppet/provider/file_line/ruby_spec.rb +127 -0
  233. data/provision/modules/stdlib/spec/unit/puppet/type/anchor_spec.rb +11 -0
  234. data/provision/modules/stdlib/spec/unit/puppet/type/file_line_spec.rb +69 -0
  235. data/provision/modules/stdlib/spec/watchr.rb +86 -0
  236. data/provision/modules/stdlib/tests/file_line.pp +9 -0
  237. data/provision/modules/stdlib/tests/has_interface_with.pp +10 -0
  238. data/provision/modules/stdlib/tests/has_ip_address.pp +3 -0
  239. data/provision/modules/stdlib/tests/has_ip_network.pp +4 -0
  240. data/provision/modules/stdlib/tests/init.pp +1 -0
  241. metadata +291 -0
data/Vagrantfile ADDED
@@ -0,0 +1,25 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ Vagrant::Config.run do |config|
5
+ config.vm.box = "precise32"
6
+
7
+ #forward kiosk ports
8
+
9
+ config.vm.forward_port 9901, 9901
10
+ config.vm.forward_port 9902, 9902
11
+ config.vm.forward_port 9903, 9903
12
+ config.vm.forward_port 9904, 9904
13
+ config.vm.forward_port 9905, 9905
14
+ config.vm.forward_port 9906, 9906
15
+ config.vm.forward_port 9907, 9907
16
+ config.vm.forward_port 9908, 9908
17
+ config.vm.forward_port 9909, 9909
18
+ config.vm.forward_port 9910, 9910
19
+
20
+ config.vm.provision :puppet, :module_path => "provision/modules" do |puppet|
21
+ puppet.manifests_path = "provision/manifests"
22
+ puppet.manifest_file = "default.pp"
23
+ end
24
+ config.vm.provision :shell, :path => "provision/bootstrap.sh"
25
+ end
data/bin/kiosk ADDED
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'kiosk'
4
+ require 'json'
5
+
6
+ def gem_dir
7
+ ServiceKiosk::Kiosk.gem_dir
8
+ end
9
+
10
+ def config
11
+ file = File.read('Kioskfile.json')
12
+ JSON.parse file
13
+ end
14
+
15
+ case ARGV[0]
16
+ when 'plaza:init', 'init'
17
+ boxes = `vagrant box list`
18
+ if(/precise32/m.match boxes)
19
+ puts 'plaza already initialized'
20
+ else
21
+ system 'vagrant init precise32 http://files.vagrantup.com/precise32.box'
22
+ end
23
+
24
+ when 'plaza:up', 'up'
25
+ system 'vagrant up'
26
+
27
+ when 'plaza:down', 'down'
28
+ system 'vagrant destroy'
29
+
30
+ when 'plaza:ssh', 'ssh'
31
+ system 'vagrant ssh'
32
+
33
+ when 'mall:open', 'open'
34
+ exec "vagrant ssh -c 'cd /vagrant/mall; /usr/local/bin/rake kiosk:start'"
35
+
36
+ when 'mall:close', 'close'
37
+ exec "vagrant ssh -c 'cd /vagrant/mall; /usr/local/bin/rake kiosk:stop'"
38
+
39
+ when 'mall:log', 'log'
40
+ exec "vagrant ssh -c 'cd /vagrant/mall; /usr/local/bin/rake kiosk:log'"
41
+
42
+ when 'kiosk:run', 'run'
43
+ env = config['kiosks'][ARGV[1]]['env']
44
+ mall = gem_dir + "/lib/mall.rb"
45
+ dir = Dir.pwd + '/kiosks/' + ARGV[1]
46
+ puts "env: #{env.inspect}"
47
+ puts "mall: #{mall}"
48
+ puts "dir: #{dir}"
49
+ jruby = `which jruby`.strip
50
+ exec(env, "#{jruby} #{mall}", :chdir => dir, :unsetenv_others => true)
51
+
52
+ else
53
+ puts "Usage: $0 {plaza:init|plaza:up|plaza:down|plaza:ssh|mall:open|mall:close|mall:log}"
54
+ end
55
+
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bash
2
+
3
+ foreman start -f ../../lib/Procfile.kiosk -d `pwd`
@@ -0,0 +1 @@
1
+ kiosk: jruby ../../lib/mall.rb
@@ -0,0 +1,59 @@
1
+ require 'json'
2
+ require 'base64'
3
+
4
+ module ServiceKiosk
5
+ class InternalService
6
+ def initialize(kiosk, service)
7
+ @service = connect(kiosk, service)
8
+ end
9
+
10
+ def connect(kiosk, service)
11
+ kiosk_class = class_from_string(class_name_from_locator(kiosk, service))
12
+ kiosk_class.new
13
+ end
14
+
15
+ def class_name_from_locator(kiosk_locator, service_name)
16
+ #puts ">>> locator: #{kiosk_locator}, svc: #{service_name}"
17
+ parts = /ruby:\/\/\/(?<kiosk_name>[\w\.]*)/.match(kiosk_locator)
18
+ name = service_name
19
+ if parts[:kiosk_name]
20
+ kiosk_name = parts[:kiosk_name].gsub('.', '::')
21
+ name = kiosk_name + '::' + name
22
+ end
23
+ end
24
+
25
+ def class_from_string(str)
26
+ #puts ">>> internal kiosk: class from str: #{str}"
27
+ str.split('::').inject(Object) do |mod, class_name|
28
+ mod.const_get(class_name)
29
+ end
30
+ end
31
+
32
+ def call(action, input={})
33
+ input_json = input.to_json
34
+ #puts ">>> kiosk call: #{action} -> #{input_json}" if ENV[LOGGER_LEVEL].to_i < 1
35
+ response = @service.method(action.to_sym).call(JSON.parse input_json)
36
+ JSON.parse response.to_json
37
+ end
38
+
39
+ def list(input={})
40
+ call('list', input)
41
+ end
42
+
43
+ def read(input={})
44
+ call('read', input)
45
+ end
46
+
47
+ def create(input={})
48
+ call('create', input)
49
+ end
50
+
51
+ def update(input={})
52
+ call('update', input)
53
+ end
54
+
55
+ def delete(input={})
56
+ call('delete', input)
57
+ end
58
+ end
59
+ end
Binary file
data/lib/kiosk.rb ADDED
@@ -0,0 +1,57 @@
1
+ require_relative 'internal_service'
2
+ require_relative 'remote_service'
3
+
4
+ # built-in internal kiosks
5
+ Dir["#{File.dirname(__FILE__)}/kiosks/**/*.rb"].each { |f| require(f) }
6
+
7
+ module ServiceKiosk
8
+ class Kiosk
9
+ @@kiosks = {}
10
+
11
+ def self.open(handle_raw)
12
+ handle = handle_raw.upcase
13
+ kiosk = @@kiosks[handle]
14
+ if kiosk.nil?
15
+ locator = ENV['KIOSK_' + handle]
16
+ kiosk = @@kiosks[handle] = ServiceKiosk::Kiosk.new locator if locator
17
+ end
18
+ raise "No '#{handle}' kiosk found" unless kiosk
19
+ kiosk
20
+ end
21
+
22
+ def self.register(handle, locator)
23
+ @@kiosks[handle.upcase] = ServiceKiosk::Kiosk.new locator
24
+ end
25
+
26
+ def self.gem_dir
27
+ spec = Gem::Specification.find_by_name("service_kiosk")
28
+ #gem_root = spec.gem_dir
29
+ #gem_lib = gem_root + "/lib"
30
+ spec.gem_dir
31
+ end
32
+
33
+ def initialize(id)
34
+ @id = id
35
+ @is_remote = is_remote
36
+ end
37
+
38
+ def service(name)
39
+ if @is_remote
40
+ ServiceKiosk::RemoteService.new @id, name
41
+ else
42
+ ServiceKiosk::InternalService.new @id, name
43
+ end
44
+ end
45
+
46
+ def is_remote
47
+ /^http/.match @id
48
+ end
49
+
50
+ # internal default kiosks
51
+ register('logger', 'ruby:///OutputLogger')
52
+
53
+ end
54
+
55
+ end
56
+
57
+ Dir[ServiceKiosk::Kiosk.gem_dir + "/lib/tasks/**/*.rake"].each { |ext| puts "loading #{ext}"; load ext } if defined?(Rake)
@@ -0,0 +1,16 @@
1
+ module OutputLogger
2
+ class Logger
3
+ def log(input={})
4
+ input.each {|level,text| output(level, text)}
5
+ {}
6
+ end
7
+
8
+ def output(level, text)
9
+ puts ts + " #{level.upcase} | " + text
10
+ end
11
+
12
+ def ts
13
+ Time.now.strftime('%H:%M:%S')
14
+ end
15
+ end
16
+ end
data/lib/mall.rb ADDED
@@ -0,0 +1,77 @@
1
+ require 'base64'
2
+ require 'sinatra'
3
+ require 'json'
4
+
5
+ def gem_dir
6
+ spec = Gem::Specification.find_by_name("service_kiosk")
7
+ spec.gem_dir
8
+ end
9
+
10
+ require gem_dir + '/lib/json-simple-1.1.1.jar'
11
+
12
+ java_import org.json.simple.JSONValue
13
+
14
+ Dir["#{File.dirname(__FILE__)}/**/*.rb"].each { |f| require(f) }
15
+ Dir["#{File.dirname(__FILE__)}/kiosks/**/*.rb"].each { |f| require(f) }
16
+ Dir["#{Dir.pwd}/lib/**/*.rb"].each { |f| require(f) }
17
+ Dir["#{Dir.pwd}/lib/**/*.jar"].each { |f| require(f) }
18
+
19
+ host = /inet addr:(\S+)/m.match(`ifconfig eth0`)[1]
20
+ set :bind, host
21
+ set :port, ENV['KIOSK_PORT']
22
+
23
+
24
+ ## New style
25
+ post '/:kiosk_name/:service/:action' do
26
+ begin
27
+ data = json_parse(Base64.decode64(params[:data]))
28
+ debug "mall: #{params[:kiosk_name]}.#{params[:service]}.#{params[:action]} with input: " + to_json(data)
29
+ results = kiosk(params[:kiosk_name], params[:service]).method(params[:action].to_sym).call(data)
30
+ rescue Exception => e
31
+ results = {"_ERROR_" => e.message + "\n" + e.backtrace.inspect}
32
+ end
33
+ json_results = to_json results
34
+ debug " results: #{json_results}"
35
+ Base64.encode64 json_results
36
+ end
37
+
38
+ def class_from_string(str)
39
+ str.split('::').inject(Object) do |mod, class_name|
40
+ mod.const_get(class_name)
41
+ end
42
+ end
43
+
44
+ def is_java?
45
+ ENV['KIOSK_TYPE'] == 'java'
46
+ end
47
+
48
+ def kiosk(kiosk_name, service)
49
+ if is_java?
50
+ java_import(kiosk_name + '.' + service)[0].new
51
+ else
52
+ class_from_string("#{kiosk_name}::#{service}").new
53
+ end
54
+ end
55
+
56
+ def to_json(input)
57
+ if is_java?
58
+ JSONValue.toJSONString input
59
+ else
60
+ input.to_json
61
+ end
62
+ end
63
+
64
+ def json_parse(input)
65
+ return nil unless input
66
+ if is_java?
67
+ JSONValue.parse input
68
+ else
69
+ JSON.parse input
70
+ end
71
+ end
72
+
73
+ def debug(message)
74
+ @log = ServiceKiosk::Kiosk.open('logger').service('Logger') unless @log
75
+ @log.call('log', {'debug' => message})
76
+ end
77
+
data/lib/mallcop.rb ADDED
@@ -0,0 +1,9 @@
1
+ procfile = ''
2
+ count = 1
3
+ Dir["#{Dir.pwd}/kiosks/*"].each do |kiosk|
4
+ handle = /\/([^\/]+)$/.match(kiosk)[1]
5
+ puts kiosk + ' -> ' + handle
6
+ procfile << %Q[#{handle}: kiosk kiosk:run #{kiosk} 990#{count}\n]
7
+ count += 1
8
+ end
9
+ File.open('./Procfile', 'w') { |file| file.write(procfile) }
@@ -0,0 +1,61 @@
1
+ require_relative 'kiosk'
2
+ require 'json'
3
+ require 'base64'
4
+ require 'rest_client'
5
+ require 'open-uri'
6
+
7
+ module ServiceKiosk
8
+ class RemoteService
9
+ def initialize(kiosk, service)
10
+ @endpoint = external_host(kiosk + '/' + service)
11
+ @logger = ServiceKiosk::Kiosk.open('logger').service('Logger') unless @logger
12
+ debug "remote service wants to use a logger: " + @logger.inspect
13
+ end
14
+
15
+ def url(id=nil, input=nil)
16
+ @endpoint + (id ? ('/' + id) : '') + (input ? '?data=' + CGI::escape(input.to_json) : '')
17
+ end
18
+
19
+ def action_url(action)
20
+ @endpoint + '/' + action
21
+ end
22
+
23
+ def external_host(id)
24
+ # TODO: this hack is to correct the fact that sinatra using jruby on vbox ubuntu won't
25
+ # bind properly to all interfaces 0.0.0.0
26
+ host = /inet addr:(\S+)/m.match(`ifconfig eth0`)[1]
27
+ id.sub('localhost', host)
28
+ end
29
+
30
+ def call(action, input={})
31
+ input_json = input.to_json
32
+ debug "kiosk call: #{action} -> #{input_json}"
33
+ response = RestClient.post action_url(action), {data: Base64.encode64(input_json)}
34
+ JSON.parse Base64.decode64(response)
35
+ end
36
+
37
+ def list(input={})
38
+ call('list', input)
39
+ end
40
+
41
+ def read(input={})
42
+ call('read', input)
43
+ end
44
+
45
+ def create(input={})
46
+ call('create', input)
47
+ end
48
+
49
+ def update(input={})
50
+ call('update', input)
51
+ end
52
+
53
+ def delete(input={})
54
+ call('delete', input)
55
+ end
56
+
57
+ def debug(message)
58
+ @logger.call('log', {'debug' => message})
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,93 @@
1
+ namespace :kiosk do
2
+ task :init do
3
+ boxes = `vagrant box list`
4
+ if(/precise32/m.match boxes)
5
+ puts 'box precise32 already defined.'
6
+ else
7
+ system 'vagrant init precise32 http://files.vagrantup.com/precise32.box'
8
+ end
9
+ end
10
+
11
+ task :up do
12
+ system 'vagrant up'
13
+ end
14
+
15
+ task :destroy do
16
+ system 'vagrant destroy'
17
+ end
18
+
19
+ task :mall_start do
20
+ exec "vagrant ssh -c 'cd /vagrant/mall; /usr/local/bin/rake start'"
21
+ end
22
+
23
+ task :mall_log do
24
+ exec "vagrant ssh -c 'cd /vagrant/mall; /usr/local/bin/rake log'"
25
+ end
26
+
27
+ task :mall_stop do
28
+ exec "vagrant ssh -c 'cd /vagrant/mall; /usr/local/bin/rake stop'"
29
+ end
30
+
31
+ task :start do
32
+ unless mall_running?
33
+ unless pid = fork
34
+ write_procfile
35
+ exec "foreman start > log/foreman.log 2>&1 & echo $! > log/pid"
36
+ end
37
+ sleep 0.1
38
+ puts "Mall is opening (pid: #{mall_pid})"
39
+ else
40
+ puts "Mall already opened (pid: #{mall_pid})"
41
+ end
42
+ end
43
+
44
+ task :stop do
45
+ if mall_running?
46
+ group = `ps axj`.match(/\d+\s+#{mall_pid}\s+(\d+).*foreman/m)[1]
47
+ system "pkill -g #{group}"
48
+ File.delete pidfile
49
+ File.delete './Procfile'
50
+ puts "Mall is closing..."
51
+ else
52
+ puts "Mall already closed"
53
+ end
54
+ end
55
+
56
+ task :log do
57
+ exec "tail -n 200 --pid=#{mall_pid} -f log/foreman.log"
58
+ end
59
+
60
+ task :mallcop do
61
+ exec "jruby #{gem_dir}/lib/mallcop.rb"
62
+ end
63
+
64
+ def mall_pid
65
+ File.read(pidfile).strip
66
+ end
67
+
68
+ def mall_running?
69
+ File.exists?(pidfile)
70
+ end
71
+
72
+ def pidfile
73
+ 'log/pid'
74
+ end
75
+
76
+ def gem_dir
77
+ spec = Gem::Specification.find_by_name("service_kiosk")
78
+ spec.gem_dir
79
+ end
80
+
81
+ def write_procfile
82
+ File.open('./Procfile', 'w') {|f| f.write(procfile) }
83
+ end
84
+
85
+ def procfile
86
+ result = ''
87
+ Dir["#{Dir.pwd}/kiosks/*"].each do |kiosk|
88
+ handle = /\/([^\/]+)$/.match(kiosk)[1]
89
+ result << %Q[#{handle}: kiosk kiosk:run #{handle}\n]
90
+ end
91
+ result
92
+ end
93
+ end
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env bash
2
+
3
+ apt-get update
4
+ apt-get install -y git
5
+ apt-get install -y ruby1.9.3
6
+ apt-get install -y cucumber
7
+ gem install rake
8
+ gem install rest-client
9
+ gem install rspec
10
+ gem install service_kiosk
11
+ gem install foreman
12
+ wget --quiet http://jruby.org.s3.amazonaws.com/downloads/1.7.3/jruby-bin-1.7.3.tar.gz
13
+ tar zxf jruby-bin-1.7.3.tar.gz
14
+ echo "export PATH=\${PATH}:/home/vagrant/jruby-1.7.3/bin" >> /home/vagrant/.profile
15
+ export PATH="${PATH}:/home/vagrant/jruby-1.7.3/bin"
16
+ jruby -S gem install sinatra
17
+ jruby -S gem install cucumber
18
+ jruby -S gem install rspec
19
+ jruby -S gem install mime-types
20
+ jruby -S gem install rest-client
21
+ jruby -S gem install service_kiosk
@@ -0,0 +1,49 @@
1
+ define append_if_no_such_line($file, $line, $refreshonly = 'false') {
2
+ exec { "/bin/echo '$line' >> '$file'":
3
+ unless => "/bin/grep -Fxqe '$line' '$file'",
4
+ path => "/bin",
5
+ refreshonly => $refreshonly,
6
+ }
7
+ }
8
+
9
+ class must-have {
10
+ include apt
11
+ apt::ppa { "ppa:webupd8team/java": }
12
+
13
+ exec { 'apt-get update':
14
+ command => '/usr/bin/apt-get update',
15
+ before => Apt::Ppa["ppa:webupd8team/java"],
16
+ }
17
+
18
+ exec { 'apt-get update 2':
19
+ command => '/usr/bin/apt-get update',
20
+ require => [ Apt::Ppa["ppa:webupd8team/java"], Package["git-core"] ],
21
+ }
22
+
23
+ package { ["vim",
24
+ "curl",
25
+ "git-core",
26
+ "bash"]:
27
+ ensure => present,
28
+ require => Exec["apt-get update"],
29
+ before => Apt::Ppa["ppa:webupd8team/java"],
30
+ }
31
+
32
+ package { ["oracle-java7-installer"]:
33
+ ensure => present,
34
+ require => Exec["apt-get update 2"],
35
+ }
36
+
37
+ exec {
38
+ "accept_license":
39
+ command => "echo debconf shared/accepted-oracle-license-v1-1 select true | sudo debconf-set-selections && echo debconf shared/accepted-oracle-license-v1-1 seen true | sudo debconf-set-selections",
40
+ cwd => "/home/vagrant",
41
+ user => "vagrant",
42
+ path => "/usr/bin/:/bin/",
43
+ require => Package["curl"],
44
+ before => Package["oracle-java7-installer"],
45
+ logoutput => true,
46
+ }
47
+ }
48
+
49
+ include must-have
@@ -0,0 +1,83 @@
1
+ 2012-05-25 Puppet Labs <info@puppetlabs.com> - 0.0.4
2
+ * Fix ppa list filename when there is a period in the PPA name
3
+ * Add .pref extension to apt preferences files
4
+ * Allow preferences to be purged
5
+ * Extend pin support
6
+
7
+ 2012-05-04 Puppet Labs <info@puppetlabs.com> - 0.0.3
8
+ * only invoke apt-get update once
9
+ * only install python-software-properties if a ppa is added
10
+ * support 'ensure => absent' for all defined types
11
+ * add apt::conf
12
+ * add apt::backports
13
+ * fixed Modulefile for module tool dependency resolution
14
+ * configure proxy before doing apt-get update
15
+ * use apt-get update instead of aptitude for apt::ppa
16
+ * add support to pin release
17
+
18
+
19
+ 2012-03-26 Puppet Labs <info@puppetlabs.com> - 0.0.2
20
+ 41cedbb (#13261) Add real examples to smoke tests.
21
+ d159a78 (#13261) Add key.pp smoke test
22
+ 7116c7a (#13261) Replace foo source with puppetlabs source
23
+ 1ead0bf Ignore pkg directory.
24
+ 9c13872 (#13289) Fix some more style violations
25
+ 0ea4ffa (#13289) Change test scaffolding to use a module & manifest dir fixture path
26
+ a758247 (#13289) Clean up style violations and fix corresponding tests
27
+ 99c3fd3 (#13289) Add puppet lint tests to Rakefile
28
+ 5148cbf (#13125) Apt keys should be case insensitive
29
+ b9607a4 Convert apt::key to use anchors
30
+
31
+ 2012-03-07 Puppet Labs <info@puppetlabs.com> - 0.0.1
32
+ d4fec56 Modify apt::source release parameter test
33
+ 1132a07 (#12917) Add contributors to README
34
+ 8cdaf85 (#12823) Add apt::key defined type and modify apt::source to use it
35
+ 7c0d10b (#12809) $release should use $lsbdistcodename and fall back to manual input
36
+ be2cc3e (#12522) Adjust spec test for splitting purge
37
+ 7dc60ae (#12522) Split purge option to spare sources.list
38
+ 9059c4e Fix source specs to test all key permutations
39
+ 8acb202 Add test for python-software-properties package
40
+ a4af11f Check if python-software-properties is defined before attempting to define it.
41
+ 1dcbf3d Add tests for required_packages change
42
+ f3735d2 Allow duplicate $required_packages
43
+ 74c8371 (#12430) Add tests for changes to apt module
44
+ 97ebb2d Test two sources with the same key
45
+ 1160bcd (#12526) Add ability to reverse apt { disable_keys => true }
46
+ 2842d73 Add Modulefile to puppet-apt
47
+ c657742 Allow the use of the same key in multiple sources
48
+ 8c27963 (#12522) Adding purge option to apt class
49
+ 997c9fd (#12529) Add unit test for apt proxy settings
50
+ 50f3cca (#12529) Add parameter to support setting a proxy for apt
51
+ d522877 (#12094) Replace chained .with_* with a hash
52
+ 8cf1bd0 (#12094) Remove deprecated spec.opts file
53
+ 2d688f4 (#12094) Add rspec-puppet tests for apt
54
+ 0fb5f78 (#12094) Replace name with path in file resources
55
+ f759bc0 (#11953) Apt::force passes $version to aptitude
56
+ f71db53 (#11413) Add spec test for apt::force to verify changes to unless
57
+ 2f5d317 (#11413) Update dpkg query used by apt::force
58
+ cf6caa1 (#10451) Add test coverage to apt::ppa
59
+ 0dd697d include_src parameter in example; Whitespace cleanup
60
+ b662eb8 fix typos in "repositories"
61
+ 1be7457 Fix (#10451) - apt::ppa fails to "apt-get update" when new PPA source is added
62
+ 864302a Set the pin priority before adding the source (Fix #10449)
63
+ 1de4e0a Refactored as per mlitteken
64
+ 1af9a13 Added some crazy bash madness to check if the ppa is installed already. Otherwise the manifest tries to add it on every run!
65
+ 52ca73e (#8720) Replace Apt::Ppa with Apt::Builddep
66
+ 5c05fa0 added builddep command.
67
+ a11af50 added the ability to specify the content of a key
68
+ c42db0f Fixes ppa test.
69
+ 77d2b0d reformatted whitespace to match recommended style of 2 space indentation.
70
+ 27ebdfc ignore swap files.
71
+ 377d58a added smoke tests for module.
72
+ 18f614b reformatted apt::ppa according to recommended style.
73
+ d8a1e4e Created a params class to hold global data.
74
+ 636ae85 Added two params for apt class
75
+ 148fc73 Update LICENSE.
76
+ ed2d19e Support ability to add more than one PPA
77
+ 420d537 Add call to apt-update after add-apt-repository in apt::ppa
78
+ 945be77 Add package definition for python-software-properties
79
+ 71fc425 Abs paths for all commands
80
+ 9d51cd1 Adding LICENSE
81
+ 71796e3 Heading fix in README
82
+ 87777d8 Typo in README
83
+ f848bac First commit
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2011 Evolving Web Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
@@ -0,0 +1,14 @@
1
+ name 'puppetlabs-apt'
2
+ version '1.1.0'
3
+ source 'https://github.com/puppetlabs/puppetlabs-apt'
4
+ author 'Evolving Web / Puppet Labs'
5
+ license 'Apache License 2.0'
6
+ summary 'Puppet Labs Apt Module'
7
+ description 'APT Module for Puppet'
8
+ project_page 'https://github.com/puppetlabs/puppetlabs-apt'
9
+
10
+ ## Add dependencies, if any:
11
+ #dependency 'puppetlabs/stdlib', '2.x'
12
+ # The dependency should be written as above but librarian-puppet
13
+ # does not support the expression as the PMT does.
14
+ dependency 'puppetlabs/stdlib', '>= 2.2.1'