kameleon-builder 2.0.0.dev

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 (95) hide show
  1. data/.editorconfig +23 -0
  2. data/.env +51 -0
  3. data/.gitignore +22 -0
  4. data/AUTHORS +19 -0
  5. data/CHANGELOG +36 -0
  6. data/COPYING +340 -0
  7. data/Gemfile +4 -0
  8. data/README.md +53 -0
  9. data/Rakefile +24 -0
  10. data/Vagrantfile +68 -0
  11. data/bin/kameleon +16 -0
  12. data/contrib/kameleon_bashrc.sh +138 -0
  13. data/contrib/scripts/VirtualBox_deploy.sh +12 -0
  14. data/contrib/scripts/chroot_env +9 -0
  15. data/contrib/scripts/create_passwd.py +17 -0
  16. data/contrib/scripts/umount-chroot.sh +290 -0
  17. data/contrib/steps/bootstrap/debian/bootstrap_if_needed.yaml +47 -0
  18. data/contrib/steps/bootstrap/debian/bootstrap_static.yaml +38 -0
  19. data/contrib/steps/setup/add_timestamp.yaml +6 -0
  20. data/contrib/steps/setup/autologin.yaml +16 -0
  21. data/contrib/steps/setup/copy_ssh_auth_file.yaml +10 -0
  22. data/contrib/steps/setup/debian/add_network_interface.yaml +7 -0
  23. data/contrib/steps/setup/debian/cluster_tools_install.yaml +16 -0
  24. data/contrib/steps/setup/debian/network_config_static.yaml +17 -0
  25. data/contrib/steps/setup/generate_user_ssh_key.yaml +15 -0
  26. data/contrib/steps/setup/install_my_ssh_key.yaml +26 -0
  27. data/contrib/steps/setup/make_swap_file.yaml +9 -0
  28. data/contrib/steps/setup/root_ssh_config.yaml +18 -0
  29. data/contrib/steps/setup/set_user_password.yaml +7 -0
  30. data/contrib/steps/setup/system_optimization.yaml +8 -0
  31. data/docs/.gitignore +1 -0
  32. data/docs/Makefile +177 -0
  33. data/docs/make.bat +242 -0
  34. data/docs/source/_static/.gitignore +0 -0
  35. data/docs/source/aliases.rst +29 -0
  36. data/docs/source/checkpoint.rst +28 -0
  37. data/docs/source/cli.rst +3 -0
  38. data/docs/source/commands.rst +62 -0
  39. data/docs/source/conf.py +254 -0
  40. data/docs/source/context.rst +42 -0
  41. data/docs/source/faq.rst +3 -0
  42. data/docs/source/getting_started.rst +3 -0
  43. data/docs/source/index.rst +38 -0
  44. data/docs/source/installation.rst +3 -0
  45. data/docs/source/recipe.rst +256 -0
  46. data/docs/source/why.rst +3 -0
  47. data/docs/source/workspace.rst +11 -0
  48. data/kameleon-builder.gemspec +37 -0
  49. data/lib/kameleon.rb +75 -0
  50. data/lib/kameleon/cli.rb +176 -0
  51. data/lib/kameleon/context.rb +83 -0
  52. data/lib/kameleon/engine.rb +357 -0
  53. data/lib/kameleon/environment.rb +38 -0
  54. data/lib/kameleon/error.rb +51 -0
  55. data/lib/kameleon/logger.rb +53 -0
  56. data/lib/kameleon/recipe.rb +474 -0
  57. data/lib/kameleon/shell.rb +290 -0
  58. data/lib/kameleon/step.rb +213 -0
  59. data/lib/kameleon/utils.rb +45 -0
  60. data/lib/kameleon/version.rb +3 -0
  61. data/templates/COPYRIGHT +21 -0
  62. data/templates/aliases/defaults.yaml +83 -0
  63. data/templates/checkpoints/docker.yaml +14 -0
  64. data/templates/checkpoints/qcow2.yaml +44 -0
  65. data/templates/debian-wheezy-chroot.yaml +98 -0
  66. data/templates/debian-wheezy-docker.yaml +97 -0
  67. data/templates/fedora-docker.yaml +96 -0
  68. data/templates/steps/bootstrap/debian/debootstrap.yaml +13 -0
  69. data/templates/steps/bootstrap/fedora/docker_bootstrap.yaml +25 -0
  70. data/templates/steps/bootstrap/fedora/yum_bootstrap.yaml +22 -0
  71. data/templates/steps/bootstrap/prepare_appliance_with_nbd.yaml +93 -0
  72. data/templates/steps/bootstrap/prepare_docker.yaml +38 -0
  73. data/templates/steps/bootstrap/start_chroot.yaml +53 -0
  74. data/templates/steps/bootstrap/start_docker.yaml +12 -0
  75. data/templates/steps/export/build_appliance_from_docker.yaml +105 -0
  76. data/templates/steps/export/clean_appliance.yaml +3 -0
  77. data/templates/steps/export/save_appliance_from_nbd.yaml +54 -0
  78. data/templates/steps/setup/create_user.yaml +12 -0
  79. data/templates/steps/setup/debian/kernel_install.yaml +20 -0
  80. data/templates/steps/setup/debian/keyboard_config.yaml +10 -0
  81. data/templates/steps/setup/debian/network_config.yaml +30 -0
  82. data/templates/steps/setup/debian/software_install.yaml +15 -0
  83. data/templates/steps/setup/debian/system_config.yaml +12 -0
  84. data/templates/steps/setup/fedora/kernel_install.yaml +27 -0
  85. data/templates/steps/setup/fedora/software_install.yaml +10 -0
  86. data/tests/helper.rb +22 -0
  87. data/tests/recipes/dummy_recipe.yaml +48 -0
  88. data/tests/recipes/steps/bootstrap/dummy_distro/dummy_bootstrap_static.yaml +4 -0
  89. data/tests/recipes/steps/export/dummy_save_appliance.yaml +9 -0
  90. data/tests/recipes/steps/setup/default/dummy_root_passwd.yaml +8 -0
  91. data/tests/recipes/steps/setup/dummy_distro/dummy_software_install.yaml +7 -0
  92. data/tests/test_context.rb +16 -0
  93. data/tests/test_recipe.rb +15 -0
  94. data/tests/test_version.rb +9 -0
  95. metadata +300 -0
