elecksee 1.0.2 → 1.0.4

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 (49) hide show
  1. data/CHANGELOG.md +4 -0
  2. data/bin/lxc-awesome-ephemeral +57 -2
  3. data/lib/elecksee/clone.rb +15 -0
  4. data/lib/elecksee/ephemeral.rb +310 -0
  5. data/lib/elecksee/helpers.rb +70 -0
  6. data/lib/elecksee/lxc.rb +409 -5
  7. data/lib/elecksee/lxc_file_config.rb +86 -0
  8. data/lib/elecksee/storage/overlay_directory.rb +31 -0
  9. data/lib/elecksee/storage/overlay_mount.rb +60 -0
  10. data/lib/elecksee/storage/virtual_device.rb +81 -0
  11. data/lib/elecksee/version.rb +1 -1
  12. metadata +9 -39
  13. data/Gemfile.lock +0 -18
  14. data/lib/elecksee/awesome.rb +0 -14
  15. data/lib/elecksee/vendor/lxc/CHANGELOG.md +0 -37
  16. data/lib/elecksee/vendor/lxc/Gemfile +0 -4
  17. data/lib/elecksee/vendor/lxc/Gemfile.lock +0 -41
  18. data/lib/elecksee/vendor/lxc/README.md +0 -112
  19. data/lib/elecksee/vendor/lxc/attributes/default.rb +0 -28
  20. data/lib/elecksee/vendor/lxc/files/default/knife_lxc +0 -228
  21. data/lib/elecksee/vendor/lxc/files/default/lxc-awesome-ephemeral +0 -495
  22. data/lib/elecksee/vendor/lxc/libraries/lxc.rb +0 -366
  23. data/lib/elecksee/vendor/lxc/libraries/lxc_expanded_resources.rb +0 -40
  24. data/lib/elecksee/vendor/lxc/libraries/lxc_file_config.rb +0 -84
  25. data/lib/elecksee/vendor/lxc/libraries/monkey.rb +0 -51
  26. data/lib/elecksee/vendor/lxc/metadata.rb +0 -12
  27. data/lib/elecksee/vendor/lxc/providers/config.rb +0 -75
  28. data/lib/elecksee/vendor/lxc/providers/container.rb +0 -318
  29. data/lib/elecksee/vendor/lxc/providers/default.rb +0 -57
  30. data/lib/elecksee/vendor/lxc/providers/ephemeral.rb +0 -40
  31. data/lib/elecksee/vendor/lxc/providers/fstab.rb +0 -30
  32. data/lib/elecksee/vendor/lxc/providers/interface.rb +0 -45
  33. data/lib/elecksee/vendor/lxc/providers/service.rb +0 -53
  34. data/lib/elecksee/vendor/lxc/recipes/containers.rb +0 -13
  35. data/lib/elecksee/vendor/lxc/recipes/default.rb +0 -58
  36. data/lib/elecksee/vendor/lxc/recipes/install_dependencies.rb +0 -15
  37. data/lib/elecksee/vendor/lxc/recipes/knife.rb +0 -37
  38. data/lib/elecksee/vendor/lxc/resources/config.rb +0 -19
  39. data/lib/elecksee/vendor/lxc/resources/container.rb +0 -54
  40. data/lib/elecksee/vendor/lxc/resources/default.rb +0 -12
  41. data/lib/elecksee/vendor/lxc/resources/ephemeral.rb +0 -13
  42. data/lib/elecksee/vendor/lxc/resources/fstab.rb +0 -12
  43. data/lib/elecksee/vendor/lxc/resources/interface.rb +0 -13
  44. data/lib/elecksee/vendor/lxc/resources/service.rb +0 -5
  45. data/lib/elecksee/vendor/lxc/templates/default/client.rb.erb +0 -13
  46. data/lib/elecksee/vendor/lxc/templates/default/default-lxc.erb +0 -3
  47. data/lib/elecksee/vendor/lxc/templates/default/file_content.erb +0 -2
  48. data/lib/elecksee/vendor/lxc/templates/default/fstab.erb +0 -5
  49. data/lib/elecksee/vendor/lxc/templates/default/interface.erb +0 -27
