Сфер применения Linux может быть очень много. Особенно, когда арендовать VPS стало можно от $1 в месяц. Кроме стандартного использования под хостинг сайтов, его используют в качестве сервера для игр (CS:GO, Terraria, Minecraft), в качестве Proxy-сервера и VPN-сервера. Под майнинг криптовалют. Под резервное хранилище бэкапов. Под домашнюю торренто-качалку. А также для тестирования, разработки и просто различных экспериментов. Именно доступность VPS на базе Linux с огромным спектром возможного его применения привела к популяризации Linux. Но желающих использовать Linux значительно больше, чем людей, которые умеют его использовать. И часто именно слабые познания администрирования Linux останавливают людей от его использования. Ну или просто усложняют таким людям жизнь — им приходится часами ковыряться в мануалах, форумах и «статьях для новичков».

Да мне и самому надоело лазить по специализированным форумам, каждый раз, когда приходится сделать шаг влево или шаг вправо относительно того, что я уже научился делать. Именно поэтому, со временем, все типовые вещи я свёл в один скрипт с дружелюбным интерфейсом, который умеет делать всё сам. Начиналась всё с малого. Скрипт просто автоматизировал установку нужного мне софта. Но за полгода он превратился уже в весьма серьёзную утилиту весом 85 Кб, в которой более 2100 строк кода. Скрипт ранее нигде не выкладывался. Использовался только в личных целях мной и несколькими моими товарищами. Пришло время им поделиться с публикой. Уверен, многим людям он способен сэкономить кучу времени.

Чтобы понять, что он умеет, проще всего глянуть на заглавный скриншот:


Далее подробнее опишу, что и как он делает.

Информация о системе


Этот раздел в дружелюбной форме выводит информацию об этом сервере. Что за железо, какая ОС, какой IP-адрес. Причём, IP адрес он сначала пытается определить по интерфейсу, но т.к. бывают VPS без выделенного IP-адреса (за NAT), далее скрипт лезет в интернет и с помощью сторонних сайтов смотрит с какого IP пришли запросы и показывает реальный внешний IP-адрес (на это тратится пара секунд). Выглядит это информационное окно так:


Работа с ОС


В этом разделе собрано несколько как мелких утилит, типа смены пароля root, установки часового пояса, обновление ОС, добавление репозитория, установка популярных приложений (типа midinght commander), так и несколько более серьезных, на которых остановлюсь подробнее:

  • Антивирус. Да, на Линуксе не бывает вирусов. Но бывают бэкдоры, которые через сайт открывают доступ ко всем вашим файлам злоумышленникам. Через эти же бэкдоры спамеры потом могут делать спам-рассылки используя ваш сервер. У меня в своё время за это забанили VPS. Поэтому, я предусмотрел установку антивируса. Разбираться в нём не нужно. Сам всё ставит, обновляет. Далее, не разбираясь в синтаксисе антивируса, через скрипт можно проверить весь диск или конкретную папку (например, где хостятся сайты).

  • Firewall. Не все умеют настраивать правила Firewall (iptables). А в некоторых арендуемых VPS он преднастроен и включен, причём так, что устанавливаемые вами сервисы не будут доступны. И вам придётся копаться в настройках и открывать порты. А неправильная и необдуманная настройка firewall может вообще привести к тому, что вы после этого в принципе не сможете подключиться по SSH к своему серверу и вам придется либо переустанавливать ОС, либо как-то лезть на сервер через web-терминал, но эта функция есть не у всех хостеров. В случае использования моего скрипта такие проблемы исключены, а настройка Firewall происходит через «Помощник», где нужно просто ответить на простые вопросы.

  • Планировщик задач (cron). Бывает, что нужно периодически выполнять какие-то типовые действия: проверка на вирусы, очистка логов, выкладывание бэкапов и т.д. Многие знают, что в Linux есть планировщик, который может выполнять задания по расписанию, но не всё умеют им пользоваться. Мой скрипт позволяет установить, включить, выключить планировщик и добавить в него задание, выбрав интервал запуска.

Установка панели управления хостингом


Очень часто Linux используется именно для хостинга, но руками настраивать там все сервисы типа: Apache, Nginx, PHP, MySQL, почтовый демон и так далее — совсем непросто для новичков. Большинство предпочитает установить какую-либо панель управления. Но даже её нужно сначала как-то установить. В своём скрипте я собрал пять бесплатных панелей управления сайтом (Vesta CP, Webuzo, CWP, ZPanel, Ajenti) и платную ISPmanager (которая является, пожалуй, самой распространенной панелью в России). Про каждую панель есть небольшое описание, системные требования. Выбираем нужную панель, скрипт сам её скачает с официального сайта (свежую версию) и установит.

Работа с VPN


В последнее время многие заводят себе VPN для того, чтобы получить преимущества пользователей других географических зон. Например, обход запретов РосКомНадзора, использование каких-то внутренних американских или европейских сервисов и так далее. Многие для этого покупают готовые VPN-сервисы. Но значительно дешевле купить себе VPS в нужной стране и поднять свой собственный VPN. Вот только не все умеют его настраивать. С помощью этого скрипта вам нужно просто отвечать на вопросы и всё. Весь нужный софт установится сам, в firewall пропишутся нужные правила. Вы сможете просматривать, добавлять и удалять пользователей, которым разрешен доступ. Причём скрипт проанализирует какая у вас ОС и сделает всё, учитывая особенности конкретно этой ОС.

Работа с Proxy


Некоторым привычнее использовать прокси вместо VPN. Ну и это зачастую дешевле, потому что Прокси, в отличии от VPN, можно использовать на серверах, у которых нет своего выделенного IP-адреса (которые находятся за NAT), а такие сервера стоят в несколько раз дешевле (их можно приобрести за $2 в год). Поднимать свой прокси-сервер на Линукс — тоже не самая простая задача для новичков. Но этот скрипт всё сделает за вас. Причём там очень много настроек. «Помощник» при установке спросит на каком порту нам нужен Прокси (или же предложит стандартный), спросит нужна ли авторизация по логину/паролю (или пускать всех, кто знает адрес и порт). Скрипт даже учтёт потребности тех пользователей, кто любит загонять сторонний трафик в Прокси (через программы типа Proxifier) и настроит конфиг нужным образом. Ну и, естественно, сам внесёт все нужные правила в Firewall (iptables). Настройка прокси ещё никогда не была такой простой. Руками в конфиг лазить вообще не нужно.

Работа с файлами и программами


В этом разделе можно установить нужную программу (пакет) или удалить. Причём самое полезное там — это именно правильное удаление. Дело в том, что при установке какой-либо программы очень часто к ней устанавливается несколько сопутствующих пакетов, необходимых для её работы. И зачастую, размер этих дополнительных пакетов превышает размер собственно той программы, которую вы устанавливали. Но вот при удалении вашей программы удалится только сама программа, а все пакеты, которые были нужны для её (и только её) работы — останутся и продолжат занимать место. В моём скрипте я предусмотрел полное удаление программы — со всем дополнительным софтом, который ставился вместе с ней. В скрипте просто указываем название программы, дальше скрипт всё сделает сам.

Очистка системы


В случае активного использования сервера под хостинг, часто копится огромное количества логов доступа к сайтам. Объём всего этого мусора иногда может достигать гигабайт. Не все знают где и как это удалять. В этом разделе можно почистить эти логи. Удаляются логи Apache и Nginx, как целиком, так и конкретного пользователя. Кроме этого, из этого раздела можно удалить старые установочные пакеты, которые по умолчанию остаются на диске после установки софта и продолжают занимать место.



На этом, собственно, пока всё. В планах, конечно, много что ещё хочется добавить. Например, бенчмарк, для оценки производительности различных компонентов сервера. Расширить поддержку других ОС и так далее. По мере сил и времени, я собственно этим и занимаюсь. Но, уже сейчас, он выполняет довольно много функций, востребованных новичками и способен сильно упростить им жизнь.

Теперь собственно, очень важный вопрос. А на каких дистрибутивах Linux всё это работает? На всех версиях CentOS. А также, на всех прочих производных от Red Hat Enterprise Linux дистрибутивах (например, Scientific Linux). Почему именно RHEL? Ну скрипт я писал для себя, а мне CentOS ближе. Ну и если говорить о целевой аудитории данного скрипта (новички), то им, как правило, без разницы на каком дистрибутиве работать. Ведь обычно они одинаково плохо знают любой из них. А RHEL весьма неплох, стабилен, нетребователен к ресурсам, ну и, самое главное, присутствует почти у каждого хостера VPS. Версию CentOS при этом можно выбрать любую (5, 6, 7), как и разрядность. Для всех действий скрипт анализирует какая версия дистрибутива и учитывает специфику именно этой версии. Я, обычно, выбираю дистрибутив CentOS 6.x (можно Minimal) с разрядностью 64 бита.

Ну и самое главное. Как собственно обзавестись этим скриптом? Ниже прилагаю полный листинг кода скрипта со всеми потрохами и подробными комментариями (для тех, кто хочет что-то своё дописать):

Исходный код скрипта
#!/bin/bash
ver="v1.8.1"
title="Breeze Easy Shell"
title_full="$title $ver"
#-----------------
#типовые функции
#-----------------

#функция, которая запрашивает только один символ
myread()
{
temp=""
while [ -z "$temp" ] #защита от пустых значений
do
read -n 1 temp
done
eval $1=$temp
echo
}

#функция, которая запрашивает только да или нет. А ещё можно попробовать использовать как while [ -z ${!$1} ]
myread_yn()
{
temp=""
while [[ "$temp" != "y" && "$temp" != "Y" && "$temp" != "n" && "$temp" != "N" ]] #запрашиваем значение, пока не будет "y" или "n"
do
echo -n "y/n: "
read -n 1 temp
echo
done
eval $1=$temp
}

#функция, которая запрашивает только цифру
myread_dig()
{
temp=""
counter=0
while [[ "$temp" != "0" && "$temp" != "1" && "$temp" != "2" && "$temp" != "3" && "$temp" != "4" && "$temp" != "5" && "$temp" != "6" && "$temp" != "7" && "$temp" != "8" && "$temp" != "9" ]] #запрашиваем значение, пока не будет цифра
do
if [ $counter -ne 0 ]; then echo -n "Неправильный выбор. Ведите цифру: "; fi
let "counter=$counter+1"
read -n 1 temp
echo
done
eval $1=$temp
}

#функция установки с проверкой не установлен ли уже пакет
myinstall()
{
if [ -z `rpm -qa $1` ]; then
	yum -y install $1
else
	echo "Пакет $1 уже установлен"
	br
fi
}

title()
{
clear
echo "$title"
}

menu()
{
clear
echo "$menu"
echo "Выберите пункт меню:"
}

wait()
{
echo "Нажмите любую клавишу, чтобы продолжить..."
read -s -n 1
}

br()
{
echo ""
}

updatescript()
{
wget $updpath/$filename -r -N -nd
chmod 777 $filename
}

undone()
{
echo "Данная функция в стадии разработки или отключена." #функция ставится в нереализованные пункты№№№№№№№№№№ меню в качестве заглушки
}

settimezone()
{
/bin/cp /usr/share/zoneinfo/$1/$2  /etc/localtime
echo "Новый часовой пояс установлен. Текущее время: $(date +%H:%M)."
wait
}

repo4()
{
echo "Будут добавлены репозитории для CentOS 4 x64"
wait
echo "Устанавливаем репозитории..."
wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el4.rf.x86_64.rpm
rpm -K rpmforge-release-0.5.3-1.el4.rf.x86_64.rpm
rpm -i rpmforge-release-0.5.3-1.el4.rf.x86_64.rpm
}

repo5()
{
echo "Будут добавлены репозитории EPEL, REMI, RPMForge и ELRepo для CentOS 5 x64"
wait
echo "Устанавливаем репозитории..."
rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL
rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-5.rpm
wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.3-1.el5.rf.x86_64.rpm
rpm -K rpmforge-release-0.5.3-1.el5.rf.*.rpm
rpm -i rpmforge-release-0.5.3-1.el5.rf.*.rpm
rpm -Uvh http://www.elrepo.org/elrepo-release-5-5.el5.elrepo.noarch.rpm
br
echo "Репозитории были добавлены."
wait
}

repo6()
{
echo "Будут добавлены репозитории EPEL, REMI, RPMForge и ELRepo для CentOS 6 x64"
wait
echo "Устанавливаем репозитории..."
rpm --import https://fedoraproject.org/static/0608B895.txt
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
br
echo "Репозитории были добавлены."
wait
}

repo7()
{
echo "Будут добавлены репозитории EPEL, REMI, RPMForge, ELRepo, atrpms для CentOS 7 x64"
wait
echo "Устанавливаем репозитории..."
rpm --import https://fedoraproject.org/static/0608B895.txt
rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
rpm --import http://packages.atrpms.net/RPM-GPG-KEY.atrpms
rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
rpm -ivh http://atrpms.net/ht/httptunnel-4.0.0-3_pre1.el7.centos.x86_64.rpm
br
echo "Репозитории были добавлены."
wait
}

iptables_save()
{
#проверка CentOS 7
if [ $osver1 -eq 7 ]; then 
	myinstall iptables-services | tee > null
fi
service iptables save
}

openport()
{
chain=$(echo $1 | tr [:lower:] [:upper:])
if [ "$chain" == "IN" ]; then chain="INPUT"; t1="dport"
else
	if [ "$chain" == "OUT" ]; then chain="OUTPUT";  t1="sport"
	else
		echo "неправильно указано направление правила для открытия порта"
	wait
	fi
fi
iptables -I $chain -p $2 --$t1 $3 -j ACCEPT #возможно в будущем предусмотрю выбор ключа -I или -A
iptables_save
}

webuzo_install()
{
openport in tcp 2004
openport in tcp 2002
wget http://files.webuzo.com/install.sh -r -N -nd
sh install.sh
rm -f install.sh
}

cwp_install()
{
openport in tcp 2030
openport in tcp 2031
wget http://centos-webpanel.com/cwp-latest
sh cwp-latest
rm -f cwp-latest
}

zpanel_install()
{
wget http://evtikhov.ru/zpanel.sh
sh zpanel.sh
rm -f zpanel.sh
}

ajenti_install()
{
openport in tcp 8000
rpm -i http://repo.ajenti.org/ajenti-repo-1.0-1.noarch.rpm 
echo "Устанавливаем Ajenti"
yum -y install ajenti
echo "Устанавливаем Ajenti V"
yum -y install ajenti-v ajenti-v-nginx ajenti-v-mysql ajenti-v-php-fpm php-mysql
echo "Отключаем SSL для админки"
sed -i -e 's/"enable": true/"enable": false/' /etc/ajenti/config.json
whatismyipext
echo "Выставляем наш внешний IP в конфиг"
sed -i -e "s/\"host\": \"0.0.0.0\"/\"host\": \"$ipext\"/" /etc/ajenti/config.json
echo "Устанавливаем русский язык по умолчанию"
sed -i -e 's/    "bind": {/    "language": "ru_RU",\n    "bind": {/' /etc/ajenti/config.json
echo "Перезапускаем Ajenti"
service ajenti restart
br
echo "Панель управления Ajenti и Ajenti V были установлены. Теперь можете управлять сервером из браузера."
echo "Адрес: http://$ipext:8000"
echo "Логин: root"
echo "Пароль: admin"
br
wait
}

mtu_change()
{
ifconfig $1 mtu $2
wait
}
#Функция проверки установленного приложения, exist возвращает true если установлена и false, если нет.
installed()
{
exist=`whereis $1 | awk {'print $2'}` #вариант быстрый, но не всегда эффективный
if [ -z $exist ]
	then #будем использовать оба варианта
	exist=`rpm -qa $1` #вариант медленнее, но эффективнее
fi

if [ -n "$exist" ]
then
exist=true
else
exist=false
fi
}

