version="v0.7.5"
dirt=`dirname $0`
green="\033[01;32m"
black="\033[00m"
redy="\033[01;31m"
question() {
echo -en "$1 [$3] " ; read var
if [ "t$var" = "t" ] ; then
eval $2=$3
else
eval $2=$var
fi
}
error() {
echo -e "$1"
clean
exit 1
}
read_params() {
if [ -f $dirt/server-install.conf ] ; then
. $dirt/server-install.conf
else
if [ -f /root/server-install.conf ] ; then
. /root/server-install.conf
else
error "${redy}Нет конфига!!!${black}"
fi
fi
if [ -f /root/server-install.conf ] ; then
. /root/server-install.conf
fi
}
usage() {
echo -ne "Этот скрипт $version устанавливает серверную версию линукса на жесткий диск компьютера.
${green}Первый интерфейс смотрит в интернет, второй в локалку.${black}
На обоих интерфейсах ${green}статика${black}.
Состав ПО: dnsmasq, squid, sarg, shorewall, apache2, netams, logwatch, postfix${black}
конфиг смотрится сначала ${dirt}/server-install.conf затем /root/server-install.conf\n
Опции: `basename $0` [ install | grub | fstab | network | admin ]\n\n"
}
limita() {
if [ "d$disk" = "d" ] ; then
echo -e "${redy}НЕТ ДИСКА!!!${black}"
exit 1
fi
size=`fdisk -l /dev/${disk}|grep /dev/${disk}:|awk '{print $5}'`
size=$[$size/1000/1000]
if [ $size -lt $mindiskspace ] ; then
echo -e "${redy}Мало места на диске!!!${black}"
exit 1
fi
}
count_sizes() {
if [ $size -lt $disksizehome ] ; then
home=0
swap=$[$size/10]
if [ $swap -lt $minswap ] ; then
swap=$minswap
fi
root=$[$size-$swap]
else
swap=$maxswap
root=$maxroot
home=$[$size-$root-$swap]
fi
}
rm_parts(){
for i in `parted /dev/$disk print|awk '{print $1}'|egrep '[[:digit:]]'` ; do
swapoff /dev/${disk}$i > /dev/null 2>&1
sleep 3
umount -l -f /dev/${disk}$i > /dev/null 2>&1
sleep 3
parted -s /dev/$disk rm $i || error "${redy}Не смогла я почистить диск :(${black}"
done
}
mk_parts() {
echo -e "${green}Создаем разделы...${black}"
parted -s /dev/$disk mklabel msdos
parted -s /dev/$disk mkpart primary 0.0 ${root}.0 || error "${redy}Не смогла я создать партицию 1 на диске :(${black}"
parted -s /dev/$disk set 1 boot on
parted -s /dev/$disk mkpartfs primary linux-swap ${root}.1 $[$root+$swap].0 || error "${redy}Не смогла я создать партицию 2 на диске :(${black}"
sleep 3
mkfs.ext3 /dev/${disk}1 >/dev/null 2>&1 || error "${redy}Не смогла я отформатировать партицию 1 на диске :(${black}"
if [ $home -gt 0 ] ; then
parted -s /dev/$disk mkpart primary $[$root+$swap].1 $[$root+$swap+$home].0 || error "${redy}Не смогла я создать партицию 3 на диске :(${black}"
sleep 3
mkfs.ext3 /dev/${disk}3 >/dev/null 2>&1 || error "${redy}Не смогла я отформатировать партицию 3 на диске :(${black}"
fi
parted -s /dev/$disk print
}
unpack_sys() {
echo -e "${green}Распаковываем систему на диск...${black}"
cd /mnt$$
if [ -f $dirt/server.tar.gz ] ; then
tar xfz $dirt/server.tar.gz || error "${redy}Не смогла я распаковать систему :(${black}"
else
error "${redy}Нет файла $dirt/server.tar.gz!!!${black}"
fi
}
unpack_configs() {
cd /mnt$$
if [ -f $dirt/server_configs.tar.gz ] ; then
tar xfz $dirt/server_configs.tar.gz || error "${redy}Не смогла я распаковать конфиги :(${black}"
else
error "${redy}Нет файла $dirt/server_configs.tar.gz!!!${black}"
fi
}
mount_home() {
if egrep "${disk}3\>" /proc/partitions > /dev/null ; then
mount /dev/${disk}3 /mnt$$/home || error "${redy}Не смогла я смонтировать home :(${black}"
mkdir /mnt$$/home/ftp
mkdir /mnt$$/home/netams
chown root:nogroup /mnt$$/home/ftp
fi
}
mount_root() {
mkdir /mnt$$
mount /dev/${disk}1 /mnt$$ || error "${redy}Не смогла я смонтировать root :(${black}"
}
mount_dev() {
sleep 1
mount --bind /dev/ /mnt$$/dev
sleep 1
chroot /mnt$$ mount -t proc none /proc
}
mk_fstab() {
cat > /mnt$$/etc/fstab <<EOF1
proc /proc proc defaults 0 0
`blkid -sUUID /dev/${disk}1|awk '{print $2}'|sed "s#\"##g"` / ext3 defaults,noatime,nodiratime,errors=remount-ro 0 0
`blkid -sUUID /dev/${disk}2|awk '{print $2}'|sed "s#\"##g"` none swap defaults 0 0
EOF1
if egrep "${disk}3\>" /proc/partitions > /dev/null ; then
homeid=`blkid -sUUID /dev/${disk}3|awk '{print $2}'|sed "s#\"##g"`
echo "$homeid /home ext3 defaults,noatime,nodiratime,errors=remount-ro 0 0" >> /mnt$$/etc/fstab
fi
}
mk_grub() {
grub-install --recheck --no-floppy --root-directory=/mnt$$ /dev/$disk >/dev/null 2>&1 || error "${redy}Не смогла я по поставить grub :(${black}"
chroot /mnt$$ update-grub -y >/dev/null 2>&1 || error "${redy}Не смогла я по поставить grub/menu.lst :(${black}"
sed -i "s|#color|color|" /mnt$$/boot/grub/menu.lst
sed -i "s|quiet splash|nosplash locale=ru_RU vga=0x303|g" /mnt$$/boot/grub/menu.lst
}
mk_netw() {
question "${green}Имя сервера?${black}" hostn $def_name
echo $hostn > /mnt$$/etc/hostname
echo "127.0.0.1 localhost" > /mnt$$/etc/hosts
echo "127.0.1.1 $hostn" >> /mnt$$/etc/hosts
question "${green}Домен?${black}" domen $hostn
echo $domen > /mnt$$/etc/mailname
question "${green}Внешний интерфейс?${black}" net_iface $def_net_iface
question "${green}Внутрений интерфейс?${black}" lan_iface $def_lan_iface
question "${green}Внешний ip-адрес на $net_iface?${black}" ip_netm $def_net
ip_gw=`ipcalc $ip_netm|grep HostMin:|awk '{print $2}'`
question "${green}Шлюз?${black}" ip_gw1 $ip_gw
question "${green}Внутренний ip-адрес на $lan_iface?${black}" ip_locm $def_lan
ip_net=`ipcalc $ip_netm|grep Address:|awk '{print $2}'`
net_mask=`ipcalc $ip_netm|grep Netmask:|awk '{print $2}'`
ip_loc=`ipcalc $ip_locm|grep Address:|awk '{print $2}'`
loc_mask=`ipcalc $ip_locm|grep Netmask:|awk '{print $2}'`
loc_net=`ipcalc $ip_locm|grep Network:|awk '{print $2}'`
cat > /mnt$$/etc/network/interfaces <<EOF3
auto lo
iface lo inet loopback
auto $net_iface
iface $net_iface inet static
address $ip_net
netmask $net_mask
gateway $ip_gw1
auto $lan_iface
iface $lan_iface inet static
address $ip_loc
netmask $loc_mask
EOF3
cat > /mnt$$/etc/dnsmasq.conf <<EOFDNMAQ
interface=$lan_iface
expand-hosts
domain=$domen
dhcp-range=`ipcalc $ip_locm|grep Address:|awk '{print $2}'|cut -f1-3 -d.`.110,`ipcalc $ip_locm|grep HostMax:|awk '{print $2}'`,$loc_mask,12h
dhcp-leasefile=/var/lib/misc/dnsmasq.leases
conf-file=/etc/dnsmasq.hosts
EOFDNMAQ
echo "nameserver 127.0.0.1" > /mnt$$/etc/resolv.conf
question "${green}ip-адрес 1 DNS-servera?${black}" dns1 $def_dns1
echo "nameserver $dns1" >> /mnt$$/etc/resolv.conf
question "${green}ip-адрес 2 DNS-servera?${black}" dns2 $def_dns2
echo "nameserver $dns2" >> /mnt$$/etc/resolv.conf
}
mk_admin() {
question "${green}Имя администратора системы?${black}" user $def_admin
chroot /mnt$$ useradd -g admin -m -k /etc/skel -s /bin/bash $user
printf "${green}Введите пароль администратора системы ${black}\n"
chroot /mnt$$ passwd $user
}
ch_configs() {
sed -i "s#REPLACEHOT#$ip_loc#" /mnt$$/etc/squid/squid.conf
sed -i "s#REPLACENET#$loc_net#" /mnt$$/etc/squid/squid.conf
sed -i "s#REPLACEHOST#$ip_loc#" /mnt$$/etc/netams/netams.cfg
sed -i "s#REPLACELAN#$loc_net#" /mnt$$/etc/netams/netams.cfg
sed -i "s#REPLACEIFACE#$lan_iface#" /mnt$$/etc/netams/netams.cfg
sed -i "s#REPLACELNET#`echo $loc_net|cut -f1 -d/`#" /mnt$$/etc/netams/netams.cfg
sed -i "s#REPLACEMASK#$loc_mask#" /mnt$$/etc/netams/netams.cfg
sed -i "s#REPLACEHOST#$ip_loc#" /mnt$$/etc/shorewall/rules
sed -i "s#REPLACEIFACEINET#$net_iface#" /mnt$$/etc/shorewall/*
sed -i "s#REPLACEIFACELAN#$lan_iface#" /mnt$$/etc/shorewall/*
sed -i "s#SERVER#$hostn#" /mnt$$/etc/skel/.screenrc
sed -i "s#DOMAIN#$domen#" /mnt$$/etc/postfix/main.cf
sed -i "s#LAN#$loc_net#" /mnt$$/etc/postfix/main.cf
}
clean() {
umount -l -f /mnt$$/dev 2>/dev/null
sleep 3
chroot /mnt$$ umount -l -f /proc 2>/dev/null
sleep 3
umount -l -f /mnt$$
sleep 3
rm -r /mnt$$
}
if [ $UID -ne 0 ] ; then
echo 'run this script whith SUDO' ; exit 1
fi
case $1 in
install)
read_params
sfdisk -s
question "${green}На какой диск будем устанавливать?${black}" dsk $def_disk
disk=`cat /proc/partitions|egrep "${dsk}\>"|awk '{print $4}'`
limita
question "${redy}Диск $disk будет отформатирован!!! Продолжить? (NO/yes)${black} " answ NO
if [ $answ != "yes" ] ; then
echo "Выход"
exit 0
fi
count_sizes
rm_parts
mk_parts
mount_root
unpack_sys
mount_home
mount_dev
mk_fstab
mk_grub
mk_netw
mk_admin
ch_configs
clean
;;
grub)
echo -e "${green}Обновляем grub...${black}"
read_params
question "${green}Какой диск?${black}" disk $def_disk
mount_root
mount_dev
mk_grub
clean
;;
fstab)
echo -e "${green}Обновляем /etc/fstab...${black}"
read_params
question "${green}Какой диск?${black}" disk $def_disk
mount_root
mk_fstab
clean
;;
network)
echo -e "${green}Обновляем сетевые настройки...${black}"
read_params
question "${green}Какой диск?${black}" disk $def_disk
mount_root
mk_netw
unpack_configs
ch_configs
clean
;;
admin)
echo -e "${green}Добавляем админа...${black}"
read_params
question "${green}Какой диск?${black}" disk $def_disk
mount_root
mount_home
mk_admin
clean
;;
*)
usage
;;
esac