LINUX.ORG.RU

Послать алерт по ссш

 


0

2

Привет, ЛОР. Есть задача, не знаю как реализовать. Помоги с идеей, плес. Суть следующая: на удаленном хосте есть файлик, у которого надо мониторить время модификации. Если изменений в нем не происходит в течении, допустим, 5 минут - надо как то послать алерт на другую машину. Это всё надо закостылить на питоне. Дело осложняется тем, что на собственно удаленном хосте крутится рхел не лицензионный, то есть поставить из реп ничего не выйдет. Да и вообще там ставить ничего дополнительного какбэ не рекомендуется. Питон там 2.6.6. Собственно, наколхозить программу по отслеживанию проблем не вызывает. Проблема в том, как слать уведомлялки и куда. Может есть у кого КЕЙСЫ ?

Заранее благодарю и желаю процветания, жены хорошей и счастья.

Ответ на: комментарий от thesis

дело в том, что этих самых файлов достаточно много и лежат они на разных машинах. Раз в минуту 30 ссш соединений лепить? Как будто бы не очень идея. Точность не нужна прям до секунды.

SpaceRanger ★★★
() автор топика
Ответ на: комментарий от thesis

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

SpaceRanger ★★★
() автор топика
Последнее исправление: SpaceRanger (всего исправлений: 2)

Я не очень понял кто куда по ssh входит, но если с машины которая получает алерт на удалённый хост, то все просто.

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

С локального хоста поднимается ssh соединение, запускается эта прога и читается её стандартный вывод.

stream = os.popen('ssh host ./proga')
while 1:
   res = stream.read(4)
   if res!='good': ...

Можно и более сложные вещи делать, закидывать на стандартный ввод команды и читать результат со стандартного вывода, реализовывать так всякие варианты RPC и тд.

Только придётся следить что коннект не протух.

AntonI ★★★★★
()
Ответ на: комментарий от SpaceRanger

Не понимаю. Ставить софт на наблюдаемые хосты нельзя, но мониторящая прога на них должна как-то появиться? То есть, нельзя ставить софт только из пакетов, а самодельные костыли - можно?

thesis ★★★★★
()

може скриптик запускающийся локально на машине раз в минуту.
смотрит дату файла, если не менялся пять минут то посылает сигнал в центр.
как посылать через ssh (подключение по ключам, тупо создается файловый флаг в глубине /run), напрямую в порт (netcat или питоновы либы), смузисовременно в телеграм-чат… уже по вкусу.
скрипт костылить на чем угодно. такое и на баше можно на*башить…

pfg ★★★★★
()

Офтоп, пробегал кабанчиком, просто практикуюсь по lua =) Досвиданья.

sleep = require("posix.unistd").sleep -- apt install lua-posix

local save_host_info = nil
-------------------------
local update_seconds = 60 * 5   -- раз в 5 минут проверяем
local alert_after_seconds = 60  -- временной триггер для файликоф
------ настраивам доступ к хостам
local hosts_acess =
{
    h1 = { check=true,  user="u0_a289", host="10.42.0.233", port="8022"},
    h2 = { check=false, user="",        host="",            port=""    },
    h3 = { check=false, user="",        host="",            port=""    },
    --h4...
}
----- настраивам файлы для отслеживания на хостах
local host_files = 
{
    h1 = {"sa", "sd",  "sc"  }, -- тут файлики лежат в /home/u0_a2289/ 
    h2 = {"",    "",    ""    }, -- тоесть пути должны быть абсолютными, `~/` низяяяя
    h3 = {"",    "",    ""    }, -- это надёжно, практично и красиво хоть и избыточно
    --h4...
}
----- функция собна для дел на хостах если чево не так
local function alert(host)
   -- команда которую посылаем на сервер у меня из серверов только termux йехх
   local command  = "чвп"--"termux-open-url 'https://www.google.com/search?q=работать!'"
   local acess = hosts_acess[host];
   local executor = io.popen("ssh "..acess.user.."@"
                                   ..acess.host.." -p "
                                   ..acess.port.." "..command,"r");
end
-----
local function check_hosts_files()
    -- создать табличку хранящую информацию
    -- о времени модификации файлов хостов
