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