#!/bin/bash
#

echo "Installing cobbler"
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
source $DIR/install.conf
if [ -f $DIR/env.conf ]; then
    source $DIR/env.conf
else
    echo "failed to load environment"
    exit 1
fi
source $DIR/install_func.sh

echo "Installing cobbler related packages"
sudo yum --enablerepo=compass_install --nogpgcheck -y install cobbler cobbler-web createrepo mkisofs python-cheetah python-simplejson python-urlgrabber PyYAML Django corosync pykickstart
sudo yum -y upgrade yum-utils
if [[ "$?" != "0" ]]; then
    echo "failed to install cobbler related packages"
    exit 1
#else
    # patch cobbler code
#    find /usr/lib -name manage_bind.py |xargs  perl -pi.old -e 's/(\s+)(self\.logger\s+\= logger)/$1$2\n$1if self\.logger is None:\n$1    import clogger\n$1    self\.logger = clogger.Logger\(\)/'
fi

# cobbler snippet uses netaddr to calc subnet and ip addr
sudo pip install netaddr
if [[ "$?" != "0" ]]; then
    echo "failed to install pip packages"
    exit 1
fi

sudo systemctl enable cobblerd.service

# create backup dir
sudo mkdir -p /root/backup/cobbler

# update bootloaders
download -u "$COBBLER_LOADERS_SOURCE" -u "$COBBLER_LOADERS_SOURCE_ASIA" loaders.tar.gz unzip /var/lib/cobbler || exit $?

# update httpd conf
sudo cp -rn /etc/httpd/conf.d /root/backup/cobbler/
sudo rm -f /etc/httpd/conf.d/cobbler_web.conf
sudo cp -rf $COMPASSDIR/misc/apache/cobbler_web.conf /etc/httpd/conf.d/cobbler_web.conf
chmod 644 /etc/httpd/conf.d/cobbler_web.conf
sudo rm -rf /etc/httpd/conf.d/ssl.conf
sudo cp -rf $COMPASSDIR/misc/apache/ssl.conf /etc/httpd/conf.d/ssl.conf
chmod 644 /etc/httpd/conf.d/ssl.conf

# disable selinux
sudo mkdir -p /root/backup/selinux
sudo cp -rn /etc/selinux/config /root/backup/selinux/
sudo sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config

# update cobbler settings
sudo cp -rn /etc/cobbler/settings /root/backup/cobbler/
sudo rm -f /etc/cobbler/settings
sudo cp -rf $ADAPTERS_HOME/cobbler/conf/settings /etc/cobbler/settings
sudo sed -i "s/next_server:[ \t]*\$next_server/next_server: $NEXTSERVER/g" /etc/cobbler/settings
sudo sed -i "s/server:[ \t]*\$ipaddr/server: $IPADDR/g" /etc/cobbler/settings
sudo sed -i "s/default_name_servers:[ \t]*\['\$ipaddr'\]/default_name_servers: \['$IPADDR'\]/g" /etc/cobbler/settings
domains=$(echo $NAMESERVER_DOMAINS | sed "s/,/','/g")
sudo sed -i "s/manage_forward_zones:[ \t]*\[\]/manage_forward_zones: \['$domains'\]/g" /etc/cobbler/settings
if [[ "$NAMESERVER_REVERSE_ZONES" != "unused" ]]; then
    reverse_zones=$(echo $NAMESERVER_REVERSE_ZONES | sed "s/,/','/g")
    sudo sed -i "s/manage_reverse_zones:[ \t]*\[\]/manage_reverse_zones: \['$reverse_zones'\]/g" /etc/cobbler/settings
fi
export cobbler_passwd=$(openssl passwd -1 -salt 'huawei' '123456')
sudo sed -i "s,^default_password_crypted:[ \t]\+\"\(.*\)\",default_password_crypted: \"$cobbler_passwd\",g" /etc/cobbler/settings
sudo chmod 644 /etc/cobbler/settings

# update dhcp.template
if [[ -f /etc/cobbler/dhcp.template ]]; then
    sudo cp -rn /etc/cobbler/dhcp.template /root/backup/cobbler/
