
Модуль управління процесами на віддаленій еом
Сторона клієнта (менеджера)
За допомогою цього модуля можна керувати процесами на віддаленій машині, а саме він дозволяє вибрати необхідний процес для запуску, отримати результат роботи та завершити запущений процес.
Рис.1. Вигляд вікна вибору та запуску процесів
HTML:
<select id="process">
<OPTION>Calc.exe</OPTION>
***
<OPTION>MsPaint.exe</OPTION>
</select>
<input onclick="snmp_set_run_process()" type="submit" value="Запустити процес" />
JS:
function snmp_set_run_process() {
setInterval(function(){
get_process();
}, 10000); {
$.ajax({
type: 'POST',
url: 'http://127.0.0.1:81/kursak_client/snmpset.php',
data: 'process=' + $('#process').val(),
success: function(data){ alert(data); }});}
При натисканні на кнопку “Запустити процес” ми запускаємо функцію get_proccess() з інтервалом в 10 секунд. Далі ми відправляємо асинхронний запит методом POST на сторінку з адресою http://127.0.0.1:81/kursak_client/snmpset.php . В запиті POST ми передаємо вміст тега process.
snmpset.php
<?
session_start();
$n_process;
switch($_POST['process']) {
case 'Calc.exe':$n_process = '1'; $_SESSION['process'] = 'Calc.exe';break;
…
case 'MsPaint.exe':$n_process = '4'; $_SESSION['process'] = 'MsPaint.exe';break;
default:
echo 'Error'; };
snmp_set_quick_print(1);
$c = snmpset("192.168.1.4", "pub1", ".1.3.6.1.4.1.2021.14.1.1.2.0", "s", $n_process);
?>
Snmpset.php служить для відправки певних даних в SNMP змінну ucdDemoPublicString, її цифровий запис ".1.3.6.1.4.1.2021.14.1.1.2.0”.
Спочатку ми створюємо сесію, перевіряємо номер процесу, записуємо его в сесію і відправляємо даний номер на іншу машину з IP 192.168.1.4, з community pub1. Тип даних, який ми записуємо – String, про що свідчить символ “s” у функції snmpset(). Після цього сторінка Snmpset.php віддає відповідь про помилку (якщо вона була) на сторінку index.php
Функція get_process(), яку ми запускаємо з інтервалом в 10 секунд після запуску snmp_set_run_process().
function get_process() { $.ajax({
type: 'GET',
url: 'http://127.0.0.1:81/kursak_client/get_process.php',
data: '',
success: function(data){
$('#process_now').html(data);
$('#kill').html('<input id="knopka" onclick="snmp_set_kill_process()" type="submit" value="Вбити процес" />'); } }); }
Під час виконання цієї функції ми звертаємося через асинхронний запит методом GET на сторінку: …kursak_client/get_process.php, яка містить наступний код, який виводить процес з сесії (процес був записаний на сторінці snmpset.php).
get_process.php
<? session_start();
echo $_SESSION['process']; ?>
В результаті успішного виконання Ajax запиту функція js get_process()
виводить запущений процес і дозволяє його завершити.
Рис.2. Вигляд вікна запущених процесів.
HTML:
<input id="knopka" onclick="snmp_set_kill_process()" type="submit" value="Вбити процес" />
Функція js snmp_set_kill_process() створена для того, щоб завершувати необхідні процеси та виводити результат роботи.
function snmp_set_kill_process(){{
$.ajax({
type: 'POST',
url: 'http://127.0.0.1:81/kursak_client/snmpset_kill.php',
data: 'process_now=' + $('#process_now').text(),
success: function(data){
alert(data); }});}}
Snmp_set_kill_process() відправляє асинхронний запит методом POST на сторінку h://127.0.0.1:81/kursak_client/snmpset_kill.php і передає вміст тега
<p id="process_now"> </p>. Таким чином реалізований механізм завершення процесів, які були запущені через менеджер на віддаленій машині.
У результаті успішного запиту на сторінку snmpset_kill.php JS виводить інформацію про помилку чи про успішний запит.
Процеси запускає і завершує сервер Apache, який встановлено на віддаленій машині. Він виконує роль snmptrapd, який в певний інтервал часу перевіряє змінні MIB, та запускає чи завершує процеси.
Використання серверу Apache дозволяє запускати дану утиліти на будь-якій платформі (ОС), яка підтримує Apache, таким чином підтримується кроссплатформенність.
Snmpset_kill.php
<?
session_start();
$n_process;
switch($_POST['process_now']) {
case 'Calc.exe':$n_process = '1'; $_SESSION['process'] = 'Calc.exe';break;
…
case 'MsPaint.exe':$n_process = '4'; $_SESSION['process'] = 'MsPaint.exe';break;
default:
echo 'Error';
};
snmp_set_quick_print(1);
$c = snmpset("192.168.1.4", "pub1", ".1.3.6.1.4.1.2021.14.1.1.2.0", "s", '0' . $n_process);
sleep(15);
$c = snmpset("192.168.1.4", "pub1", ".1.3.6.1.4.1.2021.14.1.1.2.0", "s", '00');
?>
snmp_set_quick_print(1); // дозволяє отримувати тільки значення змінної з MIB, але без його типу.
Після передачі методом POST змінної $_POST[‘process_now’], вона перевіряється і заноситься в змінну $n_process, після чого дані передаються функцією snmpset() і змінюється другий символ змінної ucdDemoPublicString на 0, що означає завершення процесу.
Також слідує функция sleep(15), яка призупиняє роботу скрипту і чекає 15 секунд, щоб виконати наступний запит snmpset(), при якому змінна ucdDemoPublicString отримує значення String ‘00’, щоб уникнути повторного запуску процесів на віддаленій машині. Перший символ в змінній відповідає за запуск процесу, а другий відповідає за його завершення.
Серверна сторона (агент)
С
ервер
або агент необхідно запустити на
віддаленій машині, щоб агент міг
відповідати на запити менеджера. Для
цього потрібно запустити на віддаленій
машині утиліту snmpd.exe
від net-snmp.
Тільки після цього ми можемо використовувати
протокол snmp,
подавати запит через консоль і
отримувати відповідь.
Рис.3. Запуск служби snmpd
Для перевірки його роботи необхідно в консолі ввести команду
Snmpget –v2c –c pub1 192.168.1.4 .1.3.6.1.2.1.1.5.0
Д
е
v2c
– версія протоколу, pub1
– community,
192.168.1.4 – ip
адреса машини, на якій запущений агент
snmpd.exe
і директива MIB, яка містить в собі
ім’я машини.
Рис.4. Запуск команди snmpget
Серверна сторона управління процесами (веб-інтерфейс)
Для того, щоб дати змогу запускати та завершати процеси на віддаленій машині, на ній потрібно запустити (крім агента snmpd) в браузері скрипт snmpd.php. Це необхідно для того, щоб Apache мав змогу запускати та завершати процеси, а також для візуального вигляду.
Рис.5. Запуск скрипту snmpd.php
HTML:
<input onclick="set_snmptrapd_on()" value="Запуск Snmptrapd" />
<input onclick="set_snmptrapd_off()" value="Зупинка Snmptrapd" />
JS:
function set_snmptrapd_on()
{
interval_snmptrapd = setInterval(function(){ set_snmptrapd_on1(); }, 15000); };
Функція set_snmptrapd_on() створює інтервал з назвою interval_snmptrapd, який буде запускати іншу функцію – set_snmptrapd_on1() кожних 15 секунд.
function set_snmptrapd_on1() {
clearInterval(interval_snmptrapd);
$.ajax({
type: 'GET',
url: 'http://127.0.0.1:81/kursak/snmptrapd_on.php',
data: '',
success: function(data){
//alert(data); }});}
Функція set_snmptrapd_on1() спочатку знищує інтервал з назвою interval_snmptrapd для того, щоб не навантажувати сервер та уникнути зайвих запитів. Далі йде асинхронний запит методом GET на сторінку:
'http://127.0.0.1:81/kursak/snmptrapd_on.php'
У разі успішного запиту браузер отримає статус завершення скрипту.
Snmptrapd_on.php
<?
snmp_set_quick_print(1);
$rez_snmpget = snmpget("192.168.1.4", "pub1", ".1.3.6.1.4.1.2021.14.1.1.2.0");
switch ($rez_snmpget[1]) {
case '1':exec('calc.exe');break;
…
case '4':exec('mspaint.exe');break;
default:
echo "Error run proccess";};
?>
Скрипт snmptrapd_on.php звертається до змінної ucdDemoPublicString через функцію snmpget і перевіряє другий символ (або перший символ, якщо не враховувати ‘ ‘, які записуються в змінну коли виконується команда snmpset.
Після перевірки скрипт запускає необхідний процес.
Інтервал для перевірки команди на завершення процесу:
setInterval(function() { set_snmptrapd_kill(); }, 10000);
Який запускає функцію set_snmptrapd_kill() з інтервалом в 10 секунд.
function set_snmptrapd_kill() {
interval_snmptrapd = setInterval(function() { set_snmptrapd_on1(); }, 15000);
$.ajax({
type: 'POST',
url: 'http://localhost/kursak/snmptrapd_kill.php',
data: 'n_kill=' + n_kill,
success: function(data){ }});}
Функція set_snmptrapd_kill() в першу чергу знову створює інтервал (який був знищений в попередній функції), щоб відновити роботу перевірки скрипту на запуск певного процесу.
Далі відбувається запит методом POST на сторінку snmptrapd_kill.php.
Snmptrapd_kill.php
<?
switch ($_POST['n_kill']) {
case '1':exec('taskkill /F /IM calc.exe');break;
…
case '4':exec('taskkill /F /IM mspaint.exe');break;
default:
echo "Error kill proccess";};
?>
Скрипт перевіряє змінну і виконує команду cmd taskkill з параметром /F, що означає примусове припинення роботи процесу, а також з параметром /IM – пошук процесу по імені.