-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprocessClient.js
More file actions
178 lines (163 loc) · 6.91 KB
/
processClient.js
File metadata and controls
178 lines (163 loc) · 6.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
// processClient.js
/**
* processClient.js
*
* Описание:
* Клиентское приложение для подключения к сервису ProcMonitor и получения событий процессов.
* Поддерживает подключение через Unix Domain Socket или TCP-сокет с аутентификацией.
*
* Использование:
* node processClient.js [options]
*
* Опции:
* -s, --socket <path> Путь к Unix Domain Socket (по умолчанию: /var/run/procMonitor.sock)
* -H, --host <hostname> Хост для подключения через TCP (по умолчанию: localhost)
* -p, --port <port> Порт для подключения через TCP (по умолчанию: 8080)
* -a, --auth <password> Пароль для аутентификации в TCP-сокетном режиме
* -t, --tcp Включает TCP-сокетный режим
* -h, --help Отображает справочную информацию
*
* Примеры:
* node processClient.js --socket /var/run/procMonitor.sock
* node processClient.js --tcp --host 127.0.0.1 --port 8080 --auth mysecretpassword
*/
const net = require('net');
const readline = require('readline');
const yargs = require('yargs');
// Парсинг аргументов командной строки
const argv = yargs
.option('socket', {
alias: 's',
description: 'Path to Unix Domain Socket',
type: 'string',
default: '/var/run/procMonitor.sock'
})
.option('host', {
alias: 'H',
description: 'Hostname for TCP connection',
type: 'string',
default: 'localhost'
})
.option('port', {
alias: 'p',
description: 'Port for TCP connection',
type: 'number',
default: 8080
})
.option('auth', {
alias: 'a',
description: 'Password for TCP authentication',
type: 'string'
})
.option('tcp', {
alias: 't',
description: 'Enable TCP mode',
type: 'boolean',
default: false
})
.help()
.alias('help', 'h')
.argv;
// Функция для подключения к Unix Domain Socket
function connectUnixSocket(socketPath) {
const client = net.createConnection({ path: socketPath }, () => {
console.log(`Подключено к ProcMonitor через Unix Domain Socket: ${socketPath}`);
});
client.on('error', (err) => {
console.error(`Ошибка подключения: ${err.message}`);
process.exit(1);
});
const rl = readline.createInterface({
input: client,
crlfDelay: Infinity
});
rl.on('line', (line) => {
try {
const event = JSON.parse(line);
switch (event.event) {
case 'fork':
console.log(`Процесс Форка: Родитель PID=${event.parent_pid}, Дочерний PID=${event.child_pid}, Пользователь=${event.user}, Команда="${event.cmdline}"`);
break;
case 'exec':
console.log(`Процесс Exec: PID=${event.pid}, Пользователь=${event.user}, Команда="${event.cmdline}"`);
break;
case 'exit':
console.log(`Процесс Завершен: PID=${event.pid}, Код выхода=${event.exit_code}, Пользователь=${event.user}`);
break;
default:
console.log('Неизвестное событие:', event);
}
} catch (err) {
console.error('Не удалось разобрать JSON:', err, 'Строка:', line);
}
});
rl.on('close', () => {
console.log('Отключено от ProcMonitor');
process.exit(0);
});
client.on('end', () => {
console.log('Отключено от ProcMonitor');
});
}
// Функция для подключения к TCP-сокету с аутентификацией
function connectTCPSocket(host, port, password) {
const client = new net.Socket();
client.connect(port, host, () => {
console.log(`Подключено к ProcMonitor через TCP: ${host}:${port}`);
if (password) {
client.write(`${password}\n`);
}
});
client.on('data', (data) => {
const message = data.toString();
if (message.includes('Authentication successful')) {
console.log('Аутентификация успешна. Получение событий...');
} else if (message.includes('Authentication failed')) {
console.error('Аутентификация не удалась. Отключение.');
client.end();
} else {
// Обработка полученных событий
try {
const event = JSON.parse(message);
switch (event.event) {
case 'fork':
console.log(`Процесс Форка: Родитель PID=${event.parent_pid}, Дочерний PID=${event.child_pid}, Пользователь=${event.user}, Команда="${event.cmdline}"`);
break;
case 'exec':
console.log(`Процесс Exec: PID=${event.pid}, Пользователь=${event.user}, Команда="${event.cmdline}"`);
break;
case 'exit':
console.log(`Процесс Завершен: PID=${event.pid}, Код выхода=${event.exit_code}, Пользователь=${event.user}`);
break;
default:
console.log('Неизвестное событие:', event);
}
} catch (err) {
console.error('Не удалось разобрать JSON:', err, 'Сообщение:', message);
}
}
});
client.on('error', (err) => {
console.error(`Ошибка подключения: ${err.message}`);
process.exit(1);
});
client.on('close', () => {
console.log('Отключено от ProcMonitor');
process.exit(0);
});
}
// Основная логика подключения
if (argv.tcp) {
// TCP-сокетный режим
if (!argv.auth) {
console.error("Ошибка: В TCP-режиме необходима опция --auth <password>.");
process.exit(1);
}
connectTCPSocket(argv.host, argv.port, argv.auth);
} else if (argv.socket) {
// Unix Domain Socket режим
connectUnixSocket(argv.socket);
} else {
// Если ни один режим не выбран, по умолчанию использовать Unix Domain Socket
connectUnixSocket(argv.socket);
}