Shell Скрипты: три действия: диск, домен, правка конфигов

Данный скрипт заточен под работу из УСБ и ОС FreeBSD, он выполняет три действия:
1. разбивает диск
2. вгонят в домен
3. правит конфиги ;)

Охх длинный то …

#!/bin/sh

cd /tmp && rm -Rf * >/dev/null 2>&1

case $1 in
        stop)
        exit;
        ;;
        *)
        clear;
        echo > /tmp/rc.conf.jail
        /usr/sbin/ntpdate my-domain-name.local >/dev/null 2>&1 &
        ;;
esac

# rm tmp files
tmp_dir="/tmp/install"
/bin/rm -Rf ${tmp_dir}
/bin/mkdir -p ${tmp_dir}

# variables
root_size="256"         # Mb    384
swap_size="128" # Mb    1024
usr_size="2048"         # Mb    4096
var_size="1024"         # Mb    4096

# distrib directory
dist_dir="/dist/dist"

# debug - on = 1; off = 2
debug="2"
# install new server

# prompt user - restore or not?
echo "

!!!!!  Внимание  !!!!!
Если вы не понимаете что делаете, выньше флэшку и перезагрузите сервер.
Если вы введёте YES, начнётся инсталляция нового сервера, и все данные
содержащиеся на жёстком диске будут утеряны. Если вы введёте NO, установка
будет прервана, и произойдёт автоматическая перезагрузка.

Если вы не создали в BIOS контроллера массив (для сервера), введите NO
и создайте его, после этого, заново начните установку."
echo -n "Хотите ли вы начать установку: "
read answer
# verify answer
case ${answer} in
        [Yy][Ee][Ss])
        # согласен. продолжаем
        echo""
        echo "Инсталляция нового сервера запущена!"
        ;;
        *)
        # передумал :)
        echo "Вы ответили '${answer}'. Сервер перезагружается..."
        shutdown -r now
        exit;
        ;;
esac

# select - what installing
echo -n "

Для инсталляции почтового/файлового сервера введите 'S',
для инсталляции сервера архивации введите 'B'.
Введите ваш выбор:"
read server_type
case ${server_type} in
        [Ss])
        # сервак
        echo""
        echo "Инсталляция нового файлового/почтового сервера запущена!"
        echo "1" > ${tmp_dir}/server_type.txt
        ;;
        [Bb])
        # бэкап
        echo "Инсталляция нового сервера архивации запущена!"
        echo "2" > ${tmp_dir}/server_type.txt
        ;;
esac
server_type="`/bin/cat ${tmp_dir}/server_type.txt`"

input_function() {
# input name new server
echo "
Для успешной инсталляции, ответтьте пожалуйста на несколько вопросов

Введите имя сервера (имя вводится без доменного суффикса)."
echo -n "Имя: "
read server_name_user
server_name="`echo ${server_name_user} | /usr/bin/tr '[:upper:]' '[:lower:]'`"
# проверяем введённое
if [ ${server_name}x = 'x' ]
then
        # пустое имя.
        server_name="default"
fi
# input IP new server
echo -n "Введите IP адрес этого сервера: "
read server_IP
# проверяем введённое
if [ ${server_IP}x = 'x' ]
then
        # пустой адрес.
        server_IP="172.31.0.10"
fi
# input IP default gateway
echo -n "Введите адрес шлюза: "
read gateway_IP
if [ ${gateway_IP}x = 'x' ]
then
        # пустой гейт
        gateway_IP="172.31.0.1"
fi
# input IP default gateway
if [ ${server_type} -eq 1 ]; then
echo -n "Введите адрес сервера backup: "
read backup_IP
if [ ${backup_IP}x = 'x' ]
then
        # пустой гейт
        backup_IP="172.31.0.1"
fi
fi

# input admin user login
echo -n "Введите логин администратора филиала: "
read user_login
if [ ${user_login}x = 'x' ]
then
        # пустой логин
        user_login="lissyara"
fi
# input admin user login
echo -n "Введите ВАШ логин в домене: "
read user_join_login
if [ ${user_join_login}x = 'x' ]
then
        # пустой логин
        user_join_login="akeda"
fi
# input admin user login
echo -n "Введите OU филиала: "
read filial_OU
if [ ${filial_OU}x = 'x' ]
then
        # пустой логин
        user_login="chelyabinsk"
fi

echo "
Вы ввели следующие сведения:
Имя сервера:                    ${server_name}
IP сервера:                     ${server_IP}
IP шлюза:                       ${gateway_IP}"
if [ ${server_type} = 1 ]; then
echo "IP сервера backup:                ${backup_IP}"
fi
echo "Логин администратора филиала:     ${user_login}
Ваш доменный логин:             ${user_join_login}
OU филиала:                     ${filial_OU}
"
# input user answer - correct or not data?
echo "Если эти данные верны, введите YES, в противном случае, введите NO"
echo -n "Ваш ответ: "
read result_code
# verify answer
echo -n > ${tmp_dir}/rezult.code.user.input
case ${result_code} in
        [Yy][Ee][Ss])
        # согласен. продолжаем
        echo""
        echo "Вы ввели верные данные. Инсталляция продолжается.!"
        echo "1" > ${tmp_dir}/rezult.code.user.input
        ;;
        *)
        # передумал :)
        echo "Вы ответили '${result_code}'. Повторный ввод данных"
        echo "no" > ${tmp_dir}/rezult.code.user.input
        ;;
        esac

}       # end input function

