aboutsummaryrefslogtreecommitdiff
path: root/share/hydractl/provision-img
blob: 7ee4505ab074e55f1fb9d0a65b6d8feada2297bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#!/bin/bash
#
# System installer, vmdebootstrap version.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public
# License along with this program.  If not, see
# <http://www.gnu.org/licenses/>.

# Load.
source $APP_BASE/lib/hydra/functions || exit 1
hydra_config_load

# Parameters
BASENAME="`basename $0`"

# Make sure there is provision config.
function hydra_provision_config {
  hydra_user_config   image             /var/cache/qemu/debian/box.img   "Destination image"
  hydra_user_config   size              3G                               "Image size"
  hydra_user_config   format            qcow2                            "Image format: raw or qcow2"
  hydra_user_config   method            custom                           "Bootstrap method: custom or vmdeboostrap"
  hydra_user_config   hostname          machine                          "Hostname"
  hydra_user_config   domain            example.org                      "Domain"
  hydra_user_config   arch              amd64                            "System arch"
  hydra_user_config   version           stretch                          "Distro version"
  hydra_user_config   mirror            http://http.debian.net/debian/   "Debian mirror"
}

# Load configuration
hydra_provision_config_load $1

# Get config parameters
hydra_provision_config

# Check
if [ -e "$image" ]; then
  echo "error: $image already exists."
  exit 1
fi

# Ensure base folder exists
hydra_sudo_run mkdir -p `dirname $image`

#
# vmdebootstrap version
#
function hydractl_provision_img_vmdebootstrap {
  # Check for requirements
  for req in vmdebootstrap mbr; do
    hydra_install_package $req
  done

  # Image format
  if [ "$format" == "qcow2" ]; then
    format="--convert-qcow2"
  else
    formt=""
  fi

  # Run
  hydra_sudo_run vmdebootstrap --verbose --image=$image --size=$size --distribution=$version \
    --mirror=$mirror --arch=$arch --hostname=$hostname.$domain    \
    --grub $format

  # Fix permissions
  hydra_sudo_run chown -R `whoami`. `dirname $image`

  # Cleanup
  hydra_sudo_run rm debootstrap.log
  hydra_sudo_run rm ${image}.raw
}

#
# Custom version
#
function hydract_provision_img_custom {
  WORK="`mktemp -d`"

  # Check for requirements.
  for req in debootstrap grub-pc parted; do
    hydra_install_package $req
  done

  echo "Creating image..."
  #hydra_sudo_run dd if=/dev/zero of=$image bs=$size count=1
  hydra_sudo_run qemu-img create -f raw $image $size
  device="`sudo losetup --find --show $image`"

  echo "Partitioning image at $device..."
  hydra_sudo_run parted -s -- $device mklabel gpt
  hydra_sudo_run parted -s -- $device unit    MB mkpart    non-fs 2  3
  hydra_sudo_run parted -s -- $device set     1  bios_grub on
  hydra_sudo_run parted -s -- $device unit    MB mkpart    ext2   3 -1
  hydra_sudo_run parted -s -- $device set     2  boot on
  hydra_sudo_run mkfs.ext4 ${device}p2
  hydra_sudo_run mount ${device}p2 $WORK/

  # Non-interactive installation
  APT_INSTALL="hydra_sudo_run LC_ALL=C DEBIAN_FRONTEND=noninteractive chroot $WORK/ apt-get install -y"

  # Initial system install.
  echo "Installing base system..."
  hydra_sudo_run LC_ALL=C DEBIAN_FRONTEND=noninteractive debootstrap --arch=$arch $version $WORK/ $mirror

  # Initial configuration.
  echo "Applying initial configuration..."
  hydra_sudo_run mount none -t proc  $WORK/proc
  hydra_sudo_run mount none -t sysfs $WORK/sys
  hydra_sudo_run mount -o bind /dev/ $WORK/dev
  echo LANG=C | $SUDO tee $WORK/etc/default/locale > /dev/null

  # Hostname configuration.
  echo $hostname.$domain     | $SUDO tee    $WORK/etc/hostname > /dev/null
  echo "127.0.0.1 localhost" | $SUDO tee -a $WORK/etc/hosts    > /dev/null

  # This ordering is important for facter correctly guess the domain name
  echo "127.0.0.1 $hostname.$domain $hostname" | $SUDO tee -a $WORK/etc/hosts > /dev/null

  # Invert hostname contents to avoid http://projects.puppetlabs.com/issues/2533
  tac $WORK/etc/hosts | $SUDO tee $WORK/etc/hosts.new > /dev/null
  hydra_sudo_run mv $WORK/etc/hosts.new $WORK/etc/hosts

  # Initial upgrade
  echo "Applying initial upgrades..."
  hydra_sudo_run chroot $WORK/ apt-get update
  hydra_sudo_run chroot $WORK/ apt-get upgrade -y

  if [ "$arch" == "i386" ]; then
    kernel_arch="686"
  else
    kernel_arch="$arch"
  fi

  $APT_INSTALL locales
  $APT_INSTALL screen cron lsb-release openssl -y
  $APT_INSTALL linux-image-$kernel_arch -y
  $APT_INSTALL grub-pc -y
  hydra_sudo_run chroot $WORK/ update-grub
  hydra_sudo_run chroot $WORK/ grub-install $device

  # Teardown
  hydra_sudo_run umount $WORK/proc
  hydra_sudo_run umount $WORK/sys
  hydra_sudo_run umount $WORK/dev
  hydra_sudo_run umount $WORK
  hydra_sudo_run rmdir  $WORK
  hydra_sudo_run losetup -d $device

  # Image conversion
  if [ "$format" == "qcow2" ]; then
    echo "Converting raw image to qcow2..."
    hydra_sudo_run mv $image $image.raw
    hydra_sudo_run qemu-img convert -O qcow2 ${image}.raw $image
    hydra_sudo_run rm ${image}.raw
  fi

  # Fix permissions
  hydra_sudo_run chown -R `whoami`. `dirname $image`
}

# Dispatch
if [ "$method" == "custom" ]; then
  hydractl_provision_img_custom
elif [ "$method" == "vmdebootstrap" ]; then
  hydractl_provision_img_vmdebootstrap
else
  echo "$BASENAME: invalid method $method"
  exit 1
fi