@@ -0,0 +1,13 @@
1
+ # # Bootstrap
2
+ - include: >
3
+ ifupdown locales libui-dialog-perl dialog isc-dhcp-client netbase
4
+ net-tools iproute acpid openssh-server pciutils
5
+ - debootstrap:
6
+ - check_cmd_out: debootstrap
7
+ - exec_out: mkdir -p $(dirname "$$rootfs_archive")
8
+ - exec_out: ROOTFS=$(dirname "$$rootfs_archive")/rootfs
9
+ - exec_out: mkdir -p $ROOTFS
10
+ - exec_out: test -f "$$rootfs_archive" || debootstrap --no-check-gpg --arch=$$arch --include="$$include" $$release $ROOTFS $$repository
11
+ - exec_out: test -f "$$rootfs_archive" || cat /etc/resolv.conf > $ROOTFS/etc/resolv.conf
12
+ - exec_out: test -f "$$rootfs_archive" || tar zcf "$$rootfs_archive" -C "$ROOTFS" --numeric-owner --one-file-system .
13
+ - exec_out: test -f "$$rootfs_archive" || rm -rf $ROOTFS
@@ -0,0 +1,25 @@
1
+ # # Bootstrap
2
+ - repository: mattdm/fedora
3
+ - rootfs: rootfs
4
+ - include: >
5
+ yum initscripts passwd rsyslog vim-minimal dhclient chkconfig rootfiles openssh-server
6
+ policycoreutils fedora-release openssh-server net-tools nc traceroute
7
+ - create_rootfs:
8
+ - exec_out: test -f "$$rootfs_archive" || mkdir -p $(dirname "$$rootfs_archive")
9
+ - exec_out: test -f "$$rootfs_archive" || echo "Pulling image from '$$repository'"
10
+ - exec_out: test -f "$$rootfs_archive" || docker pull -t f$$release $$repository > /dev/null
11
+ - exec_out: |
12
+ echo "Installing core packages : $$include"
13
+ if [ ! -f "$$rootfs_archive" ]
14
+ then
15
+ BASE_CID=$(docker run --dns $$dns -d $$repository:f$${release} \
16
+ bash -c "yum -y --nogpgcheck update ; \
17
+ yum -y --nogpgcheck install $$include ; \
18
+ /usr/bin/ssh-keygen -A")
19
+ fi
20
+ - exec_out: test -f "$$rootfs_archive" || bash -c "exit $(docker wait $BASE_CID)"
21
+ - exec_out: test -f "$$rootfs_archive" || docker export $BASE_CID > "$$rootfs_archive"
22
+ - on_bootstrap_clean:
23
+ - exec_out: test -f "$$rootfs_archive" || docker kill "$BASE_CID"
24
+ - exec_out: test -f "$$rootfs_archive" || docker rm "$BASE_CID"
25
+ - exec_out: test -f "$$rootfs_archive" || docker rmi $$repository
@@ -0,0 +1,22 @@
1
+ # # Bootstrap
2
+ - include: >
3
+ yum initscripts passwd rsyslog vim-minimal dhclient chkconfig rootfiles
4
+ policycoreutils fedora-release openssh-server net-tools nc traceroute
5
+ - bootstrap_fedora:
6
+ - check_cmd_out: yum
7
+ - check_cmd_out: curl
8
+ - exec_out: test -f "$$rootfs_archive" || mkdir -p $(dirname "$$rootfs_archive")
9
+ - exec_out: test -f "$$rootfs_archive" || ROOTFS=$(dirname "$$rootfs_archive")/rootfs
10
+ - exec_out: test -f "$$rootfs_archive" || mkdir -p $ROOTFS
11
+ - exec_out: test -f "$$rootfs_archive" || echo "Fetching release mirror"
12
+ - exec_out: test -f "$$rootfs_archive" || MIRROR_URL=$(curl -s -S -f "$$mirrorlist_url" | head -n2 | tail -n1)
13
+ - exec_out: test -f "$$rootfs_archive" || RELEASE_URL="$MIRROR_URL/Packages/f/fedora-release-$${release}-1.noarch.rpm"
14
+ - exec_out: test -f "$$rootfs_archive" || echo "Fetching from $RELEASE_URL"
15
+ - exec_out: test -f "$$rootfs_archive" || curl -sf "$RELEASE_URL" > "$(basename $RELEASE_URL)" 2> /dev/null
16
+ - exec_out: test -f "$$rootfs_archive" || mkdir -p $ROOTFS/var/lib/rpm
17
+ - exec_out: test -f "$$rootfs_archive" || rpm --root $ROOTFS --initdb
18
+ - exec_out: test -f "$$rootfs_archive" || rpm --root $ROOTFS -ivh "$(basename $RELEASE_URL)"
19
+ - exec_out: test -f "$$rootfs_archive" || yum --installroot $ROOTFS -y --nogpgcheck install $$include
20
+ - exec_out: test -f "$$rootfs_archive" || cat /etc/resolv.conf > $ROOTFS/etc/resolv.conf
21
+ - exec_out: test -f "$$rootfs_archive" || tar zcf "$$rootfs_archive" -C "$ROOTFS" --numeric-owner --one-file-system .
22
+ - exec_out: test -f "$$rootfs_archive" || rm -fr $ROOTFS
@@ -0,0 +1,93 @@
1
+ # Prepare Appliance
2
+ - nbd_device: /dev/nbd0
3
+
4
+ - create_raw_image:
5
+ - check_cmd_out: qemu-img
6
+ - exec_out: mkdir -p checkpoints
7
+ - exec_out: |
8
+ if [ ! -e "$$container" ] ; then
9
+ qemu-img create -f qcow2 checkpoints/base_$$container $$image_size
10
+ ln -sf checkpoints/base_$$container $$container
11
+ fi
12
+
13
+ - load_nbd_module:
14
+ - on_bootstrap_init:
15
+ - exec_out: |
16
+ lsmod | grep nbd >/dev/null \
17
+ || modprobe nbd max_part=63 \
18
+ || fail failed to load nbd module into kernel
19
+
20
+ - attach_nbd_device:
21
+ - on_checkpoint: skip
22
+ - check_cmd_out: qemu-nbd
23
+ - exec_out: echo Connecting $$container to nbd device $$nbd_device
24
+ - exec_out: qemu-nbd -c $$nbd_device "$(readlink $$container)" -n || fail nbd device $$container is unavailable
25
+
26
+
27
+ - detach_nbd_device:
28
+ - on_checkpoint: redo
29
+ - on_export_clean:
30
+ - exec_out: echo "sync" ; sync
31
+ - exec_out: qemu-nbd -d $$nbd_device
32
+ - exec_out: "pgrep qemu-nbd | xargs -I {} kill -9 {} || true"
33
+
34
+ - partition_disk:
35
+ - check_cmd_out: sfdisk
36
+ - exec_out: |
37
+ echo "Partitioning disk..."
38
+ sfdisk $${nbd_device} -q -D -uM --force --no-reread <<< '
39
+ ,200,83,*
40
+ ;
41
+ ' 2>&1 || fail cannot partition $$container
42
+ - exec_out: |
43
+ echo Creating boot partition...
44
+ mkfs.$$filesystem_type -q $${nbd_device}p1 || fail cannot create /boot ext4
45
+ - exec_out: |
46
+ echo Creating root partition...
47
+ mkfs.$$filesystem_type -q $${nbd_device}p2 || fail cannot create / ext4
48
+
49
+ - mount_mountdir:
50
+ - on_checkpoint: redo
51
+ - exec_out: mkdir -p $$mountdir
52
+ - exec_out: "echo Mounting root partition... ; mount $${nbd_device}p2 $$mountdir || fail cannot mount /"
53
+ - on_export_clean:
54
+ - exec_out: "echo try umount $$mountdir... ; mountpoint -q $$mountdir && umount -f -l $$mountdir || true"
55
+ - exec_out: "test -d $$mountdir && rmdir $$mountdir || true"
56
+ - exec_out: mkdir -p $$mountdir/boot
57
+ - exec_out: "echo Mounting boot partition... ; mount $${nbd_device}p1 $$mountdir/boot || fail cannot mount /boot"
58
+ - on_export_clean:
59
+ - exec_out: "echo try umount $$mountdir/boot... ; mountpoint -q $$mountdir/boot && umount -f -l $$mountdir/boot || true"
60
+ - exec_out: "test -d $$mountdir/boot && rmdir $$mountdir/boot || true"
61
+
62
+ - copy_rootfs:
63
+ - exec_out: tar -xf $$rootfs_archive -C $$mountdir
64
+ - exec_out: echo "sync..." ; sync
65
+
66
+ - create_fstab:
67
+ - write_out:
68
+ - $$mountdir/etc/fstab
69
+ - |
70
+ # /etc/fstab: static file system information.
71
+ #
72
+ # Use 'blkid' to print the universally unique identifier for a
73
+ # device; this may be used with UUID= as a more robust way to name devices
74
+ # that works even if disks are added and removed. See fstab(5).
75
+ #
76
+ # <file system> <mount point> <type> <options> <dump> <pass>
77
+ UUID=`blkid -s UUID -o value $${nbd_device}p2` / $$filesystem_type errors=remount-ro 0 1
78
+ UUID=`blkid -s UUID -o value $${nbd_device}p1` /boot $$filesystem_type sync 0 2
79
+
80
+
81
+ - install_bootloader:
82
+ - on_export_init:
83
+ - exec_in: extlinux-install $$nbd_device 2>&1
84
+ - write_in:
85
+ - /boot/extlinux/extlinux.conf
86
+ - |
87
+ default linux
88
+ timeout 1
89
+
90
+ label linux
91
+ kernel ../`basename /boot/vmlinuz*`
92
+ append initrd=../`basename /boot/init*` root=UUID=`blkid -s UUID -o value $${nbd_device}p2` ro
93
+ - exec_out: echo " sync..." ; sync
@@ -0,0 +1,38 @@
1
+
2
+ - clean_containers:
3
+ - on_checkpoint: redo
4
+ - on_export_clean:
5
+ - exec_out: echo "Stopping trailing containers"
6
+ - exec_out: touch CONTAINERS_TO_CLEAN
7
+ - exec_out: cat CONTAINERS_TO_CLEAN | xargs -I {} docker kill {}
8
+ - exec_out: echo "Removing trailing containers"
9
+ - exec_out: cat CONTAINERS_TO_CLEAN | xargs -I {} docker rm {}
10
+ - exec_out: rm -f CONTAINERS_TO_CLEAN
11
+
12
+ - import_rootfs:
13
+ - exec_out: |
14
+ docker images | grep -q $$image \
15
+ || (echo "Importing $$image to docker..." && cat "$$rootfs_archive"\
16
+ | docker import - $$image \
17
+ | xargs -I {} docker tag {} $$image:base)
18
+ - exec_out: docker tag $$image:base $$image:latest
19
+
20
+ - configure_sshd:
21
+ - on_checkpoint: redo
22
+ - exec_out: echo -e 'y\n' | ssh-keygen -q -t dsa -f $$insecure_ssh_key -N ''
23
+ - exec_out: chmod 600 $$insecure_ssh_key*
24
+ - exec_out: |
25
+ CID=$(docker run --dns $$dns -d -v "$(pwd):/tmp" $$image:latest \
26
+ /bin/bash -c "rm -fr /root/.ssh ; \
27
+ mkdir -p /root/.ssh ; \
28
+ ssh-keygen -q -t dsa -f /root/.ssh/id_dsa -N '' ; \
29
+ cat /tmp/$${insecure_ssh_key}.pub > /root/.ssh/authorized_keys")
30
+ - exec_out: bash -c "exit $(docker wait $CID)"
31
+ - exec_out: echo "$CID" >> CONTAINERS_TO_CLEAN
32
+ - exec_out: |
33
+ docker images | grep $$image \
34
+ | grep sshd \
35
+ | awk '{print $3}' \
36
+ | xargs -I {} docker rmi {}
37
+ - exec_out: docker commit $CID $$image:sshd > /dev/null
38
+ - exec_out: docker tag $$image:sshd $$image:latest
@@ -0,0 +1,53 @@
1
+ # # Bootstrap
2
+ - mount_chroot:
3
+ - on_checkpoint: redo
4
+ - check_cmd_out: chroot
5
+ - exec_out: mount -o bind /dev $$rootfs/dev
6
+ - exec_out: mount -o bind /dev/pts $$rootfs/dev/pts
7
+ - exec_out: mount -t proc /proc $$rootfs/proc
8
+ - exec_out: mount -t sysfs /sys $$rootfs/sys
9
+ - exec_out: test -f $$rootfs/etc/mtab || cat /proc/mounts > $$rootfs/etc/mtab
10
+ - on_export_clean:
11
+ - exec_out: echo try umount $$rootfs/sys... ; mountpoint -q $$rootfs/sys && umount -f -l $$rootfs/sys || true
12
+ - exec_out: echo try umount $$rootfs/proc... ; mountpoint -q $$rootfs/proc && umount -f -l $$rootfs/proc || true
13
+ - exec_out: echo try umount $$rootfs/dev/pts... ; mountpoint -q $$rootfs/dev/pts && umount -f -l $$rootfs/dev/pts || true
14
+ - exec_out: echo try umount $$rootfs/dev... ; mountpoint -q $$rootfs/dev && umount -f -l $$rootfs/dev || true
15
+
16
+ - cpuset_base_name: /dev/cpuset
17
+ - cpuset_name: kameleon
18
+
19
+ - init_cpuset:
20
+ - on_checkpoint: redo
21
+ - on_setup_init:
22
+ - exec_in: |
23
+ if [ ! -f $$cpuset_base_name/cpus ]; then
24
+ mkdir -p /dev/cpuset
25
+ mount -t cgroup -o cpuset none /dev/cpuset
26
+ fi
27
+ if [ ! -d $$cpuset_base_name/$$cpuset_name ]; then
28
+ mkdir $$cpuset_base_name/$$cpuset_name
29
+ fi
30
+ - exec_in: echo 0 > $$cpuset_base_name/$$cpuset_name/cpuset.cpus
31
+ - exec_in: echo 0 > $$cpuset_base_name/$$cpuset_name/cpuset.mems
32
+ - exec_in: echo $$ > $$cpuset_base_name/$$cpuset_name/tasks
33
+
34
+ - clean_cpuset:
35
+ - on_checkpoint: redo
36
+ - on_export_clean:
37
+ - exec_out: CPUSET_DIR="$$rootfs/$$cpuset_base_name"
38
+ - exec_out: |
39
+ if [ -f $CPUSET_DIR/$$cpuset_name/tasks ]; then
40
+ for pid in `cat $CPUSET_DIR/$$cpuset_name/tasks`; do
41
+ kill -9 $pid
42
+ done
43
+ echo "Waiting for all processes of the in context to terminate..."
44
+ while [ ! -z "$(cat $CPUSET_DIR/$$cpuset_name/tasks)" ]; do
45
+ sleep .2
46
+ done
47
+ sleep .2
48
+ echo > $CPUSET_DIR/$$cpuset_name/cpuset.cpus
49
+ echo > $CPUSET_DIR/$$cpuset_name/cpuset.mems
50
+ rmdir $CPUSET_DIR/$$cpuset_name
51
+ fi
52
+ - exec_out: echo try umount $CPUSET_DIR... ; mountpoint -q $CPUSET_DIR && umount -f -l $CPUSET_DIR || true
53
+
@@ -0,0 +1,12 @@
1
+ - start_sshd:
2
+ - on_checkpoint: redo
3
+ - exec_out: |
4
+ CID=$(docker run -d -p 22 -i --dns $$dns -h $$hostname -privileged "$$image:latest" \
5
+ /bin/bash -c "mkdir /var/run/sshd ; /usr/sbin/sshd -D")
6
+ - exec_out: echo "$CID" >> CONTAINERS_TO_CLEAN
7
+ - exec_out: echo $CID > MAIN_CONTAINER_ID
8
+ - on_export_clean:
9
+ - exec_out: rm -f MAIN_CONTAINER_ID
10
+ - exec_out: echo $(docker port $CID 22) | cut -d':' -f2 > MAIN_CONTAINER_PORT
11
+ - on_export_clean:
12
+ - exec_out: rm -f MAIN_CONTAINER_PORT
@@ -0,0 +1,105 @@
1
+ - nbd_device: /dev/nbd1
2
+
3
+ - export_targz:
4
+ - on_export_init:
5
+ - exec_out: echo "Exporting the rootfs..."
6
+ - exec_out: docker export $(cat MAIN_CONTAINER_ID) > $$filename.tar.gz
7
+
8
+ - create_raw_image:
9
+ - check_cmd_out: qemu-img
10
+ - exec_out: bash -c "qemu-img create -f $$format $$filename.$$format $$image_size"
11
+
12
+ - load_nbd_module:
13
+ - on_bootstrap_init:
14
+ - exec_out: |
15
+ lsmod | grep nbd >/dev/null \
16
+ || modprobe nbd max_part=63 \
17
+ || fail failed to load nbd module into kernel
18
+
19
+ - attach_nbd_device:
20
+ - on_checkpoint: redo
21
+ - check_cmd_out: qemu-nbd
22
+ - exec_out: echo Connecting $$filename.$$format to nbd device $$nbd_device
23
+ - exec_out: qemu-nbd -c $$nbd_device $$filename.$$format || fail nbd device $$filename.$$format is unavailable
24
+ - on_export_clean:
25
+ - exec_out: echo "sync" ; sync
26
+ - exec_out: qemu-nbd -d $$nbd_device
27
+ - exec_out: "pgrep qemu-nbd | xargs -I {} kill -9 {} || true"
28
+
29
+ - partition_disk:
30
+ - check_cmd_out: sfdisk
31
+ - exec_out: |
32
+ echo "Partitioning disk..."
33
+ sfdisk $${nbd_device} -q -D -uM --force --no-reread <<< '
34
+ ,200,83,*
35
+ ;
36
+ ' 2>&1 || fail cannot partition $$filename.$$format
37
+ - exec_out: |
38
+ echo Creating boot partition...
39
+ mkfs.$$filesystem_type -q $${nbd_device}p1 || fail cannot create /boot ext4
40
+ - exec_out: |
41
+ echo Creating root partition...
42
+ mkfs.$$filesystem_type -q $${nbd_device}p2 || fail cannot create / ext4
43
+
44
+ - mount_mountdir:
45
+ - on_checkpoint: redo
46
+ - exec_out: mkdir -p $$mountdir
47
+ - exec_out: "echo Mounting root partition... ; mount $${nbd_device}p2 $$mountdir || fail cannot mount /"
48
+ - on_export_clean:
49
+ - exec_out: "echo try umount $$mountdir... ; mountpoint -q $$mountdir && umount -f -l $$mountdir || true"
50
+ - exec_out: "test -d $$mountdir && rmdir $$mountdir || true"
51
+ - exec_out: mkdir -p $$mountdir/boot
52
+ - exec_out: "echo Mounting boot partition... ; mount $${nbd_device}p1 $$mountdir/boot || fail cannot mount /boot"
53
+ - on_export_clean:
54
+ - exec_out: "echo try umount $$mountdir/boot... ; mountpoint -q $$mountdir/boot && umount -f -l $$mountdir/boot || true"
55
+ - exec_out: "test -d $$mountdir/boot && rmdir $$mountdir/boot || true"
56
+
57
+ - copy_rootfs:
58
+ - exec_out: echo "Copying the rootfs to $$mountdir..."
59
+ - exec_out: tar -xf $$filename.tar.gz -C $$mountdir
60
+ - exec_out: rm -f $$mountdir/.dockerinit
61
+ - exec_out: rm -f $$mountdir/.dockerenv
62
+ - exec_out: echo "sync..." ; sync
63
+
64
+ - create_fstab:
65
+ - write_out:
66
+ - $$mountdir/etc/fstab
67
+ - |
68
+ # /etc/fstab: static file system information.
69
+ #
70
+ # Use 'blkid' to print the universally unique identifier for a
71
+ # device; this may be used with UUID= as a more robust way to name devices
72
+ # that works even if disks are added and removed. See fstab(5).
73
+ #
74
+ # <file system> <mount point> <type> <options> <dump> <pass>
75
+ UUID=`blkid -s UUID -o value $${nbd_device}p2` / $$filesystem_type errors=remount-ro 0 1
76
+ UUID=`blkid -s UUID -o value $${nbd_device}p1` /boot $$filesystem_type sync 0 2
77
+ - exec_out: echo "sync..." ; sync
78
+
79
+ - mount_chroot:
80
+ - on_checkpoint: redo
81
+ - check_cmd_out: chroot
82
+ - exec_out: mount -o bind /dev $$mountdir/dev
83
+ - exec_out: mount -o bind /dev/pts $$mountdir/dev/pts
84
+ - exec_out: mount -t proc /proc $$mountdir/proc
85
+ - exec_out: mount -t sysfs /sys $$mountdir/sys
86
+ - exec_out: test -f $$mountdir/etc/mtab || cat /proc/mounts > $$mountdir/etc/mtab
87
+ - on_export_clean:
88
+ - exec_out: echo try umount $$mountdir/sys... ; mountpoint -q $$mountdir/sys && umount -f -l $$mountdir/sys || true
89
+ - exec_out: echo try umount $$mountdir/proc... ; mountpoint -q $$mountdir/proc && umount -f -l $$mountdir/proc || true
90
+ - exec_out: echo try umount $$mountdir/dev/pts... ; mountpoint -q $$mountdir/dev/pts && umount -f -l $$mountdir/dev/pts || true
91
+ - exec_out: echo try umount $$mountdir/dev... ; mountpoint -q $$mountdir/dev && umount -f -l $$mountdir/dev || true
92
+
93
+ - install_bootloader:
94
+ - check_cmd_out: extlinux-install
95
+ - exec_out: chroot $$mountdir extlinux-install $$nbd_device 2>&1
96
+ - write_out:
97
+ - $$mountdir/boot/extlinux/extlinux.conf
98
+ - |
99
+ default linux
100
+ timeout 1
101
+
102
+ label linux
103
+ kernel ../`basename $$mountdir/boot/vmlinuz*`
104
+ append initrd=../`basename $$mountdir/boot/init*` root=UUID=`blkid -s UUID -o value $${nbd_device}p2` ro
105
+ - exec_out: echo "sync..." ; sync
@@ -0,0 +1,3 @@
1
+ # # Clean Appliance
2
+ - clean_udev:
3
+ - exec_in: rm -f /etc/udev/rules.d/*persistent-net.rules*
@@ -0,0 +1,54 @@
1
+ # # Save Chroot Appliance
2
+ - save_as_tgz:
3
+ - exec_out: echo "sync..." ; sync
4
+ - in2out:
5
+ - /etc/fstab
6
+ - ./fstab.bak
7
+ - on_clean:
8
+ - exec_out: rm -f ./fstab.bak
9
+ - write_in:
10
+ - /etc/fstab
11
+ - |
12
+ # UNCONFIGURED FSTAB FOR BASE SYSTEM
13
+ - pipe:
14
+ - exec_in: |
15
+ tar -zcf - --numeric-owner \
16
+ --exclude=tmp/* \
17
+ --exclude=dev/* \
18
+ --exclude=proc/* \
19
+ --exclude=sys/* \
20
+ --exclude=run/* \
21
+ --exclude=mnt/* \
22
+ --exclude=media/* \
23
+ --exclude=lost+found/* \
24
+ -C / .
25
+ - exec_out: cat > ./$$filename.tar.gz
26
+ - out2in:
27
+ - ./fstab.bak
28
+ - /etc/fstab
29
+ - exec_out: |
30
+ echo "Saved tar.gz appliance to $(pwd)/$$filename.tar.gz"
31
+
32
+ - save_as_raw:
33
+ - exec_out: echo "sync..." ; sync
34
+ - exec_out: |
35
+ qemu-img convert -O raw $(readlink $$container) $$filename.raw
36
+ - exec_out: echo "Saved raw appliance to $(pwd)/$$filename.raw"
37
+
38
+ - save_as_qcow2:
39
+ - exec_out: echo "sync..." ; sync
40
+ - exec_out: |
41
+ qemu-img convert -O qcow2 $(readlink $$container) $$filename.qcow2
42
+ - exec_out: echo "Saved qcow2 appliance to $(pwd)/$$filename.qcow2"
43
+
44
+ - save_as_vmdk:
45
+ - exec_out: echo "sync..." ; sync
46
+ - exec_out: |
47
+ qemu-img convert -O vmdk $(readlink $$container) $$filename.vmdk
48
+ - exec_out: echo "Saved vmdk appliance to $(pwd)/$$filename.vmdk"
49
+
50
+ - save_as_vdi:
51
+ - exec_out: echo "sync..." ; sync
52
+ - exec_out: |
53
+ qemu-img convert -O vdi $(readlink $$container) $$filename.vdi
54
+ - exec_out: echo "Saved vdi appliance to $(pwd)/$$filename.vdi"
@@ -0,0 +1,12 @@
1
+ # # Create User
2
+ - create_group:
3
+ - exec_in: groupadd $$group
4
+ - add_user:
5
+ # use the create_passwd.py script to generate the crypted password
6
+ - exec_in: useradd -m -g $$group $$name -s /bin/bash
7
+ - exec_in: echo -n '$$name:$$password' | chpasswd
8
+ - add_group_to_sudoers:
9
+ - append_in:
10
+ - /etc/sudoers
11
+ - |
12
+ %admin ALL=(ALL:ALL) ALL