while test 1 -eq 1
do
        # вводим данные.
        /usr/bin/touch ${tmp_dir}/rezult.code.user.input
        read rezult_code < ${tmp_dir}/rezult.code.user.input
        if [ ${rezult_code}x = 1x ]
        then
                # данные введены верные. считываем переменные.
                #echo "имя серванта ${server_name}"
                break
        else
                # либо данные не введены, либо они неверные
                input_function
        fi
done

# debug - skip restore
#if [ 2 -eq 1 ]; then

# detecting hdd on server
kernel_disks="`/sbin/sysctl kern.disks | awk -F ':' '{print $2}'`"
#kern.disks: da1 da0
if [ ${debug} -eq 1 ] ; then
echo "DEBUG: 1. kernel disks = ${kernel_disks}" ; fi
# cycle for all disks - count and match
i=0
for all_disks in ${kernel_disks}
do
        # detecting disk type
        disk_type="`echo ${all_disks} | /usr/bin/tr -d '[0-9]'`"
        # detecting disk number
        disk_number="`echo ${all_disks} | /usr/bin/tr -d '[a-z]'`"
        # find ATA|SATA disks
        if [ ${disk_type} = "ad" ]
        then
                # ATA/SATA disks
                echo " detected ATA/SATA disks! "
                echo "${all_disks}" > ${tmp_dir}/ata_disk.tmp
        else
                /usr/bin/touch ${tmp_dir}/ata_disk.tmp
        fi
        # SCSI device
        if [ ${all_disks} = "da1" ]
        then
                # found 1 SCSI disk (da0 - disk, da1 - flash)
                echo " detected SCSI disks! "
                echo "da0" > ${tmp_dir}/scsi_disk.tmp
        else
                /usr/bin/touch ${tmp_dir}/scsi_disk.tmp
        fi
        # detecting - how many SCSI disks on machine
#       for ii in 0 1 2 3 4 5 6 7 8 9
#       do
#               if [ ${all_disks} = da${ii} ]
#               then
#                       # count $i + 1 - line in file
##                      echo da${ii} >> ${tmp_dir}/disks_count.tmp
#               fi
#       done
        # up counter +1
        i="`/bin/expr $i + 1`"
done
#number_SCSI_disks="`cat ${tmp_dir}/disks_count.tmp | /usr/bin/wc -l | /usr/bin/tr -d ' '`"
#if [ ${debug} -eq 1 ] ; then
#echo "DEBUG: 2. number SCSI disks = ${number_SCSI_disks}" ; fi
# if $number_SCSI_disks = 1 - exit - only flash detected
#if [ ${number_SCSI_disks} -eq 1 ]
#then
        # exit
#       echo " Fatal: SCSI disks not detected!"
#       exit;
#fi
# scsi disks detected. da0 - disk for work

# disk counter. Current - number disk = 2; else - shutdown - error - no disks
# future - number disk = 3 (add RAM disk)
if [ $i -eq 2 ]
then
        # all OK
else
        # no disks?
        echo " HDD drive not found... System shutdown..."
        /bin/sleep 5 && /sbin/shutdown -p now && exit;
fi
# select disk for work
if [ `/usr/bin/wc -l ${tmp_dir}/ata_disk.tmp | awk '{print $1}'` -eq 1 ]
then
        # found ATA disk
        work_device="`/bin/cat ${tmp_dir}/ata_disk.tmp`"
else
        # ATA not found - work on SCSI
        work_device="`/bin/cat ${tmp_dir}/scsi_disk.tmp`"
fi

#exit
# fdisk
echo "Creating partitions..."
#/sbin/fdisk -f ${dist_dir}/fdisk.config -b -I -v /dev/da0 >/dev/null 2>&1
/sbin/fdisk -I -i -B /dev/${work_device}