#функция которая открывает на редактирование файл в приоритете: mc, nano, vi
edit()
{
installed mc
if [ $exist == true ]; then mcedit  $1
  else
  installed nano
  if [ $exist == true ]; then nano  $1
    else
    vi $1
  fi
fi
}

#функция удаления.
uninstall()
{
if [ $osver1 -eq 5 ]; then yum erase $1 $2 $3 $4 $5;
else
myinstall yum-remove-with-leaves | tee > null
yum --remove-leaves remove $1 $2 $3 $4 $5
fi
}

#Определяем активный внешний интерфейс
whatismyiface()
{
if [ $osver1 -eq 7 ]; then
  installed ifconfig
  if [ $exist == false ]; then yum -y install net-tools | tee > null; fi
fi
if [ -n "$(ifconfig | grep eth0)" ]; then iface="eth0"
else
    if [ -n "$(ifconfig | grep venet0:0)" ]; then iface=venet0:0; fi
fi
}

#определяем ip на внешнем интерфейсе
whatismyip()
{
whatismyiface
case "$osver1" in
4|5|6)
ip=`ifconfig $iface | grep 'inet addr' | awk {'print $2'} | sed s/.*://`
;;
7)
installed ifconfig
if [ $exist == false ]; then yum -y install net-tools | tee > null; fi
ip=`ifconfig $iface | grep 'inet' | sed q | awk {'print $2'}`
;;
*)
echo "Версия ОС неизвестна. Выходим."
wait
;;
esac
}

#определяем внешний IP через запрос
whatismyipext()
{
installed wget
if [ $exist == false ]; then myinstall wget; fi
ipext=`wget --no-check-certificate -qO- https://2ip.ru/index.php | grep "Ваш IP адрес:" | sed s/.*button\"\>// | sed s_"<"_" "_ | awk {'print $1'}`
}

whatismyip_full()
{
whatismyip
echo "Ваш внешний IP: $ip?"
myread_yn ans
case "$ans" in
  y|Y)
  #ничего не делаем, выходим из case
  ;;
  n|N|т|Т)
  echo "Если был неправильно определен IP, вы можете произвести настройку в ручном режиме."
  echo "Для этого Вам нужно определить как называется Ваш сетевой интерфейс, через который Вы выходите в интернет."
  echo "Если хотите вывести на экран все сетевые интерфейсы, чтобы определить какой из них внешний - нажмите 1."
  myread ans
  if [ "$ans" == "1" ]; then ifconfig; br; wait; fi
  br
  echo "Укажите название интерфейса, который имеет внешний IP (обычно eth0, venet0 или venet0:0)"
  read int
  ip=`ifconfig $int | grep 'inet addr' | awk {'print $2'} | sed s/.*://`
  #centOS7
  if [ $osver1 -eq 7 ]; then ip=`ifconfig $int | grep 'inet' | sed q | awk {'print $2'}`; fi
  echo "Ваш внешний IP: $ip?"
  myread_yn ans
  case "$ans" in
    y|Y)
    ;;
    n|N|т|Т)
    echo "Тогда введите IP вручную:"
    read ip
    ;;
    *)
    echo "Неправильный ответ. Выходим."
    wait
    sh $0
    exit 0
    ;;
  esac
  ;;
  *)
  echo "Неправильный ответ. Выходим."
  wait
  sh $0
  exit 0
  ;;
esac
}

showinfo()
{
echo '-----------------------¬'
echo '¦ Информация о системе ¦'
echo 'L-----------------------'
echo "CPU: $cpu_cores x $cpu_clock MHz ($cpu_model)"
if [ $swap_mb -eq 0 ]; then echo "RAM: $mem_mb Mb"; else
echo "RAM: $mem_mb Mb (Плюс swap $swap_mb Mb)"; fi
#Определяем диск (делаем это при каждом выводе, т.к. данные меняются)
hdd_total=`df | awk '(NR == 2)' | awk '{print $2}'`
let "hdd_total_mb=$hdd_total / 1024"
hdd_free=`df | awk '(NR == 2)' | awk '{print $4}'`
let "hdd_free_mb=$hdd_free / 1024"
echo "HDD: $hdd_total_mb Mb (свободно $hdd_free_mb Mb)"
echo "ОС: $osfamily $osver2"
echo "Разрядность ОС: $arc bit"
echo "Версия ядра Linux: $kern"
echo "Ваш IP на интерфейсе $iface: $ip"
echo "Ваш внешний IP определяется как: $ipext"
}

about()
{
echo "Данную утилиту написал Павел Евтихов (aka Brizovsky).
г. Екатеринбург, Россия.
2016 год.
"
}
changelog()
{
wget $updpath/changelog.txt -r -N -nd
cat changelog.txt
br
}

log()
{
changelog
}