@@ -1,495 +0,0 @@
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] -o orig -- [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 "bdir : directory to bind mount into container"
23
- echo "user : the user to connect to the container as"
24
- echo "key : the path to the SSH key to use to connect"
25
- echo "size : size of virtual device in M"
26
- echo "rdir : host directory to store rootfs overlay"
27
- echo "ipaddress : static ipv4 to use instead of dhcp"
28
- echo "-d : run in the background"
29
- echo "-U : type of union (aufs or overlayfs)"
30
- echo " Default is overlayfs"
31
- echo "-D : block device for rootfs overlay"
32
- echo "-z : directory to use for rootfs overlay"
33
- echo "-I : ip address to use"
34
- echo "-G : gateway to use"
35
- echo "-N : netmask to use"
36
- echo
37
- echo "if a COMMAND is given, then the container will run only as long"
38
- echo "as the command runs. If no COMMAND is given, this command will"
39
- echo "wait until the container is shut down"
40
- }
41
-
42
- shortoptions='hb:o:u:D:z:I:G:N:S:dU:'
43
- longoptions='help,orig:,bdir:,user:,device:,directory:,ipaddress:,gateway:,netmask:,ssh-key:,daemon,union:'
44
-
45
- LXC_RUNNING=0
46
- LXC_MOUNTED=0
47
- DAEMON=0
48
-
49
- cleanup_dirs()
50
- {
51
- if [ $LXC_DIR = '/' ]; then
52
- echo "ABORT ABORT ABORT -> LXC Directory set to root. Will. Not. Delete!"
53
- exit 42
54
- fi
55
- # echo "umounting ephemeral_bind_dir $EPHEMERAL_BIND_DIR" >&2
56
- sudo umount $EPHEMERAL_BIND_DIR > /dev/null 2>&1
57
- # echo "umounting lxc_dir $LXC_DIR" >&2
58
- sudo umount $LXC_DIR/rootfs > /dev/null 2>&1
59
- # echo "umounting overlay" >&2
60
- if [ ! $HOST_OVERLAY_DIRECTORY ]; then
61
- sudo umount $OVERLAY_DIR > /dev/null 2>&1
62
- fi
63
- # remove all contents of the content dir
64
- sudo rm -rf $LXC_DIR
65
-
66
- # echo "rming overlay dir $OVERLAY_DIR" >&2
67
- if [ $HOST_OVERLAY_DIRECTORY ]; then
68
- if [ $HOST_OVERLAY_DIRECTORY = '/' ]; then
69
- echo "ABORT ABORT ABORT -> Overlay Directory set to root. Will. Not. Delete!"
70
- exit 42
71
- fi
72
-
73
- if [ $VIRT_DIR ]; then
74
- sudo umount $VIRT_MNT > /dev/null 2>&1
75
- sudo rmdir $VIRT_MNT > /dev/null 2>&1
76
- sudo rm -f $VIRT_DEV
77
- fi
78
- sudo rm -rf $HOST_OVERLAY_DIRECTORY
79
- else
80
- if [ $OVERLAY_DIR = '/' ]; then
81
- echo "ABORT ABORT ABORT -> Overlay Directory set to root. Will. Not. Delete!"
82
- exit 42
83
- fi
84
- sudo rm -rf $OVERLAY_DIR
85
- fi
86
- }
87
-
88
- create_virt_device() {
89
- echo "Creating ephemeral virtual device for rootfs (${OVERLAY_DEVICE}M)"
90
- VIRT_DIR="/tmp/lxc-virt-devs"
91
- VIRT_IMG_DIR="${VIRT_DIR}/imgs"
92
- VIRT_MNT_DIR="${VIRT_DIR}/mnt"
93
- VIRT_DEV="${VIRT_IMG_DIR}/${LXC_NAME}"
94
- VIRT_MNT="${VIRT_MNT_DIR}/${LXC_NAME}"
95
- sudo mkdir -p $VIRT_DIR
96
- sudo mkdir -p $VIRT_IMG_DIR
97
- sudo mkdir -p $VIRT_MNT
98
- # Create empty disk
99
- dd if=/dev/zero of=$VIRT_DEV bs=1k seek=${OVERLAY_DEVICE}k count=1 > /dev/null
100
- # format device
101
- echo "y" | mkfs -t ext4 $VIRT_DEV > /dev/null
102
- # mount loopback
103
- mount -o loop $VIRT_DEV $VIRT_MNT
104
- HOST_OVERLAY_DIRECTORY=$VIRT_MNT
105
- }
106
-
107
- cleanup() {
108
- if [ $LXC_RUNNING -eq 1 ]; then
109
- sudo lxc-stop -n $LXC_NAME
110
- fi
111
- if [ $LXC_MOUNTED -eq 1 ]; then
112
- cleanup_dirs
113
- fi
114
- exit 1
115
- }
116
-
117
- do_mount() {
118
- lower=$1
119
- if [ $OVERLAY_DEVICE ]; then
120
- create_virt_device
121
- upper=$HOST_OVERLAY_DIRECTORY
122
- echo "Using local block device for overlay mounted at: ${HOST_OVERLAY_DIRECTORY}"
123
- elif [ $HOST_OVERLAY_DIRECTORY ]; then
124
- mkdir -p $HOST_OVERLAY_DIRECTORY
125
- HOST_OVERLAY_DIRECTORY=`mktemp -d --tmpdir=$HOST_OVERLAY_DIRECTORY $LXC_BASE-temp-XXXXXXX`
126
- upper=$HOST_OVERLAY_DIRECTORY
127
- echo "Using local directory for overlay: ${HOST_OVERLAY_DIRECTORY}"
128
- else
129
- upper=$2
130
- fi
131
- target=$3
132
- if [ $UNION = "aufs" ]; then
133
- sudo mount -t aufs -o br=${upper}=rw:${lower}=ro,noplink none ${target}
134
- else
135
- sudo mount -t overlayfs -oupperdir=${upper},lowerdir=${lower} none ${target}
136
- fi
137
- }
138
-
139
- trap cleanup SIGTERM SIGINT SIGQUIT
140
-
141
- getopt=$(getopt -o $shortoptions --longoptions $longoptions -- "$@")
142
- if [ $? != 0 ]; then
143
- usage
144
- exit 1;
145
- fi
146
-
147
- eval set -- "$getopt"
148
-
149
- while true; do
150
- case "$1" in
151
- -h|--help)
152
- help
153
- exit 1
154
- ;;
155
- -o|--orig)
156
- shift
157
- LXC_BASE=$1
158
- shift
159
- ;;
160
- -D|--device)
161
- shift
162
- OVERLAY_DEVICE=$1
163
- shift
164
- ;;
165
- -z|--directory)
166
- shift
167
- HOST_OVERLAY_DIRECTORY=$1
168
- shift
169
- ;;
170
- -b|--bdir)
171
- shift
172
- LXC_BIND=$1
173
- shift
174
- ;;
175
- -u|--user)
176
- shift
177
- LXC_USER=$1
178
- shift
179
- ;;
180
- -S|--ssh-key)
181
- shift
182
- LXC_KEY="-i $1"
183
- shift
184
- ;;
185
- -d|--detach)
186
- DAEMON=1
187
- shift
188
- ;;
189
- -I|--ipaddress)
190
- shift
191
- CUSTOM_IPADDRESS=$1
192
- shift
193
- ;;
194
- -G|--gateway)
195
- shift
196
- CUSTOM_GATEWAY=$1
197
- shift
198
- ;;
199
- -N|--netmask)
200
- shift
201
- CUSTOM_NETMASK=$1
202
- shift
203
- ;;
204
- -U|--union)
205
- shift
206
- UNION=$1
207
- shift
208
- ;;
209
- --)
210
- shift
211
- break;;
212
- *)
213
- echo $1
214
- usage
215
- exit 1
216
- ;;
217
- esac
218
- done
219
-
220
- COMMAND=$@
221
- COMMAND_LENGTH=$#
222
- LXC_USER=${LXC_USER:-`id -un`}
223
-
224
- # validation
225
-
226
- if [ -z $LXC_BASE ]; then
227
- echo "original container must be specified"
228
- usage
229
- exit 1
230
- fi
231
- if [ ! -d /var/lib/lxc/$LXC_BASE ] ; then
232
- echo "no such lxc container $LXC_BASE"
233
- exit 1
234
- fi
235
-
236
- if [ "$UNION" != "overlayfs" -a "$UNION" != "aufs" ]; then
237
- echo "Invalid option for union: choose overlayfs or aufs."
238
- exit 1
239
- fi
240
-
241
- setup_container()
242
- {
243
- echo "Setting up ephemeral container..."
244
- if [ $HOST_OVERLAY_DIRECTORY ]; then
245
- echo " -- Using local directory for overlay: ${HOST_OVERLAY_DIRECTORY}"
246
- elif [ $OVERLAY_DEVICE ]; then
247
- echo " -- Using overlay virtual block device"
248
- else
249
- OVERLAY_DIR=`mktemp -d /tmp/lxc-lp-XXXXXXX`
250
- sudo mount -t tmpfs none $OVERLAY_DIR
251
- fi
252
- LXC_DIR=`sudo mktemp -d --tmpdir=/var/lib/lxc $LXC_BASE-temp-XXXXXXX`
253
- sudo chmod 755 ${LXC_DIR}
254
- LXC_NAME=`basename $LXC_DIR`
255
- sudo mkdir ${LXC_DIR}/rootfs
256
- do_mount "/var/lib/lxc/$LXC_BASE/rootfs" "${OVERLAY_DIR}" ${LXC_DIR}/rootfs
257
- EPHEMERAL_BIND_DIR=$LXC_DIR/ephemeralbind
258
- sudo mkdir $EPHEMERAL_BIND_DIR
259
- sudo mount -t tmpfs none $EPHEMERAL_BIND_DIR
260
- LXC_MOUNTED=1
261
- {
262
- d1=/var/lib/lxc/${LXC_BASE}
263
- for f in ${d1}/*; do
264
- if [ -f $f ]; then
265
- sudo cp $f $LXC_DIR/
266
- fi
267
- done
268
- }
269
-
270
- # Update the ephemeral lxc's configuration to reflect the new container name.
271
- # Check all the places known distros keep hostnames.
272
- # FIXME: should we sanity check the hostname to make sure it contains no bad chars?
273
- for file in $LXC_DIR/fstab $LXC_DIR/config \
274
- $LXC_DIR/rootfs/etc/hostname \
275
- $LXC_DIR/rootfs/etc/hosts \
276
- $LXC_DIR/rootfs/etc/sysconfig/network \
277
- $LXC_DIR/rootfs/etc/sysconfig/network-scripts/ifcfg-eth0
278
- do
279
- if test -f "$file"
280
- then
281
- sudo sed -i -e "s/$LXC_BASE/$LXC_NAME/" $file
282
- fi
283
- done
284
-
285
- if [ -e $LXC_DIR/rootfs/etc/redhat-release ]; then
286
- DISTRO="EL"
287
- else
288
- DISTRO="DEBIAN"
289
- fi
290
-
291
- # special tweaks for the centos family of distributions
292
- if [ $DISTRO = "EL" ] ; then
293
- cat <<EOF > $LXC_DIR/rootfs/etc/sysconfig/network
294
- NETWORKING=yes
295
- HOSTNAME=$LXC_NAME
296
- EOF
297
- echo "hostname $LXC_NAME" >> $LXC_DIR/rootfs/etc/rc.local
298
- fi
299
-
300
- # Update the fstab to have all bind mounts be ephemeral.
301
- sudo cp $LXC_DIR/fstab $LXC_DIR/fstab.old
302
- while read line; do
303
- # Pull out the second field of the current line of fstab info
304
- path=`echo -n $line | awk '{print $2}'`
305
- # If LXC_BIND is not set, or the mount destination of this line is not
306
- # LXC_BIND...
307
- if [ -n "$path" ] && [ -z "$LXC_BIND" -o "`readlink -f $path`" != "`readlink -f $LXC_DIR/rootfs$LXC_BIND`" ];
308
- then
309
- # ...then we should write some form of this line.
310
- # If this line is a bind...
311
- if [ `echo -n $line | awk '{print $4}'` = "bind" ]; then
312
- # ...we should rewrite it as an overlay.
313
- source=`echo -n $line | awk '{print $1}'`
314
- upperdir=$EPHEMERAL_BIND_DIR$source
315
- sudo mkdir -p $upperdir
316
- sudo chown `sudo stat -c '%U.%G' $source` $upperdir
317
- if [ $UNION = "overlayfs" ]; then
318
- echo "none $path overlayfs upperdir=$upperdir,lowerdir=$source 0 0";
319
- else
320
- echo "none $path aufs br=${upperdir}=rw:${lowerdir}=ro,noplink 0 0";
321
- fi
322
- else
323
- # Otherwise, we can pass it through unchanged.
324
- echo "$line";
325
- fi
326
- fi
327
- done < $LXC_DIR/fstab.old | sudo tee $LXC_DIR/fstab >/dev/null
328
-
329
- # If LXC_BIND is defined, add it to fstab.
330
- if [ -n "$LXC_BIND" ]; then
331
- sudo mkdir -p $LXC_DIR/rootfs$LXC_BIND
332
- echo "$LXC_BIND $LXC_DIR/rootfs$LXC_BIND none bind 0 0" | sudo tee -a $LXC_DIR/fstab >/dev/null
333
- fi
334
-
335
- # update the ephemeral container's MAC address (lifted from lxc-clone)
336
- c=$LXC_DIR/config
337
- # change hwaddrs
338
- sudo mv ${c} ${c}.old
339
- (
340
- while read line; do
341
- if [ "${line:0:18}" = "lxc.network.hwaddr" ]; then
342
- echo "lxc.network.hwaddr= 00:16:3e:$(openssl rand -hex 3| sed 's/\(..\)/\1:/g; s/.$//')"
343
- else
344
- echo "$line"
345
- fi
346
- done
347
- ) < ${c}.old | sudo tee ${c} >/dev/null
348
- sudo rm -f ${c}.old
349
-
350
- if [ $CUSTOM_IPADDRESS ]; then
351
- if [ -z $CUSTOM_GATEWAY ]; then
352
- CUSTOM_GATEWAY=`echo $CUSTOM_IPADDRESS | sed 's/[0-9]\+$/1/'`
353
- fi
354
- if [ -z $CUSTOM_NETMASK ]; then
355
- CUSTOM_NETMASK='255.255.255.0'
356
- fi
357
- write_custom_networking
358
- fi
359
- }
360
-
361
- get_ip()
362
- {
363
- # Get init's PID
364
- PID=$(sudo lxc-info -n $1 -p | awk '{print $2}')
365
- [ "$PID" = "-1" ] && return 1
366
-
367
- # Get some unique path
368
- DST=$(sudo mktemp -u --tmpdir=/run/netns/)
369
- NAME=$(basename $DST)
370
-
371
- # Prepare the /run/netns entry for "ip netns"
372
- sudo mkdir -p /run/netns
373
- sudo ln -s /proc/$PID/ns/net $DST
374
-
375
- # Grab all the public globally routed IPv4 and IPv6 addresses
376
- (sudo ip netns exec $NAME ip -4 addr show scope global && \
377
- [ sudo ip netns exec $NAME ip -6 addr show scope global) | grep inet | while read line; do
378
- ip=$(echo $line | awk '{print $2}' | cut -d '/' -f1)
379
- echo "$ip"
380
- done
381
-
382
- sudo rm $DST
383
- }
384
-
385
- start_container()
386
- {
387
- echo "Starting up the container..."
388
- sudo lxc-start -n $LXC_NAME -d
389
- sudo lxc-wait -s RUNNING -n $LXC_NAME
390
- LXC_RUNNING=1
391
-
392
- if [ $COMMAND_LENGTH -gt 0 ]; then
393
- # When lxc-attach support arrives in the kernel, we can switch to
394
- # that.
395
- # Meanwhile, we use get_ip to wait for container's network to be up
396
- # and to obtain the ip address, then we can ssh to the lxc.
397
- TRIES=60
398
- FAILED=1
399
-
400
- # Repeatedly try to connect over SSH until we either succeed
401
- # or time out.
402
- for i in $(seq 1 $TRIES); do
403
- # We call get_ip inside the loop to ensure the correct ip
404
- # is retrieved even in the case the DHCP ip assignment
405
- # changes during the process.
406
- IP_ADDRESS=$(get_ip $LXC_NAME)
407
- if [ -z "$IP_ADDRESS" ]; then
408
- sleep 1
409
- continue
410
- fi
411
-
412
- # Iterate through all the addresses (if multiple)
413
- for ip in $IP_ADDRESS; do
414
- ssh -n -o StrictHostKeyChecking=no \
415
- -o UserKnownHostsFile=/dev/null \
416
- $LXC_KEY $LXC_USER@$IP_ADDRESS -- "$COMMAND"
417
- SSH_RET=$?
418
- if [ ! 255 -eq $SSH_RET ]; then
419
- # If ssh returns 255 then its connection failed.
420
- # Anything else is either success (status 0) or a
421
- # failure from whatever we ran over the SSH connection.
422
- # In those cases we want to stop looping, so we break
423
- # here
424
- return $SSH_RET
425
- fi
426
- done
427
- sleep 1
428
- done
429
-
430
- echo "could not get IP address - aborting." >&2
431
- return 255
432
- else
433
- sudo lxc-wait -n $LXC_NAME -s RUNNING
434
- echo "$LXC_NAME is running"
435
- echo "You connect with the command:"
436
- echo " sudo lxc-console -n $LXC_NAME"
437
- sudo lxc-wait -n $LXC_NAME -s STOPPED
438
- fi
439
- }
440
-
441
- write_custom_networking()
442
- {
443
- if [ $DISTRO = "EL" ] ; then
444
- cat <<EOF > $LXC_DIR/rootfs/etc/sysconfig/network-scripts/ifcfg-eth0
445
- DEVICE=eth0
446
- BOOTPROTO=static
447
- NETMASK=$CUSTOM_NETMASK
448
- IPADDR=$CUSTOM_IPADDRESS
449
- ONBOOT=yes
450
- TYPE=Ethernet
451
- USERCTL=yes
452
- PEERDNS=yes
453
- IPV6INIT=no
454
- GATEWAY=$CUSTOM_GATEWAY
455
- EOF
456
- else
457
- cat <<EOF > $LXC_DIR/rootfs/etc/network/interfaces
458
- auto lo
459
- iface lo inet loopback
460
- auto eth0
461
- iface eth0 inet static
462
- address $CUSTOM_IPADDRESS
463
- netmask $CUSTOM_NETMASK
464
- gateway $CUSTOM_GATEWAY
465
- EOF
466
- fi
467
- }
468
-
469
- stop_container()
470
- {
471
- echo "Stopping lxc" >&2
472
- sudo lxc-stop -n $LXC_NAME
473
- sleep 2
474
- LXC_RUNNING=0
475
- cleanup_dirs
476
- }
477
-
478
- handle_container()
479
- {
480
- setup_container
481
- start_container
482
- RET=$?
483
- stop_container
484
- if [ $DAEMON -eq 1 ]; then
485
- cleanup
486
- fi
487
- exit $RET
488
- }
489
-
490
- if [ $DAEMON -eq 1 ]; then
491
- handle_container &
492
- exit 0
493
- fi
494
-
495
- handle_container