PackerFiles 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/PackerFiles.gemspec +36 -0
  6. data/README.md +32 -0
  7. data/Rakefile +21 -0
  8. data/bin/pkf +5 -0
  9. data/lib/PackerFiles/CLI/OS.rb +44 -0
  10. data/lib/PackerFiles/CLI/Root.rb +41 -0
  11. data/lib/PackerFiles/Core/Base.rb +23 -0
  12. data/lib/PackerFiles/Core/CDImage.rb +185 -0
  13. data/lib/PackerFiles/Core/Disk.rb +135 -0
  14. data/lib/PackerFiles/Core/Exceptions.rb +65 -0
  15. data/lib/PackerFiles/Core/Hypervisor.rb +96 -0
  16. data/lib/PackerFiles/Core/Keyboard.rb +38 -0
  17. data/lib/PackerFiles/Core/Locale.rb +62 -0
  18. data/lib/PackerFiles/Core/LogicalVolume.rb +41 -0
  19. data/lib/PackerFiles/Core/Network.rb +67 -0
  20. data/lib/PackerFiles/Core/Packages.rb +30 -0
  21. data/lib/PackerFiles/Core/Partition.rb +41 -0
  22. data/lib/PackerFiles/Core/TimeZone.rb +45 -0
  23. data/lib/PackerFiles/Core/User.rb +46 -0
  24. data/lib/PackerFiles/Core/VolumeGroup.rb +50 -0
  25. data/lib/PackerFiles/Core/example/CDImage.txt +75 -0
  26. data/lib/PackerFiles/Core/example/Disk.txt +29 -0
  27. data/lib/PackerFiles/Core/example/Hypervisor.txt +111 -0
  28. data/lib/PackerFiles/Core/example/Keyboard.txt +28 -0
  29. data/lib/PackerFiles/Core/example/Locale.txt +31 -0
  30. data/lib/PackerFiles/Core/example/Network.txt +68 -0
  31. data/lib/PackerFiles/Core/example/Packages.txt +22 -0
  32. data/lib/PackerFiles/Core/example/TimeZone.txt +36 -0
  33. data/lib/PackerFiles/Core/example/User.txt +48 -0
  34. data/lib/PackerFiles/OS/Builder.rb +116 -0
  35. data/lib/PackerFiles/OS/CentOS/CD.rb +81 -0
  36. data/lib/PackerFiles/OS/CentOS/Kickstart.rb +64 -0
  37. data/lib/PackerFiles/OS/CentOS/Server.rb +170 -0
  38. data/lib/PackerFiles/OS/CentOS/Templates/Base_erb.rb +4 -0
  39. data/lib/PackerFiles/OS/CentOS/Templates/Disk_erb.rb +35 -0
  40. data/lib/PackerFiles/OS/CentOS/Templates/Keyboard_erb.rb +4 -0
  41. data/lib/PackerFiles/OS/CentOS/Templates/Locale_erb.rb +4 -0
  42. data/lib/PackerFiles/OS/CentOS/Templates/Network_erb.rb +17 -0
  43. data/lib/PackerFiles/OS/CentOS/Templates/Packages_erb.rb +34 -0
  44. data/lib/PackerFiles/OS/CentOS/Templates/Tail_erb.rb +15 -0
  45. data/lib/PackerFiles/OS/CentOS/Templates/TimeZone_erb.rb +10 -0
  46. data/lib/PackerFiles/OS/CentOS/Templates/User_erb.rb +20 -0
  47. data/lib/PackerFiles/OS/CentOS/Templates/boot_command_erb.rb +16 -0
  48. data/lib/PackerFiles/OS/CentOS/Templates/command_as_root_erb.rb +1 -0
  49. data/lib/PackerFiles/OS/CentOS/Templates/disable_root_erb.rb +1 -0
  50. data/lib/PackerFiles/OS/CentOS/Templates/enable_root_erb.rb +1 -0
  51. data/lib/PackerFiles/OS/CentOS/Templates/shutdown_command_erb.rb +1 -0
  52. data/lib/PackerFiles/OS/Debian/Apt.rb +42 -0
  53. data/lib/PackerFiles/OS/Debian/CD.rb +65 -0
  54. data/lib/PackerFiles/OS/Debian/Mirrors.rb +73 -0
  55. data/lib/PackerFiles/OS/Debian/Preseed.rb +64 -0
  56. data/lib/PackerFiles/OS/Debian/Server.rb +169 -0
  57. data/lib/PackerFiles/OS/Debian/Templates/Apt_erb.rb +18 -0
  58. data/lib/PackerFiles/OS/Debian/Templates/Disk_erb.rb +69 -0
  59. data/lib/PackerFiles/OS/Debian/Templates/Keyboard_erb.rb +5 -0
  60. data/lib/PackerFiles/OS/Debian/Templates/Locale_erb.rb +7 -0
  61. data/lib/PackerFiles/OS/Debian/Templates/Mirrors_erb.rb +9 -0
  62. data/lib/PackerFiles/OS/Debian/Templates/Network_erb.rb +19 -0
  63. data/lib/PackerFiles/OS/Debian/Templates/Packages_erb.rb +6 -0
  64. data/lib/PackerFiles/OS/Debian/Templates/TimeZone_erb.rb +6 -0
  65. data/lib/PackerFiles/OS/Debian/Templates/User_erb.rb +14 -0
  66. data/lib/PackerFiles/OS/Debian/Templates/boot_command_erb.rb +24 -0
  67. data/lib/PackerFiles/OS/Debian/Templates/command_as_root_erb.rb +1 -0
  68. data/lib/PackerFiles/OS/Debian/Templates/disable_root_erb.rb +5 -0
  69. data/lib/PackerFiles/OS/Debian/Templates/enable_root_erb.rb +1 -0
  70. data/lib/PackerFiles/OS/Debian/Templates/shutdown_command_erb.rb +1 -0
  71. data/lib/PackerFiles/OS/Debian/example/Apt.txt +55 -0
  72. data/lib/PackerFiles/OS/DocGenerator.rb +51 -0
  73. data/lib/PackerFiles/OS/Finder.rb +96 -0
  74. data/lib/PackerFiles/OS/RHEL/CD.rb +32 -0
  75. data/lib/PackerFiles/OS/RHEL/Fedora.rb +59 -0
  76. data/lib/PackerFiles/OS/RHEL/FedoraCD.rb +68 -0
  77. data/lib/PackerFiles/OS/RHEL/Server.rb +32 -0
  78. data/lib/PackerFiles/OS/RHEL/Templates/Fedora_Tail_erb.rb +14 -0
  79. data/lib/PackerFiles/OS/RHEL/Templates/boot_command_fedora_erb.rb +16 -0
  80. data/lib/PackerFiles/OS/SUSE/Templates/Base_erb.xml +32 -0
  81. data/lib/PackerFiles/OS/SUSE/Templates/Disk_erb.xml +110 -0
  82. data/lib/PackerFiles/OS/SUSE/Templates/Keyboard_erb.xml +7 -0
  83. data/lib/PackerFiles/OS/SUSE/Templates/Locale_erb.xml +18 -0
  84. data/lib/PackerFiles/OS/SUSE/Templates/Network_erb.xml +143 -0
  85. data/lib/PackerFiles/OS/SUSE/Templates/Packages_erb.xml +29 -0
  86. data/lib/PackerFiles/OS/SUSE/Templates/Tail_erb.xml +4 -0
  87. data/lib/PackerFiles/OS/SUSE/Templates/TimeZone_erb.xml +15 -0
  88. data/lib/PackerFiles/OS/SUSE/Templates/User_erb.xml +57 -0
  89. data/lib/PackerFiles/OS/SUSE/Templates/boot_command_erb.rb +23 -0
  90. data/lib/PackerFiles/OS/SUSE/Templates/command_as_root_erb.rb +1 -0
  91. data/lib/PackerFiles/OS/SUSE/Templates/disable_root_erb.rb +1 -0
  92. data/lib/PackerFiles/OS/SUSE/Templates/enable_root_erb.rb +1 -0
  93. data/lib/PackerFiles/OS/SUSE/Templates/shutdown_command_erb.rb +1 -0
  94. data/lib/PackerFiles/OS/Ubuntu/CD.rb +81 -0
  95. data/lib/PackerFiles/OS/Ubuntu/Desktop.rb +50 -0
  96. data/lib/PackerFiles/OS/Ubuntu/DesktopCD.rb +16 -0
  97. data/lib/PackerFiles/OS/Ubuntu/Mirrors.rb +103 -0
  98. data/lib/PackerFiles/OS/Ubuntu/Server.rb +78 -0
  99. data/lib/PackerFiles/OS/Ubuntu/Templates/Apt_erb.rb +18 -0
  100. data/lib/PackerFiles/OS/Ubuntu/Templates/boot_command_desktop_erb.rb +36 -0
  101. data/lib/PackerFiles/OS/Ubuntu/Templates/boot_command_erb.rb +30 -0
  102. data/lib/PackerFiles/OS/Ubuntu/Templates/ubiquity_erb.rb +8 -0
  103. data/lib/PackerFiles/OS/example/Doc.txt +8 -0
  104. data/lib/PackerFiles/Provision/Base.rb +20 -0
  105. data/lib/PackerFiles/Provision/ChefSolo.rb +90 -0
  106. data/lib/PackerFiles/Provision/ChefSoloHelper.rb +72 -0
  107. data/lib/PackerFiles/Provision/Copy.rb +22 -0
  108. data/lib/PackerFiles/Provision/ExternalScript.rb +43 -0
  109. data/lib/PackerFiles/Provision/InlineScript.rb +37 -0
  110. data/lib/PackerFiles/Provision/Provisioners.rb +87 -0
  111. data/lib/PackerFiles/Provision/example/Provisioners.txt +21 -0
  112. data/lib/PackerFiles/Utils/AutoZone.rb +96 -0
  113. data/lib/PackerFiles/Utils/FastestURL.rb +73 -0
  114. data/lib/PackerFiles/Utils/Generator.rb +34 -0
  115. data/lib/PackerFiles/Utils/HashSerializer.rb +110 -0
  116. data/lib/PackerFiles/Utils/Size.rb +44 -0
  117. data/lib/PackerFiles/Utils/TypeAccessor.rb +71 -0
  118. data/lib/PackerFiles/Virtual/Hypervisors.rb +72 -0
  119. data/lib/PackerFiles/Virtual/KVM.rb +119 -0
  120. data/lib/PackerFiles/Virtual/KVMConverter.rb +79 -0
  121. data/lib/PackerFiles/Virtual/VMWare.rb +108 -0
  122. data/lib/PackerFiles/Virtual/VMWareConverter.rb +78 -0
  123. data/lib/PackerFiles/Virtual/VirtualBox.rb +98 -0
  124. data/lib/PackerFiles/Virtual/VirtualBoxConverter.rb +75 -0
  125. data/lib/PackerFiles/Virtual/example/Hypervisors.txt +23 -0
  126. data/lib/PackerFiles/version.rb +3 -0
  127. data/lib/PackerFiles.rb +44 -0
  128. data/spec/core/builder_spec.rb +84 -0
  129. data/spec/core/cdimage_spec.rb +159 -0
  130. data/spec/core/disk_spec.rb +191 -0
  131. data/spec/core/keyboard_spec.rb +36 -0
  132. data/spec/core/locale_spec.rb +73 -0
  133. data/spec/core/network_spec.rb +96 -0
  134. data/spec/core/packages_spec.rb +18 -0
  135. data/spec/core/timezone_spec.rb +43 -0
  136. data/spec/core/user_spec.rb +44 -0
  137. data/spec/core/volume_group_spec.rb +53 -0
  138. data/spec/os/centos/cd_spec.rb +12 -0
  139. data/spec/os/centos/data/Server-Script-Provisioner.rb +57 -0
  140. data/spec/os/centos/data/Server.rb +55 -0
  141. data/spec/os/centos/data/chef-solo-provisioner.rb +58 -0
  142. data/spec/os/centos/finder_spec.rb +22 -0
  143. data/spec/os/centos/templates/boot_command_spec.rb +57 -0
  144. data/spec/os/centos/templates/disk_spec.rb +79 -0
  145. data/spec/os/centos/templates/keyboard_spec.rb +18 -0
  146. data/spec/os/centos/templates/locale_spec.rb +26 -0
  147. data/spec/os/centos/templates/network_spec.rb +38 -0
  148. data/spec/os/centos/templates/packages_spec.rb +18 -0
  149. data/spec/os/centos/templates/timezone_spec.rb +37 -0
  150. data/spec/os/centos/templates/user_spec.rb +24 -0
  151. data/spec/os/debian/apt_spec.rb +50 -0
  152. data/spec/os/debian/cd_spec.rb +30 -0
  153. data/spec/os/debian/data/7zip.tar.gz +0 -0
  154. data/spec/os/debian/data/All-sections.rb +60 -0
  155. data/spec/os/debian/data/Chef-Solo-Provisioner.rb +60 -0
  156. data/spec/os/debian/data/Copy-Provisioner.rb +61 -0
  157. data/spec/os/debian/data/External-Script-Provisioner.rb +69 -0
  158. data/spec/os/debian/data/Missing-CDImage.rb +53 -0
  159. data/spec/os/debian/data/Missing-VMWare-KVM-sections.rb +51 -0
  160. data/spec/os/debian/data/Missing-sections.rb +53 -0
  161. data/spec/os/debian/data/Script-Provisioner.rb +62 -0
  162. data/spec/os/debian/data/chef-solo-cookbooks/git_setup/Berksfile.lock +32 -0
  163. data/spec/os/debian/data/chef-solo-cookbooks/git_setup/README.md +81 -0
  164. data/spec/os/debian/data/chef-solo-cookbooks/git_setup/attributes/default.rb +3 -0
  165. data/spec/os/debian/data/chef-solo-cookbooks/git_setup/metadata.rb +11 -0
  166. data/spec/os/debian/data/chef-solo-cookbooks/git_setup/recipes/default.rb +30 -0
  167. data/spec/os/debian/data/chef-solo.json +5 -0
  168. data/spec/os/debian/data/test-script.sh +4 -0
  169. data/spec/os/debian/finder_spec.rb +59 -0
  170. data/spec/os/debian/mirrors_spec.rb +18 -0
  171. data/spec/os/debian/preseed_spec.rb +56 -0
  172. data/spec/os/debian/server_spec.rb +59 -0
  173. data/spec/os/debian/templates/apt_spec.rb +20 -0
  174. data/spec/os/debian/templates/boot_command_spec.rb +56 -0
  175. data/spec/os/debian/templates/disk_spec.rb +81 -0
  176. data/spec/os/debian/templates/keyboard_spec.rb +18 -0
  177. data/spec/os/debian/templates/locale_spec.rb +36 -0
  178. data/spec/os/debian/templates/mirrors_spec.rb +16 -0
  179. data/spec/os/debian/templates/network_spec.rb +38 -0
  180. data/spec/os/debian/templates/packages_spec.rb +17 -0
  181. data/spec/os/debian/templates/timezone_spec.rb +36 -0
  182. data/spec/os/debian/templates/user_spec.rb +25 -0
  183. data/spec/os/finder_spec.rb +21 -0
  184. data/spec/os/rhel/data/Fedora.rb +45 -0
  185. data/spec/os/rhel/data/Server-Custom.rb +54 -0
  186. data/spec/os/rhel/data/Server.rb +45 -0
  187. data/spec/os/rhel/finder_spec.rb +21 -0
  188. data/spec/os/ubuntu/cd_spec.rb +28 -0
  189. data/spec/os/ubuntu/data/Desktop.rb +61 -0
  190. data/spec/os/ubuntu/data/Server.rb +61 -0
  191. data/spec/os/ubuntu/finder_spec.rb +17 -0
  192. data/spec/os/ubuntu/mirrors_spec.rb +18 -0
  193. data/spec/utils/autozone_spec.rb +33 -0
  194. data/spec/virtual/virtual_box_spec.rb +16 -0
  195. metadata +405 -0
