fuel-library/iso/functions.sh
2013-06-03 20:31:26 +04:00

265 lines
10 KiB
Bash

#!/bin/bash
LC_CTYPE="C"
function validate_hostname {
local hostname=$@
local res=1
if [[ $hostname =~ ^[.A-Za-z0-9]*$ ]]; then
res=0
else
res=1
fi
return $res
}
function validate_ip() {
local ip=$@
local res=1
if [[ $ip =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] || [[ $ip = none ]]; then
res=0
else
res=1
fi
return $res
}
function set_if_conf {
echo
echo -n "Should we use DHCP for the ${intf} interface (Y/n)?";read -n 1 dhcpsw
if [[ $dhcpsw =~ ^[nN] ]]; then
echo
eval "ip=\${${intf}_ip}"
echo -n "Enter IP address or 'none' to disable interface [$ip]: "; read val
validate_ip $val && ip=$val
[ -z "$ip" ] && echo "No IP entered - will use DHCP" && return
eval ${intf}_ip="$ip"
eval "mask=\${${intf}_mask}"
[ -z "$mask" ] && mask="255.255.255.0"
echo -n "Enter netmask [$mask]: "; read val
validate_ip $val && mask=$val
eval ${intf}_mask="$mask"
eval "gw=\${${intf}_gw}"
echo -n "Enter default gateway [$gw]: "; read val
validate_ip $val && gw=$val
eval ${intf}_gw="$gw"
eval "dns1=\${${intf}_dns1}"
echo -n "Enter the 1st DNS server [$dns1]: "; read val
validate_ip $val && dns1=$val
eval ${intf}_dns1="$dns1"
eval "dns2=\${${intf}_dns2}"
echo -n "Enter the 2nd DNS server [$dns2]: "; read val
validate_ip $val && dns2=$val
eval ${intf}_dns2="$dns2"
else
eval ${intf}_ip=""; eval ${intf}_mask=""; eval ${intf}_gw=""; eval ${intf}_dns1=""; eval ${intf}_dns2=""
fi
echo
}
function save_if_cfg {
scrFile="/etc/sysconfig/network-scripts/ifcfg-$device"
hwaddr=$(cat /sys/class/net/$device/address)
[ -z $gw ] || echo GATEWAY=$gw >> /etc/sysconfig/network
echo DEVICE=$device > $scrFile
echo ONBOOT=yes >> $scrFile
echo NM_CONTROLLED=no >> $scrFile
echo HWADDR=$hwaddr >> $scrFile
echo USERCTL=no >> $scrFile
if [ $ip ] && [[ $ip != none ]]; then
echo BOOTPROTO=static >> $scrFile
echo IPADDR=$ip >> $scrFile
echo NETMASK=$netmask >> $scrFile
[ $dns1 ] && echo DNS1=$dns1 >> $scrFile
[ $dns2 ] && echo DNS2=$dns2 >> $scrFile
elif [[ $ip = none ]] ; then
echo BOOTPROTO=dhcp >> $scrFile
echo ONBOOT=no >> $scrFile
else
echo BOOTPROTO=dhcp >> $scrFile
fi
}
function default_settings {
hostname="fuel-pm"
domain="localdomain"
mgmt_if="eth0"
mgmt_ip="10.0.0.100"
mgmt_mask="255.255.0.0"
ext_if="eth1"
dhcp_start_address="10.0.0.201"
dhcp_end_address="10.0.0.254"
mirror_type="default"
puppet_master_version="2.7.19-1.el6"
# Read settings from file
[ -f $FUELCONF ] && source $FUELCONF
}
function apply_settings {
echo;echo "Applying settings ..."
# Let's save settings in rc file for future use
echo "hostname=$hostname" > $FUELCONF
echo "domain=$domain" >> $FUELCONF
echo "dhcp_start_address=${dhcp_start_address}" >> $FUELCONF
echo "dhcp_end_address=${dhcp_end_address}" >> $FUELCONF
echo "mirror_type=${mirror_type}" >> $FUELCONF
echo "parent_proxy=${parent_proxy}" >> $FUELCONF
echo "mgmt_if=$mgmt_if" >> $FUELCONF
echo "mgmt_ip=${mgmt_ip}" >> $FUELCONF
echo "mgmt_mask=${mgmt_mask}" >> $FUELCONF
echo "mgmt_gw=$mgmt_gw" >> $FUELCONF
echo "mgmt_dns1=$mgmt_dns1" >> $FUELCONF
echo "mgmt_dns2=$mgmt_dns2" >> $FUELCONF
echo "ext_if=$ext_if" >> $FUELCONF
echo "ext_ip=${ext_ip}" >> $FUELCONF
echo "ext_mask=${ext_mask}" >> $FUELCONF
echo "ext_gw=$ext_gw" >> $FUELCONF
echo "ext_dns1=$ext_dns1" >> $FUELCONF
echo "ext_dns2=$ext_dns2" >> $FUELCONF
# Network interfaces settings apply
for iftype in ext mgmt
do
eval device=\$${iftype}_if
eval ip=\$${iftype}_ip
eval netmask=\$${iftype}_mask
eval gw=\$${iftype}_gw
eval dns1=\$${iftype}_dns1
eval dns2=\$${iftype}_dns2
hwaddr=`ifconfig $device | grep -i hwaddr | sed -e 's#^.*hwaddr[[:space:]]*##I'`
save_if_cfg
done
# Cobbler settings apply
: ${server=$mgmt_ip}
: ${domain_name=$domain}
: ${name_server=$mgmt_ip}
: ${next_server=$mgmt_ip}
: ${dhcp_netmask=$mgmt_mask}
: ${dhcp_gateway=$mgmt_ip}
: ${cobbler_user="cobbler"}
: ${cobbler_password="cobbler"}
: ${pxetimeout="0"}
: ${dhcp_interface=$mgmt_if}
# Domain/Hostname apply
sed -i -e 's#^\(HOSTNAME=\).*$#\1'"$hostname.$domain"'#' /etc/sysconfig/network
rm -f /var/lib/puppet/ssl/ca/signed/*
[ -n "$mgmt_ip" -a -n "$ext_ip" ] && sed -i '/nameserver/d' /etc/resolv.conf && echo "nameserver 127.0.0.1;" >> /etc/resolv.conf
[ -z "$mgmt_ip" ] && echo "prepend domain-name-servers 127.0.0.1;" >> /etc/dhclient-$mgmt_if.conf
[ -z "$ext_ip" ] && echo "prepend domain-name-servers 127.0.0.1;" >> /etc/dhclient-$ext_if.conf
[ -z "$mgmt_ip" ] || grep -Eq "^\s*$mgmt_ip\s+$hostname" /etc/hosts || sed -i "/$mgmt_ip/d" /etc/hosts && echo "$mgmt_ip $hostname.$domain $hostname" >> /etc/hosts
sed -i '/kernel.hostname/d' /etc/sysctl.conf && echo "kernel.hostname=$hostname" >> /etc/sysctl.conf
sed -i '/kernel.domainname/d' /etc/sysctl.conf && echo "kernel.domainname=$domain" >> /etc/sysctl.conf
sed -i '/server/d' /etc/puppet/puppetdb.conf && echo "server = $hostname.$domain" >> /etc/puppet/puppetdb.conf
service network restart
service puppetdb restart
sed -i "s%\(^.*address is:\).*$%\1 `ip address show $ext_if | awk '/inet / {print \$2}' | cut -d/ -f1 -`%" /etc/issue
}
function show_top {
clear
echo "Hostname: $hostname"
echo "Domain: $domain"
echo "PXE dhcp range: ${dhcp_start_address} - ${dhcp_end_address}"
echo "Mirror set to use: ${mirror_type}"
echo -n "Parent proxy: "
if [ -z "${parent_proxy}" ];then
echo "none (direct access)"
else
echo $parent_proxy
fi
echo -e "Management interface: $mgmt_if%External interface: $ext_if\n\
IP address: ${mgmt_ip:-"DHCP"}%IP address: ${ext_ip:-"DHCP"}\n\
Netmask: $mgmt_mask%Netmask: $ext_mask\n\
Gateway: $mgmt_gw%Gateway:$ext_gw\n\
DNS Server 1: $mgmt_dns1%DNS Server 1: $ext_dns1\n\
DNS Server 2: $mgmt_dns2%DNS Server 2: $ext_dns2\n" | column -t -s%
}
function show_msg {
echo "Menu:"
echo "1. Change MasterNode hostname and domain"
echo "2. Configure OpenStack cloud management interface"
echo "3. Configure external interface to access package repositories and Internet"
echo "4. Change dhcp IP range to use for baremetal provisioning via PXE"
echo "5. Choose a set of mirrors to use ('default' or 'custom')"
echo "6. Configure MasterNode to use a parent proxy"
echo "9. Quit"
echo -n "Please select an action to do:"
}
function menu_conf {
if [ -f /root/fuel.defaults ]; then
source /root/fuel.defaults
endconf=1
else
while [ $endconf -ne 1 ]; do
show_top
show_msg
read -n 1 -t 5 answer
case $answer in
1)
show_top
echo "WARNING! Changing MasterNode hostname or domain name will make your existing"
echo "puppet keys and configuration files invalid!!!"
echo "If you have already deployed any nodes using current hostname or domain name"
echo "you have either to re-deploy existing nodes including operating system"
echo "installation or manually remove puppet cache and keys on every deployed node"
echo "with 'rm -rf /var/lib/puppet' and manually change all affected puppet and"
echo "mcollective configuration files!"
echo "If there are no deployed nodes in your current installation - then it is safe"
echo "to change MasterNode hostname and domain name."
echo "This script will remove current puppet master key automatically."
echo
echo -n "Please enter hostname for this puppetmaster/cobbler MasterNode [$hostname]: "; read val
[ -z "$val" ] || hostname=$val
echo -n "Please enter domain name for this OpenStack cloud [$domain]: "; read val
[ -z "$val" ] || domain=$val
;;
2)
show_top
echo -n "Please specify the network interface to use for management network [${mgmt_if}]: "; read val
[ -z "$val" ] || mgmt_if=$val
intf="mgmt"
set_if_conf
;;
3)
show_top
echo -n "Please specify the network interface to access package repositories and Internet [${ext_if}]: "; read val
[ -z "$val" ] || ext_if=$val
intf="ext"
set_if_conf
;;
4)
show_top
echo -n "Please enter PXE dhcp start address [${dhcp_start_address}]: "; read val
validate_ip $val && dhcp_start_address=$val
echo -n "Please enter PXE dhcp end address [${dhcp_end_address}]: "; read val
validate_ip $val && dhcp_end_address=$val
;;
5)
show_top
echo -n "Please type a set of mirrors to use ('default' or 'custom') [${mirror_type}]: "; read val
if [ -n "$val" ]; then
[[ "$val" == "default" || "$val" == "custom" ]] && mirror_type=$val
fi
;;
6)
show_top
echo -n "Please specify MasterNode parent proxy address and port to be used (ex: 11.12.13.14:3128 ) [${parent_proxy}]: "; read val
[ -z "$val" ] || parent_proxy=$val
;;
9)
echo;echo "ATTENTION! The changes are permanent!"
echo -n "Are you sure about applying them? (y/N):"; read -n 1 answ
[[ $answ =~ ^[yY] ]] && endconf=1
;;
esac
done
fi
}