fi
sudo cp -rf $DIR/dhcp.template /etc/cobbler/dhcp.template
export netaddr=$(ipcalc $IPADDR $NETMASK -n |cut -f 2 -d '=')
export netprefix=$(ipcalc $IPADDR $NETMASK -p |cut -f 2 -d '=')
export subnet=${netaddr}/${netprefix}
sudo sed -i "s/local-address \$server/local-address $IPADDR/g" /etc/cobbler/dhcp.template
sudo sed -i "s/subnet \$subnet netmask \$netmask/subnet $netaddr netmask $NETMASK/g" /etc/cobbler/dhcp.template
sudo sed -i "s/option routers \$gateway/option routers $IPADDR/g" /etc/cobbler/dhcp.template
sudo sed -i "s/option subnet-mask \$netmask/option subnet-mask $NETMASK/g" /etc/cobbler/dhcp.template
sudo sed -i "s/option domain-name-servers \$ipaddr/option domain-name-servers $IPADDR/g" /etc/cobbler/dhcp.template
sudo sed -i "s/range dynamic-bootp \$ip_range/range dynamic-bootp $IP_START $IP_END/g" /etc/cobbler/dhcp.template
sudo sed -i "s/local-address \$ipaddr/local-address $IPADDR/g" /etc/cobbler/dhcp.template
sudo sed -i "s/next-server \$next_server/next-server $NEXTSERVER/g" /etc/cobbler/dhcp.template
sudo chmod 644 /etc/cobbler/dhcp.template

# update tftpd.template
sudo cp -rn /etc/cobbler/tftpd.template /root/backup/cobbler/
sudo rm -f /etc/cobbler/tftpd.template
sudo cp -rf $ADAPTERS_HOME/cobbler/conf/tftpd.template /etc/cobbler/tftpd.template
sudo chmod 644 /etc/cobbler/tftpd.template

# update named.template
sudo cp -rn /etc/cobbler/named.template /root/backup/cobbler/
sudo rm -f /etc/cobbler/named.template
sudo cp -rf $ADAPTERS_HOME/cobbler/conf/named.template /etc/cobbler/named.template
sudo sed -i "s/listen-on port 53 { \$ipaddr; }/listen-on port 53 \{ $IPADDR; \}/g" /etc/cobbler/named.template
subnet_escaped=$(echo $subnet | sed -e 's/[\/&]/\\&/g')
sudo sed -i "s/allow-query { 127.0.0.0\/8; \$subnet; }/allow-query \{ 127.0.0.0\/8; $subnet_escaped; \}/g" /etc/cobbler/named.template
sudo chmod 644 /etc/cobbler/named.template

# update zone.template
sudo cp -rn /etc/cobbler/zone.template /root/backup/cobbler/
sudo rm -f /etc/cobbler/zone.template
sudo cp -rf $ADAPTERS_HOME/cobbler/conf/zone.template /etc/cobbler/zone.template
sudo sed -i "s/\$hostname IN A \$ipaddr/$HOSTNAME IN A $IPADDR/g" /etc/cobbler/zone.template
sudo sed -i "s/metrics IN A \$ipaddr/metrics IN A $IPADDR/g" /etc/cobbler/zone.template
sudo chmod 644 /etc/cobbler/zone.template

# update modules.conf
sudo cp -rn /etc/cobbler/modules.conf /root/backup/cobbler/
sudo rm -f /etc/cobbler/modules.conf
sudo cp -rf $ADAPTERS_HOME/cobbler/conf/modules.conf /etc/cobbler/modules.conf
sudo chmod 644 /etc/cobbler/modules.conf

echo "setting up cobbler web password: default user is cobbler"

CBLR_USER=${CBLR_USER:-"cobbler"}
CBLR_PASSWD=${CBLR_PASSWD:-"cobbler"}
(echo -n "$CBLR_USER:Cobbler:" && echo -n "$CBLR_USER:Cobbler:$CBLR_PASSWD" | md5sum - | cut -d' ' -f1) > /etc/cobbler/users.digest

