aboutsummaryrefslogtreecommitdiff
path: root/share/hydractl/provision-img-custom
blob: 134793ee6ffe17328adb2b17258eb61e7b6dc666 (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
#!/bin/bash
#
# System installer, virtual machine 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

# 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   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`

#
# Custom version
#
#
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`