pauper 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 94d280ad4009853e8492e658aaea2a837ec85942
4
- data.tar.gz: f7d798e8947f7bd3bd5b6815b935d3e7e71564d2
3
+ metadata.gz: af5126775307e89900badb113cdc5e1425799250
4
+ data.tar.gz: 7e99fd016fbdfb32a35040061af5a07667b47fb3
5
5
  SHA512:
6
- metadata.gz: 956b22f89d47919396c52c5458cab8af7017da569be4460d6974d90771fb95c7dda58c0b737a1b8e5a4b40000deb599c52a34c5600461f407acc895d03a091b1
7
- data.tar.gz: 34de6a41b2922bc528593b86e207532f42869dfc43facbad61f1db6f449876305c19d3b7c715c0370aa349ab1624d323ec30bbbe86da912bc75f3cdd251bae82
6
+ metadata.gz: 58bb795aa47da08f4dcd3f1fc64c74058414009a9a48e668621ee40f883f9973f7ef96e80f228b654197cb48552ea9282d1fe36781eefc324fac80838d35629b
7
+ data.tar.gz: d8b8d0b344870bdec4798b38bab5ae18dc6781bff2de109498a8d6ce37615e010d06dcd6eb78915a881633a04f4ae3c6ce50e6870deee9e94d9b37037c820749
data/bin/pauper CHANGED
@@ -6,6 +6,7 @@ require 'pauper'
6
6
  require 'fusion'
7
7
 
8
8
  # Check for new versions on startup
9
+
9
10
  SKIP_VERSION_CHECK_FLAG = '--skip-version-check'
10
11
  unless ARGV.include?(SKIP_VERSION_CHECK_FLAG)
11
12
  current_version = Gem.loaded_specs['pauper'].version
@@ -18,6 +19,9 @@ unless ARGV.include?(SKIP_VERSION_CHECK_FLAG)
18
19
  end
19
20
  ARGV.delete(SKIP_VERSION_CHECK_FLAG)
20
21
 
22
+ # Make sure PATH is what ubuntu expects it to be
23
+ ENV['PATH']='/usr/local/sbin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin'
24
+
21
25
  require 'vmx'
22
26
 
23
27
  module Pauperism
@@ -86,9 +90,9 @@ module Pauperism
86
90
  class CLI < Thor
87
91
  class_option :pauperfile, :type => :string
88
92
 
89
- desc "bootstrap", "Initialize the base image"
90
- def bootstrap
91
- pauper.bootstrap
93
+ desc "bootstrap [lucid|precise]", "Initialize the base image"
94
+ def bootstrap(release='lucid')
95
+ pauper.bootstrap(release)
92
96
  end
93
97
 
94
98
  desc "destroy [NODENAME]", "Completely destroy a VM"
@@ -155,7 +159,6 @@ module Pauperism
155
159
  pauper.write_hosts
156
160
  end
157
161
 
158
-
159
162
  desc 'setup_osx [VMNAME]', 'Set up things for OS X'
160
163
  def setup_osx(vm_path=Fusion::DEFAULT_VMPATH)
161
164
  unless Pauper.osx?
@@ -214,6 +217,11 @@ module Pauperism
214
217
 
215
218
  desc 'vm SUBCOMMAND', 'Operations dealing with VMware Fusion'
216
219
  subcommand 'vm', Vm
220
+
221
+ desc 'version', 'Print version'
222
+ def version
223
+ Pauper.version
224
+ end
217
225
  end
218
226
  end
219
227
 
data/lib/fusion.rb CHANGED
@@ -44,7 +44,7 @@ class Fusion
44
44
  def vmrun(cmd)
45
45
  case cmd
46
46
  when 'start'
47
- cmd = "#{@vmrun} -T fusion #{cmd} #{vmx.shellescape} #{@gui}"
47
+ cmd = "#{@vmrun} -T fusion #{cmd} #{vmx.shellescape} #{@nogui}"
48
48
  when 'stop', 'reset', 'suspend'