# update cobbler config
sudo cp -rn /var/lib/cobbler/snippets /root/backup/cobbler/
sudo cp -rn /var/lib/cobbler/scripts /root/backup/cobbler
sudo cp -rn /var/lib/cobbler/kickstarts/ /root/backup/cobbler/
sudo cp -rn /var/lib/cobbler/triggers /root/backup/cobbler/
sudo rm -rf /var/lib/cobbler/scripts/*
sudo rm -rf /var/lib/cobbler/snippets/*
sudo rm -rf /var/lib/cobbler/kickstarts/*
sudo cp -rf $ADAPTERS_HOME/cobbler/snippets/* /var/lib/cobbler/snippets/
sudo cp -rf $ADAPTERS_HOME/cobbler/scripts/* /var/lib/cobbler/scripts/
sudo cp -rf $ADAPTERS_HOME/cobbler/triggers/* /var/lib/cobbler/triggers/
sudo chmod 777 /var/lib/cobbler/snippets
sudo chmod 777 /var/lib/cobbler/scripts
sudo chmod -R 666 /var/lib/cobbler/snippets/*
sudo chmod -R 666 /var/lib/cobbler/scripts/*
sudo chmod -R 755 /var/lib/cobbler/triggers
sudo cp -rf $ADAPTERS_HOME/cobbler/kickstarts/* /var/lib/cobbler/kickstarts/
sudo chmod 666 /var/lib/cobbler/kickstarts/*
sudo mkdir -p /var/www/cblr_ks
sudo chmod 755 /var/www/cblr_ks
sudo cp -rf $ADAPTERS_HOME/cobbler/conf/cobbler.conf /etc/httpd/conf.d/
chmod 644 /etc/httpd/conf.d/cobbler.conf

sudo cp -rn /etc/xinetd.d /root/backup/
sudo cp  $COMPASSDIR/misc/rsync /etc/xinetd.d/

#sudo sed -i 's/^@dists=/# @dists=/g' /etc/debmirror.conf
#sudo sed -i 's/^@arches=/# @arches=/g' /etc/debmirror.conf

sudo rm -rf /var/lib/cobbler/config/systems.d/*

sudo systemctl stop firewalld

# echo "disable selinux temporarily"
# echo 0 > /selinux/enforce

# make log dir
sudo mkdir -p /var/log/cobbler
sudo mkdir -p /var/log/cobbler/tasks
sudo mkdir -p /var/log/cobbler/anamon
sudo chmod -R 777 /var/log/cobbler

sudo systemctl restart httpd.service
sudo systemctl restart cobblerd.service
sudo systemctl restart named.service

sudo sleep 10
sudo cobbler sync

echo "Checking if httpd is running"
sudo systemctl status httpd.service
if [[ "$?" != "0" ]]; then
    echo "httpd is not running"
    exit 1
fi

sudo systemctl restart dhcpd.service
echo "Checking if dhcpd is running"
sudo systemctl status dhcpd.service
if [[ "$?" != "0" ]]; then
    echo "dhcpd is not running"
    exit 1
fi

echo "Checking if named is running"
sudo systemctl status named.service
if [[ "$?" != "0" ]]; then
    echo "named is not running"
    exit 1
fi

sudo systemctl restart xinetd.service
echo "Checking if xinetd is running"
sudo systemctl status xinetd.service
if [[ "$?" != "0" ]]; then
    echo "xinetd is not running"
    exit 1
fi

echo "Checking if cobblerd is running"
sudo systemctl status cobblerd.service
if [[ "$?" != "0" ]]; then
    echo "cobblerd is not running"
    exit 1
fi

sudo cobbler get-loaders
if [[ "$?" != "0" ]]; then
    echo "failed to get loaders for cobbler"
    exit 1
fi

for i in $UBUNTU_14_04_03_IMAGE_SOURCE; do
    sudo mkdir -p /var/lib/cobbler/iso
    download  -u "$i" `basename "$i"` copy /var/lib/cobbler/iso/ || exit $?
    name=`basename "$i" | sed -e 's/.iso//g' -e 's/-amd64//g' -e 's/-x86_64//g'`-x86_64
    if [[ `mount | grep "$name"` -eq 0 ]]; then
        sudo mkdir -p /mnt/$name    
        sudo mount -o loop /var/lib/cobbler/iso/`basename $i` /mnt/$name
        if [[ "$?" != "0" ]]; then
            echo "failed to mount image /mnt/$name"
            exit 1
        fi

        cobbler import --path=/mnt/$name \
                       --name $name \
                       --arch=x86_64 \
                       --kickstart=/var/lib/cobbler/kickstarts/default.seed \
                       --breed=ubuntu
        if [[ "$?" != "0" ]]; then
            echo "failed to import /mnt/$i"
            exit 1
        fi
    fi
done

for i in $CENTOS_7_2_IMAGE_SOURCE; do
    sudo mkdir -p /var/lib/cobbler/iso
    download  -u "$i" `basename "$i"` copy /var/lib/cobbler/iso/ || exit $?
    name=`basename "$i" | sed -e 's/.iso//g' -e 's/-amd64//g' -e 's/-x86_64//g'`-x86_64
    if [[ `mount | grep "$name"` -eq 0 ]]; then
        sudo mkdir -p /mnt/$name
        sudo mount -o loop /var/lib/cobbler/iso/`basename $i` /mnt/$name
        if [[ "$?" != "0" ]]; then
            echo "failed to mount image /mnt/$name"
            exit 1
        fi

        cobbler import --path=/mnt/$name \
                       --name $name \
                       --arch=x86_64 \
                       --kickstart=/var/lib/cobbler/kickstarts/default.ks \
                       --breed=redhat
        if [[ "$?" != "0" ]]; then
            echo "failed to import /mnt/$i"
            exit 1
        fi
    fi
    
done

cobbler repo list | xargs -n 1 cobbler repo remove --name

mkdir -p /var/lib/cobbler/repo_mirror

for i in $UBUNTU_14_04_03_PPA_REPO_SOURCE; do
     download -u "$i" `basename "$i"` unzip /var/lib/cobbler/repo_mirror || exit $?
     filename=`basename $i | sed 's/.tar.gz//g'`
     cobbler repo add --name $filename --mirror=/var/lib/cobbler/repo_mirror/$filename \
                      --mirror-locally=Y --arch=x86_64 --apt-dists=trusty --apt-components=main

     if [[ "$?" != "0" ]]; then
         echo "failed to add repo $i"
         exit 1
     fi
done

for i in $CENTOS_7_2_PPA_REPO_SOURCE; do
     download -u "$i" `basename "$i"` unzip /var/lib/cobbler/repo_mirror || exit $?
     filename=`basename $i | sed 's/.tar.gz//g'`
     cobbler repo add --name $filename --mirror=/var/lib/cobbler/repo_mirror/$filename \
                      --mirror-locally=Y --arch=x86_64
     if [[ "$?" != "0" ]]; then
         echo "failed to add repo $i"
         exit 1
     fi
done

for i in $UBUNTU_14_04_03_IMAGE_SOURCE; do
    name=`basename "$i" | sed -e 's/.iso//g' -e 's/-amd64//g' -e 's/-x86_64//g'`-x86_64
    cobbler profile edit --name=$name \
            --distro=$name --ksmeta="tree=http://$IPADDR/cobbler/ks_mirror/$name" \
            --kickstart=/var/lib/cobbler/kickstarts/default.seed \
            --kopts="netcfg/choose_interface=auto console='ttyS0,115200n8' console=tty0 biosdevname=0" \
            --kopts-post="console='ttyS0,115200n8' console=tty0 biosdevname=0"
done

for i in $CENTOS_7_2_IMAGE_SOURCE; do
    name=`basename "$i" | sed -e 's/.iso//g' -e 's/-amd64//g' -e 's/-x86_64//g'`-x86_64
    cobbler profile edit --name=$name \
            --distro=$name --ksmeta="tree=http://$IPADDR/cobbler/ks_mirror/$name" \
            --kickstart=/var/lib/cobbler/kickstarts/default.ks
done

sudo cobbler reposync
if [[ "$?" != "0" ]]; then
    echo "cobbler reposync failed"
    exit 1
fi

sudo cobbler sync
if [[ "$?" != "0" ]]; then
    echo "cobbler sync failed"
    exit 1
fi

echo "Checking cobbler is OK"
sudo cobbler check
if [[ "$?" != "0" ]]; then
    echo "cobbler check failed"
    exit 1
fi

echo "Cobbler configuration complete!"