@@ -0,0 +1,50 @@
1
+ # Requires
2
+ require_relative 'Server'
3
+ require_relative 'DesktopCD'
4
+
5
+ # OS class that handles details for generating Packer files for Ubuntu
6
+ # Desktop.
7
+ module PackerFiles
8
+ module Ubuntu
9
+
10
+ class Desktop < Ubuntu::Server
11
+
12
+ # Constructor. Yield self for further initialization
13
+ def initialize
14
+ super
15
+ end
16
+
17
+ # Hook function called before normalizing CD Image
18
+ def cd_image_hook
19
+ self.CDImage.impl = Ubuntu::DesktopCD.new
20
+ end
21
+
22
+ # Hook for writing into preseed file.
23
+ def preseed_write_hook(objects)
24
+
25
+ # Get Preseed object from the base class.
26
+ preseed = super
27
+
28
+ # Generate Ubiquity specific sections.
29
+ preseed.eval_file 'Ubuntu/Templates/ubiquity_erb.rb', {'obj' => self}
30
+ end
31
+
32
+ # Name of the preseed file
33
+ def preseed_file
34
+ rel = self.CDImage.release
35
+ arch = self.CDImage.arch
36
+ name = "preseed-ubuntu-desktop-#{rel}-#{arch}.cfg"
37
+ File.join(http_dir, name)
38
+ end
39
+
40
+ # Boot Command Override
41
+ def boot_command
42
+ file = PackerFiles.DirPath('Ubuntu/Templates/boot_command_desktop_erb.rb')
43
+ hash = { 'obj' => self}
44
+ value = PackerFiles.evaluate_erb(file.first, hash)
45
+ value.split("\n")
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,16 @@
1
+ # Requires
2
+ require_relative 'CD'
3
+
4
+ # An implementation for CDImage for Ubuntu Desktop.
5
+ module PackerFiles
6
+ module Ubuntu
7
+ class DesktopCD < CD
8
+
9
+ # Override method for getting the ISO name
10
+ def get_iso_name_pattern
11
+ 'ubuntu-@release@-desktop-@arch@.iso'
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,103 @@
1
+ # Requires
2
+ require 'open-uri'
3
+ require 'uri'
4
+ require 'Utils/AutoZone'
5
+ require 'Utils/FastestURL'
6
+ require 'nokogiri'
7
+
8
+ # Auto configures the Ubuntu mirror list. This is useful in pre-seeding
9
+ # the fastest possible mirror.
10
+ module PackerFiles
11
+ module Ubuntu
12
+ class Mirrors
13
+
14
+ # default ubuntu mirror
15
+ @@default = 'http://archive.ubuntu.com/ubuntu'
16
+
17
+ # Default ubuntu mirror list for any country.
18
+ @@mirrors = 'http://mirrors.ubuntu.com/@country@.txt'
19
+
20
+ # Default Master archive mirror list
21
+ @@master = 'https://launchpad.net/ubuntu/+archivemirrors'
22
+
23
+ # accessors
24
+ attr_reader :hosts
25
+ attr_reader :best
26
+ attr_reader :proxy
27
+
28
+ # Constructor
29
+ def initialize
30
+
31
+ # A Single web page get more than this (in seconds) is SLOW
32
+ limit = 1
33
+
34
+ # No. of trials for a web page
35
+ trials = 4
36
+
37
+ # Get the name of the http proxy
38
+ @proxy = ENV['http_proxy']
39
+
40
+ # Get the host list of mirrors for this country
41
+ code = Utils::AutoZone.new.country_code.upcase
42
+ @hosts = country_mirror(code)
43
+ if @hosts.empty?
44
+ @hosts = [@@default] if @hosts.empty?
45
+ @best = URI::parse(@@default)
46
+ else
47
+ @hosts = filter_status_unknown.compact
48
+ f = Utils::FastestURL.new(limit, trials)
49
+ all = f.best_urls(@hosts).flatten
50
+ begin
51
+ @best = URI::parse(all.first)
52
+ rescue Exception => e
53
+ puts "Exception: #{e}, All: #{all.to_s}"
54
+ raise e
55
+ end
56
+ end
57
+ end
58
+
59
+ # Given the country code, get a list of mirror sites that match
60
+ # the country code.
61
+ private
62
+ def country_mirror(code)
63
+ url = @@mirrors.gsub('@country@', code)
64
+ contents = open(url) {|f| f.read}
65
+ return contents.split("\n")
66
+ end
67
+
68
+ # Given a list of hosts which can act as mirrors, filter out those
69
+ # hosts whose status is unknown, as they can cause updates and
70
+ # new installation packages to fail.
71
+ private
72
+ def filter_status_unknown
73
+
74
+ # Parse the HTML from the master index archive.
75
+ page = Nokogiri::HTML(open(@@master))
76
+
77
+ # Iterate through the list of hosts
78
+ @hosts.map {|host|
79
+ node = page.css('td').select {|node|
80
+ aref = node.css('a')
81
+ if aref.empty?
82
+ false
83
+ else
84
+ aref.first['href'] == host
85
+ end
86
+ }
87
+ if node.empty?
88
+ nil
89
+ else
90
+ text = node.first.next_element.next_element.text
91
+ if text.include?('Last update unknown')
92
+ nil
93
+ else
94
+ host
95
+ end
96
+ end
97
+ }
98
+ end
99
+
100
+ end #class Mirror
101
+
102
+ end
103
+ end
@@ -0,0 +1,78 @@
1
+ # Requires
2
+ require 'OS/Debian/Server'
3
+ require_relative 'CD'
4
+ require_relative 'Mirrors'
5
+
6
+ # OS class that handles details for generating Packer files for Ubuntu
7
+ # Servers.
8
+ module PackerFiles
9
+ module Ubuntu
10
+
11
+ class Server < Debian::Server
12
+
13
+ # Constructor. Yield self for further initialization
14
+ def initialize
15
+ super
16
+ end
17
+
18
+ # Hook function called before normalizing CD Image
19
+ def cd_image_hook
20
+ self.CDImage.impl = Ubuntu::CD.new
21
+ end
22
+
23
+ # Hook for writing into preseed file.
24
+ def preseed_write_hook(objects)
25
+
26
+ # Preseed file by evaluating templates @ Debian folder.
27
+ preseed = Debian::Preseed.new(preseed_file)
28
+
29
+ # Convert objects into Preseed configuration.
30
+ objects.each do |obj|
31
+ if obj.is_a? Debian::Apt
32
+ preseed.convert obj, 'Ubuntu/Templates'
33
+ else
34
+ preseed.convert obj, 'Debian/Templates'
35
+ end
36
+ end
37
+
38
+ # Generate fastest debian mirrors
39
+ preseed.eval_file 'Debian/Templates/Mirrors_erb.rb',
40
+ {'obj' => Ubuntu::Mirrors.new}
41
+
42
+ # Return the preseed object for further customization
43
+ # by derived classes.
44
+ return preseed
45
+
46
+ end
47
+
48
+ # Name of the preseed file
49
+ def preseed_file
50
+ rel = self.CDImage.release
51
+ arch = self.CDImage.arch
52
+ name = "preseed-ubuntu-server-#{rel}-#{arch}.cfg"
53
+ File.join(http_dir, name)
54
+ end
55
+
56
+ # Boot Command Override
57
+ def boot_command
58
+ file = PackerFiles.DirPath('Ubuntu/Templates/boot_command_erb.rb')
59
+ hash = { 'obj' => self, 'network' => self.Network }
60
+ value = PackerFiles.evaluate_erb(file.first, hash)
61
+ value.split("\n")
62
+ end
63
+
64
+ # Guest OS Type override
65
+ def guest_os_type
66
+ return "Ubuntu_64" if (self.CDImage.arch == "amd64")
67
+ return "Ubuntu"
68
+ end
69
+
70
+ # VMWare Guest OS Type override
71
+ def vmware_guest_os_type
72
+ return "ubuntu-64" if (self.CDImage.arch == "amd64")
73
+ return "ubuntu"
74
+ end
75
+
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,18 @@
1
+ # Apt Configuration Section
2
+ apt-cdrom-setup apt-setup/cdrom/set-first boolean false
3
+ apt-mirror-setup apt-setup/use_mirror boolean true
4
+ popularity-contest popularity-contest/participate boolean false
5
+ tasksel tasksel/first multiselect <%= @obj.tasks.join(',') %>
6
+ d-i apt-setup/restricted boolean <%= @obj.non_free %>
7
+ d-i apt-setup/multiverse boolean <%= @obj.non_free %>
8
+ d-i apt-setup/universe boolean <%= @obj.contrib %>
9
+ d-i pkgsel/upgrade select <%= @obj.upgrades %>
10
+ d-i pkgsel/update-policy select unattended-upgrades
11
+ d-i apt-setup/services-select multiselect security, updates
12
+
13
+ # Basic OS Settings and Configuration
14
+ d-i base-installer/kernel/override-image string <%= @obj.kernel %>
15
+ d-i finish-install/reboot_in_progress note
16
+ d-i grub-installer/only_debian boolean true
17
+ d-i grub-installer/with_other_os boolean true
18
+
@@ -0,0 +1,36 @@
1
+ <esc><esc><esc>
2
+ <enter><wait>
3
+ <% if @obj.CDImage.arch == "amd64" -%>
4
+ /casper/vmlinuz.efi <wait>
5
+ <% else -%>
6
+ /casper/vmlinuz <wait>
7
+ <% end -%>
8
+ keyboard-configuration/layoutcode=<%= @obj.Keyboard.layout %>
9
+ noprompt
10
+ automatic-ubiquity
11
+ boot=casper
12
+ initrd=/casper/initrd.lz
13
+ quiet
14
+ splash
15
+ auto=true priority=critical
16
+ <% preseed = @obj.preseed_file.gsub(@obj.http_dir,'').gsub('/', '') -%>
17
+ <% if @obj.Network.nil? -%>
18
+ url=http://{{user `host`}}:{{user `port`}}/<%= preseed -%> <wait>
19
+ <% elsif !@obj.Network.is_static? -%>
20
+ url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/<%= preseed -%> <wait>
21
+ <% else -%>
22
+ url=http://{{user `host`}}:{{user `port`}}/<%= preseed -%> <wait>
23
+ <% end -%>
24
+ <% if !@obj.Network.nil? && @obj.Network.is_static? -%>
25
+ netcfg/disable_autoconfig=true <wait>
26
+ netcfg/get_ipaddress=<%= @obj.Network.ip %> <wait>
27
+ netcfg/get_netmask=<%= @obj.Network.mask %> <wait>
28
+ netcfg/get_gateway=<%= @obj.Network.gateway %> <wait>
29
+ netcfg/get_nameservers=<%= @obj.Network.dns.join(" ") %> <wait>
30
+ netcfg/confirm_static=true <wait>
31
+ netcfg/dhcp_timeout=60 <wait>
32
+ netcfg/dhcpv6_timeout=60 <wait>
33
+ netcfg/get_hostname=unassigned-hostname <wait>
34
+ netcfg/get_domain=unassigned-domain <wait>
35
+ <% end -%>
36
+ -- <enter> <wait>
@@ -0,0 +1,30 @@
1
+ <esc><wait>
2
+ <esc><wait>
3
+ <enter><wait>
4
+ /install/vmlinuz <wait>
5
+ initrd=/install/initrd.gz <wait>
6
+ fb=false <wait>
7
+ noapic <wait>
8
+ auto=true priority=critical <wait>
9
+ <% preseed = @obj.preseed_file.gsub(@obj.http_dir,'').gsub('/', '') -%>
10
+ <% if @network.nil? -%>
11
+ preseed/url=http://{{user `host`}}:{{user `port`}}/<%= preseed -%> <wait>
12
+ <% elsif !@network.is_static? -%>
13
+ preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/<%= preseed -%> <wait>
14
+ <% else -%>
15
+ preseed/url=http://{{user `host`}}:{{user `port`}}/<%= preseed -%> <wait>
16
+ <% end -%>
17
+ <% if !@network.nil? && @network.is_static? -%>
18
+ netcfg/disable_autoconfig=true <wait>
19
+ netcfg/get_ipaddress=<%= @network.ip %> <wait>
20
+ netcfg/get_netmask=<%= @network.mask %> <wait>
21
+ netcfg/get_gateway=<%= @network.gateway %> <wait>
22
+ netcfg/get_nameservers=<%= @network.dns.join(" ") %> <wait>
23
+ netcfg/confirm_static=true <wait>
24
+ netcfg/dhcp_timeout=60 <wait>
25
+ netcfg/dhcpv6_timeout=60 <wait>
26
+ netcfg/get_hostname=unassigned-hostname <wait>
27
+ netcfg/get_domain=unassigned-domain <wait>
28
+ <% end -%>
29
+ -- <wait>
30
+ <enter><wait>
@@ -0,0 +1,8 @@
1
+ # Various Parameters for Ubiquity to work properly.
2
+ ubiquity languagechooser/language-name select English
3
+ ubiquity ubiquity/reboot boolean true
4
+ <% if !@obj.Packages.list.nil? -%>
5
+ ubiquity ubiquity/success_command string in-target apt-get --yes install <%= @obj.Packages.list.join(' ') %>
6
+ <% end -%>
7
+
8
+
@@ -0,0 +1,8 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ # Generate files for Packer tool using the template below:
5
+ PackerFiles.Generate('<%= @os_name -%>') do |os|
6
+ <%= @content.join("\n") %>
7
+
8
+ end
@@ -0,0 +1,20 @@
1
+ # Requires
2
+ require 'Utils/HashSerializer'
3
+
4
+ # The Remote Copier class is used for copying local files or directories
5
+ # into the remote host.
6
+ module PackerFiles
7
+ module Provision
8
+ class Base < Utils::HashSerializer
9
+
10
+ # Various accessors common for all Provisioners.
11
+ hash_variable :only, Array
12
+ hash_variable :except, Array
13
+ hash_variable :type
14
+
15
+ # attribute accessor
16
+ attr_accessor :os
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,90 @@
1
+ # Requires
2
+ require 'json'
3
+ require_relative 'Base'
4
+ require_relative 'ChefSoloHelper'
5
+
6
+ # The Chef Solo class is used for executing a series of Cookbooks
7
+ # inside the VM, using chef solo provisioner.
8
+ module PackerFiles
9
+ module Provision
10
+ class ChefSolo < Base
11
+
12
+ # Various accessors
13
+ hash_variable :cookbook_paths, Array, :convert_cookbook_paths
14
+ hash_variable :data_bags_path
15
+ hash_variable :encrypted_data_bag_secret_path
16
+ hash_variable :execute_command
17
+ hash_variable :install_command
18
+ hash_variable :json, String, :convert_to_json
19
+ hash_variable :prevent_sudo, String, :convert_sudo_to_boolean
20
+ hash_variable :remote_cookbook_paths
21
+ hash_variable :roles_path
22
+ hash_variable :run_list, Array
23
+ hash_variable :skip_install, String, :convert_skip_to_boolean
24
+ hash_variable :staging_directory
25
+
26
+ # Attribute accessor which is not converted into a hash serializer
27
+ #attr_accessor :download_cookbooks
28
+
29
+ # JSON converter
30
+ def convert_to_json
31
+ # Check if it is a string and if so parse it into JSON
32
+ begin
33
+ return JSON.parse(self.json)
34
+ rescue JSON::ParserError => e
35
+ return JSON.parse(File.read(self.json))
36
+ end
37
+ end
38
+
39
+ # Cookbook Path converter
40
+ def convert_cookbook_paths
41
+ self.cookbook_paths.map {|p| File.absolute_path(p)}
42
+ end
43
+
44
+ # Boolean converter for prevent_sudo
45
+ def convert_sudo_to_boolean
46
+ (self.prevent_sudo.to_i > 0) ? true : false
47
+ end
48
+
49
+ # Boolean converter for skip_install
50
+ def convert_skip_to_boolean
51
+ (self.skip_install.to_i > 0) ? true : false
52
+ end
53
+
54
+ # Constructor yields self
55
+ def initialize(&block)
56
+ yield self if block_given?
57
+ @type = 'chef-solo'
58
+ end
59
+
60
+ # If chef-solo has to work, all the dependent cookbooks also
61
+ # needs to be found in one of the cookbook folders. So we need
62
+ # to intercept the to_hash call to extract cookbooks inside a
63
+ # .tar.gz bundle.
64
+ def to_hash(*args)
65
+
66
+ # The Provisioner usually passes the OS class as it's first
67
+ # argument
68
+ os = args[0]
69
+
70
+ # Some cookbook paths are special in the sense, they are .tar.gz
71
+ # bundles. The code fragment handles that special case.
72
+ convert_cookbook_paths.each_with_index do |path, index|
73
+ next if !path.end_with?('.tar.gz')
74
+ temp = Dir.mktmpdir('dep', os.OutDir)
75
+ helper = ChefSoloHelper.new(path)
76
+ local = helper.download_files(os.OutDir)
77
+ helper.extract_files(temp, local)
78
+ @cookbook_paths.push(temp)
79
+ end
80
+
81
+ # Remove all the cookbooks that end with .tar.gz
82
+ @cookbook_paths.delete_if {|cb| cb.end_with?('.tar.gz')}
83
+
84
+ # call back the original to_hash function.
85
+ super
86
+ end
87
+
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,72 @@
1
+ # Requires
2
+ require 'uri'
3
+ require 'open-uri'
4
+ require 'rubygems/package'
5
+ require 'zlib'
6
+ require 'fileutils'
7
+
8
+ # Chef Solo helper is useful to download [remote tar.gz] files into a local
9
+ # folder.
10
+ module PackerFiles
11
+ module Provision
12
+ class ChefSoloHelper
13
+
14
+ # Just remember the name of the file
15
+ attr_accessor :tar_gz_file
16
+
17
+ # Initialize the helper with the path of the .tar.gz file
18
+ def initialize(tar_gz_file)
19
+ @tar_gz_file = tar_gz_file
20
+ end
21
+
22
+ # Given a top level directory, and the tar_gz_file, download
23
+ # it locally if it is a remote file.
24
+ def download_files(top_dir)
25
+ url = URI::parse(@tar_gz_file)
26
+ if url.scheme.nil?
27
+ return @tar_gz_file
28
+ else
29
+ name = File.join(top_dir, File.basename(@tar_gz_file))
30
+ content = open(@tar_gz_file) {|f| f.read}
31
+ File.write(name, content)
32
+ return name
33
+ end
34
+ end
35
+
36
+ # Given a list of .tar.gz files, untar and ungzip them
37
+ def extract_files(dest_dir, file)
38
+ untar(ungzip(file), dest_dir)
39
+ end
40
+
41
+ # un-gzips the given IO, returning the decompressed version
42
+ # as a StringIO
43
+ private
44
+ def ungzip(tarfile)
45
+ zip = Zlib::GzipReader.open(tarfile)
46
+ unzip = StringIO.new(zip.read)
47
+ zip.close
48
+ unzip
49
+ end
50
+
51
+ # untars the given IO into the specified directory
52
+ private
53
+ def untar(io, dest_dir)
54
+ Gem::Package::TarReader.new io do |tar|
55
+ tar.each do |tarfile|
56
+ dest = File.join(dest_dir, tarfile.full_name)
57
+ if tarfile.directory?
58
+ FileUtils.mkdir_p(dest)
59
+ next
60
+ end
61
+ dir = File.dirname(dest)
62
+ FileUtils.mkdir_p dir unless File.directory?(dir)
63
+ File.open dest, "wb" do |f|
64
+ f.print tarfile.read
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,22 @@
1
+ # Requires
2
+ require_relative 'Base'
3
+
4
+ # The Remote Copier class is used for copying local files or directories
5
+ # into the remote host.
6
+ module PackerFiles
7
+ module Provision
8
+ class Copy < Base
9
+
10
+ # Various accessors
11
+ hash_variable :source
12
+ hash_variable :destination
13
+
14
+ # Constructor yields self
15
+ def initialize(&block)
16
+ yield self if block_given?
17
+ @type = 'file'
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,43 @@
1
+ # Requires
2
+ require_relative 'Base'
3
+
4
+ # The External script class is used for executing a series of external scripts
5
+ # inside the VM.
6
+ module PackerFiles
7
+ module Provision
8
+ class ExternalScript < Base
9
+
10
+ # Various accessors
11
+ hash_variable :execute_command
12
+ hash_variable :scripts, Array, :convert_scripts
13
+ hash_variable :binary, Integer, :convert_to_boolean
14
+ hash_variable :environment_vars, Hash, :convert_env_vars
15
+
16
+ # Conversion function for environment variables.
17
+ def convert_env_vars
18
+ array = []
19
+ self.environment_vars.each_pair do |var, value|
20
+ array.push("#{var}=#{value.to_s}")
21
+ end
22
+ array
23
+ end
24
+
25
+ # Conversion function for boolean
26
+ def convert_to_boolean
27
+ (self.binary > 0) ? true : false
28
+ end
29
+
30
+ # Conversion function for scripts
31
+ def convert_scripts
32
+ self.scripts.map {|script| File.absolute_path(script)}
33
+ end
34
+
35
+ # Constructor yields self
36
+ def initialize(&block)
37
+ yield self if block_given?
38
+ @type = 'shell'
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,37 @@
1
+ # Requires
2
+ require_relative 'Base'
3
+
4
+ # The Inline script class is used for executing a series of script commands
5
+ # inside the VM.
6
+ module PackerFiles
7
+ module Provision
8
+ class InlineScript < Base
9
+
10
+ # Various accessors
11
+ hash_variable :execute_command
12
+ hash_variable :environment_vars, Hash, :convert_env_vars
13
+ hash_variable :inline, String, :convert_inline
14
+
15
+ # Conversion function for environment variables.
16
+ def convert_env_vars
17
+ array = []
18
+ self.environment_vars.each_pair do |var, value|
19
+ array.push("#{var}=#{value.to_s}")
20
+ end
21
+ array
22
+ end
23
+
24
+ # Conversion function for inline commands
25
+ def convert_inline
26
+ self.inline.split("\n").map {|line| line.strip}
27
+ end
28
+
29
+ # Constructor yields self
30
+ def initialize(&block)
31
+ yield self if block_given?
32
+ @type = 'shell'
33
+ end
34
+
35
+ end
36
+ end
37
+ end