echo "# /dev/${work_device}s1:
8 partitions:
#       size    offset  fstype  [fsize  bsize   bps/cpg]
a:      ${root_size}M   0       4.2BSD  2048    16384   32776
b:      ${swap_size}M   *       swap
c:      *       0       unused  0       0               # "raw" part, don't edit
d:      ${usr_size}M    *       4.2BSD  2048    16384   28528
e:      ${var_size}M    *       4.2BSD  2048    16384   28528
f:      *               *       4.2BSD  2048    16384   28552   # /shares - all remaining space
" > ${tmp_dir}/bsdlabel.txt

# bsdlabel
/sbin/bsdlabel -R ${work_device}s1 ${tmp_dir}/bsdlabel.txt >/dev/null 2>&1
/sbin/bsdlabel -B ${work_device}s1 >/dev/null 2>&1
# newfs
echo "Creating filesystems..."
/sbin/newfs /dev/${work_device}s1a      >/dev/null 2>&1 # /
/sbin/newfs /dev/${work_device}s1f      >/dev/null 2>&1 # /shares
/sbin/newfs /dev/${work_device}s1d      >/dev/null 2>&1 # /usr
/sbin/newfs /dev/${work_device}s1e      >/dev/null 2>&1 # /var
# tunefs
echo "Settings filesystems parameters..."
/sbin/tunefs -n enable /dev/${work_device}s1f   >/dev/null 2>&1 # softupdates
/sbin/tunefs -a enable /dev/${work_device}s1f   >/dev/null 2>&1 # ACLs
/sbin/tunefs -n enable /dev/${work_device}s1d   >/dev/null 2>&1 # softupdates
/sbin/tunefs -n enable /dev/${work_device}s1e   >/dev/null 2>&1 # softupdates

# restore /
echo "Restoring '/' filesystems..."
/sbin/mount /dev/${work_device}s1a /mnt
cd /mnt
/usr/bin/bunzip2 --stdout ${dist_dir}/root.dump.bz2 | /sbin/restore -rf -       >/dev/null 2>&1
# restore /usr
echo "Restoring '/usr' filesystems..."
/sbin/mount /dev/${work_device}s1d /mnt/usr
cd /mnt/usr
/usr/bin/bunzip2 --stdout ${dist_dir}/usr.dump.bz2 | /sbin/restore -rf -        >/dev/null 2>&1
# restore /var
echo "Restoring '/var' filesystems..."
/sbin/mount /dev/${work_device}s1e /mnt/var
cd /mnt/var
/usr/bin/bunzip2 --stdout ${dist_dir}/var.dump.bz2 | /sbin/restore -rf -        >/dev/null 2>&1
# restore /shares
echo "Restoring '/shares' filesystems..."
/sbin/mount /dev/${work_device}s1f /mnt/shares
cd /mnt/shares
/usr/bin/bunzip2 --stdout ${dist_dir}/shares.dump.bz2 | /sbin/restore -rf -     >/dev/null 2>&1

echo "All filesystems restored!"

# sync disks
sync
# end debug
#fi

# extract interface name (short; up)
for interface in `/sbin/ifconfig -l -u`
do
        # test interface name
        if [ ${interface} = "lo0" ]
        then
                # none
        else
                interface_name="${interface}"
        fi
done

# применяем введённые данные
# редактируем конфиги
echo "Applying new settings..."
for config in "etc/rc.conf" "etc/hosts" "usr/local/etc/exim/configure"
do
# server name
/usr/bin/sed -e "s/testsrv/${server_name}/g" /mnt/${config} \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/${config}
# server IP
/usr/bin/sed -e "s/172.31.0.10/${server_IP}/g" /mnt/${config} \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/${config}
# router IP $gateway_IP
/usr/bin/sed -e "s/172.31.0.1/${gateway_IP}/g" /mnt/${config} \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/${config}
done
# smb.conf
server_name_UPPER="`echo ${server_name} | /usr/bin/tr '[:lower:]' '[:upper:]'`"
/usr/bin/sed -e "s/TESTSRV/${server_name_UPPER}/g" /mnt/usr/local/etc/smb.conf \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/usr/local/etc/smb.conf
# Admin_testfil
/usr/bin/sed -e "s/admin_testfil/${user_login}/g" /mnt/usr/local/etc/smb.conf \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/usr/local/etc/smb.conf
# filial OU (in AD)
/usr/bin/sed -e "s/testfil/${filial_OU}/g" /mnt/usr/local/etc/exim/includes/filials_macros.conf \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/usr/local/etc/exim/includes/filials_macros.conf

# emai alias for admin
echo "" >> /mnt/etc/aliases
echo "#filial admin email" >> /mnt/etc/aliases
echo "${user_login}:    ${user_login}@my-domain-name.local" >> /mnt/etc/aliases
/usr/bin/sed -e "s/lissyara,dag/lissyara,dag,${user_login}/g" /mnt/etc/aliases \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/aliases