if save_host_info == nil then
        save_host_info = {} -- инициализируем при первом запуске
        for host,table in pairs(host_files) do
            -- внутри пару табличек инфа о файлах и лист файлов
            if hosts_acess[host].check == true then
                save_host_info[host] = { files = {}, lists = "'" }
                for id,file in ipairs(table) do
                    -- инфа о файлах с индексацией по имени файла храним время потом в секундах
                    save_host_info[host].files[id] = { last = 0} ;
                    -- а тут подготовим строку для запроса проверки через дат модификации через `stat`
                    save_host_info[host].lists = save_host_info[host].lists .." stat -c %Z ".. file .. "; ";
                end
                    save_host_info[host].lists = save_host_info[host].lists .. "'"
            end
        end
    end
    -- обойти хосты и проверить состояние фйлов
    -- через подготовленные нами таблички \^.^/
    while true do
        -- если не хотим ставить lua-posix
        -- os.execute("sleep "..update_seconds)
        sleep(update_seconds)
        print(os.date()..">>>-------> стрела купидона поразила жьёпу :3!")
        for host,acess in pairs(hosts_acess) do
            if acess.check == true then
               -- отчаянно и без устали дрыгаем ссх и нам даже не стыдно за это!
               local executor = io.popen("ssh "..acess.user.."@"
                                               ..acess.host.." -p "
                                               ..acess.port.." "
                                               ..save_host_info[host].lists.." 2>&1","r");
               -- stat вернёт просто список дат в секундах через перевод строки
               local result = executor:read("*a");
               --print(result)
               executor:close();
               -- пришло время сохранить наши чиселки от `stat`
               if  result:find("ssh:",1,true) then 
                    print("ОШибка доступа к серверу "..host.."!")
               else 
                   local ps,pe = 1,1 -- cмещения в result, в lua с идинички, хихи дурдомчик ^.^
                   for id,time in ipairs(save_host_info[host].files) do
                       -- находим перевод строки с начала без шаблонов
                       ps , pe = result:find("\n",1,true);
                       -- вырезаем всё что до перевода строки проупская его
                       local strnum = result:sub(1,pe-1)
                       if strnum:find("stat:",1,true)  then -- stat не смог получить информацию, жесть!
                          print("Ошибка доступа к файлу '"..host_files[host][id]..
                                "'".." На хосте "..host.." Что-то там не так!!!");
                          alert(host); -- срочно уведомить хост мол какого фигу!!
                          time.last = 0
                       else
                          time.last = tonumber(strnum) or 0; 
                       end
                       -- оберзаем до следующего значения
                       -- перепрыгивая через перевод строки
                       result = result:sub(pe+1,#result);
                   end
                end
            end
        end
        -- фсё у нас есть все данные
        for host,_ in pairs(save_host_info) do
            if hosts_acess[host].check == true then
                for id,state in ipairs(save_host_info[host].files) do
                    if state.last == 0 then 
                        print(host..": состояние файла '"..host_files[host][id].."' неизвестно");
                    elseif state.last+alert_after_seconds < os.time()  then
                        print(host..": файл '"..host_files[host][id]..
                              "' не обновлялся более "..alert_after_seconds.." секунд");
                        alert(host);
                    else
                        print(host..": файл '"..host_files[host][id]..
                              "' в норме. Осталось "..state.last+alert_after_seconds - os.time())
                    end
                end
            end
        end
    end
end

check_hosts_files()
LINUX-ORG-RU ★★★★★
()

Поставь на локальном хосте ansible, настрой проверку нужных файлов и запускай раз в пять минут. Заодно облегчишь себе жизнь, раз у тебя там реально сотни файлов и хостов.

Aceler ★★★★★
()
Ответ на: комментарий от SpaceRanger

netcat позволяет работать с tcp и udp передачами внутрэ скриптов на баше.
т.е. можно можно передать строчку символов непосредственно из баш-скрипта и также баш-скриптом принять и обработать.
описаний и примеров море, к примеру https://habr.com/ru/post/336596/

pfg ★★★★★
()

А почему бы не воспользоваться логами?

Тот же самый logger умеет посылать логи по сети.

Если точности в 1 минуту достаточно, то программировать на питоне тут вообще нечего.

По хрону раз в минуту проверять файл (stat + date в помощь) и через logger отправлять сообщение.

На удаленном сервере логи мониторить логи.

vel ★★★★★
()
Ответ на: комментарий от Vlad-76

Так то да, но в lua всё что не nil и не false является true, я порой немного путаюсь и вместо false в параметрах по лени пишу просто 0 так как всю жизнь скромно пишу на сишечке свои маленькие быдлокодики и там это логично. И пару раз стрельнул себе в ухо уже =) Не привык пока, хехе, поэтому иногда пишу избыточно для подстраховки ^.^

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от Vlad-76

=) Эт хорошо, спасибо за фидбек. Я луа только только начал практиковатьб хоть раньше и тыкал. Относился скептически ибо сишник любитель, пока не влез в потраха реализаций луа. Пишу всё подряд, чисто по приколу, нраица ^.^/

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от rupert

У меня лежит скачанная pdf’ка PIL в переводе на русский, но я дальше введения не продвинулся. Онлайн руководство глянул на lua.org.ru и сразу пейсать :D (хотя я и раньше lua трогал, но так, поскольку постольку)

Хочется почитать, но эт надо время…

LINUX-ORG-RU ★★★★★
()