Да, съгласен съм, извинявам се за което.
Ще напиша RPC сървър и клиент за него.
Сървърът ще приема и ще отговаря асинхронно на заявки през HTTP.
Процесите които ще могат да се викат през него са:
- CPU usage - Натовареност на процесора
- Memory usage - Натовареност на RAM паметта
- Traffic monitor - Брой активни TCP връзки, брой на новоотворените TCP връзки за интервал от x секунди, натовареност на мрежата
- Active processes - Списък с активните процеси
- Проверка за активността на даден процес
- Стартиране на програма (по конфигуриран път до нея)
- Спиране на програма (по ID, върнато от active processes)
Сървърът ще чете своята конфигурация (bind address / port / trusted keys) от файл. Поддържаните формати са JSON и XML.
През конфигурационния файл ще могат и да се "изключват" част от процесите, които клиента може да вика.
Този сървър се деплойва върху всеки хост, който трябва да се следи.
Клиента:
Конфигурира се през файл (JSON / XML). Опциите за конфигурация са:
- Списък от хостве, които да се следят
- Услуги, които да се следят
- Интервал на проверка за дадна услуга
- log файл за дадения хост
- аларма
- Действия, ако алармата се задейства
За всяка следена услуга ще има набор от "аларми", които да се задействат.
За CPU usage, Memory usage, Network traffic usage това представлява лимит на натовареността за даден период от време. (Т.е. 99% CPU usage, 99% RAM usage -> something wrong).
За проверка на активност на процес алармата е спрян процес.
Действия при задействане на алармата:
CPU usage, Memory usage, Traffic Monitor, проверка на активност на процес поддържат действие спиране на процес.
Проверка на активност на процеса поддържа действие стартиране на програма.
Една конфигурация на сървъра би била (примерно):
server: {
port: `<number>`,
bind-to-address: `<address / *>`,
trusted-certs: `<path to certifficates file>`
allowed-processes: `[cpu, memory, traffic]`
}
Една конфигураця на клиент би била:
host: {
address: `<address:port>`,
cert: `<path-to-certifficate-file>`,
monitor: {
service {
name: `"<име на услугата>"`,
alarm: `usage-over <number>`,
action: `"stop: <service-name>"`,
poll-interval: `<milliseconds>`,
},
service {
name: `"<име на услугата>"`,
alarm: `"process-inactive"`,
action: `"start: <service-name>"`,
poll-interval: `<milliseconds>`,
}
}
}