# settings for backup server
/usr/bin/sed -e "s/da0/${work_device}/g" /mnt/etc/fstab \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/fstab
if [ ${server_type} -eq 2 ]
then
        /usr/bin/sed -e "s/bce0/${interface_name}/g" /mnt/etc/rc.conf \
                > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/rc.conf
        /usr/bin/sed -e "s/dovecot_enable=\"YES\"//g" /mnt/etc/rc.conf \
                > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/rc.conf
        /usr/bin/sed -e "s/squid_enable=\"yes\"//g" /mnt/etc/rc.conf \
                > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/rc.conf
        /bin/cp ${dist_dir}/exim.conf /mnt/usr/local/etc/exim/configure
        /usr/bin/sed -e "s/clamav_clamd_enable=\"YES\"//g" /mnt/etc/rc.conf \
                > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/rc.conf
fi

sync

# debug - end skip restore
#fi

# new IP for jail
first_octet="`echo ${server_IP} | awk -F '.' '{print $1}'`"
second_octet="`echo ${server_IP} | awk -F '.' '{print $2}'`"
third_octet="`echo ${server_IP} | awk -F '.' '{print $3}'`"
fourth_octet="`echo ${server_IP} | awk -F '.' '{print $4}'`"
new_fourth_octet="`expr ${fourth_octet} - 1`"

alias_IP="${first_octet}.${second_octet}.${third_octet}.${new_fourth_octet}"

# alias - for jail
killall -9 dhclient >/dev/null 2>&1
sleep 1;
/sbin/ifconfig ${interface_name} inet ${server_IP} netmask 255.255.255.0
/sbin/ifconfig ${interface_name} alias ${alias_IP}
/sbin/route add default ${gateway_IP} >/dev/null 2>&1

# dev - for jail
/sbin/mount_devfs devfs /mnt/dev

# crating config for jail
#echo "# jails config
## Generic settings for JAILS
#jail_enable=\"YES\"
#jail_list=\"${server_name}\"
#jail_set_hostname_allow=\"YES\"
#jail_${server_name}_rootdir=\"/mnt\"
#jail_${server_name}_hostname=\"${server_name}\"
#jail_${server_name}_ip=\"${alias_IP}\"
#jail_${server_name}_procfs_enable=\"YES\"
#jail_${server_name}_devfs_enable=\"YES\"
#jail_${server_name}_flags=\"-l -U root\"

#" > /tmp/rc.conf.jail

# startting jails
#echo "starting jail for join in domain"
#/etc/rc.d/jail stop >/dev/null 2>&1
#/etc/rc.d/jail start >/dev/null 2>&1
#sleep 2;

# creating script for kinit
echo "#!/bin/sh
# killall services
#/usr/bin/killall -9 squid >/dev/null 2>&1
#/etc/rc.d/syslogd stop >/dev/null 2>&1
/bin/sleep 2
/usr/bin/kinit ${user_join_login}
" > /mnt/shares/tmp/kinit.sh
chmod 777 /mnt/shares/tmp/kinit.sh
# kerberos
echo "
Введите ВАШ доменный пароль для получения билета Kerberos:"
/usr/sbin/jail /mnt ${server_name} ${alias_IP} /shares/tmp/kinit.sh

# ifconfig down/up
#/sbin/ifconfig bce0 down
#sleep 1;
#ifconfig bce0 up
#sleep 1;

# creating script for net join
echo "#!/bin/sh
#/usr/local/etc/rc.d/samba restart >/dev/null 2>&1
sleep 1;
/usr/local/bin/net join -U ${user_join_login}
" > /mnt/shares/tmp/net_join.sh
chmod 777 /mnt/shares/tmp/net_join.sh
# join in domain
echo "
Введите ВАШ доменный пароль для ввода машины в домен:"
/usr/sbin/jail /mnt ${server_name} ${alias_IP} /shares/tmp/net_join.sh

# clear jail file
echo "# empty file" > /tmp/rc.conf.jail

echo "All done! Rebooting..."

# reboot
#/bin/sleep 5 && /sbin/shutdown -r now

exit;
Twitter Google Bookmarks Закладки Yandex БобрДобр.ru Memori.ru МоёМесто.ru

Похожие статьи:

  • None Found
Вы можете получать все комментарии по данной статье используя RSS 2.0 feed. Вы можете оставить комментарий, или trackback ссылку на ответ с своего сайта.
2 Комментариев
Оставить ответ

XHTML:Вы можете использовать данные теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Внимание!!!

В нашем блоге ссылки в комментариях индексируютя поисковиками, поэтому настоятельно просим Вас не СПАМИТЬ.

Пока что разрешаются ссылки только из поля "Ваш сайт", остальные ссылки будут удаляться, либо сообщения не будут публиковаться.