mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
All (almost) files belonging to the systemvm aer now centralize in the systemvm directory. The code for the separate functions is still in the services directory. This will make the code easier to understand and makes it clear that the systemvm is a separate item. It alos means that it can be excluded from the build entirely by not adding the systemvm profile, this will speed up the compiles somewhat.
568 lines
16 KiB
Bash
Executable File
568 lines
16 KiB
Bash
Executable File
#!/bin/bash
|
||
# Licensed to the Apache Software Foundation (ASF) under one
|
||
# or more contributor license agreements. See the NOTICE file
|
||
# distributed with this work for additional information
|
||
# regarding copyright ownership. The ASF licenses this file
|
||
# to you under the Apache License, Version 2.0 (the
|
||
# "License"); you may not use this file except in compliance
|
||
# with the License. You may obtain a copy of the License at
|
||
#
|
||
# http://www.apache.org/licenses/LICENSE-2.0
|
||
#
|
||
# Unless required by applicable law or agreed to in writing,
|
||
# software distributed under the License is distributed on an
|
||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||
# KIND, either express or implied. See the License for the
|
||
# specific language governing permissions and limitations
|
||
# under the License.
|
||
|
||
echo "####################################################"
|
||
echo " Note there is a new systemvm build script based on "
|
||
echo " Veewee(Vagrant) under tools/appliance."
|
||
echo "####################################################"
|
||
|
||
set -e
|
||
set -x
|
||
|
||
IMAGENAME=systemvm
|
||
LOCATION=/var/lib/images/systemvm
|
||
PASSWORD=password
|
||
#APT_PROXY=192.168.1.115:3142/
|
||
APT_PROXY=
|
||
HOSTNAME=systemvm
|
||
SIZE=2000
|
||
DEBIAN_MIRROR=ftp.us.debian.org/debian
|
||
MINIMIZE=true
|
||
CLOUDSTACK_RELEASE=4.0
|
||
offset=4096
|
||
baseimage() {
|
||
mkdir -p $LOCATION
|
||
#dd if=/dev/zero of=$IMAGELOC bs=1M count=$SIZE
|
||
dd if=/dev/zero of=$IMAGELOC bs=1M seek=$((SIZE - 1)) count=1
|
||
loopdev=$(losetup -f)
|
||
losetup $loopdev $IMAGELOC
|
||
parted $loopdev -s 'mklabel msdos'
|
||
parted $loopdev -s 'mkpart primary ext3 4096B -1'
|
||
sleep 2
|
||
losetup -d $loopdev
|
||
loopdev=$(losetup --show -o $offset -f $IMAGELOC )
|
||
mkfs.ext3 -L ROOT $loopdev
|
||
mkdir -p $MOUNTPOINT
|
||
tune2fs -c 100 -i 0 $loopdev
|
||
sleep 2
|
||
losetup -d $loopdev
|
||
|
||
mount -o loop,offset=$offset $IMAGELOC $MOUNTPOINT
|
||
|
||
#debootstrap --variant=minbase --keyring=/usr/share/keyrings/debian-archive-keyring.gpg wheezy $MOUNTPOINT http://${APT_PROXY}${DEBIAN_MIRROR}
|
||
debootstrap --variant=minbase --arch=i386 wheezy $MOUNTPOINT http://${APT_PROXY}${DEBIAN_MIRROR}
|
||
}
|
||
|
||
|
||
fixapt() {
|
||
if [ "$APT_PROXY" != "" ]; then
|
||
cat >> etc/apt/apt.conf.d/01proxy << EOF
|
||
Acquire::http::Proxy "http://${APT_PROXY}";
|
||
EOF
|
||
fi
|
||
|
||
cat > etc/apt/sources.list << EOF
|
||
deb http://ftp.us.debian.org/debian/ wheezy main contrib non-free
|
||
deb-src http://ftp.us.debian.org/debian/ wheezy main contrib non-free
|
||
|
||
deb http://security.debian.org/ wheezy/updates main
|
||
deb-src http://security.debian.org/ wheezy/updates main
|
||
|
||
deb http://ftp.us.debian.org/debian/ wheezy-backports main
|
||
deb-src http://ftp.us.debian.org/debian/ wheezy-backports main
|
||
EOF
|
||
|
||
cat >> etc/apt/apt.conf << EOF
|
||
APT::Default-Release "stable";
|
||
EOF
|
||
|
||
cat >> etc/apt/preferences << EOF
|
||
Package: *
|
||
Pin: release o=Debian,a=stable
|
||
Pin-Priority: 900
|
||
EOF
|
||
|
||
#apt-key exportall | chroot . apt-key add - &&
|
||
chroot . apt-get update &&
|
||
echo "Apt::Install-Recommends 0;" > etc/apt/apt.conf.d/local-recommends
|
||
|
||
cat >> usr/sbin/policy-rc.d << EOF
|
||
#!/bin/sh
|
||
exit 101
|
||
EOF
|
||
chmod a+x usr/sbin/policy-rc.d
|
||
|
||
cat >> etc/default/locale << EOF
|
||
LANG=en_US.UTF-8
|
||
LC_ALL=en_US.UTF-8
|
||
EOF
|
||
|
||
cat >> etc/locale.gen << EOF
|
||
en_US.UTF-8 UTF-8
|
||
EOF
|
||
|
||
DEBIAN_FRONTEND=noninteractive
|
||
DEBIAN_PRIORITY=critical
|
||
export DEBIAN_FRONTEND DEBIAN_PRIORITY
|
||
chroot . dpkg-reconfigure debconf --frontend=noninteractive
|
||
chroot . apt-get -q -y install locales
|
||
}
|
||
|
||
network() {
|
||
|
||
echo "$HOSTNAME" > etc/hostname &&
|
||
cat > etc/hosts << EOF
|
||
127.0.0.1 localhost
|
||
# The following lines are desirable for IPv6 capable hosts
|
||
::1 localhost ip6-localhost ip6-loopback
|
||
fe00::0 ip6-localnet
|
||
ff00::0 ip6-mcastprefix
|
||
ff02::1 ip6-allnodes
|
||
ff02::2 ip6-allrouters
|
||
ff02::3 ip6-allhosts
|
||
EOF
|
||
|
||
cat >> etc/network/interfaces << EOF
|
||
auto lo eth0
|
||
iface lo inet loopback
|
||
|
||
# The primary network interface
|
||
iface eth0 inet static
|
||
|
||
EOF
|
||
}
|
||
|
||
install_kernel() {
|
||
DEBIAN_FRONTEND=noninteractive
|
||
DEBIAN_PRIORITY=critical
|
||
export DEBIAN_FRONTEND DEBIAN_PRIORITY
|
||
|
||
chroot . apt-get -qq -y --force-yes install grub-legacy &&
|
||
cp -av usr/lib/grub/i386-pc boot/grub
|
||
#for some reason apt-get install grub does not install grub/stage1 etc
|
||
#loopd=$(losetup -f --show $1)
|
||
#grub-install $loopd --root-directory=$MOUNTPOINT
|
||
#losetup -d $loopd
|
||
grub << EOF &&
|
||
device (hd0) $1
|
||
root (hd0,0)
|
||
setup (hd0)
|
||
quit
|
||
EOF
|
||
# install a kernel image
|
||
cat > etc/kernel-img.conf << EOF &&
|
||
do_symlinks = yes
|
||
link_in_boot = yes
|
||
do_initrd = yes
|
||
EOF
|
||
touch /mnt/systemvm/boot/grub/default
|
||
chroot . apt-get install -qq -y --force-yes linux-image-686-bigmem
|
||
cat >> etc/kernel-img.conf << EOF
|
||
postinst_hook = /usr/sbin/update-grub
|
||
postrm_hook = /usr/sbin/update-grub
|
||
EOF
|
||
}
|
||
|
||
|
||
fixgrub() {
|
||
kern=$(basename $(ls boot/vmlinuz-*))
|
||
ver=${kern#vmlinuz-}
|
||
cat > boot/grub/menu.lst << EOF
|
||
default 0
|
||
timeout 2
|
||
color cyan/blue white/blue
|
||
|
||
### BEGIN AUTOMAGIC KERNELS LIST
|
||
# kopt=root=LABEL=ROOT ro
|
||
|
||
## ## End Default Options ##
|
||
title Debian GNU/Linux, kernel $ver
|
||
root (hd0,0)
|
||
kernel /boot/$kern root=LABEL=ROOT ro console=tty0 xencons=ttyS0,115200 console=hvc0 quiet
|
||
initrd /boot/initrd.img-$ver
|
||
|
||
### END DEBIAN AUTOMAGIC KERNELS LIST
|
||
EOF
|
||
(cd boot/grub; ln -s menu.lst grub.conf)
|
||
}
|
||
|
||
fixinittab() {
|
||
cat >> etc/inittab << EOF
|
||
|
||
vc:2345:respawn:/sbin/getty 38400 hvc0
|
||
EOF
|
||
}
|
||
|
||
fixfstab() {
|
||
cat > etc/fstab << EOF
|
||
# <file system> <mount point> <type> <options> <dump> <pass>
|
||
proc /proc proc defaults 0 0
|
||
LABEL=ROOT / ext3 errors=remount-ro,sync,noatime 0 1
|
||
EOF
|
||
}
|
||
|
||
fixacpid() {
|
||
mkdir -p etc/acpi/events
|
||
cat >> etc/acpi/events/power << EOF
|
||
event=button/power.*
|
||
action=/usr/local/sbin/power.sh "%e"
|
||
EOF
|
||
cat >> usr/local/sbin/power.sh << EOF
|
||
#!/bin/bash
|
||
/sbin/poweroff
|
||
EOF
|
||
chmod a+x usr/local/sbin/power.sh
|
||
}
|
||
|
||
fixiptables() {
|
||
cat >> etc/modules << EOF
|
||
nf_conntrack
|
||
nf_conntrack_ipv4
|
||
EOF
|
||
cat > etc/init.d/iptables-persistent << EOF
|
||
#!/bin/sh
|
||
### BEGIN INIT INFO
|
||
# Provides: iptables
|
||
# Required-Start: mountkernfs $local_fs
|
||
# Required-Stop: $local_fs
|
||
# Should-Start: cloud-early-config
|
||
# Default-Start: S
|
||
# Default-Stop:
|
||
# Short-Description: Set up iptables rules
|
||
### END INIT INFO
|
||
|
||
PATH="/sbin:/bin:/usr/sbin:/usr/bin"
|
||
|
||
# Include config file for iptables-persistent
|
||
. /etc/iptables/iptables.conf
|
||
|
||
case "\$1" in
|
||
start)
|
||
if [ -e /var/run/iptables ]; then
|
||
echo "iptables is already started!"
|
||
exit 1
|
||
else
|
||
touch /var/run/iptables
|
||
fi
|
||
|
||
if [ \$ENABLE_ROUTING -ne 0 ]; then
|
||
# Enable Routing
|
||
echo 1 > /proc/sys/net/ipv4/ip_forward
|
||
fi
|
||
|
||
# Load Modules
|
||
modprobe -a \$MODULES
|
||
|
||
# Load saved rules
|
||
if [ -f /etc/iptables/rules ]; then
|
||
iptables-restore </etc/iptables/rules
|
||
fi
|
||
;;
|
||
stop|force-stop)
|
||
if [ ! -e /var/run/iptables ]; then
|
||
echo "iptables is already stopped!"
|
||
exit 1
|
||
else
|
||
rm /var/run/iptables
|
||
fi
|
||
|
||
if [ \$SAVE_NEW_RULES -ne 0 ]; then
|
||
# Backup old rules
|
||
cp /etc/iptables/rules /etc/iptables/rules.bak
|
||
# Save new rules
|
||
iptables-save >/etc/iptables/rules
|
||
fi
|
||
|
||
# Restore Default Policies
|
||
iptables -P INPUT ACCEPT
|
||
iptables -P FORWARD ACCEPT
|
||
iptables -P OUTPUT ACCEPT
|
||
|
||
# Flush rules on default tables
|
||
iptables -F
|
||
iptables -t nat -F
|
||
iptables -t mangle -F
|
||
|
||
# Unload previously loaded modules
|
||
modprobe -r \$MODULES
|
||
|
||
# Disable Routing if enabled
|
||
if [ \$ENABLE_ROUTING -ne 0 ]; then
|
||
# Disable Routing
|
||
echo 0 > /proc/sys/net/ipv4/ip_forward
|
||
fi
|
||
|
||
;;
|
||
restart|force-reload)
|
||
\$0 stop
|
||
\$0 start
|
||
;;
|
||
status)
|
||
echo "Filter Rules:"
|
||
echo "--------------"
|
||
iptables -L -v
|
||
echo ""
|
||
echo "NAT Rules:"
|
||
echo "-------------"
|
||
iptables -t nat -L -v
|
||
echo ""
|
||
echo "Mangle Rules:"
|
||
echo "----------------"
|
||
iptables -t mangle -L -v
|
||
;;
|
||
*)
|
||
echo "Usage: \$0 {start|stop|force-stop|restart|force-reload|status}" >&2
|
||
exit 1
|
||
;;
|
||
esac
|
||
|
||
exit 0
|
||
EOF
|
||
chmod a+x etc/init.d/iptables-persistent
|
||
|
||
|
||
touch etc/iptables/iptables.conf
|
||
cat > etc/iptables/iptables.conf << EOF
|
||
# A basic config file for the /etc/init.d/iptable-persistent script
|
||
|
||
# Should new manually added rules from command line be saved on reboot? Assign to a value different that 0 if you want this enabled.
|
||
SAVE_NEW_RULES=0
|
||
|
||
# Modules to load:
|
||
MODULES="nf_nat_ftp nf_conntrack_ftp"
|
||
|
||
# Enable Routing?
|
||
ENABLE_ROUTING=1
|
||
EOF
|
||
chmod a+x etc/iptables/iptables.conf
|
||
|
||
}
|
||
|
||
vpn_config() {
|
||
cp -r ${scriptdir}/vpn/* ./
|
||
}
|
||
|
||
packages() {
|
||
DEBIAN_FRONTEND=noninteractive
|
||
DEBIAN_PRIORITY=critical
|
||
DEBCONF_DB_OVERRIDE=’File{/root/config.dat}’
|
||
export DEBIAN_FRONTEND DEBIAN_PRIORITY DEBCONF_DB_OVERRIDE
|
||
|
||
#basic stuff
|
||
chroot . apt-get --no-install-recommends -q -y --force-yes install rsyslog logrotate cron chkconfig insserv net-tools ifupdown vim-tiny netbase iptables openssh-server grub-legacy e2fsprogs dhcp3-client dnsmasq tcpdump socat wget python bzip2 sed gawk diffutils grep gzip less tar telnet ftp rsync traceroute psmisc lsof procps monit inetutils-ping iputils-arping httping dnsutils zip unzip ethtool uuid file iproute acpid iptables-persistent virt-what sudo
|
||
#fix hostname in openssh-server generated keys
|
||
sed -i "s/root@\(.*\)$/root@systemvm/g" etc/ssh/ssh_host_*.pub
|
||
|
||
#sysstat
|
||
chroot . echo 'sysstat sysstat/enable boolean true' | chroot . debconf-set-selections
|
||
chroot . apt-get --no-install-recommends -q -y --force-yes install sysstat
|
||
#apache
|
||
chroot . apt-get --no-install-recommends -q -y --force-yes install apache2 ssl-cert
|
||
#haproxy
|
||
chroot . apt-get --no-install-recommends -q -y --force-yes install haproxy
|
||
#dnsmasq
|
||
chroot . apt-get --no-install-recommends -q -y --force-yes install dnsmasq
|
||
#nfs client
|
||
chroot . apt-get --no-install-recommends -q -y --force-yes install nfs-common
|
||
#vpn stuff
|
||
chroot . apt-get --no-install-recommends -q -y --force-yes install xl2tpd openswan bcrelay ppp ipsec-tools tdb-tools
|
||
#vmware tools
|
||
chroot . apt-get --no-install-recommends -q -y --force-yes install open-vm-tools
|
||
#xenstore utils
|
||
chroot . apt-get --no-install-recommends -q -y --force-yes install xenstore-utils libxenstore3.0
|
||
#keepalived and conntrackd
|
||
chroot . apt-get --no-install-recommends -q -y --force-yes install keepalived conntrackd ipvsadm libnetfilter-conntrack3 libnl1
|
||
#ipcalc
|
||
chroot . apt-get --no-install-recommends -q -y --force-yes install ipcalc
|
||
|
||
echo "***** getting jre 7 *********"
|
||
chroot . apt-get --no-install-recommends -q -y install openjdk-7-jre-headless
|
||
}
|
||
|
||
|
||
password() {
|
||
chroot . echo "root:$PASSWORD" | chroot . chpasswd
|
||
}
|
||
|
||
apache2() {
|
||
chroot . a2enmod ssl rewrite auth_basic auth_digest
|
||
chroot . a2ensite default-ssl
|
||
cp etc/apache2/sites-available/default etc/apache2/sites-available/default.orig
|
||
cp etc/apache2/sites-available/default-ssl etc/apache2/sites-available/default-ssl.orig
|
||
}
|
||
|
||
services() {
|
||
mkdir -p ./var/www/html
|
||
mkdir -p ./opt/cloud/bin
|
||
mkdir -p ./var/cache/cloud
|
||
mkdir -p ./usr/share/cloud
|
||
mkdir -p ./usr/local/cloud
|
||
mkdir -p ./root/.ssh
|
||
#Fix haproxy directory issue
|
||
mkdir -p ./var/lib/haproxy
|
||
|
||
/bin/cp -r ${scriptdir}/config/* ./
|
||
chroot . chkconfig xl2tpd off
|
||
chroot . chkconfig --add cloud-early-config
|
||
chroot . chkconfig cloud-early-config on
|
||
chroot . chkconfig --add iptables-persistent
|
||
chroot . chkconfig iptables-persistent off
|
||
chroot . chkconfig --force --add cloud-passwd-srvr
|
||
chroot . chkconfig cloud-passwd-srvr off
|
||
chroot . chkconfig --add cloud
|
||
chroot . chkconfig cloud off
|
||
chroot . chkconfig monit off
|
||
}
|
||
|
||
dhcp_fix() {
|
||
#deal with virtio DHCP issue, copy and install customized kernel module and iptables
|
||
mkdir -p tmp
|
||
cp /tmp/systemvm/xt_CHECKSUM.ko lib/modules/2.6.32-5-686-bigmem/kernel/net/netfilter
|
||
chroot . depmod -a 2.6.32-5-686-bigmem
|
||
cp /tmp/systemvm/iptables_1.4.8-3local1checksum1_i386.deb tmp/
|
||
chroot . dpkg -i tmp/iptables_1.4.8-3local1checksum1_i386.deb
|
||
rm tmp/iptables_1.4.8-3local1checksum1_i386.deb
|
||
}
|
||
|
||
install_xs_tool() {
|
||
#deal with virtio DHCP issue, copy and install customized kernel module and iptables
|
||
mkdir -p tmp
|
||
cp /tmp/systemvm/xe-guest-utilities_5.6.0-595_i386.deb tmp/
|
||
chroot . dpkg -i tmp/xe-guest-utilities_5.6.0-595_i386.deb
|
||
rm tmp/xe-guest-utilities_5.6.0-595_i386.deb
|
||
}
|
||
|
||
cleanup() {
|
||
rm -f usr/sbin/policy-rc.d
|
||
rm -f root/config.dat
|
||
rm -f etc/apt/apt.conf.d/01proxy
|
||
|
||
if [ "$MINIMIZE" == "true" ]
|
||
then
|
||
rm -rf var/cache/apt/*
|
||
rm -rf var/lib/apt/*
|
||
rm -rf usr/share/locale/[a-d]*
|
||
rm -rf usr/share/locale/[f-z]*
|
||
rm -rf usr/share/doc/*
|
||
size=$(df $MOUNTPOINT | awk '{print $4}' | grep -v Available)
|
||
dd if=/dev/zero of=$MOUNTPOINT/zeros.img bs=1M count=$((((size-150000)) / 1000))
|
||
rm -f $MOUNTPOINT/zeros.img
|
||
fi
|
||
}
|
||
|
||
signature() {
|
||
(cd ${scriptdir}/config; tar cvf ${MOUNTPOINT}/usr/share/cloud/cloud-scripts.tar *)
|
||
(cd ${scriptdir}/vpn; tar rvf ${MOUNTPOINT}/usr/share/cloud/cloud-scripts.tar *)
|
||
gzip -c ${MOUNTPOINT}/usr/share/cloud/cloud-scripts.tar > ${MOUNTPOINT}/usr/share/cloud/cloud-scripts.tgz
|
||
md5sum ${MOUNTPOINT}/usr/share/cloud/cloud-scripts.tgz |awk '{print $1}' > ${MOUNTPOINT}/var/cache/cloud/cloud-scripts-signature
|
||
echo "Cloudstack Release $CLOUDSTACK_RELEASE $(date)" > ${MOUNTPOINT}/etc/cloudstack-release
|
||
}
|
||
|
||
#check grub version
|
||
|
||
grub --version | grep "0.9" > /dev/null
|
||
if [ $? -ne 0 ]
|
||
then
|
||
echo You need grub 0.9x\(grub-legacy\) to use this script!
|
||
exit 1
|
||
fi
|
||
|
||
mkdir -p $IMAGENAME
|
||
mkdir -p $LOCATION
|
||
MOUNTPOINT=/mnt/$IMAGENAME/
|
||
IMAGELOC=$LOCATION/$IMAGENAME.img
|
||
scriptdir=$(dirname $PWD/$0)
|
||
|
||
rm -rf /tmp/systemvm
|
||
mkdir -p /tmp/systemvm
|
||
#cp ./xt_CHECKSUM.ko /tmp/systemvm
|
||
#cp ./iptables_1.4.8-3local1checksum1_i386.deb /tmp/systemvm
|
||
#cp ./xe-guest-utilities_5.6.0-595_i386.deb /tmp/systemvm
|
||
|
||
rm -f $IMAGELOC
|
||
begin=$(date +%s)
|
||
echo "*************INSTALLING BASEIMAGE********************"
|
||
baseimage
|
||
|
||
cp $scriptdir/config.dat $MOUNTPOINT/root/
|
||
cd $MOUNTPOINT
|
||
|
||
mount -o bind /proc $MOUNTPOINT/proc
|
||
mount -o bind /dev $MOUNTPOINT/dev
|
||
|
||
echo "*************CONFIGURING APT********************"
|
||
fixapt
|
||
echo "*************DONE CONFIGURING APT********************"
|
||
|
||
echo "*************CONFIGURING NETWORK********************"
|
||
network
|
||
echo "*************DONE CONFIGURING NETWORK********************"
|
||
|
||
echo "*************INSTALLING KERNEL********************"
|
||
install_kernel $IMAGELOC
|
||
echo "*************DONE INSTALLING KERNEL********************"
|
||
|
||
echo "*************CONFIGURING GRUB********************"
|
||
fixgrub $IMAGELOC
|
||
echo "*************DONE CONFIGURING GRUB********************"
|
||
|
||
|
||
echo "*************CONFIGURING INITTAB********************"
|
||
fixinittab
|
||
echo "*************DONE CONFIGURING INITTAB********************"
|
||
|
||
echo "*************CONFIGURING FSTAB********************"
|
||
fixfstab
|
||
echo "*************DONE CONFIGURING FSTAB********************"
|
||
|
||
echo "*************CONFIGURING ACPID********************"
|
||
fixacpid
|
||
echo "*************DONE CONFIGURING ACPID********************"
|
||
|
||
echo "*************INSTALLING PACKAGES********************"
|
||
packages
|
||
echo "*************DONE INSTALLING PACKAGES********************"
|
||
|
||
echo "*************CONFIGURING IPTABLES********************"
|
||
fixiptables
|
||
echo "*************DONE CONFIGURING IPTABLES********************"
|
||
|
||
echo "*************CONFIGURING PASSWORD********************"
|
||
password
|
||
|
||
echo "*************CONFIGURING SERVICES********************"
|
||
services
|
||
|
||
echo "*************CONFIGURING APACHE********************"
|
||
apache2
|
||
|
||
echo "*************CONFIGURING VPN********************"
|
||
vpn_config
|
||
|
||
echo "*************FIX DHCP ISSUE********************"
|
||
#dhcp_fix
|
||
|
||
echo "*************INSTALL XS TOOLS********************"
|
||
#install_xs_tool
|
||
|
||
echo "*************CLEANING UP********************"
|
||
cleanup
|
||
|
||
echo "*************GENERATING SIGNATURE********************"
|
||
signature
|
||
|
||
cd $scriptdir
|
||
|
||
umount $MOUNTPOINT/proc
|
||
umount $MOUNTPOINT/dev
|
||
umount $MOUNTPOINT
|
||
fin=$(date +%s)
|
||
t=$((fin-begin))
|
||
echo "Finished building image $IMAGELOC in $t seconds"
|
||
|