#-----------------
#задаем переменные
#-----------------
#Задаём переменную с нужным количеством пробелов, чтобы меню не разъезжалось от смены версии
title_full_len=${#title_full}
title_len=${#title}
space=""
      let "space_len=43-$title_full_len" 
      while [ "${#space}" -le $space_len ]
      do
      space=$space" "
      done

space2=""
      let "space2_len=30-$title_len" 
      while [ "${#space2}" -le $space2_len ]
      do
      space2=$space2" "
      done

filename='breeze.sh'
updpath='http://evtikhov.ru/'

#определяем сколько RAM
mem_total=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`
swap_total=`cat /proc/meminfo | grep SwapTotal | awk '{print $2}'`
let "mem_mb=$mem_total / 1024"
let "swap_mb=$swap_total / 1024"

#Определяем данные процессора
cpu_clock=`cat /proc/cpuinfo | grep "cpu MHz" | awk {'print $4'} | sed q`
let "cpu_clock=$(printf %.0f $cpu_clock)"
#cpu_cores=`cat /proc/cpuinfo | grep "cpu cores" | awk {'print $4'}`
cpu_cores=`grep -o "processor" <<< "$(cat /proc/cpuinfo)" | wc -l`
cpu_model=`cat /proc/cpuinfo | grep "model name" | sed q | sed -e "s/model name//" | sed -e "s/://" | sed -e 's/^[ \t]*//' | sed -e "s/(tm)//g" | sed -e "s/(C)//g" | sed -e "s/(R)//g"`
#уберём двойные пробелы:
cpu_model=`echo $cpu_model | sed -e "s/  / /g" | sed -e "s/  / /g" | sed -e "s/  / /g" | sed -e "s/  / /g" | sed -e "s/  / /g" | sed -e "s/  / /g" | sed -e "s/  / /g" | sed -e "s/  / /g" | sed -e "s/  / /g" | sed -e "s/  / /g"`

#Определяем ОС
if [ "$(cat /etc/redhat-release | awk {'print $2'})" == "release" ]
then
  osfamily=$(cat /etc/redhat-release | awk {'print $1'})
  osver2=$(cat /etc/redhat-release | awk {'print $3'})
else
  if [ "$(cat /etc/redhat-release | awk {'print $3'})" == "release" ]
    then
    osfamily=$(cat /etc/redhat-release | awk {'print $1'})" "$(cat /etc/redhat-release | awk {'print $2'})
    osver2=$(cat /etc/redhat-release | awk {'print $4'})
  else osver2=0
  fi
fi
osver1=`echo $osver2 | cut -c 1` #берём только первый символ от версии для определения поколения
if [ "$osfamily" == "CentOS Linux" ]; then osfamily="CentOS"; fi

#Определяем разрядность ОС
arc=`arch`
if [ "$arc" == "x86_64" ]; then arc=64 #В теории возможно обозначение "IA-64" и "AMD64", но я не встречал
else arc=32 #Чтобы не перебирать все возможные IA-32, x86, i686, i586 и т.д.
fi 

#определяем версию ядра Linux
kern=`uname -r | sed -e "s/-/ /" | awk {'print $1'}`

menu="
----------------------------------------------¬
¦ $title $ver$space¦
+---T-----------------------------------------+
¦ 1 ¦ Информация о системе                    ¦
+---+-----------------------------------------+
¦ 2 ¦ Работа с ОС                             ¦
+---+-----------------------------------------+
¦ 3 ¦ Установить панель управления хостингом  ¦
+---+-----------------------------------------+
¦ 4 ¦ Установка и настройка VPN-сервера       ¦
+---+-----------------------------------------+
¦ 5 ¦ Работа с Proxy                          ¦
+---+-----------------------------------------+
¦ 6 ¦ Работа с файлами и программами          ¦
+---+-----------------------------------------+
¦ 7 ¦ Очистка системы                         ¦
+---+-----------------------------------------+
¦ 8 ¦ Терминал                                ¦
+---+-----------------------------------------+
¦ 9 ¦ Обновить $title$space2¦
+---+-----------------------------------------+
¦ 0 ¦ Выход                                   ¦
L---+------------------------------------------
"
menu2="
? Работа с ОС:
¦
¦ ----T--------------------------------------¬
+-+ 1 ¦ Добавить внешние репозитории         ¦
¦ +---+--------------------------------------+
+-+ 2 ¦ Обновить ОС                          ¦
¦ +---+--------------------------------------+
+-+ 3 ¦ Установить популярные приложения     ¦
¦ +---+--------------------------------------+
+-+ 4 ¦ Антивирус                            ¦
¦ +---+--------------------------------------+
+-+ 5 ¦ Firewall (iptables)                  ¦
¦ +---+--------------------------------------+
+-+ 6 ¦ Планировщик задач (cron)             ¦
¦ +---+--------------------------------------+
+-+ 7 ¦ Установить часовой пояс              ¦
¦ +---+--------------------------------------+
+-+ 8 ¦ Сменить пароль текущего пользователя ¦
¦ +---+--------------------------------------+
L-+ 0 ¦ Выйти на уровень вверх               ¦
  L---+---------------------------------------
"
menu24="
? Работа с ОС:
¦
L-? Антивирус:
  ¦
  ¦ ----T---------------------------¬
  +-+ 1 ¦ Установить Антивирус      ¦
  ¦ +---+---------------------------+
  +-+ 2 ¦ Обновить антивирус        ¦
  ¦ +---+---------------------------+
  +-+ 3 ¦ Проверить папку на вирусы ¦
  ¦ +---+---------------------------+
  +-+ 4 ¦ Удалить антивирус         ¦
  ¦ +---+---------------------------+
  L-+ 0 ¦ Выйти на уровень вверх    ¦
    L---+----------------------------
"
menu25="
? Работа с ОС:
¦
L-? Firewall (iptables):
  ¦
  ¦ ----T-----------------------------------------------¬
  +-+ 1 ¦ Включить firewall (помощник настройки)        ¦
  ¦ +---+-----------------------------------------------+
  +-+ 2 ¦ Отключить firewall (рарешить все подключения) ¦
  ¦ +---+-----------------------------------------------+
  +-+ 3 ¦ Временно выключить firewall                   ¦
  ¦ +---+-----------------------------------------------+
  +-+ 4 ¦ Перезапустить firewall                        ¦
  ¦ +---+-----------------------------------------------+
  +-+ 5 ¦ Открыть порт в iptables                       ¦
  ¦ +---+-----------------------------------------------+
  +-+ 6 ¦ Посмотреть текущую политику firewall          ¦
  ¦ +---+-----------------------------------------------+
  +-+ 7 ¦ Сохранить текущие правила firewall            ¦
  ¦ +---+-----------------------------------------------+
  L-+ 0 ¦ Выйти на уровень вверх                        ¦
    L---+------------------------------------------------
"
menu26="
? Работа с ОС:
¦
L-? Планировщик задач (cron):
  ¦
  ¦ ----T-----------------------------------------¬
  +-+ 1 ¦ Проверить запущен ли планировщик (cron) ¦
  ¦ +---+-----------------------------------------+
  +-+ 2 ¦ Перезапустить cron                      ¦
  ¦ +---+-----------------------------------------+
  +-+ 3 ¦ Добавить задание в планировщик (cron)   ¦
  ¦ +---+-----------------------------------------+
  +-+ 4 ¦ Открыть файл с заданиями cron           ¦
  ¦ +---+-----------------------------------------+
  +-+ 5 ¦ Выключить планировщик (cron)            ¦
  ¦ +---+-----------------------------------------+
  L-+ 0 ¦ Выйти на уровень вверх                  ¦
    L---+------------------------------------------
"
menu27="
? Работа с ОС:
¦
L-? Установить часовой пояс:
  ¦
  ¦ ----T------------------------¬
  +-+ 1 ¦ Калининград            ¦
  ¦ +---+------------------------+
  +-+ 2 ¦ Москва                 ¦
  ¦ +---+------------------------+
  +-+ 3 ¦ Самара                 ¦
  ¦ +---+------------------------+
  +-+ 4 ¦ Екатеринбург           ¦
  ¦ +---+------------------------+
  +-+ 5 ¦ Новосибирск            ¦
  ¦ +---+------------------------+
  +-+ 6 ¦ Красноярск             ¦
  ¦ +---+------------------------+
  +-+ 7 ¦ Иркутск                ¦
  ¦ +---+------------------------+
  +-+ 8 ¦ Владивосток            ¦
  ¦ +---+------------------------+
  +-+ 9 ¦ Камчатка               ¦
  ¦ +---+------------------------+
  L-+ 0 ¦ Выйти на уровень вверх ¦
    L---+-------------------------
"
menu3="
? Установить панель управления хостингом:
¦
¦ ----T------------------------¬
+-+ 1 ¦ ISPmanager 4           ¦
¦ +---+------------------------+
+-+ 2 ¦ ISPmanager 5           ¦
¦ +---+------------------------+
+-+ 3 ¦ Vesta CP               ¦
¦ +---+------------------------+
+-+ 4 ¦ Webuzo                 ¦
¦ +---+------------------------+
+-+ 5 ¦ CentOS Web Panel (CWP) ¦
¦ +---+------------------------+
+-+ 6 ¦ ZPanel CP              ¦
¦ +---+------------------------+
+-+ 7 ¦ Ajenti                 ¦
¦ +---+------------------------+
L-+ 0 ¦ Выйти на уровень вверх ¦
  L---+-------------------------
"
menu4="
? Установка и настройка VPN-сервера:
¦
¦ ----T------------------------------------------------¬
+-+ 1 ¦ Установить VPN-сервер (pptpd)                  ¦
¦ +---+------------------------------------------------+
+-+ 2 ¦ Добавить пользователей VPN                     ¦
¦ +---+------------------------------------------------+
+-+ 3 ¦ Открыть файл с логинами/паролями пользователей ¦
¦ +---+------------------------------------------------+
+-+ 4 ¦ Добавить правила для работы VPN в IPTables     ¦
¦ +---+------------------------------------------------+
+-+ 5 ¦ Удалить VPN-сервер                             ¦
¦ +---+------------------------------------------------+
L-+ 0 ¦ Выйти на уровень вверх                         ¦
  L---+-------------------------------------------------
"
menu5="
? Работа с Proxy:
¦
¦ ----T------------------------------------------------¬
+-+ 1 ¦ Установить Proxy-сервер (на базе Squid)        ¦
¦ +---+------------------------------------------------+
+-+ 2 ¦ Удалить Proxy (Squid)                          ¦
¦ +---+------------------------------------------------+
+-+ 3 ¦ Поменять MTU для интерфейса                    ¦
¦ +---+------------------------------------------------+
+-+ 4 ¦ Открыть файл настроек Squid                    ¦
¦ +---+------------------------------------------------+
+-+ 5 ¦ Добавить пользователя Proxy                    ¦
¦ +---+------------------------------------------------+
+-+ 6 ¦ Открыть файл с логинами/паролями пользователей ¦
¦ +---+------------------------------------------------+
+-+ 7 ¦ Перезапустить сервис Proxy (Squid)             ¦
¦ +---+------------------------------------------------+
L-+ 0 ¦ Выйти на уровень вверх                         ¦
  L---+-------------------------------------------------
"
menu6="
? Работа с файлами и программами:
¦
¦ ----T-----------------------------------------------------¬
+-+ 1 ¦ Установить какую-либо программу                     ¦
¦ +---+-----------------------------------------------------+
+-+ 2 ¦ Удалить какую-либо программу                        ¦
¦ +---+-----------------------------------------------------+
+-+ 3 ¦ Удалить какую-либо программу со всеми зависимостями ¦
¦ +---+-----------------------------------------------------+
+-+ 4 ¦ Посмотреть сколько свободного места на диске        ¦
¦ +---+-----------------------------------------------------+
L-+ 0 ¦ Выйти на уровень вверх                              ¦
  L---+------------------------------------------------------
"
menu7="
? Очистка системы:
¦
¦ ----T----------------------------------------------¬
+-+ 1 ¦ Удалить старые установочные пакеты (кэш yum) ¦
¦ +---+----------------------------------------------+
+-+ 2 ¦ Удалить логи Apache, Nginx                   ¦
¦ +---+----------------------------------------------+
+-+ 3 ¦ Удалить логи Apache конкретного пользователя ¦
¦ +---+----------------------------------------------+
+-+ 4 ¦ Посмотреть сколько свободного места на диске ¦
¦ +---+----------------------------------------------+
L-+ 0 ¦ Выйти на уровень вверх                       ¦
  L---+-----------------------------------------------
"

#-----------------
#Интерфейс
#-----------------
repeat=true
chosen=0
chosen2=0
while [ "$repeat" = "true" ] #выводим меню, пока не надо выйти
do

#пошёл вывод
if [ $chosen -eq 0 ]; then #выводим меню, только если ещё никуда не заходили
menu
myread_dig pick
else
pick=$chosen
fi

case "$pick" in
1) #Информация о системе
clear
showinfo
br
echo "Вычисляем Ваш IP на интерфейсе..."
whatismyip
clear
showinfo
br
echo "Вычисляем Ваш внешний IP..."
whatismyipext
clear
showinfo
br
wait
;;
2) #Работа с ОС
chosen=2
clear
if [ $chosen2 -eq 0 ]; then #выводим меню, только если ещё никуда не заходили
echo "$title"
echo "$menu2"
myread_dig pick
else
pick=$chosen2
fi
    case "$pick" in
    1) #Добавить внешние репозитории
      case "$osver1" in
        4)
        repo4
        ;;
        5)
        repo5
        ;;
        6)
        repo6
        ;;
        7)
        repo7
        ;;
        0)
        echo "Мы не смогли определить версию Вашей ОС, но Вы можете выбрать её сами на свой страх и риск:"
        echo "5) CentOS 5.x x64 (или другой дистрибутив на базе RHEL 5)"
        echo "6) CentOS 6.x x64 (или другой дистрибутив на базе RHEL 6)"
        echo "7) CentOS 7.x x64 (или другой дистрибутив на базе RHEL 7)"
        echo "0) Любая другая ОС"
        myread_dig osver_user
        case "$osver_user" in
          5)
          repo5
          ;;
          6)
          repo6
          ;;
          7)
          repo7
          ;;
          0)
          echo "Никакие другие ОС пока не поддерживаются. Но планируется расширение поддержки"
          wait
          ;;
        esac
        ;;
        *) #по идее мы НИКОГДА не должны попасть сюда, исходя из того, как строится проверка
        echo "Произошла непредвиденная ошибка при определении версии CentOS. Выходим."
        exit 0
        ;;
      esac   
    ;;
    2) #Обновить ОС
    echo "Начинаем обновление ОС..."
    yum update -y
    echo "ОС была успешно обновлена."
    wait    
    ;;
    3) #Установить популярные приложения
    echo "Сечас будут установлены следующие программы:"
    echo "mc - Midnigh Commander (файловый менеджер)"
    echo "htop (более продвинутый мониторинг ресурсов)"
    echo "nano (простейший текстовый редактор)"
    if [ $osver1 -ne 5 ]; then echo "аддон для yum, который позволяет удалять программы со всеми зависимостями"; fi #Не для CentOS 5
    if [ $osver1 -eq 7 ]; then echo "net-tools (чтобы вернуть команду ifconfig)"; fi #Только для CentOS 7
    br
    wait
    echo "Начинаем установку программ..."
    yum -y install mc
    yum -y install htop
    yum -y install nano
    if [ $osver1 -ne 5 ]; then yum -y install yum-remove-with-leaves; fi #Не для CentOS 5
    if [ $osver1 -eq 7 ]; then yum -y install net-tools; fi #Только для CentOS 7
    br
    echo "Программы были установлены."
    wait    
    ;;
    4) #Антивирус
    chosen2=4
    clear
    echo "$title"
    echo "$menu24"
    myread_dig pick
    case "$pick" in
      1) #Установить Антивирус
      echo "сейчас будет установлен антивирус ClamAV."
      wait
      yum -y install clamav clamd
      br
      echo "Антивирус был установлен. Сейчас обновим антивирусные базы"
      br
      freshclam
      br
      echo "Базы были обновлены."
      br
      echo "Сейчас мы попробуем запустить этот сервис (демон)."
      chkconfig --levels 235 clamd on
      service clamd restart
      br
      echo "Всё готово!"
      wait
      ;;
      2) #Обновить антивирус
      installed clamscan
      if [ $exist == true ]; then
        freshclam
        br
        wait
      else
        echo "У вас не установлен антивирус."
      wait
      fi
      ;;
      3) #Проверить папку на вирусы
      installed clamscan
      if [ $exist == true ]; then
        echo 'Укажите папку, которую нужно просканировать (введите "/", если весь сервер):'
        read scandir
        echo "Нужно ли сохранить лог сканирования в файл?"
        myread_yn avlog
        case "$avlog" in
         y|Y)
           echo 'Укажите путь для сохранения лога сканирования (начиная с "/")'
           read avlogdir
           echo "Сканируем..."
           br
           clamscan $scandir -r -i --log=$avlogdir
         ;;
         n|N|т|Т)
         echo "Сканируем..."
         br
         clamscan $scandir -r
         ;;
         *)
         echo "Неправильный выбор"
         wait
         ;;
        esac
      br
      wait
      else
        echo "У вас не установлен антивирус."
        wait
      fi
      ;;
      4) #Удалить антивирус
      uninstall clamav*
      br
      wait
      ;;
      0)
      chosen2=0
      ;;
    esac
    ;;
    5) #Firewall (iptables)
    chosen2=5
    clear
    echo "$title"
    echo "$menu25"
    myread_dig pick
    case "$pick" in
      1) #Включить firewall (помощник настройки)
      clear
      echo "Сейчас будут удалены все правила iptables (если они были), установлен запрет"
      echo "на обработку всех входящих и исходящих пакетов, кроме внутреннего обмена"
      echo "пакетами (localhost), SSH-подключения (22 порт) и всех связанных пакетов"
      echo "(состояние RELATED и ESTABLISHED). А далее вам будет предложен вариант открыть"
      echo "самые распространенные порты (с вашего разрешения). Продолжить?"
      myread_yn ans
      case "$ans" in
        y|Y)
        echo "Начинаем настройку iptables"
		#Проверка на CentOS 7
        if [ $osver1 -eq 7 ]; then 
        systemctl stop firewalld
		systemctl mask firewalld
		myinstall iptables-services | tee > null
		systemctl enable iptables
        fi
        iptables -F
        iptables -X
        iptables -A INPUT -i lo -j ACCEPT
        iptables -A OUTPUT -o lo -j ACCEPT
        iptables -A INPUT -p tcp --dport 22 -j ACCEPT
        iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
        iptables -P INPUT DROP
        iptables -P OUTPUT DROP
        iptables -P FORWARD DROP
        iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
        iptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
        br
        echo "Готово. Хотите, чтобы этот компьютер пинговался с других компьютеров?"
        myread_yn ans
        case "$ans" in
          y|Y)
          iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
          iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
          iptables -A OUTPUT -p icmp -j ACCEPT
          ;;
        esac
        br
        echo "Часто люди на серверах открывают следующие порты:"
        echo "web: 80, 443"
        echo "ftp: 21"
        echo "ntp: 123 (для синхронизации часов)"
        echo "dns: 54"
        echo "Хотите открыть их сейчас?"
        myread_yn ans
        case "$ans" in
          y|Y)
          iptables -A INPUT -p tcp --dport 21 -j ACCEPT
          iptables -A OUTPUT -p tcp --dport 21 -j ACCEPT
          iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
          iptables -A INPUT -p tcp --dport 80 -j ACCEPT
          iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
          iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
          iptables -A INPUT -p tcp --dport 443 -j ACCEPT
          iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
          iptables -A OUTPUT -p tcp --sport 443 -j ACCEPT
          iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
          iptables -A OUTPUT -p udp --dport 123 -j ACCEPT
          ;;
        esac
        br
        echo "Хотите открыть порт 3128 для Proxy?"
        myread_yn ans
        case "$ans" in
          y|Y)
          iptables -A INPUT -p tcp --dport 3128 -j ACCEPT
          ;;
        esac
        br
        echo "Хотите открыть порты для VPN-сервера (PPTP)?"
        myread_yn ans
        case "$ans" in
          y|Y)
          whatismyip_full
          iptables -A INPUT -p 47 -j ACCEPT
          iptables -A OUTPUT -p 47 -j ACCEPT
          iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
          iptables -A OUTPUT -p tcp --sport 1723 -j ACCEPT
          iptables -t nat -I POSTROUTING -j SNAT --to $ip
          iptables -A FORWARD -s 10.1.0.0/24 -j ACCEPT
          iptables -A FORWARD -d 10.1.0.0/24 -j ACCEPT
          ;;
        esac
        iptables_save
        br
        echo "Firewall был настроен. Остальные порты вы можете открыть самостоятельно,"
        echo 'воспользовавшись разделом "Открыть порт в iptables".'
        wait
        ;;
      esac
      ;;
      2) #Выключить firewall (рарешить все подключения)
	  echo "Сейчас будут удалены все правила iptables, после чего будут разрешены все подключения. Продолжить?"
      myread_yn ans
      case "$ans" in
        y|Y)
        iptables -F
        iptables -X
        iptables -P INPUT ACCEPT
        iptables -P FORWARD ACCEPT
        iptables -P OUTPUT ACCEPT
        ;;
      esac
      iptables_save
      br
      echo "Готово. Iptables продолжает работать, но в нём разрешены все подключения."
      wait
      ;;
      3) #Временно выключить firewall
      iptables -F
      iptables -X
      iptables -P INPUT ACCEPT
      iptables -P FORWARD ACCEPT
      iptables -P OUTPUT ACCEPT
      br
      echo "Готово. Были временно сброшены все правила для iptables. Сейчас проходят все"
      echo "подключения. После перезагрузки сервера или перезапуска iptables всё будет"
      echo "как прежде (применятся все правила, которые были до этого)."
      br
      wait
      ;;
      4) #Перезапустить firewall
      if [ $osver1 -eq 7 ]; then 
	  myinstall iptables-services | tee > null
      fi
      service iptables restart
      br
      echo "Готово. "
      wait
      ;;
      5) #Открыть порт в iptables
      echo "Укажите в какую сторону вы хотите открыть порт:"
      echo "1) Входящие соединения (чтобы к этому серверу можно было подключиться по заданному порту)"
      echo "2) Исходящие соединения (чтобы этот сервер мог подключиться к другим компьютерам по заданному порту)"
      myread_dig taffic_type
      case "$taffic_type" in
      1)
      taffic_type=in
      ;;
      2)
      taffic_type=out
      ;;
      *)
      echo "Неправильный выбор. Аварийный выход."
      wait
      exit
      ;;
      esac
      br
      echo "Укажите какой порт вы хотите открыть:"
      read port
      br
      echo "Выберите протокол, по которому его нужно открыть:"
      echo "1) TCP"
      echo "2) UDP"
      echo "3) TCP и UDP"
      myread_dig protocol
      case "$protocol" in
		1)
		openport $taffic_type tcp $port
		;;
		2)
		openport $taffic_type udp $port
		;;
		3)
		openport $taffic_type tcp $port
		openport $taffic_type udp $port
		;;
		*)
		echo "Неправильный выбор."
		;;
      esac
      br
      echo "Готово."
      wait
      ;;
      6) #Посмотреть текущую политику firewall
      iptables -nvL
      br
      wait
      ;;
      7) #Сохранить текущие правила firewall
      iptables_save
      br
      echo "Готово."
      wait
      ;;
      0)
      chosen2=0
      ;;
    esac
    ;;
    6) #Планировщик задач (cron)
    chosen2=6
    clear
    echo "$title"
    echo "$menu26"
	myread_dig pick
    case "$pick" in
		1) #Проверить запущен ли планировщик (cron)
		if [[ -n $(service crond status | grep "is running") ]]; then
			echo "Планировщик Cron работает..."
			wait
		else
			echo "Планировщик Cron в данный момент не запущен. Попробовать запустить?"
			myread_yn pick
			case "$pick" in
				y|Y)
				service crond start
				br
				echo "Готово. Хотите добавить Cron в автозагрузку, чтобы он запускался после каждой перезагрузки?"
				myread_yn pick
				case "$pick" in
					y|Y)
					echo "Добавляем..."
					chkconfig crond on
					echo "Готово."
					br
					wait
					;;
				esac	
				;;
			esac
		fi
		;;
		2) #Перезапустить cron
		service crond restart
		br
		wait
		;;
		3) #Добавить задание в планировщик (cron)
		clear
		echo "Введите команду, которую должен выполнять планировщик:"
		read cron_task
		br
		echo "Выберите интервал, с которым должна выполняться эта задача:"
		echo "1) При каждой загрузке системы"
		echo "2) Один или несколько раз в час"
		echo "3) Один или несколько раз в день"
		echo "4) Один раз в неделю"
		echo "5) Один раз в месяц"
		echo "0) Не нужно выполнять, я передумал"
		myread_dig pick
		case "$pick" in
			1)
			echo "@reboot $cron_task" >> /var/spool/cron/$(whoami)
			echo "Готово. Задание будет выполняться после каждой загрузки системы."
			;;
			2)
			br
			echo "Выберите интервал"
			echo "1) Каждый час"
			echo "2) Два раза в час (каждые 30 минут)"
			echo "3) Три раза в час (каждые 20 минут)"
			echo "4) Четыре раза в час (каждые 15 минут)"
			echo "5) Шесть раз в час (каждые 10 минут)"
			echo "6) Двенадцать раз в час (каждые 5 минут)"
			echo "7) Тридцать раз в час (каждые 2 минуты)"
			echo "8) Шестьдесят раз в час (каждую минуту)"
			echo "0) Не нужно выполнять, я передумал"
			myread_dig pick
			case "$pick" in
				1)
				echo "0 * * * * $cron_task" >> /var/spool/cron/$(whoami) # @hourly
				echo "Готово. Задание будет выполняться в 0 минут каждого часа."
				;;
				2)
				echo "*/30 * * * * $cron_task" >> /var/spool/cron/$(whoami)
				echo "Готово. Задание будет выполняться каждые 30 минут"					
				;;
				3)
				echo "*/20 * * * * $cron_task" >> /var/spool/cron/$(whoami)
				echo "Готово. Задание будет выполняться каждые 20 минут"				
				;;
				4)
				echo "*/15 * * * * $cron_task" >> /var/spool/cron/$(whoami)
				echo "Готово. Задание будет выполняться каждые 15 минут"				
				;;
				5)
				echo "*/10 * * * * $cron_task" >> /var/spool/cron/$(whoami)
				echo "Готово. Задание будет выполняться каждые 10 минут"				
				;;
				6)
				echo "*/5 * * * * $cron_task" >> /var/spool/cron/$(whoami)
				echo "Готово. Задание будет выполняться каждые 5 минут"				
				;;
				7)
				echo "*/2 * * * * $cron_task" >> /var/spool/cron/$(whoami)
				echo "Готово. Задание будет выполняться каждые 2 минуты"				
				;;
				8)
				echo "* * * * * $cron_task" >> /var/spool/cron/$(whoami)
				echo "Готово. Задание будет выполняться каждую минуту"				
				;;
				0)
				;;
				*)
				echo "Неправильный выбор..."
				;;				
			esac
			;;
			3)
			br
			echo "Выберите интервал"
			echo "1) Каждый день (можно выбрать в какой час)"
			echo "2) Два раза в день (каждые 12 часов)"
			echo "3) Три раза в день (каждые 8 часов)"
			echo "4) Четыре раза в день (каждые 6 часов)"
			echo "5) Шесть раз в день (каждые 4 часа)"
			echo "6) Двенадцать раз в день (каждые 2 часа)"
			echo "0) Не нужно выполнять, я передумал"
			myread_dig pick
			case "$pick" in
				1)
				br
				echo "Укажите в какой час запускать задание (0-23)"
				read temp
				let temp2=$temp+0
				if [[ $temp2 -gt 0 && $temp2 -le 23 ]]; then #введён правильно
					echo "0 $temp * * * $cron_task" >> /var/spool/cron/$(whoami)
					echo "Готово. Задание будет выполняться каждый $temp-й час"
				else #возможно введён неправильно
					if [[ "$temp" = "0" ]]; then #всё-таки введён правильно
						echo "0 $temp * * * $cron_task" >> /var/spool/cron/$(whoami)
						echo "Готово. Задание будет выполняться каждый $temp-й час"
					else #точно введён неправильно
						echo "Неправильно указали час"
					fi
				fi
				;;
				2)
				echo "0 */12 * * * $cron_task" >> /var/spool/cron/$(whoami)
				echo "Готово. Задание будет выполняться каждые 12 часов"					
				;;
				3)
				echo "0 */8 * * * $cron_task" >> /var/spool/cron/$(whoami)
				echo "Готово. Задание будет выполняться каждые 8 часов"					
				;;
				4)
				echo "0 */6 * * * $cron_task" >> /var/spool/cron/$(whoami)
				echo "Готово. Задание будет выполняться каждые 6 часов"					
				;;
				5)
				echo "0 */4 * * * $cron_task" >> /var/spool/cron/$(whoami)
				echo "Готово. Задание будет выполняться каждые 4 часа"					
				;;
				6)
				echo "0 */2 * * * $cron_task" >> /var/spool/cron/$(whoami)
				echo "Готово. Задание будет выполняться каждые 2 часа"					
				;;
				0)
				;;
				*)
				echo "Неправильный выбор..."
				;;	
			esac
			;;
			4)
			br
			echo "Выберите день недели, в который надо запускать задание"
			echo "1) Понедельник"
			echo "2) Вторник"
			echo "3) Среда"
			echo "4) Четверг"
			echo "5) Пятница"
			echo "6) Суббота"
			echo "7) Воскресенье"
			echo "0) Не нужно выполнять, я передумал"
			myread_dig pick
			case "$pick" in
				1|2|3|4|5|6|7)
				echo "0 4 * * $pick $cron_task" >> /var/spool/cron/$(whoami)
				case "$pick" in
					1) day="каждый понедельник"
					;;
					2) day="каждый вторник"
					;;
					3) day="каждую среду"
					;;
					4) day="каждый четверг"
					;;
					5) day="каждую пятницу"
					;;
					6) day="каждую субботу"
					;;
					7) day="каждое воскресенье"
					;;
				esac
				echo "Готово. Задание будет выполняться $day в 4 часа утра."
				;;
				0)
				;;
				*)
				echo "Неправильный выбор..."
				;;
			esac
			;;
			5)
			br
			echo "Укажите в какой день месяца запускать задание"
			read temp
			let temp=$temp+0
			if [[ $temp -gt 0 && $temp -le 31 ]]; then #введён правильно
				echo "0 4 $temp * * $cron_task" >> /var/spool/cron/$(whoami)
				echo "Готово. Задание будет выполняться каждое $temp-ое часло каждого месяца в 4 часа утра."
			else # введён неправильно
				echo "Неправильно выбрано число"
			fi
			;;
			0)
			;;
			*)
			echo "Неправильный выбор..."
			;;
		esac
		service crond reload  | tee > null
		br
		wait
		;;
		4) #Открыть файл с заданиями cron
		edit /var/spool/cron/$(whoami)
		;;
		5) #Выключить планировщик (cron)
		echo "Планировщик не рекомендуется отключать. Вы уверены что хотите отключить его?"
		myread_yn pick
		case "$pick" in
			y|Y)
			br
			service crond stop
			br
			echo "Планировщик был выключен. Если он стоял в автозагрузке, то он вновь будет запущен после перезагрузки системы"
			br
			wait
			;;
		esac
		;;
		0) #Выйти на уровень вверх
		chosen2=0
		;;
	esac	
    ;;
    7) #Установить часовой пояс
    clear
    echo "$title"
    echo "$menu27"
    echo "Текущее время на этом компьютере: $(date +%H:%M). Выберите часовой пояс, который хотите установить."
    myread_dig pick
        case "$pick" in
        1)
        settimezone Europe Kaliningrad
        ;;
        2)
        settimezone Europe Moscow
        ;;
        3)
        settimezone Europe Samara
        ;;
        4)
        settimezone Asia Yekaterinburg
        ;;
        5)
        settimezone Asia Novosibirsk
        ;;
        6)
        settimezone Asia Krasnoyarsk
        ;;
        7)
        settimezone Asia Irkutsk
        ;;
        8)
        settimezone Asia Vladivostok
        ;;
        9)
        settimezone Asia Kamchatka
        ;;
        0)
        ;;
        *)
        echo "Неправильный выбор."
        wait
        esac
    ;;
    8) #Сменить пароль текущего пользователя
    passwd
    br
    wait
    ;;
    0)
    chosen=0
    ;;
    *)
    echo "Неправильный выбор"
    wait
    ;;
    esac
;;
3) #Установить панель управления хостингом
chosen=3
clear
echo "$title"
echo "$menu3"
myread_dig pick
    case "$pick" in
    1) #ISPmanager 4
    clear
    echo 'Панель управления "ISPManager 4"'
    echo 'Поддержка ОС: CentOS | RHEL | Debian | Ubuntu'
    echo 'Системные требования: минимальные не определены'
    echo 'Лицензия: Панель управления ПЛАТНАЯ! Без лицензии, активированной на ваш IP даже не установится.'
    echo 'Язык: Русский'
    echo 'Хотите установить?'
    myread_yn pick
    case "$pick" in
      y|Y)
        wget "http://download.ispsystem.com/install.4.sh" -r -N -nd
        sh install.4.sh
        rm -f install.4.sh
      ;;
    esac
    ;;
    2) #ISPmanager 5
    clear
    echo 'Панель управления "ISPManager 5"'
    echo 'Поддержка ОС: CentOS | RHEL | Debian | Ubuntu'
    echo 'Системные требования: минимальные не определены'
    echo 'Лицензия: Панель управления ПЛАТНАЯ! После установки будет Trial на 14 дней.'
    echo 'Язык: Русский'
    echo 'Хотите установить?'
    myread_yn pick
    case "$pick" in
      y|Y)
        wget http://cdn.ispsystem.com/install.sh -r -N -nd
        sh install.sh
        rm -f install.sh
      ;;
    esac
    ;;
    3) #Vesta CP
    clear
    echo 'Панель управления "Vesta CP"'
    echo 'Поддержка ОС: CentOS | RHEL | Debian | Ubuntu'
    echo 'Системные требования: минимальные не определены'
    echo 'Лицензия: Панель управления полностью бесплатна.'
    echo 'Язык: Английский, русский'
    echo 'Хотите установить?'
    myread_yn pick
    case "$pick" in
      y|Y)
      if [[ $(pidof httpd) != "" ]] #проверяем установлен ли httpd
      then
        echo "У вас установлен http-сервер, а Vesta CP требует установки на чистую машину."
        echo 'Хотите удалить его перед установкой "Vesta CP"?'
        myread_yn pick
        case "$pick" in
          y|Y)
          service httpd stop
          yum erase httpd -y
          ;;
        esac
      fi
      br
      echo 'Начинаем установку...'
      openport in tcp 8083
      wget http://vestacp.com/pub/vst-install.sh -r -N -nd
      sh vst-install.sh --force
      rm -f vst-install.sh
      ;;
    esac
    ;;
    4) #Webuzo
    clear
    echo 'Панель управления "Webuzo"'
    echo 'Поддержка ОС: CentOS 5.x, 6.x | RHEL 5.x, 6.x | Scientific Linux 5.x, 6.x | Ubuntu LTS'
    echo 'Системные требования: 512 MB RAM (minimum)'
    echo 'Лицензия: Панель управления имеет платную и бесплатную версию. Установите без лицензии для использования бесплатной версии.'
    echo 'Язык: Английский'
    echo 'Хотите установить?'
    myread_yn pick
    case "$pick" in
      y|Y)
      case "$osver1" in
        5|6)
        webuzo_install
        ;;
        7)
        echo 'У вас CentOS 7.x. Данная панель управления не поддерживает эту версию. Выходим.'
        wait
        ;;
        0)
        echo 'нам не удалось определить Вашу ОС. Возможно, она не поддерживается Webuzo.'
        echo 'Хотите всё равно установить данную панель управления на свой страх и риск?'
        myread_yn ans
        case "$ans" in
          y|Y)
          webuzo_install
          ;;
          n|N|т|Т)
          ;;
          *)
          echo 'Неправильный выбор. Выходим.'
          wait
          ;;
        esac
        ;; 
      esac
      ;;
      n|N|т|Т)
      ;;
      *)
      echo 'Неправильный выбор. Выходим.'
      wait
      ;;
    esac
    ;;
    5) #CentOS Web Panel (CWP)
    clear
    echo 'Панель управления "CentOS Web Panel (CWP)"'
    echo 'Поддержка ОС: CentOS 6.x | RHEL 6.x | CloudLinux 6.x'
    echo 'Системные требования: 512 MB RAM (minimum)'
    echo 'Лицензия: Панель управления полностью бесплатна.'
    echo 'Язык: Английский'
    br
    echo "ВНИМАНИЕ! Данная панель будет устанавливаться очень долго (до 1 часа)!"
    br
    echo 'Хотите установить?'
    myread_yn pick
    case "$pick" in
      y|Y)
      case "$osver1" in
        5|7)
        echo "У вас CentOS $osver1.x. Данная панель управления не поддерживает эту версию. Выходим."
        wait
        ;;
        6)
        cwp_install
        ;;
        0)
        echo 'нам не удалось определить Вашу ОС. Возможно, она не поддерживается Webuzo.'
        echo 'Хотите всё равно установить данную панель управления на свой страх и риск?'
        myread_yn ans
        case "$ans" in
          y|Y)
          cwp_install
          ;;
          n|N|т|Т)
          ;;
          *)
          echo 'Неправильный выбор. Выходим.'
          wait
          ;;
        esac
        ;; 
      esac
      ;;
      n|N|т|Т)
      ;;
      *)
      echo 'Неправильный выбор. Выходим.'
      wait
      ;;
    esac
    ;;
    6) #ZPanel CP
    clear
    echo 'Панель управления "ZPanel CP"'
    echo 'Поддержка ОС: CentOS 6.x | RHEL 6.x'
    echo 'Системные требования: не указаны разработчиком'
    echo 'Лицензия: Панель управления полностью бесплатна.'
    echo 'Язык: Английский, немецкий'
    br
    echo 'ВНИМАНИЕ! Поддержка данной панели давно прекращена, русификации нет. Устанавливайте на свой страх и риск.'
    br
    echo 'Хотите установить?'
    myread_yn pick
    case "$pick" in
      y|Y)
      case "$osver1" in
        5|7)
        echo "У вас CentOS $osver1.x. Данная панель управления не поддерживает эту версию. Выходим."
        wait
        ;;
        6)
        zpanel_install
        ;;
        0)
        echo 'нам не удалось определить Вашу ОС. Возможно, она не поддерживается Webuzo.'
        echo 'Хотите всё равно установить данную панель управления на свой страх и риск?'
        myread_yn ans
        case "$ans" in
          y|Y)
          zpanel_install
          ;;
          n|N|т|Т)
          ;;
          *)
          echo 'Неправильный выбор. Выходим.'
          wait
          ;;
        esac
        ;; 
      esac
      ;;
      n|N|т|Т)
      ;;
      *)
      echo 'Неправильный выбор. Выходим.'
      wait
      ;;
    esac
    ;;
    7) #Ajenti
    clear
    echo 'Панель управления "Ajenti"'
    echo 'Поддержка ОС: CentOS 6, 7 | Debian 6, 7, 8 | Ubuntu | Gentoo'
    echo 'Системные требования: 35 Mb RAM '
    echo 'Лицензия: Панель имеет как бесплатную версию, так и платную'
    echo 'Описание: Ajenti - это панель управления сервером, но к ней есть Addon под названием Ajenti V,'
    echo '          с помощью которого можно управлять хостингом.'
    echo 'Язык: Английский, русский и ещё 42 других языка'
    echo 'Хотите установить?'
    myread_yn pick
    case "$pick" in
      y|Y)
      case "$osver1" in
        4|5)
        echo "У вас CentOS $osver1.x. Данная панель управления не поддерживает эту версию. Выходим."
        wait
        ;;
        6|7)
        ajenti_install
        ;;
        0)
        echo 'нам не удалось определить Вашу ОС. Возможно, она не поддерживается Webuzo.'
        echo 'Хотите всё равно установить данную панель управления на свой страх и риск?'
        myread_yn ans
        case "$ans" in
          y|Y)
          ajenti_install
          ;;
          n|N|т|Т)
          ;;
          *)
          echo 'Неправильный выбор. Выходим.'
          wait
          ;;
        esac
        ;; 
      esac
      ;;
      n|N|т|Т)
      ;;
      *)
      echo 'Неправильный выбор. Выходим.'
      wait
      ;;
    esac    
    ;;
    0)
    chosen=0
    ;;
    *)
    echo "Неправильный выбор."
    wait
    ;;
    esac
;;
4) #Установка и настройка VPN-сервера
chosen=4
clear
echo "$title"
echo "$menu4"
myread_dig pick
    case "$pick" in
    1) #Установить VPN-сервер (pptpd)
        echo "Внимание! Данный скрипт работает ТОЛЬКО на centOS!"
        echo "Внимание! Для работы VPN нужен интерфейс PPP, который обычно отключен при виртуализации"
        echo "на OpenVZ. Его можно включить через тех.поддержку или в панели управления сервером."
        echo "Если у вас технология виртуализации XEN или KVM, то всё нормально."
        br
        echo "Далее будет произведено обновление ОС и установка нужных компонентов для VPN-сервера."
        wait
        br
        echo "установка PPTP"
        #CentOS 5
        if [ $osver1 -eq 5 ]; then rpm -Uvh http://pptpclient.sourceforge.net/yum/stable/rhel5/pptp-release-current.noarch.rpm; fi
        #yum update -y
        yum -y install ppp pptpd pptp
        br
        whatismyip_full
          #открываем порты и настраиваем маршрутизацию
          br
          echo "Открываем порты в firewall для работы VPN"
          br
            iptables -I INPUT -p 47 -j ACCEPT
            iptables -I OUTPUT -p 47 -j ACCEPT
			openport in tcp 1723
			openport out tcp 1723
            iptables -t nat -I POSTROUTING -j SNAT --to $ip
            iptables -I FORWARD -s 10.1.0.0/24 -j ACCEPT
            iptables -I FORWARD -d 10.1.0.0/24 -j ACCEPT
          #теперь делаем так, чтобы сохранились правила после перезагрузки
          iptables_save
          br
          echo "Введите имя пользователя, которое нужно создать (н.п.. client1 or john):"
          read u
          echo "Введите пароль для этого пользователя:"
          read p
          br
          echo "Создание конфигурации сервера"
          cat > /etc/ppp/pptpd-options <<END
name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 8.8.8.8
ms-dns 8.8.4.4
proxyarp
nodefaultroute
lock
nobsdcomp
END
          sed -i -e '/net.ipv4.ip_forward = 0/d' /etc/sysctl.conf #Удаляем строчку net.ipv4.ip_forward = 0
          echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
          sysctl -p
          # setting up pptpd.conf
          echo "option /etc/ppp/pptpd-options" > /etc/pptpd.conf
          echo "logwtmp" >> /etc/pptpd.conf
          echo "localip $ip" >> /etc/pptpd.conf
          echo "remoteip 10.1.0.1-100" >> /etc/pptpd.conf
          #autostart pptpd
          chkconfig pptpd on          
          # adding new user
          echo "$u * $p *" >> /etc/ppp/chap-secrets
          # правим mtu для 10 ppp-юзеров
          sed -i -e '/exit 0/d' /etc/ppp/ip-up #Удаляем exit 0 в конце файла
          cat >> /etc/ppp/ip-up <<END
ifconfig ppp0 mtu 1400
ifconfig ppp1 mtu 1400
ifconfig ppp2 mtu 1400
ifconfig ppp3 mtu 1400
ifconfig ppp4 mtu 1400
ifconfig ppp5 mtu 1400
ifconfig ppp6 mtu 1400
ifconfig ppp7 mtu 1400
ifconfig ppp8 mtu 1400
ifconfig ppp9 mtu 1400
exit 0 #возвращаем exit 0
END
          br
          echo "Перезапуск PPTP"
          service pptpd restart
          #centOS7
          if [ $osver1 -eq 7 ]; then systemctl start pptpd; systemctl enable pptpd.service; fi
          br
          echo "Настройка вашего собственного VPN завершена!"
          echo "Ваш IP: $ip? логин и пароль:"
          echo "Имя пользователя (логин):$u ##### Пароль: $p"
          br
          wait
    ;;
    2) #Добавить пользователей VPN
    echo "Введите имя пользователя для создания (eg. client1 or john):"
    read u
    echo "введите пароль для создаваемого пользователя:"
    read p
    # adding new user
    echo "$u * $p *" >> /etc/ppp/chap-secrets
    echo
    echo "Дополнительный пользователь создан!"
    echo "Имя пользователя (логин):$u ##### Пароль: $p"
    br
    wait
    ;;
    3) #Открыть файл с логинами/паролями пользователей
    edit /etc/ppp/chap-secrets
    ;;
    4) #Добавить правила для работы VPN в IPTables
    whatismyip_full    
    iptables -I INPUT -p 47 -j ACCEPT
    iptables -I OUTPUT -p 47 -j ACCEPT
	openport in tcp 1723
	openport out tcp 1723
    iptables -t nat -I POSTROUTING -j SNAT --to $ip
    iptables -I FORWARD -s 10.1.0.0/24 -j ACCEPT
    iptables -I FORWARD -d 10.1.0.0/24 -j ACCEPT
    br
    echo 'Хотите, чтобы это правило сохранялось после перезагрузки?'
    myread_yn ans
    case "$ans" in
      y|Y)
      iptables_save  
      ;;
    esac
    br
    wait
    ;;
    5) #Удалить VPN-сервер
    clear
    echo "Внимание! Будет полностью удален VPN-сервер, файл с логинами/паролями и файл настроек"
    echo "Продолжить?"
    myread_yn ans
    case "$ans" in
    y|Y)
    uninstall -y pptpd pptp
    rm -f /etc/ppp/chap-secrets
    rm -f /etc/pptpd.conf
    sed -i -e '/ifconfig ppp0 mtu 1400/d' /etc/ppp/ip-up #Удаляем строки, которые добавляли
    sed -i -e '/ifconfig ppp1 mtu 1400/d' /etc/ppp/ip-up #Удаляем строки, которые добавляли
    sed -i -e '/ifconfig ppp2 mtu 1400/d' /etc/ppp/ip-up #Удаляем строки, которые добавляли
    sed -i -e '/ifconfig ppp3 mtu 1400/d' /etc/ppp/ip-up #Удаляем строки, которые добавляли
    sed -i -e '/ifconfig ppp4 mtu 1400/d' /etc/ppp/ip-up #Удаляем строки, которые добавляли
    sed -i -e '/ifconfig ppp5 mtu 1400/d' /etc/ppp/ip-up #Удаляем строки, которые добавляли
    sed -i -e '/ifconfig ppp6 mtu 1400/d' /etc/ppp/ip-up #Удаляем строки, которые добавляли
    sed -i -e '/ifconfig ppp7 mtu 1400/d' /etc/ppp/ip-up #Удаляем строки, которые добавляли
    sed -i -e '/ifconfig ppp8 mtu 1400/d' /etc/ppp/ip-up #Удаляем строки, которые добавляли
    sed -i -e '/ifconfig ppp9 mtu 1400/d' /etc/ppp/ip-up #Удаляем строки, которые добавляли
	echo "Готово."
	br
	wait
    ;;
    n|N)
    ;;
    *)
    echo "Неправильный ответ"
    wait
    ;;
    esac
    ;;
    0)
    chosen=0
    ;;
    *)
    echo "Неправильный выбор"
    wait
    ;;
    esac
;;
5) #Работа с Proxy
chosen=5
clear
echo "$title"
echo "$menu5"
myread_dig pick
    case "$pick" in
    1) #Установить Proxy-сервер (на базе Squid)
    echo "Начинаем установку squid"
    yum -y install squid
    echo "Squid был установлен"
    sed -i "/http_access deny all/d" "/etc/squid/squid.conf" #удаляем строку с запретом доступа (ниже добавим снова при необходимости)
    echo "#Ниже добавлены наши наcтройки" >> /etc/squid/squid.conf
    br
    echo 'По умолчанию Proxy работает на порту 3128, но его можно поменять. Хотите изменить порт?'
    myread_yn ans
    port=3128 #ставим порт по умолчанию, далее, если надо, его переопределяем
      case "$ans" in
        y|Y)
        echo 'Укажите порт, на котором должен работать Proxy?'
        read port
        sed -i "/http_port/d" "/etc/squid/squid.conf" #удаляем строку с настройкой порта
        echo "http_port $port" >> /etc/squid/squid.conf #добавляем строку с настройкой порта
        ;;
      esac
    br
    echo "Выберите вариант авторизации на Proxy:"
    echo "1) Свободный доступ (любой, кто знает IP и порт - может воспользоваться)"
    echo "2) Доступ по логину/паролю"
    myread_dig ans
    case "$ans" in
		1)
		echo "http_access allow all" >> /etc/squid/squid.conf
		echo 'Был открыт доступ всем пользователям'
		br
		;;
		2)
		installed httpd-tools
		if [ $exist == false ]; then yum -y install httpd-tools; fi #устанавливаем утилиту htpasswd, если её нет
		touch /etc/squid/internet_users #создаем файл с логинами-паролями
		chmod 440 /etc/squid/internet_users #выставляем права на этот файл
		chown squid:squid /etc/squid/internet_users
		ncsa_path=$(find / -name "ncsa_auth") #определяем путь ncsa_auth
		br
		echo "Укажите логин пользователя:"
		read login
		login_lower=$(echo $login | tr [:upper:] [:lower:]) #Перевели логин в нижний регстр, без этого авторизация вообще не будет проходить
		htpasswd /etc/squid/internet_users $login_lower
		echo "auth_param basic program $ncsa_path /etc/squid/internet_users " >> /etc/squid/squid.conf
		echo "auth_param basic children 32" >> /etc/squid/squid.conf #кол-во юзеров
		echo "auth_param basic realm Enter login and password to use this Proxy " >> /etc/squid/squid.conf #приветственная фраза
		echo "auth_param basic credentialsttl 8 hours " >> /etc/squid/squid.conf #На сколько запоминать авторизацию
		echo "acl internet_users proxy_auth REQUIRED " >> /etc/squid/squid.conf
		echo "http_access allow internet_users " >> /etc/squid/squid.conf
		echo "http_access deny all " >> /etc/squid/squid.conf #запретили доступ всем, кроме авторизованных пользователей
		;;
		*)
		echo "Неправильный выбор. Аварийный выход."
		wait
		exit
		;;
    esac
    #открываем порт в iptables
    br
    echo "Сейчас откроем порт в iptables, чтобы можно было подключиться к серверу"
    openport in tcp $port
    br
      echo 'По умолчанию Proxy не является анонимным и можно определить Ваш IP, когда Вы им пользуетесь'
      echo 'Хотите сделать Ваш Proxy полностью анонимным?'
      myread_yn ans
      case "$ans" in
        y|Y)
       br
       echo 'Имейте ввиду, что такой Proxy-сервер нарушает правила протокола HTTP и является НЕЗАКОННЫМ.'
       echo 'Всю ответственность за такой сервер - несёте вы. Всё ещё хотите продолжить?'
       myread_yn ans
        case "$ans" in
          y|Y)
cat >> /etc/squid/squid.conf <<END
via off
forwarded_for delete
END
          ;;
        esac
        ;;
      esac
    br
    echo 'Вы хотите настроить Proxy таким образом, чтобы можно было использовать программы, типа Proxifier?'
    echo 'В этом случае будет разрешен проброс SSL туннеля на порт 80. Если вы не уверены, ответьте "нет"'
    myread_yn ans
        case "$ans" in
          y|Y)
          sed -i -e '/http_access deny CONNECT !SSL_ports/d' /etc/squid/squid.conf #Удаляем из конфига строчку http_access deny CONNECT !SSL_ports
          echo '#http_access deny CONNECT !SSL_ports' >> /etc/squid/squid.conf #возвращаем ее назад в закомментированном виде"
          ;;
        esac
    br
    echo "Добавляем Squid в автозагрузку..."
    chkconfig squid on
    br
    service squid restart
    br
    echo "Proxy-сервер был успешно настроен. Если подключение к нему есть, но трафик не идёт, то, возможно"
    echo "проблема в MTU. Вы можете его настроить в соответствующем разделе."
    br
	whatismyipext
    echo "Параметры вашего Proxy:"
    echo "IP: $ipext"
    echo "Порт: $port"
    echo "Пользователь: $login"
    br
    wait
    ;;
    2) #Удалить Proxy (Squid)
    echo "Будет удален Proxy-сервер (Squid), а также файл настроек и файл"
    echo "с логинами/паролями пользователей. Продолжить?"
    myread_yn ans
    case "$ans" in
		y|Y)
		echo "Начинаем удаление squid..."
		uninstall -y squid
		rm -f /etc/squid/squid.conf
		rm -f /etc/squid/internet_users
		br
		echo 'Squid был удален'
		wait
		;;
	esac    
    ;;
    3) #Поменять MTU для интерфейса
    echo 'На каком интерфейсе вы хотите поменять mtu?'
    read interface
    echo 'Какой mtu установить?'
    read mtu
    mtu_change $interface $mtu
    echo 'Для интерфейса '$interface' был успешно установлен MTU '$mtu
    wait
    ;;
    4) #Открыть файл настроек Squid
    edit /etc/squid/squid.conf
    ;;
    5) #Добавить пользователей Proxy
	br
	installed httpd-tools
	if [ $exist == false ]; then yum -y install httpd-tools; fi #устанавливаем утилиту htpasswd, если её нет
	br
	echo "Укажите логин пользователя:"
	read login
	login_lower=$(echo $login | tr [:upper:] [:lower:]) #Перевели логин в нижний регстр, без этого авторизация вообще не будет проходить
	htpasswd /etc/squid/internet_users $login_lower    
	br
	echo "Пользователь $login был успешно добавлен в файл настроек"
	wait
    ;;
    6) #Открыть файл с логинами/паролями пользователей Proxy
    clear
    br
    echo "ВНИМАНИЕ! В этом файле содержатся не пароли пользователей, а их хэш-суммы!"
    echo "Редактировать пароли в этом файле нельзя! Вы можете отредактировать только логин."
	echo "Из этого файла Вы можете просто посмотреть какие у Вас есть пользователи и можете удалить кого-то."
	echo "Для удаления пользователя просто сотрите соответствующую строку и сохраните файл."
    echo "Если нужно изменить пароль - просто создайте заново пользователя с тем же логином."
    br
    wait
    edit /etc/squid/internet_users
    ;;    
    7) #Перезапустить сервис Proxy (Squid)
    service squid restart
    echo 'Готово'
    wait
    ;;
    0)
    chosen=0
    ;;
    *)
    echo "Неправильный выбор"
    wait
    ;;
    esac
;;
6) #Работа с файлами и программами
chosen=6
clear
echo "$title"
echo "$menu6"
myread_dig pick
    case "$pick" in
    1) #Установить какую-либо программу
    echo "Укажите название пакета который нужно установить"
    read answer
    yum -y install $answer
    br
    echo "Готово."
    wait
    ;;
    2) #Удалить какую-либо программу
    echo "Укажите название пакета который нужно удалить"
    read answer
    yum erase $answer
    br
    echo "Готово."
    wait
    ;;
    3) #Удалить какую-либо программу со всеми зависимостями
    #CentOS5
    if [ $osver1 -eq 5 ]; then echo "Данная функция не поддерживается на CentOS 5.x"; wait
    else
        echo "Укажите название пакета который нужно полностью удалить"
        read answer
        uninstall $answer
        br
        echo "Готово."
        wait    
    fi
    ;;
    4) #Посмотреть сколько свободного места на диске
    br
    df -h
    br
    wait    
    ;;
    0)
    chosen=0
    ;;
    *)
    echo "Неправильный выбор"
    wait
    ;;
    esac
;;
7) #Очистка системы
chosen=7
clear
echo "$title"
echo "$menu7"
myread_dig pick
    case "$pick" in
    1) #Очистить кэш yum
    yum clean all
    br
    echo "Готово."
    wait
    ;;
    2) #Удалить логи Apache, Nginx
    echo "Внимание! Будут удалены все архивные логи Apache и NginX, кроме сегодняшних."
    echo "Продолжить?"
    myread_yn ans
    case "$ans" in
		y|Y)
		rm -f -v /var/www/httpd-logs/*.gz
		rm -f -v /var/log/nginx/*.gz
		service httpd restart
		service nginx restart
		br
		echo "Готово."
		wait    
    ;;
    esac
    ;;
    3) #Удалить логи Apache конкретного пользователя
    br
    echo "Введите логин ispmanager (обычно в нижнем регистре!) для удаления его старых логов:"
    read answer
    rm -f /var/www/$answer/data/logs/*.gz
    br
    echo "Готово."
    wait
    ;;
    4) #Посмотреть сколько свободного места на диске
	br
    df -h
    br
    wait    
    ;;
    0)
    chosen=0
    ;;
    *)
    echo "Неправильный выбор. Нажмите любую клавишу, чтобы продолжить."
    wait
    ;;
    esac
;;
8) #терминал
chosen=8
clear
echo '-----------¬'
echo '¦ Терминал ¦'
echo 'L-----------'
echo "Здесь вы можете ввести любую команду, которую поддерживает bash."
echo "Кроме этого, поддерживаются внутренние команды $title"
echo 'Такие как: myinstall, uninstall, openport, changelog, updatescript, about и др.'
echo 'Для выхода из терминала наберите "exit" или "quit".'
br
echo "Введите команду:"
read cmd
if [[ "$cmd" == "exit" || "$cmd" == "quit" ]]
then
  chosen=0
else
  br
  $cmd
  br
  wait
fi
;;
9) #Обновить Breeze Easy Shell
echo "обновляю..."
updatescript
repeat=false
sh $0
exit 0
;;
0)
repeat=false
;;
*)
echo "Неправильный выбор."
wait
;;
esac
done
echo "Скрипт ожидаемо завершил свою работу."
clear


Всё что вам нужно, чтобы его использовать — это создать файл [название].sh и засунуть в него это содержимое. После чего запустить командой «sh [название].sh». Создать его можно как на сервере, так и на своем компьютере, а потом скопировать на сервер. Я, например, закинул его себе на домашний сервер и на каждом новом VPS вбиваю команду:

cd /root/
wget http://evtikhov.ru/breeze.sh -r -N -nd
cat >> /root/.bashrc <<END
alias breeze='cd /root/
sh breeze.sh'
END
exit

После этого под рутом в терминале одной командой «breeze» запускаю его.

P.S. Вообще, частенько возникает вопрос доверия использования чужих скриптов и это правильно. Но прелесть скриптов на bash в том, что перед их запуском можно открыть и посмотреть его. И убедиться в том, что он не делает ничего плохого. Функцию обновления скрипта вас использовать никто не заставляет. В общем-то, вас вообще никто не заставляет его использовать. Всегда можно просто посмотреть как настраивается VPN, Proxy и прочие вещи и вручную вколотить пару десятков команд, разобравшись в них. Обилие комментариев в коде даже поможет в них разобраться.
Поделиться с друзьями
-->

Комментарии (113)


  1. webmasterx
    09.09.2016 17:57
    +1

    Да, на Линуксе не бывает вирусов. Поэтому, я предусмотрел установку антивируса.

    Ну и зачем тогда он в скрипте? Зачем изначально формировать ложный список must have ПО?


    1. ponich
      09.09.2016 18:06
      +1

      Да, но обычно в сети не все машины на linux


      1. dmx102
        09.09.2016 22:22

        Windows машины не заразны для linux


    1. ornic
      09.09.2016 19:47
      +14

      Там же очевидный сарказм, нет? Вирусов не бывает только на обесточенном и желательно разобранном компьютере.


  1. ponich
    09.09.2016 17:58
    +9

    А можно пожалуйста ссылку на git? Спасибо!


    1. Brizovsky
      09.09.2016 19:56
      +1

      Это может звучит странно для местных жителей, но на гитхабе я его не публиковал. :)
      Каюсь, виноват. Обещаю исправиться. :)


      1. 0xScript
        10.09.2016 10:17
        +1

        Тоже жду ссылку на GitHub. Заранее спасибо


      1. aureliano_b
        15.09.2016 16:48
        -2

        мне тоже первая мысль пришла: почему не на git :)

        Большая работа и очень полезный скрипт. Спасибо. Уважаю чрезвычайно!


  1. Alex_ME
    09.09.2016 17:59
    +6

    Большое спасибо за труд! Действительно, полезная вещь, сам тоже часто не знаю\забываю, как сделать какую-то вещь, правда CentOS еще не использовал.


    Но выкладывать такое полотно на хабр для копи-паста, наверное, не самый удобный способ распространения. Лучше, если вы загрузите на Github.


    1. Brizovsky
      09.09.2016 19:47

      Тут я с вами согласен. Не очень удобно. Выбрал этот вариант как более «безопасный» по сравнению с тем, чтобы просто дать ссылку на скрипт, хранящийся где-то у меня.
      Просто на гитхабе не публиковался. Теперь вижу, что пора. Чуть позже перенесу всё на гитхаб и статью подправлю.


  1. vitaly_KF
    09.09.2016 19:15

    Клево, но я так понимаю заточен скрипт исключительно под CentOS?


    1. Brizovsky
      09.09.2016 19:45
      +4

      Пока да. Следующее, что планировал сделать — это как раз добавить поддержку Debian/Ubuntu. «Заготовку» под это сделал. Почти везде в коде все типовые действия выполняются отдельными функциями. Достаточно добавить проверку дистрибутива и вписать команды, собственно, под другие дистрибутивы. Думаю, что если будет поддержка семейств не только RHEL, но и Debian, подавляющее большинство потребностей уже будет закрыто.
      Осталось найти время. :)


      1. Incognito4pda
        09.09.2016 21:06
        +2

        Очень жду Ваш проект под Debian! Спасибо!


      1. extempl
        09.09.2016 21:24
        +2

        Публикация в опен-сорс (на гитхаб, например) как раз тем и крута, что если времени нет, то оно с некоторой долей вероятности найдётся у других участников сообщества, и вам только нужно будет аппрувить пулл реквесты.


      1. vov1
        10.09.2016 00:34
        +2

        Возможно лучше делать отдельный скрипт для каждой ОС? А то поддержка очень быстро станет адом.


  1. barker
    09.09.2016 20:22
    +6

    menu="
    ----------------------------------------------¬
    ¦ $title $ver$space¦
    +---T-----------------------------------------+
    ¦ 1 ¦ Информация о системе ¦
    +---+-----------------------------------------+
    ¦ 2 ¦ Работа с ОС ¦
    +---+-----------------------------------------+
    ¦ 3 ¦ Установить панель управления хостингом ¦
    Может всё же какой-нибудь dialog лучше или аналог?


    1. Brizovsky
      09.09.2016 20:55
      -7

      Стоит понимать, что это не коммерческий продукт. Это не работа для заказчика. Всё это делалось под себя из того, с чем удобней было работать в тот момент, не ковыряясь в лишних мануалах. Можно ведь по меню и курсором бегать. Только перед этим мне придется достаточно много часов потратить на изучение соответствующих материалов. А данный скрипт — результат хобби и работы «для души». Более того, если поковыряться в коде, я уверен, что многие гуру баша могут и сматериться местами. Мол «зачем ты так криво проверяешь введенный символ на принадлежность цифре, когда это можно сделать одним красивым регулярным выражением?». Конечно можно. Но я не ставил цель участвовать в конкурсе на самый красивый код. В тот момент мне было быстрее выражение записать именно так, чем читать многотонную статью о премудростях регулярных выражений на Баше.

      Так или иначе это код менялся и дополнялся на протяжении последних 9-10 месяцев. Уверен, еще через полгода он будет другим. Будет больше радовать тех, кто вообще плохо разбирается в Линуксе. И будет меньше резать глаза «тру кодерам». :)


      1. ValdikSS
        09.09.2016 21:27
        +7

        Только перед этим мне придется достаточно много часов потратить на изучение соответствующих материалов.
        В том-то и дело, что не придется. dialog или его аналог все сделает за вас.

        Пробегите глазами код Winetricks.


        1. greabock
          10.09.2016 05:26
          +5

          Я с Вами согласен. но "пробегите глазами" по пятнадцати тысячам строк — это это Вы знатно протролили =)


    1. Self_Perfection
      10.09.2016 14:36

      Два года назад, когда я пробовал использовать dialog, он был ужасным глюкодромом.
      whiptail куда лучше.


  1. yuriybz
    09.09.2016 20:44
    +1

    Ждем на github, а там и портирование под ubuntu появится


  1. kotomyava
    09.09.2016 21:57
    +18

    При слабых знаниях администрирования, этот скрипт, да и большинство подобной автоматизации написанной другими, дают их пользователям ложную уверенность, что у них всё хорошо и всё работает.
    В реальности же, это не так, и такие сервера с впсками с удовольствием используют для рассылки спама и ddos, потому что такие штуки, даже если всё правильно настраивают, то только то, для чего созданы, и не отменяют необходимости настроить всё остальное, и, что очень важно, следить за всем настроенным.
    Ну и до кучи они «отменяют» необходимость хотя бы минимально разобраться как должно работать настраиваемое, и покопаться в документации.

    Желающим попользоваться — одумайтесь! Либо разберитесь в том, чем будете пользоваться, либо купите готовую услугу, либо наймите кого-нибудь, чтобы сделать хорошо, как нужно вам. Нет других путей — такие скрипты всегда путь к проблемам, даже если автор хотел как лучше.


    1. umputun
      09.09.2016 22:16
      +18

      Добавлю, что кроме ложной уверенности, это еще и набор вредных и весьма опасных практик, собранный в одном флаконе. Кроме того, что оно должно запускаться под root, оно еще смело загружает по http черт знает что из интернета и потом запускает под тем же самым рутом.


  1. macik
    09.09.2016 22:33
    -6

    Большое спасибо за скрипт!!!
    Я конечно не поставлю такие вещи к себе на сервере… НО! Скрипт просто «прелесть» для изучения! Автору респект!


  1. rie
    09.09.2016 23:28
    +24

    Что же с нами стало. Детский сад какой-то. Бложиг программистов.


  1. chemistmail
    09.09.2016 23:39
    +6

    Это не с нами, это дети шалят.


  1. citius
    10.09.2016 01:03
    +1

    Вот если бы это было писано например под Ansible, то это было бы сразу кросс-дистрибутивно, и более-менее актуально.
    Ну и полезно бы тоже было, чего уж там.


    1. grossws
      10.09.2016 03:42

      Особенно в ansible кросс-дистрибутивны модули yum/apt/dnf/pacman/zypper, да. Это даже не вспоминая о том, что в разных дистрибутивах пакеты могут называться существенно по разному: где-то apache2, где-то — httpd. Иногда и в рамках одного дистрибутива разных версий бывает каша, например, в centos/rhel 6-7 были docker-io, docker, docker-engine, которые, по сути, являются одним и тем же продуктом.


      1. SirEdvin
        10.09.2016 12:53

        Никто не мешает использовать условия на версию и дистрибутив.

        А с докером — это их завтык. Везде у них так.


        1. grossws
          11.09.2016 00:41

          Никто не мешает использовать условия на версию и дистрибутив.

          Равно как и самописном скрипте, в общем.


          А с докером — это их завтык. Везде у них так.

          Это просто не хипстерский (в плохом смысле этого слова) подход. Если в репозитории rhel6/centos6 уже есть пакет docker (это какой-то док для wm/de в рамках x11), то никто не будет новый пакет называть также и выкидывать старый в рамках одной major версии дистрибутива. Банальная обратная совместимость. Точно также происходит во всех более-менее нормальных дистрибутивах: centos/fedora/rhel, debian, ubuntu — как минимум. У большинства, правда, lts немножко меньше 10 лет.


          То, что докеровцы в какой-то момент переназвали кусок, который ныне именуется docker-engine — их личное дело. И мейнтейнеры дистрибутивов в этом не виноваты.


          1. SirEdvin
            11.09.2016 09:42

            Я думаю, вы меня не так поняли.


            Я имел ввиду, что существование таких пакетов, как docker-lcx, docker-io и docker-engine вместо нормальной версионности — это решение самих разработчиков Docker.


      1. bormotov
        10.09.2016 15:55

        Про ansible не знаю, но у salt stack управление пакетами кросс-дистрибутивно.

        А разнообразие имен пакетов аккуратно оформляется в «рецепте», знания о том, какой дистрибутив доступно.


        1. grossws
          11.09.2016 00:43

          Про ansible не знаю, но у salt stack управление пакетами кросс-дистрибутивно.
          А разнообразие имен пакетов аккуратно оформляется в «рецепте», знания о том, какой дистрибутив доступно.

          Я знаком с этим подходом по chef'у. У ansible просто более явная модель. Обычно, если пишутся ansible playbooks, охватывающие несколько дистрибутивов, то делается условный include на семейство или версию дистрибутивов. Ведь кроме имён пакетов конфиги могут лежать в разных директориях, использоваться разные init-системы и т. п.


  1. strangeman
    10.09.2016 03:46
    +2

    Но зачем, когда есть масса утилит для управления конфигурациями? Лучше бы плейбуков для ансибла/кукбуков для шефа написали.


  1. iAndrey
    10.09.2016 05:51
    +19

    PPTP в 2016? «Декорации» в меню? Сотня echo "", десятки «Начинаем\Заканчиваем установку» и wget чёрт знает откуда? И это только на поверхности. А глянуть подробно в каждый процесс установки — вообще волосы дыбом встают.

    Я понимаю, что ты осилил case и прочие основы bash, но выкатывать свой helloworld.sh, пусть и на несколько сотен строчек — моветон. Тем более называя его таблеткой от всех болезней.

    Читателей прошу ни в коем случае не использовать это, даже ради «посмотреть как на баше писать» так писать нельзя. Модераторов или автора прошу удалить\убрать в черновики статью как зловред.

    ps: У кого один-два сервера должны прочитать ман и поднять нужные службы правильно, а не как в твоём скрипте. У кого серверов много — давно научились puppet\ansible.


    1. Alex_ME
      10.09.2016 12:48

      Подскажите, пожалуйста, в какую сторону надо копать, чтобы узнать, как надо делать?


      1. loginsin
        10.09.2016 13:03
        +4

        Изучить основы администрирования, основы программирования. Читать opennet, stackoverflow, набираться опыта, оптимизировать накопленные знания. Пока не будут пройдены эти этапы, как надо не получится.


      1. iAndrey
        10.09.2016 13:57
        +2

        Сначала учиться, потом делать, а не искать готовый рецепт и не думая копипастить команды в терминал.
        Если говорить конкретно о RHEL/CentOS, то можно почитать RHCSA/RHCE Red Hat Linux Certification Study Guide, а так же документацию на сайтах Red Hat, Fedora Project и CentOS.
        Ну и за лишний запуск man ни кто по рукам не ударит.


      1. bormotov
        10.09.2016 16:05
        +1

        как нужно делать что?

        так называемый unix-way, это в первую очередь понимание задачи и способность хотя-бы самому себе сформулировать, что же нужно получить в итоге.

        Как уже заметили выше — нужно что-то готовое, гораздо лучше просто купить готовую услугу. VPN, прокси, хранение данных — всё это есть, или за деньги сравнимые с VPS, или даже бесплатно. И если вам лень разбираться, как это реально работает — такого рода скрипты дадут только ложную уверенность.


        1. Alex_ME
          10.09.2016 16:12

          Ох… Я имел в виду немного другое. Я сам против использования чего-то не разобравшись в вопросе.
          Просто iAndrey говорил


          PPTP в 2016? «Декорации» в меню? Сотня echo ""

          и мне стало интересно — чтобы написать для себя некий скрипт конфигурации с менюшкой, что использовать вместо раскритикованных вещей? Просто если бы я писал что-то такое, то так же бы использовал case и echo в большом количестве.


          1. bormotov
            10.09.2016 16:31
            +5

            Скрипты конфигурации с менюшками в консоли, на мой взгляд не нужны, уже лет пять — так совсем.

            ansible, salt, chef, puppet (что-то забыл?) — кому что интереснее/удобнее/привычнее. Насколько я понимаю, у ansible самый низкий порог вхождения, и в случае «нет у меня кластера, одна машина» с ним проще всего.

            Мне ближе salt, поэтому я бы начинал с https://github.com/saltstack-formulas/

            Что там хотел автор, VPN? Например https://github.com/saltstack-formulas/openvpn-formula
            Прокси? https://github.com/saltstack-formulas/squid-formula

            Почему-то уверен, что есть где-то аналогичный сборник уже готовых «рецептов», для остальных систем автоматической конфигурации.

            — Не понимаю, откуда у людей такая тяга к интерактивным штукам. Понятно откуда тяга к общению с людьми: от природы, инстинкты, гены и всё такое. Во всех остальных случаях, всегда нужно стремиться к одной кнопке «сделать хорошо».

            Опять-же, в случае salt'а, скажем, я пишу

            some.new.host:
            — vpn
            — squid
            — some-another-stuff

            в одном месте, а потом в консоли говорю

            salt some.new.host state.highstate


            Через какое-то время, получаю на этот some.new.host всё установленное и настроенное так, как мне нужно.
            «Как именно нужно» — опять-же, хранится в рецептах «vpn», «squid», «some-another-stuff».

            Правда, удобно?


            1. Alex_ME
              10.09.2016 17:07

              Большое спасибо за ответ и ссылки.


              1. loginsin
                10.09.2016 18:32

                Если уж так хочется диалогов, то dialog или ncurses (если на C/C++)


            1. grossws
              11.09.2016 00:47

              ansible, salt, chef, puppet (что-то забыл?)

              bcfg, cfengine и тонна более древних средств. Моё личное предпочтение — ansible, т. к. требует только ssh для начала работы и python 2.4+ для продолжения, но не требует агентов на хостах.


              1. bormotov
                11.09.2016 01:15

                мы остановились на salt, потому что в момент когда выбирали, только там адекватно (даже более — очень комфортно) поддерживался Windows, которого у нас достаточно много.

                С тех пор, с одной стороны, что-то на тему Windows сделали в ansible. С другой, у salt появился salt-ssh, который «как в ansible». За другими совсем не слежу, но слышал Chef вполне себе успешно развивается.

                В общем, смысл писать «скрипты» (да еще и на bash) для конфигурирования линукса мне не понятен. Если нужно один раз — просто делаешь руками, если нужно много раз — пишешь рецепт для своей любимой системы оркестрации или как там их правильно называют.


                1. grossws
                  11.09.2016 01:30

                  Они обычно называются SCM (software configuration management), но некоторые используются и для оркестрации, хотя это далеко не их основное предназначение.


    1. loginsin
      10.09.2016 12:58
      +3

      Я бы добавил:

      zpanel_install()
      {
      wget http://evtikhov.ru/zpanel.sh
      sh zpanel.sh
      rm -f zpanel.sh
      }
      


      Домен автора? При желании отличный ботнет выйдет :-)
      Ну и согласен с тем, что единственная польза от скрипта — это понять, как не надо писать на bash.

      Думаю, что автору (если цель, конечно, не распространение ботнета) имеет смысл немножко углубится в знаниях по администрированию *nix-систем и в последующем написать пост о работе над ошибками после этого. Будет ценнее и полезнее.


      1. grossws
        11.09.2016 00:49

        Достаточно любого домена и использования http без дальнейших проверок с использованием gpg или, как минимум, криптографических хэшсумм ,)


    1. aon24
      13.09.2016 12:17
      -3

      В комментарии сквозит гордость от собственных знаний и презрение к тем, кто знает меньше.
      ОС — это среда для запуска программ, и для меня (прикладного программиста) разбираться в системе — это лишняя работа.
      Если бы при аренде VDS можно было галочками отметить пакеты, которые надо установить,
      гордые собой линуксойды остались бы без работы.


      1. barker
        13.09.2016 14:40
        -1

        Да уж, поставить пакеты в ОС и минимально уметь настроить окружение — это ведь такая сложная задача по сравнению с программированием.


      1. iAndrey
        14.09.2016 04:29
        +2

        И у вас, как у программиста, к скрипту претензий нет. Верно?


        1. aon24
          14.09.2016 12:59
          -3

          У меня претензия к Linux. Доля виндовс на ПК 90%, Linux 1.5%
          Если бы в всех Linux была единая настройка конфигурации, не требующая знания системы, проценты были бы другие (imho).
          То, что человек сделал шаг в этом направлении, я приветствую.
          А то, что он плохо знает bash, — не страшно и не главное.
          Я не администратор Linux и не хочу им быть. Не хочу забивать голову сотнями команд и параметров.
          Я хочу при установке системы нажать 28 раз кнопку ОК или клавшу «Y» и получить готовую систему.

          П.С. Я недавно сменил хостинг из-за непомерной жадности хостера. То, что настройки apache делаются по другому
          и то, что MySql не понял старый my.cnf, меня удивило и опечалило. И отняло время.


          1. iAndrey
            14.09.2016 16:48
            +1

            У меня к вам всего 3 вопроса:
            1) Мы говорим о десктопах или о серверах? Покажите эти 90% серверов под Windows.
            2) Вас насильно заставляют администрировать linux системы, или жалко денег на профильного специалиста, а сервер под Windows любой человек с улицы сможет правильно настроить?
            3) Т.е. вы не зная как устроена и работает система разрабатываете под неё программное обеспечение?

            PS Ну вот ни как не пойму, зачем 28 раз нажимать «ОК», если можно один раз указать путь к ks файлу и идти пить кофе, а по возвращении получить готовую систему в которой не просто апач будет установлен (коли вы про веб-дев заговорили), но и ваше приложение уже развернётся и запустится.


            1. KlimovDm
              14.09.2016 17:01
              +1

              >>> Ну вот ни как не пойму, зачем 28 раз нажимать «ОК»

              Образ мысли. Недостаток знаний. Привычка :)
              Я никогда не забуду потрясение моего коллеги — windows-специалиста, когда он увидел как по одной команде разворачивается резервый кластер из 6-ти linux серверов на физике на другом конце света. При этом мы именно пили кофе :)


            1. aon24
              14.09.2016 19:03
              -1

              Вы абсолютно правы: мне жалко денег на специалиста, и я действительно не знаю и знать не хочу, как устроены Windows, Mac Os, Linux.
              Вы удивитесь, но мы разрабатываем кроссплатформенное прикладное ПО, и оно всюду работает.


              1. iAndrey
                14.09.2016 19:59
                +2

                Программное обеспечение может всюду работать одинаково хорошо и одинаково плохо. Увы, но без «знать как устроены ОС» «одинаково хорошо» не получится никогда. Тем более, если ни разработчики сами не знают, ни специалистов не привлекают со стороны.


                1. aon24
                  14.09.2016 20:44

                  Вы меня заинтриговали. Что же Вы такое знаете, без чего все будет одинаково плохо?
                  А то я и заказчики думали, что у нас все одинаково хорошо, а оказывается во как.
                  Поделитесь примером, что нужно знать прикладному программисту на Python про отличия в системах.
                  Я кроме chmod ничего и не знаю.


                  1. loginsin
                    14.09.2016 21:01
                    +2

                    sarcasm Наверное, больше и не надо ничего знать. Ведь и так все работает. /sarcasm


                  1. iAndrey
                    15.09.2016 04:14

                    [безсарказма]визитки-одностраничники клепать — ничего и не надо знать, кроме chmod[/безсарказма]
                    Более-менее серьёзные проекты требуют определённых знаний, но нужно знать специфику проекта, чтобы сказать каких. А можно везде городить свои велосипеды, но это снова разговор про «одинаково плохо»


                    1. aon24
                      15.09.2016 11:11
                      -1

                      Вы не ответили, что же надо знать. Пример приведите.
                      У нас средний проект: 25 тыс строк на Питоне, JS/CSS еще 10т., около 200 html-форм, около 300 пользователей (MFF/GH).
                      Один и тот же код работает на Windows и разных Linux с разными SQL серверами.
                      Распределенная система из 30 серверов. В т.ч. есть мнисерверы: стартуют, как службы виндовс на ПК пользователя.
                      И никто из команды не знает ни Windows ни Linux и знать не хочет.
                      Когда клиент просит настроить ОС, коллеги валят на меня, а я с матюгами лезу в шпаргалки и мануалы.
                      При этом главная мысль: «КАК ЭТО ВСЕ НЕУДОБНО».
                      Исходно шла речь о администрировании ОС и о том, нужен ли инструмент, позволяющий получить готовую систему без глубоких знаний в части администрирования.
                      Смею Вас уверить, что то, что я узнаю/вспоминаю в процесс настройки ОС, для прикладного программирования БЕСПОЛЕЗНО. Отсюда соответствующее отношение.


                      1. KlimovDm
                        15.09.2016 15:32
                        +1

                        Где-то вы лукавите. Один вопрос — а кто (или что) разворачивает ваши приложения на серверах?


                        1. aon24
                          15.09.2016 16:59

                          Я не лукавлю. Я действительно не люблю администрировать ОС.
                          Не потому, что я этого не могу, просто мне это неинтересно. Когда я проходил обучение в Nato по курсу «Практическое администрирование TCP/IP сетей» (это не шутка), я во многом разобрался. Получил сертификат и благополучно все (почти все) забыл, потому что для прикладного программирования это не нужно.

                          Как мы разворачиваем:
                          Для минисервера на ПК пользователя есть инсталлятор (делается с помощью cx_Freeze + InnoSetup).
                          Для обычного сервера надо скопировать папку и прописать запуск приложения.
                          Остальное через ВЕБ. Исходные тексты одни и те же. Кроме chmode ничего платформозависимого.

                          Мне кажется, все так делают. Недавно жене в институте установил Moodle (онлайн обучение) — та же схема. Копируешь папку, а дальше веб-настройка.


                          1. KlimovDm
                            15.09.2016 17:07
                            +1

                            Знание того, в какое место нужно скопировать папку в зависимости от платформы — это администрирование или прикладное программирование? :)


                            1. aon24
                              15.09.2016 17:22
                              -1

                              Если не понятно, куда копировать, то в виндовс есть $Recycle.Bin, в Linux копировать в папку nul.


                              1. KlimovDm
                                15.09.2016 17:33
                                +2

                                В линуксе нет папок. И nul там нет. В общем — понятно.


                      1. loginsin
                        15.09.2016 17:15
                        +1

                        У вас слишком зауженное понимание термина «прикладное программирование».
                        Ну это на мой взгляд. На тот же (мой) взгляд, вы слишком настойчиво пытаетесь навязать весьма далекую от действительности точку зрения о бесполезности понимания процессов ОС для прикладного программирования.
                        Вообще странно видеть человека, который занимается программированием, но упорно не желает изучать среды, под которые программирует.

                        О времена, о нравы


                        1. aon24
                          15.09.2016 18:02
                          -2

                          В чем зауженность термина «прикладное программирование»?
                          Наш проект сочетает multiThreadin и multiprocessing, сервера общаются друг с другом и со смежными системами по 7 протоколам, могут одновременно работать с разными sql-серверами, полнотекстовый поиск через сфинкс.
                          При этом решается прикладная задача. Пользователям не важно, какая ОС. Нам тоже. Питон всюду одинаково работает.
                          Зачем тратить время на освоение того, что не нужно? Я вот даже не знаю, что такое реестр в винде. То ли это файл, то ли таблица, формируемая при загрузке. И совершенно не комплексую.
                          На мой взгляд, копаться в системе нужно системным программистам, тем кто пишет драйвера и системные утилиты.
                          Сейчас заказчик попросил мобильное приложение — ваяю в Android Studio и даже в мыслях нет изучать еще одну ОС.

                          Кстати никто не привел ни одного примера, зачем прикладному программисту знать тонкости ОС.


                          1. loginsin
                            15.09.2016 20:34
                            +1

                            Тонко подталкиваете к холивару? Нет уж.
                            Вот библиотеки питона, по вашему, кто писал? Системный программист? «Программист драйверов»? Как вы отличаете системного программиста от прикладного?
                            Ваша задача слишком узка для того, чтобы можно начать дискутировать на тему «Зачем программисту знать про специфику ОС».
                            Вот я знаю как писать драйверы и приложения под win, *nix системы, могу выбрать язык (c/c++, python, bash, vbs, asm), могу выбрать api (winapi, gtk), framework (dotnet, qt), написать оконное приложение, консольное. Сегодня захочу написать свою оболочку (на замену Explorer, если угодно) для win, а завтра веб-приложение. Кто я? Системный программист? Прикладной? Кросс-платформенный я или инструмент (ЯП)? Мыслите шире, изучайте, познавайте. В информационных технологиях никакие знания не бывают лишними.


                            1. aon24
                              15.09.2016 22:46
                              -2

                              Если вам это надо, изучайте. Я не против. Для моей работы это лишнее, мне и без ОС есть что изучать.
                              Задачи разные: для платформозависимых надо знать ОС, для моих — не надо. О чем спорить?
                              Прикладной программист это, имхо, тот, кто в первую очередь разбирается в прикладной задаче. Ее и надо изучать.
                              Для меня ОС — это среда для запуска приложений, и если автор скрипта пытается упростить ее настройку, я это приветствую. Тем, кто посвятил себя администрированию, наверно обидно, что имея удобный инструмент любой чел сможет сконфигурить Линукс не хуже чем гуру со стажем. Иначе я не могу объяснить столько негатива в адрес автора скрипта.
                              Вот товарищ пишет: «администрируя юникс крайне вредно использовать виндовые подходы. Что за желание сделать одно мегаприложение? Учитесь думать по другому».
                              Думать по другому для него — это помнить десятки команд и настроек, вместо того, чтобы запустить приложение, которое спросит, что я хочу и само все сделает. Причем оптимально и без ошибок.
                              Простое лучше сложного, давайте упростим настройку. Но нет: деды руками вводили команды, отцы вводили и мы будем. Как в старой шутке: в Линукс настроить можно все, и вы, блин, будете настраивать все.


                              1. iAndrey
                                16.09.2016 05:08

                                А вам не надо знать как работает SQL сервер, который обрабатывает запросы вашего ПО?

                                Не умеешь linux — ставь Ubuntu, там всё просто. Зачем выбирать систему, где предполагается наличие скиллов у администратора, если администратора нет?

                                Оптимально и без ошибок? Повторю вопрос (если и сейчас уйдёте от ответа, значит вас всё устраивает): к скрипту у вас претензий нет — он хорошо написан, делает правильные вещи правильным образом?


                                1. aon24
                                  16.09.2016 10:38

                                  1. с точки зрения программиста сервер работает одинаково на всех платформах. Настройки разные, — это как раз то, на что тратится время. И кроссплатформенный инсталлятор облегчит работу.
                                  2. Я выбираю систему из того, что стоит у заказчика или из списка систем провайдера
                                  3. Я не писал, что скрипт хорош, я говорил о шаге в правильном направлении


                                  1. JIghtuse
                                    16.09.2016 15:11

                                    Шаг в правильном направлении — Cockpit, например. Но даже там вы можете увидеть терминал.


                                    1. aon24
                                      16.09.2016 15:42

                                      спасибо за ссылку. Мне понравилось.
                                      Я так понял, это новый проект. В общем примерно то, что я хотел.
                                      Я не против терминала, — был случай, когда доступ только по SSH


                              1. KlimovDm
                                16.09.2016 08:37

                                >>>Думать по другому для него — это помнить десятки команд и настроек, вместо того, чтобы запустить приложение

                                На самом деле с вами сложно дискутировать. Вы оперируйте заблуждениями из прошлого века, и, судя по вашим сообщениям, когда вы пишете о линаксе, то вообще не понимаете тему.
                                Но это, конечно же, не надо «прикладному программисту», знающему, сколько строчек кода у него в проекте.

                                Знаете, условно есть две категории программистов.
                                Одни делают место, доступным для записи только веб-сервером chmod 777 dirname
                                К ним, видимо, и вы относитесь, потому что сами написали, что кроме chmod ничего не знаете.
                                Другие используют chown uid:gid dirname
                                Между этими решениями есть тонкая разница. Когда вы ее осмыслите, с вами можно будет дискутировать дальше.

                                А к автору скрипта я не увидел никакого негатива, это вам показалось.


                                1. aon24
                                  16.09.2016 11:48
                                  -2

                                  Мне кажется, в ваших письмах появились эмоции. Не надо раздражаться. Все хорошо, вчера наши победили:)
                                  Про chown — грешен, утаил: я его тоже использую.

                                  Вам показалось, что я писал конкретно про Ваш негатив.

                                  Да, мы делаем веб-приложения. За ними будущее. Толстые клиенты вымрут, а платформозависимое ПО останется в инструментальной сфере.

                                  По поводу скрипта: шарить по каталогам и вводить команды руками я считаю тупой работой. Помнить десятки команд и сотни параметров я считаю бесполезными знаниями. Потому что все это может сделать компьютер. Он для того и придуман.


                          1. iAndrey
                            16.09.2016 04:59

                            Алексей, вы лукавите. Поделие Результата, может и использует несколько протоколов и sql серверов. Только не потому что «сложное и крутое», а потому что вы не осилили кластеризацию и репликацию sql. В прошлых темах вам уже говорили, что ваш подход крайне не эффективен — где можно создать 100К записей, вы создаёте 1М.

                            Вы кривую архитектуру пытаетесь выставить как достоинство. Системные требования вашего ПО можно? А результаты тестирования производительности?


                            1. aon24
                              16.09.2016 11:13

                              Я не удачно выразился. Имеется в виду, что часть данных может храниться в MySQL, часть в Postgree
                              Подход эффективен, потому что все работает прекрасно. Кстати вместо 100к у нас будет примерно 5М. И что? Вас это пугает? Система, которая стояла до нас была сделана на нормализованной базе и работала медленнее.
                              Вы что-нибудь слышали о mangoDB? Если для Вас она тоже кривая, то говорить не о чем. У нас тот же принцип реализован иначе и на базовых запросах работает быстрее (сбор отчетов, правда, медленнее).

                              Не думаю, что здесь уместно рассказывать о системных требованиях.

                              Результаты тестирования — вещь многоплановая. Если коротко, годовые отчеты собираются за 2-30 мин. Поиск работает быстро: в ТЗ был прописан Сфинкс (отличная вещь, кстати), но потом попросили убрать кнопку. Потому что родной поиск по скорости работает практически также (меньше секунды, в таблице 20 млн строк).


                              1. grossws
                                16.09.2016 15:51

                                Вы что-нибудь слышали о mangoDB? Если для Вас она тоже кривая, то говорить не о чем.

                                Вы про эту, надеюсь? Прекрасная быстрая CLOUD SCALE база без IO bottleneck'а.

                                ибо
                                танки /dev/null'ы наши быстры


                                1. aon24
                                  16.09.2016 16:41

                                  Приношу извинения за опечатку (очень хотелось съесть манго). Конечно MongoDB.


                              1. iAndrey
                                17.09.2016 06:04

                                Т.е. вы не используете по полной ни тот, ни другой. Или они не взаимозаменяемы, тогда какой от этого профит?

                                Какой «тот же»? Вы уже внутри реляционной СУБД сидите, а используете её как документоориентированную. И рассказываете тут о производительности хорошей.

                                Конечно, если вы расскажете о системных требованиях, вам уже не получится петь о высокой скорости работы.


                1. citius
                  15.09.2016 00:00
                  +3

                  Да эт наверное разработчики битрикса.
                  Все в порядке.


  1. kalobyte
    10.09.2016 05:55
    +10

    вот так вот автор столько лет писал скрипт, юзал его и горя не знал
    поделился с миром и оказывается в реальном мире код надо выкладывать на гитхаб, код написан не правильно, а правильно надо через dialog, в 2016 году уже есть всякие механизмы автоматизации ansible, да и вообще скрипт от рута работает

    вот так вот послушаеш всех и поймеш, что оказывается твои знания давно устарели и ты не модный админ, застрял где-то в прошлом
    и тут самооценка падает и больше не хочется быть админом (типа смайлик тут)


    1. Showvars
      10.09.2016 08:29
      +2

      однако только в собственном соку тоже не стоит варится :)


  1. Anakros
    10.09.2016 07:29
    +9

    Эпично. Жду твикера и компрессора реестра от автора.


    1. sumanai
      10.09.2016 14:33
      +2

      Реестра под Linux пока нет, а вот конфиги сжимать можно уже сейчас.
      Новый скрипт удаляет комментарии и переводы строк из всех конфигурационных файлов в каталоге /etc/, уменьшая их объём, увеличивая скорость их загрузки и свободное место на диске!


      1. ValdikSS
        10.09.2016 16:03
        +2

        А как же dconf?
        dconf editor


  1. sigmatik
    10.09.2016 09:44
    -2

    Очень крутой и полезный скрипт, маст хэв так сказать. В свое время писал подобные для винды :). Автору желаю дальнейшего развития «проекта» и конечно жду поддержки Ubuntu /debian.


  1. chelovek_iz_ekb
    10.09.2016 10:18
    -2

    как новичок, с нетерпением буду ждать статью про этот скрипт, но для Debian подобных пингвинов =)


  1. white-head
    10.09.2016 10:18

    как пользователь окон и любитель делать все мышкой и хоткеями одной клавишей очень рад начать знакомство с линуксом в таком лояльном к пользователю формате!


  1. VJean
    10.09.2016 10:27
    +7

    Задаём переменную с нужным количеством пробелов, чтобы меню не разъезжалось от смены версии

    Есть же printf "%-7s${$title}"


    Определяем ОС

    if [ "$(cat /etc/redhat-release | awk {'print $2'})" == "release" ]
    и т.д. и.т.п.

    А если файл не найден?


    уберём двойные пробелы:

    cpu_model=echo $cpu_model | sed -e "s/ / /g" | sed -e "s/ / /g" | sed -e "s/ / /g" | sed -e "s/ / /g" | sed -e "s/ / /g" | sed -e "s/ / /g" | sed -e "s/ / /g" | sed -e "s/ / /g" | sed -e "s/ / /g" | sed -e "s/ / /g"

    Мои глаза! sed -e "s/ */ /g"


    iptables -A OUTPUT -p icmp -j ACCEPT

    -A OUTPUT -p icmp --icmp-type 0 -m state --state ESTABLISHED,RELATED -j ACCEPT -A OUTPUT -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


    echo "0 4 $temp * * $cron_task" >> /var/spool/cron/$(whoami)

    Нет чмода (0600) и човна ($user:crontab) соответствующего файла. Выполнять все задания от рута — рискованно.


    В целом: шибко большая простыня исходника скрипта, так и напрашивается разбитие на подскрипты, запуск с параметрами (getopts) и вынос настроек [с урлами] в отдельный файл, подгружаемый через source <(grep = "${D}/config.ini" | sed 's/ *= */=/g')
    Нет проверки на уставленный запускаемый бинарник, только проверка на установленный пакет.


    Не нашел самого важного: бекапы.


  1. rockin
    10.09.2016 11:03
    +5

    Каждый уважающий себя и своё время админ пишет скрипты для автоматизации рутинных или просто повторяющихся изредка действий.
    Ключевое слово тут «скрипты». Во множественном числе. Вызов конкретного скрипта исключает возможность ошибки, возможность затереть что-то правленое руками и конкретный костыль.

    Я не знаю, чем конкретно руководствовался автор, когда столько времени убил на более удобное представление и так элементарных вещей.

    Когда мы ставим некий сервис на сервер, будь то прокси, впн, почта, веб-сервер и так далее, мы должны ПОНИМАТЬ, что мы делаем. Иначе в случае ошибок или краха всё равно придётся лезть в мануалы, а при установке мы туда не лазили, поэтому разбираться сложнее придётся.

    Слишком много я знаю людей, которые представляют, как установить некие сервисы (например, nginx, php) и совсем не знают, как их конфигурировать. А уж ошибки разобрать — так это вообще за гранью фантастики… Для них подобные скрипты, всякие испменеджеры (кои сами могут падать) — сущее зло, т.к. человек хватает верхушки, управляет сервисами костылём, а мануалы-то совсем простые, открыл файл, прописал строчки, перезапустил сервис или перечитал конфиги — всё.


  1. tushev
    10.09.2016 12:16
    -2

    Меня печалит и удивляет что подобные утилиты не встроены в популярные дистрибутивы. Пока для себя я этот вопрос решил написанием большой шапаргалки на Google Documents с кучей команд, кусков конфигов и т.п.


  1. tushev
    10.09.2016 12:17
    +1

    Было бы хорошо, если бы этот скрипт помимо выполнений действий, опционально показывал какие команды или изменения он сейчас будет выполнять и давал текстовые пояснения своим действиям. А то просто верить и наедятся что он все сделает как надо — это не очень хорошая практика.


    1. stilet69
      10.09.2016 16:02
      +1

      Так ведь скрипт на баше! Открыл в любом текстовом редакторе и посмотрел


    1. JIghtuse
      10.09.2016 18:09
      +1

      Пишете в начале скрипта:

      set -x
      И наблюдаете всё, что он делает. Однако, соглашусь с отдельными комментариями, рекомендующими ознакомиться хотя бы с основами системы, в которой работаешь, прежде чем запускать скрипты из интернета.


  1. Alex_ME
    10.09.2016 12:53

    Кстати, вопрос к администраторам Linux (сам я нуб).


    Код на bash лично мне делает больно глазам — переменные, условия, циклы (ну это понятно, он выполняется командным интерпретатором).
    Почему бы не использовать скрипты на том же Python, который куда понятнее и удобнее для чтения и позволяет с легкостью вызывать команды. Во многих десктоп-дистрибутивах он уже есть "из коробки", а если есть — легко поставить?


    1. JIghtuse
      10.09.2016 18:25

      Кто-то и делает на Python/Ruby/Perl, кто-то рекомендует в различных целях только на них и писать системные скрипты.

      Преимущество bash/dash/ash в повсеместности, на любом тапке под UNIX будет подобный шелл. Стандарт POSIX требует наличия этого, насколько помню. Помимо этого, во множестве дистрибутивов он является login shell, а посему более-менее известен пользователям. Ну и на мой взгляд, простые скрипты делать на bash просто: используются ровно те же команды, что вы можете писать руками (то есть, взял из истории пачку строк, сохранил в файл — есть скрипт); различные expansions, куча руководств по созданию скриптов именно в обычном шелле. С другой стороны, когда такой скрипт разрастается — его уже сложнее править и читать, да и разных (для многих неожиданных) особенностей хватает.

      Я бы сказал, что если ваш скрипт будет запускаться только в современных системах на десктопе и вы знаете Python/Perl/Ruby — стоит на них и писать.


  1. OasisInDesert
    10.09.2016 14:37
    -5

    Интересная штука, сам наверно пользоваться не буду, но какому нибудь волею случая администратору Линукса вполне пригодится.


    1. Tolsty_kot
      13.09.2016 13:45

      Нет, не пригодится. Тот, кто пользуется таким вот скриптом не должен называть себя Линукс админом.


  1. safinaskar
    10.09.2016 14:42
    +5

    В статье с таким названием ожидал увидеть «rm -rf /*». Лень разбираться с линуксом? Сделайте rm, снесите линукс и поставьте винду.


  1. KlimovDm
    10.09.2016 15:45
    +3

    Вообще это ужасно. Автор, без обид, но администрируя юникс крайне вредно использовать виндовые подходы. Что за желание сделать одно мегаприложение? Учитесь думать по другому.


  1. Darknikolas
    10.09.2016 16:03
    -3

    Очень полезная вещь, благодарю от души. Такие скрипты очень облегчают и больше времени остаётся на другие дела.
    Единственная просьба есть у меня добавить в панели управления серверами webmin ;) хотя я ещё не юзал скрипт (сегодня проверю обязательно ) но на сколько понял по описанию webmin нет(((
    До сих пор использую centminmod для автоматизирования многих задач в Centos.


  1. ZEEGIN
    11.09.2016 11:25
    -1

    Я просто оставлю это здесь
    KISS-принцип


  1. bagiroff777
    11.09.2016 22:51
    -1

    У меня есть брат, который хотел бы разобраться в linux. Только ему этот скрипт и пригодился.


    1. sumanai
      12.09.2016 02:13
      +4

      В итоге в Linux он так и не разобрался.


  1. DeLuxis
    12.09.2016 06:58
    +4

    Потом просят вот такие вот сервера «чуть чуть поправить» или избавить сайт от «вирусов».


  1. Slow_Mo
    14.09.2016 11:57

    Присоединяюсь к советчикам «не использовать это у себя» и «не делать так».
    Автору желаю принять критику конструктивно и перейти на сторону LInux-way.
    Для любителей «все в одном скрипте» и «я не хочу разбираться, хочу чтоб работало» есть уже готовые изделия, написаные специалистами, например Yast в OpenSUSE (если оно ещё живо).


  1. delvin-fil
    14.09.2016 11:57

    Ну что же такое? Почему у меня процессор CPU: 4 x 0 MHz. Он же быстрый...image
    https://yadi.sk/d/ckhrwTfduxc7x

    ЗЫ: Извиняюсь перед всеми хабровчанами. Я еще не разобрался(о картинке) в структуре комментариев и предпросмотр не помогает, засим, одна из ссылок лишняя, а исправить мне без инвайта невозможно.


  1. rumanzo
    14.09.2016 11:58

    Я очень скептически ко всему этому отношусь, но допускаю что есть люди кому это может быть полезно. Но в некоторых местах из глаз почти пошла кровь. Вы не думали это переписать на python или perl с минимальным вызовом внешних программ?
    Плюс есть вещи вроде webmin, и вы могли бы написать модуль для него (или в некоторых местах использовать его)?


    1. aureliano_b
      15.09.2016 16:54
      -2

      >… с минимальным вызовом внешних программ… [x] на python или perl

      вы, простите, какую операционную систему используете на своем сервере? :)


      1. rumanzo
        15.09.2016 18:02
        +2

        В основном centos. И там тот же питон в любом случае есть. И скорее всего это лучше чем городить велосипеды из череды пайпов на awk и sed.
        А про минимальный вызов внешних программ, это я имел в виду скорее предостережение для тех кто хочет из perl'а grep вызывать (видел и такое).


        1. delvin-fil
          16.09.2016 05:01

          Не вспомню адрес, ибо давно было.
          На stackoverflow один товарищ предлагал писать через os и subprocess именно через grep монитор температуры проца примерно так:

          a = subprocess.Popen("cat /sys/class/hwmon/hwmon1/temp4_input", stderr=None, stdout=PIPE, shell=PIPE)
          a = int(a.stdout.read())
          a = a/1000; a = str(a)
          

          Или так:
          a = subprocess.Popen("sensors |grep temp|sed q", stderr=None, stdout=PIPE, shell=PIPE)
          a = int(a.stdout.read())
          a = a/1000; a = str(a)
          

          Или:
          b = os.system("sensors |grep temp|sed q")
          

          Уже и не помню:)
          Так ведь работает же:)


    1. delvin-fil
      16.09.2016 04:52

      Согласен. Решаю подобные вещи на питоне.