Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Сценарий проверки доступности машин для шлюза и автоматизация отключения питания  (Прочитано 1664 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн V_ctor

  • Автор темы
  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Возможно я изобретаю велосипед, но ...
Возникла тут такая задача имеется шлюз который раздает инет на несколько машин. Дак вот хотелось заавтоматизироать его отключение ибо иногда бывает что  нельзя пойти и узнать нужен он еще или можно отключить да бы не палить электричество зря. Все думал найти готовый скрипт, но увы полчаса гугления ничего не дали, а тут наткнулся
на подобный сценарий
http://salomatin.ru/index.php?option=com_content&view=article&id=54:scriptnet&catid=36:scripts&Itemid=61
и решил по его подобию сваять и поделиться. Представляю на суд

#!/bin/bash                                                                                                                                                   
IPs=$(arp | grep lan | awk '{print $1}')                                                                                                                       
count=3                                                                                                                                                       
attempt=2                                                                                                                                                     
timeout=5                                                                                                                                                     
file="/tmp/CheckClientPresent.tmp"                                                                                                                             
                                                                                                                                                               
if [ -z $IPs ]; then          # if ARP is empty then  remember it                                                                                   
#    echo "Arp is empty"                                                                                                                                       
        if [ -f ${file} ]; then                                                                                                                               
            f=$(cat ${file})                                                                                                                                   
            if [ ${f} -eq ${attempt} ]; then                                                                                                                   
                 echo "shutdown" > ${file}                                                                                                                     
                rm ${file}                                                                                                                                     
                poweroff                                                                                                                                       
            else                                                                                                                                               
                    att=$(expr ${f} + 1)                                                                                                                       
            fi                                                                                                                                                 
        else                                                                                                                                                   
            att=1                                                                                                                                             
        fi                                                                                                                                                     
        if [ ! -z ${att} ]; then #if att not empty then write it in file                                                                       
            echo ${att} > ${file}                                                                                                                             
        fi                                                                                                                                                     
    exit 0;                                                                                                                                                   
fi                                                                                                                                                             
for ip in $IPs; do                                                                                                                                             
    echo "${ip}"                                                                                                                                               
    result=$(ping -c ${count} ${ip} -w ${timeout} | tail -2 | head -1 | awk '{print $4}' )                                                                     
    if [ $result = 0 ]; then                                                                                                                                   
#echo ${result}                                                                                                                                         
        if [ -f ${file} ]; then                                                                                                                               
            f=$(cat ${file})                                                                                                                                   
            if [ ${f} -eq ${attempt} ]; then                                                                                                                   
                echo "shutdown" > ${file}                                                                                                                     
                rm ${file}                                                                                                                                     
                poweroff                                                                                                                                       
            else                                                                                                                                               
                    att=$(expr ${f} + 1)                                                                                                                       
            fi                                                                                                                                                 
        else                                                                                                                                                   
            att=1                                                                                                                                             
        fi                                                                                                                                                     
        if [ ! -z ${att} ]; then    #if att not empty then write it in file                                                                       
            echo ${att} > ${file}                                                                                                                             
        fi                                                                                                                                                     
    else                                                                                                                                                       
#<----->echo ${result}                                                                                                                                         
          rm ${file}         #if at least one client found del file                                                                                         
          exit 0;                                                                                                                                               
    fi                                                                                                                                                         
done

Смысл простой проверяем арп таблицу, если записей сопоставленных нашей сети (у меня это виртуальный мост из нескольких сетевух с именем lan у вас может быть eth0 или eth1) не найдено, то делаем отметку в файле, иначе прибиваем файл-отметку
Но поскольку механизм записей  арп не самый надежный спосбо здесь, то получив из нее записи быренько пропингуем их и посмотрим, если хоть кто-то где-то откликнулся, то выходим, если по всем тишина, то тоже делаем отметку.
Как токо счетчик дойдет до необходимок кол-а выдаем останов шлюза. Теперь знаем что если в течении N минут нет жизни в локальной сети, то шлюз загасится сам.

далее наш скрипт надо занести в крон
признаюсь честно сделать по правиламм через команду crontab  мне не удалось. Вроде все создается. Все какие надо записи образуются, но ничего не запускается. По этому я поступил не красиво прописал прямо в /etc/crontab
строку типа
*/6 * * * * root /home/victor/My/CheckClientsPresent.sh
где CheckClientsPresent.sh имя этого скрипта
так оно заработало

Временный файл создается в /tmp специально т.к. оно смонтировано с tmpfs , а винты так же гасятся после 10 минут простоя, таким образом мы их не дергаем лишний раз
Жаль что мой шлюз не умеет пробуждаться еще от сетевухи, было б совсем здорово!  ))))

Подчеркну что это чисто для машин которые выполняют роль шлюза! Если у вас крутятся какие-то дополнительные серверные сервисы типа почты, то конечно гасить вам смысла нет.

P.S. это мой первый башевский скрипт. так что особо не... Если есть конструктивные предложение как это все упростить, то буду рад.
P.P.S а ну и это расчитано на небольшую локальную сеть ибо если у вас 100 машин, то конечно это наверно не лучший способ пинговать их. Хотя логка тут такая что как токо находим первую живую машину то заершаемся, вряд ли это будет сотая из ста, пусть десятая или двадцатая, ну и интервал можно побольше задать

 

Страница сгенерирована за 0.022 секунд. Запросов: 22.