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;