49
49
  cmd = "#{@vmrun} -T fusion #{cmd} #{vmx.shellescape} #{@force}"
50
50
  when 'pause', 'unpause'
@@ -0,0 +1,643 @@
1
+ # -*- coding: iso-8859-1 -*-
2
+ class Template
3
+ def self.lxc
4
+ <<TEMPLATE
5
+ #!/bin/bash
6
+
7
+ #
8
+ # template script for generating ubuntu container for LXC
9
+ #
10
+ # This script consolidates and extends the existing lxc ubuntu scripts
11
+ #
12
+
13
+ # Copyright © 2011 Serge Hallyn <serge.hallyn@canonical.com>
14
+ # Copyright © 2010 Wilhelm Meier
15
+ # Author: Wilhelm Meier <wilhelm.meier@fh-kl.de>
16
+ #
17
+ # This program is free software; you can redistribute it and/or modify
18
+ # it under the terms of the GNU General Public License version 2, as
19
+ # published by the Free Software Foundation.
20
+
21
+ # This program is distributed in the hope that it will be useful,
22
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
23
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24
+ # GNU General Public License for more details.
25
+
26
+ # You should have received a copy of the GNU General Public License along
27
+ # with this program; if not, write to the Free Software Foundation, Inc.,
28
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
29
+ #
30
+
31
+ set -e -x
32
+
33
+ if [ -r /etc/default/lxc ]; then
34
+ . /etc/default/lxc
35
+ fi
36
+
37
+ configure_ubuntu()
38
+ {
39
+ rootfs=$1
40
+ hostname=$2
41
+ release=$3
42
+
43
+ # configure the network using the dhcp
44
+ cat <<EOF > $rootfs/etc/network/interfaces
45
+ # This file describes the network interfaces available on your system
46
+ # and how to activate them. For more information, see interfaces(5).
47
+
48
+ # The loopback network interface
49
+ auto lo
50
+ iface lo inet loopback
51
+
52
+ auto eth0
53
+ iface eth0 inet dhcp
54
+ EOF
55
+
56
+ # set the hostname
57
+ cat <<EOF > $rootfs/etc/hostname
58
+ $hostname
59
+ EOF
60
+ # set minimal hosts
61
+ cat <<EOF > $rootfs/etc/hosts
62
+ 127.0.0.1 localhost
63
+ 127.0.1.1 $hostname
64
+
65
+ # The following lines are desirable for IPv6 capable hosts
66
+ ::1 ip6-localhost ip6-loopback
67
+ fe00::0 ip6-localnet
68
+ ff00::0 ip6-mcastprefix
69
+ ff02::1 ip6-allnodes
70
+ ff02::2 ip6-allrouters
71
+ EOF
72
+
73
+ if [ ! -f $rootfs/etc/init/container-detect.conf ]; then
74
+ # suppress log level output for udev
75
+ sed -i "s/=\"err\"/=0/" $rootfs/etc/udev/udev.conf
76
+
77
+ # remove jobs for consoles 5 and 6 since we only create 4 consoles in
78
+ # this template
79
+ rm -f $rootfs/etc/init/tty{5,6}.conf
80
+ fi
81
+
82
+ return 0
83
+ }
84
+
85
+ # finish setting up the user in the container by injecting ssh key
86
+ finalize_user()
87
+ {
88
+ if [ -n "$auth_key" -a -f "$auth_key" ]; then
89
+ u_path="/root/.ssh"
90
+ root_u_path="$rootfs/$u_path"
91
+
92
+ mkdir -p $root_u_path
93
+ cp $auth_key "$root_u_path/authorized_keys"
94
+ chroot $rootfs chown -R root: "$u_path"
95
+
96
+ echo "Inserted SSH public key from $auth_key into /root/.ssh/authorized_keys"
97
+ fi
98
+ return 0
99
+ }
100
+
101
+ write_sourceslist()
102
+ {
103
+ # $1 => path to the rootfs
104
+ # $2 => architecture we want to add
105
+ # $3 => whether to use the multi-arch syntax or not
106
+
107
+ case $2 in
108
+ amd64|i386)
109
+ MIRROR=${MIRROR:-http://mirrors.fastly.net/ubuntu}
110
+ SECURITY_MIRROR=${SECURITY_MIRROR:-http://mirrors.fastly.net/ubuntu}
111
+ ;;
112
+ *)
113
+ MIRROR=${MIRROR:-http://ports.ubuntu.com/ubuntu-ports}
114
+ SECURITY_MIRROR=${SECURITY_MIRROR:-http://ports.ubuntu.com/ubuntu-ports}
115
+ ;;
116
+ esac
117
+ if [ -n "$3" ]; then
118
+ cat >> "$1/etc/apt/sources.list" << EOF
119
+ deb [arch=$2] $MIRROR ${release} main restricted universe multiverse
120
+ deb [arch=$2] $MIRROR ${release}-updates main restricted universe multiverse
121
+ deb [arch=$2] $SECURITY_MIRROR ${release}-security main restricted universe multiverse
122
+ EOF
123
+ else
124
+ cat >> "$1/etc/apt/sources.list" << EOF
125
+ deb $MIRROR ${release} main restricted universe multiverse
126
+ deb $MIRROR ${release}-updates main restricted universe multiverse
127
+ deb $SECURITY_MIRROR ${release}-security main restricted universe multiverse
128
+ EOF
129
+ fi
130
+ }
131
+
132
+ cleanup()
133
+ {
134
+ rm -rf $cache/partial-$arch
135
+ rm -rf $cache/rootfs-$arch
136
+ }
137
+
138
+ download_ubuntu()
139
+ {
140
+ cache=$1
141
+ arch=$2
142
+ release=$3
143
+
144
+ packages=vim,ssh,curl,wget
145
+ echo "installing packages: $packages"
146
+
147
+ trap cleanup EXIT SIGHUP SIGINT SIGTERM
148
+ # check the mini ubuntu was not already downloaded
149
+ mkdir -p "$cache/partial-$arch"
150
+ if [ $? -ne 0 ]; then
151
+ echo "Failed to create '$cache/partial-$arch' directory"
152
+ return 1
153
+ fi
154
+
155
+ # download a mini ubuntu into a cache
156
+ MIRROR=${MIRROR:-http://mirrors.fastly.net/ubuntu}
157
+ echo "Downloading ubuntu $release minimal from $MIRROR ..."
158
+ if [ -n "$(which qemu-debootstrap)" ]; then
159
+ qemu-debootstrap --verbose --components=main,universe --arch=$arch --include=$packages $release $cache/partial-$arch $MIRROR
160
+ else
161
+ debootstrap --verbose --components=main,universe --arch=$arch --include=$packages $release $cache/partial-$arch $MIRROR
162
+ fi
163
+
164
+ if [ $? -ne 0 ]; then
165
+ echo "Failed to download the rootfs, aborting."
166
+ return 1
167
+ fi
168
+
169
+ # Serge isn't sure whether we should avoid doing this when
170
+ # $release == `distro-info -d`
171
+ echo "Installing updates"
172
+ > $cache/partial-$arch/etc/apt/sources.list
173
+ write_sourceslist $cache/partial-$arch/ $arch
174
+
175
+ # precise: do not try to use i386 repos, we do not have them
176
+ if [ $release != "lucid" ]; then
177
+ rm -f "$1/partial-${arch}/etc/dpkg/dpkg.cfg.d/multiarch"
178
+ fi
179
+
180
+ chroot "$1/partial-${arch}" apt-get update
181
+ if [ $? -ne 0 ]; then
182
+ echo "Failed to update the apt cache"
183
+ return 1
184
+ fi
185
+ cat > "$1/partial-${arch}"/usr/sbin/policy-rc.d << EOF
186
+ #!/bin/sh
187
+ exit 101
188
+ EOF
189
+ chmod +x "$1/partial-${arch}"/usr/sbin/policy-rc.d
190
+
191
+ lxc-unshare -s MOUNT -- chroot "$1/partial-${arch}" apt-get dist-upgrade -y
192
+ ret=$?
193
+ rm -f "$1/partial-${arch}"/usr/sbin/policy-rc.d
194
+
195
+ if [ $ret -ne 0 ]; then
196
+ echo "Failed to upgrade the cache"
197
+ return 1
198
+ fi
199
+
200
+ mv "$1/partial-$arch" "$1/rootfs-$arch"
201
+ trap EXIT
202
+ trap SIGINT
203
+ trap SIGTERM
204
+ trap SIGHUP
205
+ echo "Download complete"
206
+ return 0
207
+ }
208
+
209
+ copy_ubuntu()
210
+ {
211
+ cache=$1
212
+ arch=$2
213
+ rootfs=$3
214
+
215
+ # make a local copy of the miniubuntu
216
+ echo "Copying rootfs to $rootfs ..."
217
+ mkdir -p $rootfs
218
+ rsync -a $cache/rootfs-$arch/ $rootfs/ || return 1
219
+ return 0
220
+ }
221
+
222
+ install_ubuntu()
223
+ {
224
+ rootfs=$1
225
+ release=$2
226
+ flushcache=$3
227
+ cache="/var/cache/lxc/$release"
228
+ mkdir -p /var/lock/subsys/
229
+
230
+ (
231
+ flock -x 200
232
+ if [ $? -ne 0 ]; then
233
+ echo "Cache repository is busy."
234
+ return 1
235
+ fi
236
+
237
+
238
+ if [ $flushcache -eq 1 ]; then
239
+ echo "Flushing cache..."
240
+ rm -rf "$cache/partial-$arch"
241
+ rm -rf "$cache/rootfs-$arch"
242
+ fi
243
+
244
+ echo "Checking cache download in $cache/rootfs-$arch ... "
245
+ if [ ! -e "$cache/rootfs-$arch" ]; then
246
+ download_ubuntu $cache $arch $release
247
+ if [ $? -ne 0 ]; then
248
+ echo "Failed to download 'ubuntu $release base'"
249
+ return 1
250
+ fi
251
+ fi
252
+
253
+ echo "Copy $cache/rootfs-$arch to $rootfs ... "
254
+ copy_ubuntu $cache $arch $rootfs
255
+ if [ $? -ne 0 ]; then
256
+ echo "Failed to copy rootfs"
257
+ return 1
258
+ fi
259
+
260
+ return 0
261
+
262
+ ) 200>/var/lock/subsys/lxc
263
+
264
+ return $?
265
+ }
266
+
267
+ copy_configuration()
268
+ {
269
+ path=$1
270
+ rootfs=$2
271
+ name=$3
272
+ arch=$4
273
+ release=$5
274
+
275
+ if [ $arch = "i386" ]; then
276
+ arch="i686"
277
+ fi
278
+
279
+ ttydir=""
280
+ if [ -f $rootfs/etc/init/container-detect.conf ]; then
281
+ ttydir=" lxc"
282
+ fi
283
+
284
+ # if there is exactly one veth network entry, make sure it has an
285
+ # associated hwaddr.
286
+ nics=`grep -e '^lxc\.network\.type[ \t]*=[ \t]*veth' $path/config | wc -l`
287
+ if [ $nics -eq 1 ]; then
288
+ grep -q "^lxc.network.hwaddr" $path/config || cat <<EOF >> $path/config
289
+ lxc.network.hwaddr = 00:16:3e:$(openssl rand -hex 3| sed 's/\(..\)/\1:/g; s/.$//')
290
+ EOF
291
+ fi
292
+
293
+ cat <<EOF >> $path/config
294
+ lxc.utsname = $name
295
+
296
+ lxc.devttydir =$ttydir
297
+ lxc.tty = 4
298
+ lxc.pts = 1024
299
+ lxc.rootfs = $rootfs
300
+ lxc.mount = $path/fstab
301
+ lxc.arch = $arch
302
+ lxc.cap.drop = sys_module mac_admin
303
+ lxc.pivotdir = lxc_putold
304
+
305
+ # uncomment the next line to run the container unconfined:
306
+ #lxc.aa_profile = unconfined
307
+
308
+ lxc.cgroup.devices.deny = a
309
+ # Allow any mknod (but not using the node)
310
+ lxc.cgroup.devices.allow = c *:* m
311
+ lxc.cgroup.devices.allow = b *:* m
312
+ # /dev/null and zero
313
+ lxc.cgroup.devices.allow = c 1:3 rwm
314
+ lxc.cgroup.devices.allow = c 1:5 rwm
315
+ # consoles
316
+ lxc.cgroup.devices.allow = c 5:1 rwm
317
+ lxc.cgroup.devices.allow = c 5:0 rwm
318
+ #lxc.cgroup.devices.allow = c 4:0 rwm
319
+ #lxc.cgroup.devices.allow = c 4:1 rwm
320
+ # /dev/{,u}random
321
+ lxc.cgroup.devices.allow = c 1:9 rwm
322
+ lxc.cgroup.devices.allow = c 1:8 rwm
323
+ lxc.cgroup.devices.allow = c 136:* rwm
324
+ lxc.cgroup.devices.allow = c 5:2 rwm
325
+ # rtc
326
+ lxc.cgroup.devices.allow = c 254:0 rwm
327
+ #fuse
328
+ lxc.cgroup.devices.allow = c 10:229 rwm
329
+ #tun
330
+ lxc.cgroup.devices.allow = c 10:200 rwm
331
+ #full
332
+ lxc.cgroup.devices.allow = c 1:7 rwm
333
+ #hpet
334
+ lxc.cgroup.devices.allow = c 10:228 rwm
335
+ #kvm
336
+ lxc.cgroup.devices.allow = c 10:232 rwm
337
+ EOF
338
+
339
+ cat <<EOF > $path/fstab
340
+ proc proc proc nodev,noexec,nosuid 0 0
341
+ sysfs sys sysfs defaults 0 0
342
+ EOF
343
+
344
+ if [ $? -ne 0 ]; then
345
+ echo "Failed to add configuration"
346
+ return 1
347
+ fi
348
+
349
+ return 0
350
+ }
351
+
352
+ trim()
353
+ {
354
+ rootfs=$1
355
+ release=$2
356
+
357
+ # provide the lxc service
358
+ cat <<EOF > $rootfs/etc/init/lxc.conf
359
+ # fake some events needed for correct startup other services
360
+
361
+ description "Container Upstart"
362
+
363
+ start on startup
364
+
365
+ script
366
+ rm -rf /var/run/*.pid
367
+ rm -rf /var/run/network/*
368
+ /sbin/initctl emit stopped JOB=udevtrigger --no-wait
369
+ /sbin/initctl emit started JOB=udev --no-wait
370
+ end script
371
+ EOF
372
+
373
+ # fix buggus runlevel with sshd
374
+ cat <<EOF > $rootfs/etc/init/ssh.conf
375
+ # ssh - OpenBSD Secure Shell server
376
+ #
377
+ # The OpenSSH server provides secure shell access to the system.
378
+
379
+ description "OpenSSH server"
380
+
381
+ start on filesystem
382
+ stop on runlevel [!2345]
383
+
384
+ expect fork
385
+ respawn
386
+ respawn limit 10 5
387
+ umask 022
388
+ # replaces SSHD_OOM_ADJUST in /etc/default/ssh
389
+ oom never
390
+
391
+ pre-start script
392
+ test -x /usr/sbin/sshd || { stop; exit 0; }
393
+ test -e /etc/ssh/sshd_not_to_be_run && { stop; exit 0; }
394
+ test -c /dev/null || { stop; exit 0; }
395
+
396
+ mkdir -p -m0755 /var/run/sshd
397
+ end script
398
+
399
+ # if you used to set SSHD_OPTS in /etc/default/ssh, you can change the
400
+ # 'exec' line here instead
401
+ exec /usr/sbin/sshd
402
+ EOF
403
+
404
+ cat <<EOF > $rootfs/etc/init/console.conf
405
+ # console - getty
406
+ #
407
+ # This service maintains a console on tty1 from the point the system is
408
+ # started until it is shut down again.
409
+
410
+ start on stopped rc RUNLEVEL=[2345]
411
+ stop on runlevel [!2345]
412
+
413
+ respawn
414
+ exec /sbin/getty -8 38400 /dev/console
415
+ EOF
416
+
417
+ cat <<EOF > $rootfs/lib/init/fstab
418
+ # /lib/init/fstab: cleared out for bare-bones lxc
419
+ EOF
420
+
421
+ # reconfigure some services
422
+ if [ -z "$LANG" ]; then
423
+ chroot $rootfs locale-gen en_US.UTF-8
424
+ chroot $rootfs update-locale LANG=en_US.UTF-8
425
+ else
426
+ chroot $rootfs locale-gen $LANG
427
+ chroot $rootfs update-locale LANG=$LANG
428
+ fi
429
+
430
+ # remove pointless services in a container
431
+ chroot $rootfs /usr/sbin/update-rc.d -f ondemand remove
432
+
433
+ chroot $rootfs /bin/bash -c 'cd /etc/init; for f in $(ls u*.conf); do mv $f $f.orig; done'
434
+ chroot $rootfs /bin/bash -c 'cd /etc/init; for f in $(ls tty[2-9].conf); do mv $f $f.orig; done'
435
+ chroot $rootfs /bin/bash -c 'cd /etc/init; for f in $(ls plymouth*.conf); do mv $f $f.orig; done'
436
+ chroot $rootfs /bin/bash -c 'cd /etc/init; for f in $(ls hwclock*.conf); do mv $f $f.orig; done'
437
+ chroot $rootfs /bin/bash -c 'cd /etc/init; for f in $(ls module*.conf); do mv $f $f.orig; done'
438
+
439
+ # if this isn't lucid, then we need to twiddle the network upstart bits :(
440
+ if [ $release != "lucid" ]; then
441
+ sed -i 's/^.*emission handled.*$/echo Emitting lo/' $rootfs/etc/network/if-up.d/upstart
442
+ fi
443
+ }
444
+
445
+ post_process()
446
+ {
447
+ rootfs=$1
448
+ release=$2
449
+ trim_container=$3
450
+
451
+ if [ $trim_container -eq 1 ]; then
452
+ trim $rootfs $release
453
+ elif [ ! -f $rootfs/etc/init/container-detect.conf ]; then
454
+ # Make sure we have a working resolv.conf
455
+ cresolvonf="${rootfs}/etc/resolv.conf"
456
+ mv $cresolvonf ${cresolvonf}.lxcbak
457
+ cat /etc/resolv.conf > ${cresolvonf}
458
+
459
+ # for lucid, if not trimming, then add the ubuntu-virt
460
+ # ppa and install lxcguest
461
+ if [ $release = "lucid" ]; then
462
+ chroot $rootfs apt-get install --force-yes -y python-software-properties
463
+ chroot $rootfs add-apt-repository ppa:ubuntu-virt/ppa
464
+ fi
465
+
466
+ chroot $rootfs apt-get update
467
+ chroot $rootfs apt-get install --force-yes -y lxcguest
468
+
469
+ # Restore old resolv.conf
470
+ rm -f ${cresolvonf}
471
+ mv ${cresolvonf}.lxcbak ${cresolvonf}
472
+ fi
473
+
474
+ # If the container isn't running a native architecture, setup multiarch
475
+ if [ -x "$(ls -1 ${rootfs}/usr/bin/qemu-*-static 2>/dev/null)" ]; then
476
+ dpkg_version=$(chroot $rootfs dpkg-query -W -f='${Version}' dpkg)
477
+ if chroot $rootfs dpkg --compare-versions $dpkg_version ge "1.16.2"; then
478
+ chroot $rootfs dpkg --add-architecture ${hostarch}
479
+ else
480
+ mkdir -p ${rootfs}/etc/dpkg/dpkg.cfg.d
481
+ echo "foreign-architecture ${hostarch}" > ${rootfs}/etc/dpkg/dpkg.cfg.d/lxc-multiarch
482
+ fi
483
+
484
+ # Save existing value of MIRROR and SECURITY_MIRROR
485
+ DEFAULT_MIRROR=$MIRROR
486
+ DEFAULT_SECURITY_MIRROR=$SECURITY_MIRROR
487
+
488
+ # Write a new sources.list containing both native and multiarch entries
489
+ > ${rootfs}/etc/apt/sources.list
490
+ write_sourceslist $rootfs $arch "native"
491
+
492
+ MIRROR=$DEFAULT_MIRROR
493
+ SECURITY_MIRROR=$DEFAULT_SECURITY_MIRROR
494
+ write_sourceslist $rootfs $hostarch "multiarch"
495
+
496
+ # precise: do not try to use i386 repos, we do not have them
497
+ if [ $release != "lucid" ]; then
498
+ rm -f ${rootfs}/etc/dpkg/dpkg.cfg.d/multiarch
499
+ fi
500
+
501
+ # Finally update the lists and install upstart using the host architecture
502
+ chroot $rootfs apt-get update
503
+ chroot $rootfs apt-get install --force-yes -y --no-install-recommends upstart:${hostarch} mountall:${hostarch} iproute:${hostarch} isc-dhcp-client:${hostarch}
504
+ fi
505
+
506
+ # rmdir /dev/shm for containers that have /run/shm
507
+ # I'm afraid of doing rm -rf $rootfs/dev/shm, in case it did
508
+ # get bind mounted to the host's /run/shm. So try to rmdir
509
+ # it, and in case that fails move it out of the way.
510
+ if [ ! -L $rootfs/dev/shm ] && [ -d $rootfs/run/shm ] && [ -e $rootfs/dev/shm ]; then
511
+ mv $rootfs/dev/shm $rootfs/dev/shm.bak
512
+ ln -s /run/shm $rootfs/dev/shm
513
+ fi
514
+ }
515
+
516
+ usage()
517
+ {
518
+ cat <<EOF
519
+ $1 -h|--help [-a|--arch] [--trim] [-d|--debug]
520
+ [-F | --flush-cache] [-r|--release <release>] [ -S | --auth-key <keyfile>]
521
+ release: the ubuntu release (e.g. precise): defaults to host release on ubuntu, otherwise uses latest LTS
522
+ trim: make a minimal (faster, but not upgrade-safe) container
523
+ arch: the container architecture (e.g. amd64): defaults to host arch
524
+ auth-key: SSH Public key file to inject into container
525
+ EOF
526
+ return 0
527
+ }
528
+
529
+ options=$(getopt -o a:b:hp:r:xn:FS:d -l arch:,help,path:,release:,trim,name:,flush-cache,auth-key:,debug,rootfs: -- "$@")
530
+ if [ $? -ne 0 ]; then
531
+ usage $(basename $0)
532
+ exit 1
533
+ fi
534
+ eval set -- "$options"
535
+
536
+ release=precise # Default to the last Ubuntu LTS release for non-Ubuntu systems
537
+ if [ -f /etc/lsb-release ]; then
538
+ . /etc/lsb-release
539
+ if [ "$DISTRIB_ID" = "Ubuntu" ]; then
540
+ release=$DISTRIB_CODENAME
541
+ fi
542
+ fi
543
+
544
+ bindhome=
545
+ arch=$(arch)
546
+
547
+ # Code taken from debootstrap
548
+ if [ -x /usr/bin/dpkg ] && /usr/bin/dpkg --print-architecture >/dev/null 2>&1; then
549
+ arch=`/usr/bin/dpkg --print-architecture`
550
+ elif type udpkg >/dev/null 2>&1 && udpkg --print-architecture >/dev/null 2>&1; then
551
+ arch=`/usr/bin/udpkg --print-architecture`
552
+ else
553
+ arch=$(arch)
554
+ if [ "$arch" = "i686" ]; then
555
+ arch="i386"
556
+ elif [ "$arch" = "x86_64" ]; then
557
+ arch="amd64"
558
+ elif [ "$arch" = "armv7l" ]; then
559
+ arch="armel"
560
+ fi
561
+ fi
562
+
563
+ debug=0
564
+ trim_container=0
565
+ hostarch=$arch
566
+ flushcache=0
567
+
568
+ while true
569
+ do
570
+ case "$1" in
571
+ -h|--help) usage $0 && exit 0;;
572
+ -p|--path) path=$2; shift 2;;
573
+ -n|--name) name=$2; shift 2;;
574
+ -F|--flush-cache) flushcache=1; shift 1;;
575
+ -r|--release) release=$2; shift 2;;
576
+ -a|--arch) arch=$2; shift 2;;
577
+ -x|--trim) trim_container=1; shift 1;;
578
+ -S|--auth-key) auth_key=$2; shift 2;;
579
+ -d|--debug) debug=1; shift 1;;
580
+ --rootfs) shift 2;;
581
+ --) shift 1; break ;;
582
+ "") break ;;
583
+ *) echo "Got unexpected parameter: $1" ; exit 1 ;;
584
+ esac
585
+ done
586
+
587
+ if [ $debug -eq 1 ]; then
588
+ set -x
589
+ fi
590
+
591
+ if [ "$arch" == "i686" ]; then
592
+ arch=i386
593
+ fi
594
+
595
+ if [ $hostarch = "i386" -a $arch = "amd64" ]; then
596
+ echo "can't create amd64 container on i386"
597
+ exit 1
598
+ fi
599
+
600
+ type debootstrap
601
+ if [ $? -ne 0 ]; then
602
+ echo "'debootstrap' command is missing"
603
+ exit 1
604
+ fi
605
+
606
+ if [ -z "$path" ]; then
607
+ echo "'path' parameter is required"
608
+ exit 1
609
+ fi
610
+
611
+ if [ "$(id -u)" != "0" ]; then
612
+ echo "This script should be run as 'root'"
613
+ exit 1
614
+ fi
615
+
616
+ rootfs=$path/rootfs
617
+
618
+ install_ubuntu $rootfs $release $flushcache
619
+ if [ $? -ne 0 ]; then
620
+ echo "failed to install ubuntu $release"
621
+ exit 1
622
+ fi
623
+
624
+ configure_ubuntu $rootfs $name $release
625
+ if [ $? -ne 0 ]; then
626
+ echo "failed to configure ubuntu $release for a container"
627
+ exit 1
628
+ fi
629
+
630
+ copy_configuration $path $rootfs $name $arch $release
631
+ if [ $? -ne 0 ]; then
632
+ echo "failed write configuration file"
633
+ exit 1
634
+ fi
635
+
636
+ post_process $rootfs $release $trim_container
637
+
638
+ finalize_user
639
+
640
+ TEMPLATE
641
+ end
642
+ end
643
+