скрипт server-install
Создано: 09-09-2011 10:02:19  Метки: linux
#! /bin/bash
# create server
version="v0.7.5"
dirt=`dirname $0`
# colors
green="\033[01;32m"
black="\033[00m"
redy="\033[01;31m"

# question вопрос (переменная знач_по_умолчанию)
question() {
    echo -en "$1 [$3] " ; read var
    if [ "t$var" = "t" ] ; then
        eval $2=$3
    else
        eval $2=$var
    fi
}

# somethingh wrong (message)
error() {
    echo -e "$1"
    clean
    exit 1
}

# read parameters
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
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"
}

# check limitations of disk
limita() {
if [ "d$disk" = "d" ] ; then
    echo -e "${redy}НЕТ ДИСКА!!!${black}"
    exit 1

fi
size=`fdisk -l /dev/${disk}|grep /dev/${disk}:|awk '{print $5}'`
# in Mb
size=$[$size/1000/1000]
if [ $size -lt $mindiskspace ] ; then
    echo -e "${redy}Мало места на диске!!!${black}"
    exit 1
fi
}

# count swap & home
count_sizes() {
if [ $size -lt $disksizehome ] ; then
    home=0
    swap=$[$size/10]
    if [ $swap -lt $minswap ] ; then
        # min swap
        swap=$minswap
    fi
    root=$[$size-$swap]
else
    swap=$maxswap
    root=$maxroot
    home=$[$size-$root-$swap]
fi
}

# remove partitions
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
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
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
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
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
}

# fstab
mk_fstab() {
cat > /mnt$$/etc/fstab <<EOF1
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
# /dev/sda1
`blkid -sUUID /dev/${disk}1|awk '{print $2}'|sed "s#\"##g"`     /       ext3    defaults,noatime,nodiratime,errors=remount-ro   0       0
# /dev/sda2
`blkid -sUUID /dev/${disk}2|awk '{print $2}'|sed "s#\"##g"`     none    swap    defaults        0       0
#/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto,exec 0       0
# /dev/sda3
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

}

# grub
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
}

# network
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
}

# add admin
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() {
# squid
sed -i "s#REPLACEHOT#$ip_loc#" /mnt$$/etc/squid/squid.conf
sed -i "s#REPLACENET#$loc_net#" /mnt$$/etc/squid/squid.conf

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

#shorewall
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/*

#screen
sed -i "s#SERVER#$hostn#" /mnt$$/etc/skel/.screenrc

#postfix
sed -i "s#DOMAIN#$domen#" /mnt$$/etc/postfix/main.cf
sed -i "s#LAN#$loc_net#" /mnt$$/etc/postfix/main.cf
}

#umount & clear
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$$
}

################################################################################
# begin

################################################################################
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
1785 просмотров комментировать
Создано: _medved_ 24-11-2011 17:21:53 Ответить
Сан Саныч!Сам писал что ли? Не то чтобы очень сложно, но писанины много, респект, круто!
Создано: sanych 24-11-2011 20:25:49 Ответить
Вов, конечно сам писал... На бывшей работе же очень много свободного времени было :) Ничего крутого, просто старался писать понятно и просто для того чтоб через любое прошедшее время этот скрипт можно было понять.