lxc-awesome-ephemeral 0.0.1.beta1

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.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in lxc-awesome-ephemeral.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Sean Porter
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,29 @@
1
+ # LXC Awesome Ephemeral
2
+
3
+ A Ruby gem to encapsulate [lxc-awesome-ephemeral](https://github.com/hw-cookbooks/lxc/blob/master/files/default/lxc-awesome-ephemeral).
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'lxc-awesome-ephemeral'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install lxc-awesome-ephemeral
18
+
19
+ ## Usage
20
+
21
+ `lxc-awesome-ephemeral --help`
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ exec("#{File.dirname(__FILE__)}/lxc-awesome-ephemeral.sh", *ARGV)
@@ -0,0 +1,533 @@
1
+ #!/bin/bash
2
+
3
+ # (C) Copyright Canonical 2011,2012
4
+
5
+ # What lxc container to clone
6
+ LXC_BASE=""
7
+ # $2 is a path to bind mount e.g. /tmp/foo.
8
+ LXC_BIND=""
9
+ UNION="overlayfs"
10
+
11
+ usage() {
12
+ echo "usage: lxc-awesome-ephemeral [-I ipaddress] [-G gateway] [-N netmask] [-D size] [-z rdir] [-U uniontype] [-d|--daemon] [-h] [-b bdir] [-u user] [-S key] [-c clean] -o orig [-n name] -- [COMMAND [ARGS...]]"
13
+ }
14
+
15
+ help() {
16
+ usage
17
+ echo
18
+ echo "Runs an ephemeral (one-off) container"
19
+ echo
20
+ echo "Options:"
21
+ echo "orig : name of the original container"
22
+ echo "name : name of new container"
23
+ echo "bdir : directory to bind mount into container"
24
+ echo "user : the user to connect to the container as"
25
+ echo "key : the path to the SSH key to use to connect"
26
+ echo "size : size of virtual device in M"
27
+ echo "rdir : host directory to store rootfs overlay"
28
+ echo "ipaddress : static ipv4 to use instead of dhcp"
29
+ echo "clean : cleanup directories"
30
+ echo "-d : run in the background"
31
+ echo "-c : clean up directories created for an ephemeral container"
32
+ echo "-n : name for the ephemeral container"
33
+ echo "-U : type of union (aufs or overlayfs)"
34
+ echo " Default is overlayfs"
35
+ echo "-D : block device for rootfs overlay"
36
+ echo "-z : directory to use for rootfs overlay"
37
+ echo "-I : ip address to use"
38
+ echo "-G : gateway to use"
39
+ echo "-N : netmask to use"
40
+ echo
41
+ echo "if a COMMAND is given, then the container will run only as long"
42
+ echo "as the command runs. If no COMMAND is given, this command will"
43
+ echo "wait until the container is shut down. In the case of --cleanup,"
44
+ echo "any provided command will be ignored"
45
+ }
46
+
47
+ shortoptions='hb:o:u:D:z:I:G:N:S:dU:n:c'
48
+ longoptions='help,orig:,bdir:,user:,clean,device:,directory:,ipaddress:,gateway:,netmask:,ssh-key:,name:,daemon,union:'
49
+
50
+ LXC_RUNNING=0
51
+ LXC_MOUNTED=0
52
+ DAEMON=0
53
+ CLEAN=0
54
+
55
+ cleanup_dirs()
56
+ {
57
+ # echo "umounting ephemeral_bind_dir $EPHEMERAL_BIND_DIR" >&2
58
+ sudo umount $EPHEMERAL_BIND_DIR
59
+ # echo "umounting lxc_dir $LXC_DIR" >&2
60
+ sudo umount $LXC_DIR/rootfs
61
+ # echo "umounting overlay" >&2
62
+ if [ ! $HOST_OVERLAY_DIRECTORY ]; then
63
+ sudo umount $OVERLAY_DIR
64
+ fi
65
+ # remove all contents of the content dir
66
+ sudo rmdir $LXC_DIR/ephemeralbind
67
+ sudo rmdir $LXC_DIR/rootfs
68
+ sudo rm -f $LXC_DIR/*
69
+
70
+ # echo "rming lxc_dir $LXC_DIR" >&2
71
+ sudo rmdir $LXC_DIR
72
+ # echo "rming overlay dir $OVERLAY_DIR" >&2
73
+ if [ $HOST_OVERLAY_DIRECTORY ]; then
74
+ if [ $VIRT_DIR ]; then
75
+ sudo umount $VIRT_MNT
76
+ sudo rmdir $VIRT_MNT
77
+ sudo rm $VIRT_DEV
78
+ fi
79
+ sudo rm -rf $HOST_OVERLAY_DIRECTORY
80
+ else
81
+ sudo rmdir $OVERLAY_DIR
82
+ fi
83
+ }
84
+
85
+ create_virt_device() {
86
+ echo "Creating ephemeral virtual device for rootfs (${OVERLAY_DEVICE}M)"
87
+ VIRT_DIR="/tmp/lxc-virt-devs"
88
+ VIRT_IMG_DIR="${VIRT_DIR}/imgs"
89
+ VIRT_MNT_DIR="${VIRT_DIR}/mnt"
90
+ VIRT_DEV="${VIRT_IMG_DIR}/${LXC_NAME}"
91
+ VIRT_MNT="${VIRT_MNT_DIR}/${LXC_NAME}"
92
+ sudo mkdir -p $VIRT_DIR
93
+ sudo mkdir -p $VIRT_IMG_DIR
94
+ sudo mkdir -p $VIRT_MNT
95
+ # Create empty disk
96
+ dd if=/dev/zero of=$VIRT_DEV bs=1k seek=${OVERLAY_DEVICE}k count=1 > /dev/null
97
+ # format device
98
+ echo "y" | mkfs -t ext4 $VIRT_DEV > /dev/null
99
+ # mount loopback
100
+ mount -o loop $VIRT_DEV $VIRT_MNT
101
+ HOST_OVERLAY_DIRECTORY=$VIRT_MNT
102
+ }
103
+
104
+ cleanup() {
105
+ if [ $LXC_RUNNING -eq 1 ]; then
106
+ sudo lxc-stop -n $LXC_NAME
107
+ fi
108
+ if [ $LXC_MOUNTED -eq 1 ]; then
109
+ cleanup_dirs
110
+ fi
111
+ exit 1
112
+ }
113
+
114
+ do_mount() {
115
+ lower=$1
116
+ if [ $OVERLAY_DEVICE ]; then
117
+ create_virt_device
118
+ upper=$HOST_OVERLAY_DIRECTORY
119
+ echo "Using local block device for overlay mounted at: ${HOST_OVERLAY_DIRECTORY}"
120
+ elif [ $HOST_OVERLAY_DIRECTORY ]; then
121
+ mkdir -p $HOST_OVERLAY_DIRECTORY
122
+ mkdir "$HOST_OVERLAY_DIRECTORY/$LXC_NAME"
123
+ HOST_OVERLAY_DIRECTORY="$HOST_OVERLAY_DIRECTORY/$LXC_NAME"
124
+ upper=$HOST_OVERLAY_DIRECTORY
125
+ echo "Using local directory for overlay: ${HOST_OVERLAY_DIRECTORY}"
126
+ else
127
+ upper=$2
128
+ fi
129
+ target=$3
130
+ if [ $UNION = "aufs" ]; then
131
+ sudo mount -t aufs -o br=${upper}=rw:${lower}=ro,noplink none ${target}
132
+ else
133
+ sudo mount -t overlayfs -oupperdir=${upper},lowerdir=${lower} none ${target}
134
+ fi
135
+ }
136
+
137
+ trap cleanup SIGTERM SIGINT SIGQUIT
138
+
139
+ getopt=$(getopt -o $shortoptions --longoptions $longoptions -- "$@")
140
+ if [ $? != 0 ]; then
141
+ usage
142
+ exit 1;
143
+ fi
144
+
145
+ eval set -- "$getopt"
146
+
147
+ while true; do
148
+ case "$1" in
149
+ -h|--help)
150
+ help
151
+ exit 1
152
+ ;;
153
+ -o|--orig)
154
+ shift
155
+ LXC_BASE=$1
156
+ shift
157
+ ;;
158
+ -n|--name)
159
+ shift
160
+ LXC_NAME=$1
161
+ shift
162
+ ;;
163
+ -D|--device)
164
+ shift
165
+ OVERLAY_DEVICE=$1
166
+ shift
167
+ ;;
168
+ -z|--directory)
169
+ shift
170
+ HOST_OVERLAY_DIRECTORY=$1
171
+ shift
172
+ ;;
173
+ -b|--bdir)
174
+ shift
175
+ LXC_BIND=$1
176
+ shift
177
+ ;;
178
+ -u|--user)
179
+ shift
180
+ LXC_USER=$1
181
+ shift
182
+ ;;
183
+ -S|--ssh-key)
184
+ shift
185
+ LXC_KEY="-i $1"
186
+ shift
187
+ ;;
188
+ -c|--clean)
189
+ CLEAN=1
190
+ shift
191
+ ;;
192
+ -d|--detach)
193
+ DAEMON=1
194
+ shift
195
+ ;;
196
+ -I|--ipaddress)
197
+ shift
198
+ CUSTOM_IPADDRESS=$1
199
+ shift
200
+ ;;
201
+ -G|--gateway)
202
+ shift
203
+ CUSTOM_GATEWAY=$1
204
+ shift
205
+ ;;
206
+ -N|--netmask)
207
+ shift
208
+ CUSTOM_NETMASK=$1
209
+ shift
210
+ ;;
211
+ -U|--union)
212
+ shift
213
+ UNION=$1
214
+ shift
215
+ ;;
216
+ --)
217
+ shift
218
+ break;;
219
+ *)
220
+ echo $1
221
+ usage
222
+ exit 1
223
+ ;;
224
+ esac
225
+ done
226
+
227
+ COMMAND=$@
228
+ COMMAND_LENGTH=$#
229
+ LXC_USER=${LXC_USER:-`id -un`}
230
+
231
+ # validation
232
+
233
+ if [ -z $LXC_BASE ]; then
234
+ echo "original container must be specified"
235
+ usage
236
+ exit 1
237
+ fi
238
+ if [ ! -d /var/lib/lxc/$LXC_BASE ] ; then
239
+ echo "no such lxc container $LXC_BASE"
240
+ exit 1
241
+ fi
242
+
243
+ if [ "$UNION" != "overlayfs" -a "$UNION" != "aufs" ]; then
244
+ echo "Invalid option for union: choose overlayfs or aufs."
245
+ exit 1
246
+ fi
247
+
248
+ decide_dirs()
249
+ {
250
+ if [ -z "$LXC_NAME" ] ; then
251
+ echo "You can only use the --clean option if the --name option is also specified "
252
+ fi
253
+ EPHEMERAL_BIND_DIR=/var/lib/lxc/$LXC_NAME/ephemeralbind
254
+ # echo "umounting ephemeral_bind_dir $EPHEMERAL_BIND_DIR" >&2
255
+ LXC_DIR=/var/lib/lxc/$LXC_NAME
256
+ if [ -z $HOST_OVERLAY_DIRECTORY ] && [ -z $OVERLAY_DEVICE ] ; then
257
+ OVERLAY_DIR=/tmp/lxc-$LXC_NAME
258
+ fi
259
+ }
260
+
261
+ setup_container()
262
+ {
263
+ echo "Setting up ephemeral container..."
264
+ if [ $HOST_OVERLAY_DIRECTORY ]; then
265
+ echo " -- Using local directory for overlay: ${HOST_OVERLAY_DIRECTORY}"
266
+ elif [ $OVERLAY_DEVICE ]; then
267
+ echo " -- Using overlay virtual block device"
268
+ fi
269
+
270
+ if [ -z $LXC_NAME ] ; then
271
+ LXC_DIR=`sudo mktemp -d --tmpdir=/var/lib/lxc $LXC_BASE-temp-XXXXXXX`
272
+ LXC_NAME=`basename $LXC_DIR`
273
+ else
274
+ `sudo mkdir /var/lib/lxc/$LXC_NAME`
275
+ LXC_DIR=/var/lib/lxc/$LXC_NAME
276
+ fi
277
+
278
+ if [ -z $HOST_OVERLAY_DIRECTORY ] && [ -z $OVERLAY_DEVICE ] ; then
279
+ mkdir /tmp/lxc-$LXC_NAME
280
+ OVERLAY_DIR=/tmp/lxc-$LXC_NAME
281
+ sudo mount -t tmpfs none $OVERLAY_DIR
282
+ fi
283
+
284
+
285
+ sudo chmod 755 ${LXC_DIR}
286
+ sudo mkdir ${LXC_DIR}/rootfs
287
+ do_mount "/var/lib/lxc/$LXC_BASE/rootfs" "${OVERLAY_DIR}" ${LXC_DIR}/rootfs
288
+ EPHEMERAL_BIND_DIR=$LXC_DIR/ephemeralbind
289
+ sudo mkdir $EPHEMERAL_BIND_DIR
290
+ sudo mount -t tmpfs none $EPHEMERAL_BIND_DIR
291
+ LXC_MOUNTED=1
292
+ {
293
+ d1=/var/lib/lxc/${LXC_BASE}
294
+ for f in ${d1}/*; do
295
+ if [ -f $f ]; then
296
+ sudo cp $f $LXC_DIR/
297
+ fi
298
+ done
299
+ }
300
+
301
+ # Update the ephemeral lxc's configuration to reflect the new container name.
302
+ # Check all the places known distros keep hostnames.
303
+ # FIXME: should we sanity check the hostname to make sure it contains no bad chars?
304
+ for file in $LXC_DIR/fstab $LXC_DIR/config \
305
+ $LXC_DIR/rootfs/etc/hostname \
306
+ $LXC_DIR/rootfs/etc/hosts \
307
+ $LXC_DIR/rootfs/etc/sysconfig/network \
308
+ $LXC_DIR/rootfs/etc/sysconfig/network-scripts/ifcfg-eth0
309
+ do
310
+ if test -f "$file"
311
+ then
312
+ sudo sed -i -e "s/$LXC_BASE/$LXC_NAME/" $file
313
+ fi
314
+ done
315
+
316
+ dist=`cat $LXC_DIR/rootfs/etc/issue | head -n 1 | cut -f1 -d\ `
317
+ if [ $dist = 'CentOS' ] ; then
318
+ DISTRO="EL"
319
+ else
320
+ DISTRO="DEBIAN"
321
+ fi
322
+
323
+ # special tweaks for the centos family of distributions
324
+ if [ $DISTRO = "EL" ] ; then
325
+ cat <<EOF > $LXC_DIR/rootfs/etc/sysconfig/network
326
+ NETWORKING=yes
327
+ HOSTNAME=$LXC_NAME
328
+ EOF
329
+ echo "hostname $LXC_NAME" >> $LXC_DIR/rootfs/etc/rc.local
330
+ fi
331
+
332
+ # Update the fstab to have all bind mounts be ephemeral.
333
+ sudo cp $LXC_DIR/fstab $LXC_DIR/fstab.old
334
+ while read line; do
335
+ # Pull out the second field of the current line of fstab info
336
+ path=`echo -n $line | awk '{print $2}'`
337
+ # If LXC_BIND is not set, or the mount destination of this line is not
338
+ # LXC_BIND...
339
+ if [ -z "$LXC_BIND" -o "`readlink -f $path`" != "`readlink -f $LXC_DIR/rootfs$LXC_BIND`" ];
340
+ then
341
+ # ...then we should write some form of this line.
342
+ # If this line is a bind...
343
+ if [ "`echo -n $line | awk '{print $4}'`" = "bind" ]; then
344
+ # ...we should rewrite it as an overlay.
345
+ source=`echo -n $line | awk '{print $1}'`
346
+ upperdir=$EPHEMERAL_BIND_DIR$source
347
+ sudo mkdir -p $upperdir
348
+ sudo chown `sudo stat -c '%U.%G' $source` $upperdir
349
+ if [ $UNION = "overlayfs" ]; then
350
+ echo "none $path overlayfs upperdir=$upperdir,lowerdir=$source 0 0";
351
+ else
352
+ echo "none $path aufs br=${upperdir}=rw:${lowerdir}=ro,noplink 0 0";
353
+ fi
354
+ else
355
+ # Otherwise, we can pass it through unchanged.
356
+ echo "$line";
357
+ fi
358
+ fi
359
+ done < $LXC_DIR/fstab.old | sudo tee $LXC_DIR/fstab >/dev/null
360
+
361
+ # If LXC_BIND is defined, add it to fstab.
362
+ if [ -n "$LXC_BIND" ]; then
363
+ sudo mkdir -p $LXC_DIR/rootfs$LXC_BIND
364
+ echo "$LXC_BIND $LXC_DIR/rootfs$LXC_BIND none bind 0 0" | sudo tee -a $LXC_DIR/fstab >/dev/null
365
+ fi
366
+
367
+ # update the ephemeral container's MAC address (lifted from lxc-clone)
368
+ c=$LXC_DIR/config
369
+ # change hwaddrs
370
+ sudo mv ${c} ${c}.old
371
+ (
372
+ while read line; do
373
+ if [ "${line:0:18}" = "lxc.network.hwaddr" ]; then
374
+ echo "lxc.network.hwaddr= 00:16:3e:$(openssl rand -hex 3| sed 's/\(..\)/\1:/g; s/.$//')"
375
+ else
376
+ echo "$line"
377
+ fi
378
+ done
379
+ ) < ${c}.old | sudo tee ${c} >/dev/null
380
+ sudo rm -f ${c}.old
381
+
382
+ if [ $CUSTOM_IPADDRESS ]; then
383
+ if [ -z $CUSTOM_GATEWAY ]; then
384
+ CUSTOM_GATEWAY=`echo $CUSTOM_IPADDRESS | sed 's/[0-9]\+$/1/'`
385
+ fi
386
+ if [ -z $CUSTOM_NETMASK ]; then
387
+ CUSTOM_NETMASK='255.255.255.0'
388
+ fi
389
+ write_custom_networking
390
+ fi
391
+ }
392
+
393
+ get_ip()
394
+ {
395
+ # Get init's PID
396
+ PID=$(sudo lxc-info -n $1 -p | awk '{print $2}')
397
+ [ "$PID" = "-1" ] && return 1
398
+
399
+ # Get some unique path
400
+ DST=$(sudo mktemp -u --tmpdir=/run/netns/)
401
+ NAME=$(basename $DST)
402
+
403
+ # Prepare the /run/netns entry for "ip netns"
404
+ sudo mkdir -p /run/netns
405
+ sudo ln -s /proc/$PID/ns/net $DST
406
+
407
+ # Grab all the public globally routed IPv4 and IPv6 addresses
408
+ (sudo ip netns exec $NAME ip -4 addr show scope global && \
409
+ sudo ip netns exec $NAME ip -6 addr show scope global) | grep inet | while read line; do
410
+ ip=$(echo $line | awk '{print $2}' | cut -d '/' -f1)
411
+ echo "$ip"
412
+ done
413
+
414
+ sudo rm $DST
415
+ }
416
+
417
+ start_container()
418
+ {
419
+ echo "Starting up the container..."
420
+ sudo lxc-start -n $LXC_NAME -d
421
+ sudo lxc-wait -s RUNNING -n $LXC_NAME
422
+ LXC_RUNNING=1
423
+
424
+ if [ $COMMAND_LENGTH -gt 0 ]; then
425
+ # When lxc-attach support arrives in the kernel, we can switch to
426
+ # that.
427
+ # Meanwhile, we use get_ip to wait for container's network to be up
428
+ # and to obtain the ip address, then we can ssh to the lxc.
429
+ TRIES=60
430
+ FAILED=1
431
+
432
+ # Repeatedly try to connect over SSH until we either succeed
433
+ # or time out.
434
+ for i in $(seq 1 $TRIES); do
435
+ # We call get_ip inside the loop to ensure the correct ip
436
+ # is retrieved even in the case the DHCP ip assignment
437
+ # changes during the process.
438
+ IP_ADDRESS=$(get_ip $LXC_NAME)
439
+ if [ -z "$IP_ADDRESS" ]; then
440
+ sleep 1
441
+ continue
442
+ fi
443
+
444
+ # Iterate through all the addresses (if multiple)
445
+ for ip in $IP_ADDRESS; do
446
+ ssh -n -o StrictHostKeyChecking=no \
447
+ -o UserKnownHostsFile=/dev/null \
448
+ $LXC_KEY $LXC_USER@$IP_ADDRESS -- "$COMMAND"
449
+ SSH_RET=$?
450
+ if [ ! 255 -eq $SSH_RET ]; then
451
+ # If ssh returns 255 then its connection failed.
452
+ # Anything else is either success (status 0) or a
453
+ # failure from whatever we ran over the SSH connection.
454
+ # In those cases we want to stop looping, so we break
455
+ # here
456
+ return $SSH_RET
457
+ fi
458
+ done
459
+ sleep 1
460
+ done
461
+
462
+ echo "could not get IP address - aborting." >&2
463
+ return 255
464
+ else
465
+ sudo lxc-wait -n $LXC_NAME -s RUNNING
466
+ echo "$LXC_NAME is running"
467
+ echo "You connect with the command:"
468
+ echo " sudo lxc-console -n $LXC_NAME"
469
+ fi
470
+ }
471
+
472
+ write_custom_networking()
473
+ {
474
+ if [ $DISTRO = "EL" ] ; then
475
+ cat <<EOF > $LXC_DIR/rootfs/etc/sysconfig/network-scripts/ifcfg-eth0
476
+ DEVICE=eth0
477
+ BOOTPROTO=static
478
+ NETMASK=$CUSTOM_NETMASK
479
+ IPADDR=$CUSTOM_IPADDRESS
480
+ ONBOOT=yes
481
+ TYPE=Ethernet
482
+ USERCTL=yes
483
+ PEERDNS=yes
484
+ IPV6INIT=no
485
+ GATEWAY=$CUSTOM_GATEWAY
486
+ EOF
487
+ else
488
+ cat <<EOF > $LXC_DIR/rootfs/etc/network/interfaces
489
+ auto lo
490
+ iface lo inet loopback
491
+ auto eth0
492
+ iface eth0 inet static
493
+ address $CUSTOM_IPADDRESS
494
+ netmask $CUSTOM_NETMASK
495
+ gateway $CUSTOM_GATEWAY
496
+ EOF
497
+ fi
498
+ }
499
+
500
+ stop_container()
501
+ {
502
+ echo "Stopping lxc" >&2
503
+ sudo lxc-stop -n $LXC_NAME
504
+ sleep 2
505
+ LXC_RUNNING=0
506
+ cleanup_dirs
507
+ }
508
+
509
+ handle_container()
510
+ {
511
+ setup_container
512
+ start_container
513
+ sudo lxc-wait -n $LXC_NAME -s STOPPED
514
+ RET=$?
515
+ stop_container
516
+ exit $RET
517
+ }
518
+
519
+ if [ $CLEAN -eq 1 ]; then
520
+ decide_dirs
521
+ stop_container
522
+ RET=$?
523
+ exit $RET
524
+ fi
525
+
526
+ if [ $DAEMON -eq 1 ]; then
527
+ setup_container
528
+ start_container
529
+ RET=$?
530
+ exit $RET
531
+ fi
532
+
533
+ handle_container
@@ -0,0 +1,16 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.name = "lxc-awesome-ephemeral"
7
+ gem.version = "0.0.1.beta1"
8
+ gem.authors = ["Sean Porter"]
9
+ gem.email = ["portertech@gmail.com"]
10
+ gem.description = "lxc-awesome-ephemeral"
11
+ gem.summary = "lxc-awesome-ephemeral"
12
+ gem.homepage = "https://github.com/portertech/lxc-awesome-ephemeral"
13
+
14
+ gem.files = `git ls-files`.split($/)
15
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
16
+ end
metadata ADDED
@@ -0,0 +1,55 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lxc-awesome-ephemeral
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: 6
5
+ version: 0.0.1.beta1
6
+ platform: ruby
7
+ authors:
8
+ - Sean Porter
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-13 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: lxc-awesome-ephemeral
15
+ email:
16
+ - portertech@gmail.com
17
+ executables:
18
+ - lxc-awesome-ephemeral
19
+ - lxc-awesome-ephemeral.sh
20
+ extensions: []
21
+ extra_rdoc_files: []
22
+ files:
23
+ - .gitignore
24
+ - Gemfile
25
+ - LICENSE.txt
26
+ - README.md
27
+ - Rakefile
28
+ - bin/lxc-awesome-ephemeral
29
+ - bin/lxc-awesome-ephemeral.sh
30
+ - lxc-awesome-ephemeral.gemspec
31
+ homepage: https://github.com/portertech/lxc-awesome-ephemeral
32
+ licenses: []
33
+ post_install_message:
34
+ rdoc_options: []
35
+ require_paths:
36
+ - lib
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ! '>'
47
+ - !ruby/object:Gem::Version
48
+ version: 1.3.1
49
+ requirements: []
50
+ rubyforge_project:
51
+ rubygems_version: 1.8.24
52
+ signing_key:
53
+ specification_version: 3
54
+ summary: lxc-awesome-ephemeral
55
+ test_files: []