From 619996b91306e0a1fb2cdb73aa4e54d309e0697a Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Tue, 8 Aug 2023 22:36:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B1=D0=B0=D0=B3?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TelegramBotController.java | 21 ++++++--- .../servermonitorbot/model/Command.java | 25 ++++++++++ .../repository/SshRepositoryImpl.java | 12 ++++- .../service/TelegramBotServiceImpl.java | 2 +- .../service/ssh/SshService.java | 6 +-- .../service/ssh/SshServiceImpl.java | 46 ++++++++++++------- .../service/uname/UnameServiceImpl.java | 10 ++-- .../utils/SshServerUtils.java | 17 +++++++ .../ui/uname/UnameChatButtonAggregate.java | 19 +++++--- 9 files changed, 118 insertions(+), 40 deletions(-) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/model/Command.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/utils/SshServerUtils.java diff --git a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java index a3501bf..5f533ff 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java @@ -31,19 +31,23 @@ public class TelegramBotController extends TelegramLongPollingBot { String messageText = update.getMessage().getText(); switch (messageText) { case "/start" -> { - log.info("Получена команда /start"); + log.info("Получена команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName()); telegramBotService.firstUse(update, this); } case "Статус" -> { - log.info("Получена команда 'Статус'"); + log.info("Получена команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName()); telegramBotService.getStatusSessions(update, this); } case "uname" -> { - log.info("Получена команда 'uname'"); + log.info("Получена команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName()); telegramBotService.sendUnameAggregate(update, this); } default -> { - log.warn("Неизвестная команда:" + messageText); + log.warn("Неизвестная команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName()); telegramBotService.switchToMainMenu(update, this); } } @@ -54,16 +58,19 @@ public class TelegramBotController extends TelegramLongPollingBot { if (tags.length > 1) { switch (tags[0]) { case "uname": - log.info("Получена команда '" + messageText + "'"); + log.info("Получена команда '" + messageText + + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName()); telegramBotService.uname(update, this); break; default: - log.warn("Неизвестная команда:" + messageText); + log.warn("Неизвестная команда '" + messageText + + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName()); telegramBotService.switchToMainMenu(update, this); break; } } else { - log.warn("Неверный формат команды:" + messageText); + log.warn("Неверный формат команды '" + messageText + + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName()); telegramBotService.switchToMainMenu(update, this); } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/Command.java b/src/main/java/ru/ldeloff/servermonitorbot/model/Command.java new file mode 100644 index 0000000..936f89b --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/Command.java @@ -0,0 +1,25 @@ +package ru.ldeloff.servermonitorbot.model; + +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Command { + @NotNull + private String command; + @NotNull + @Min(100) + private int timeout; + @NotNull + private SshServer sshServer; + private String response; + + public Command(String command, int timeout, SshServer sshServer) { + this.command = command; + this.timeout = timeout; + this.sshServer = sshServer; + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java index 2817664..8210141 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java @@ -12,6 +12,7 @@ import ru.ldeloff.servermonitorbot.model.SshServer; import java.util.ArrayList; import java.util.List; +import java.util.Objects; @Slf4j @Repository @@ -65,7 +66,7 @@ public class SshRepositoryImpl implements SshRepository { sshServers.forEach(server -> { text.append(server.getName()) .append(": ") - .append(server.getSession().isConnected() ? "OK" : "отключён") + .append(checkStatusServer(server)) .append("\n"); }); return String.valueOf(text); @@ -75,4 +76,13 @@ public class SshRepositoryImpl implements SshRepository { public List getSshServers() { return sshServers; } + + private String checkStatusServer(SshServer server) { + if (Objects.isNull(server.getSession())) { + return "нет соединения"; + } else { + return server.getSession().isConnected() ? "OK" : "отключён"; + } + } + } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java index 1f0ca6b..53df118 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java @@ -27,7 +27,7 @@ public class TelegramBotServiceImpl implements TelegramBotService { SendMessage message = new SendMessage(); long chatId = 0L; chatId = update.getMessage().getChatId(); - message.setText("Добро пожалвать " + update.getMessage().getChat().getUserName() + "!"); + message.setText("Добро пожаловать " + update.getMessage().getChat().getUserName() + "!"); message.setChatId(chatId); sendMessage(telegramBotKeyboard.uiForm(message), bot); } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java index ce46ba1..80c4378 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java @@ -3,6 +3,7 @@ package ru.ldeloff.servermonitorbot.service.ssh; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Update; +import ru.ldeloff.servermonitorbot.model.Command; import ru.ldeloff.servermonitorbot.model.SshServer; import java.util.List; @@ -10,7 +11,6 @@ import java.util.List; public interface SshService { SendMessage getStatusSessions(Update update); List getSshServers(); - - String execute(String s, SshServer sshServer); - String execute(String s, SshServer sshServer, int timeout); + Command execute(Command command); + List execute(List commands); } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshServiceImpl.java index 2638cdd..565c3c4 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshServiceImpl.java @@ -8,10 +8,12 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Update; +import ru.ldeloff.servermonitorbot.model.Command; import ru.ldeloff.servermonitorbot.model.SshServer; import ru.ldeloff.servermonitorbot.repository.SshRepository; import java.io.ByteArrayOutputStream; +import java.util.ArrayList; import java.util.List; @Service @@ -33,34 +35,44 @@ public class SshServiceImpl implements SshService { } @Override - public String execute(String s, SshServer sshServer) { - return execute(s, sshServer, 100); + public Command execute(Command command) { + List commands = new ArrayList<>(); + commands.add(command); + return execute(commands).get(0); } @Override - public String execute(String s, SshServer sshServer, int timeout) { - Session session = sshServer.getSession(); + public List execute(List commands) { + Session session = commands.get(0).getSshServer().getSession(); // подразумевается, что в листе с командами сервер один и тот же ChannelExec channel = null; try { channel = (ChannelExec) session.openChannel("exec"); - channel.setCommand(s); - ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); - channel.setOutputStream(responseStream); - channel.connect(); + ChannelExec finalChannel = channel; - while (channel.isConnected()) { - Thread.sleep(timeout); - } - - String responseString = new String(responseStream.toByteArray()); - return responseString; - } catch (JSchException | InterruptedException e) { - log.error(e.getMessage()); - return null; + commands.forEach(command -> { + try { + finalChannel.setCommand(command.getCommand()); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + finalChannel.setOutputStream(responseStream); + finalChannel.connect(); + while (finalChannel.isConnected()) { + Thread.sleep(command.getTimeout()); + } + String responseString = new String(responseStream.toByteArray()); + command.setResponse(responseString); + } catch (JSchException | InterruptedException e) { + log.warn(e.getMessage()); + throw new RuntimeException(e); + } + }); + } catch (JSchException e) { + log.warn(e.getMessage()); + throw new RuntimeException(e); } finally { if (channel != null) { channel.disconnect(); } } + return commands; } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameServiceImpl.java index c6eb657..e7a3304 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameServiceImpl.java @@ -5,8 +5,10 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Update; +import ru.ldeloff.servermonitorbot.model.Command; import ru.ldeloff.servermonitorbot.model.SshServer; import ru.ldeloff.servermonitorbot.service.ssh.SshService; +import ru.ldeloff.servermonitorbot.utils.SshServerUtils; import ru.ldeloff.servermonitorbot.utils.ui.uname.UnameChatButtonAggregate; import java.util.Arrays; @@ -49,7 +51,7 @@ public class UnameServiceImpl implements UnameService { } private String unameAllHost() { - List servers = sshService.getSshServers(); + List servers = SshServerUtils.filterGoodServers(sshService.getSshServers()); StringBuilder response = new StringBuilder(); servers.forEach(server -> { response.append(unameSpecificHost(server.getName())).append("\n"); @@ -63,9 +65,9 @@ public class UnameServiceImpl implements UnameService { .filter(x -> x.getName().equals(serverName)) .findFirst(); if (server.isPresent()) { - String result = sshService.execute("uname -a", server.get()); - return server.get().getName() + ": " + (Objects.isNull(result) ? "ошибка при выполнении команды" : result); - + Command result = sshService.execute(new Command("uname -a", 100, server.get())); + return server.get().getName() + ": " + + (Objects.isNull(result.getResponse()) ? "ошибка при выполнении команды" : result.getResponse()); } else { log.error("Ошибка при выполнении команды 'uname'. Искомый сервер (" + serverName + ") не найден"); return null; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/SshServerUtils.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/SshServerUtils.java new file mode 100644 index 0000000..4db77ca --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/utils/SshServerUtils.java @@ -0,0 +1,17 @@ +package ru.ldeloff.servermonitorbot.utils; + +import ru.ldeloff.servermonitorbot.model.SshServer; + +import java.util.List; +import java.util.Objects; + +public class SshServerUtils { + public static List filterGoodServers(List sshServers) { + List goodSshServers = sshServers.stream() + .filter(Objects::nonNull) + .filter(server -> Objects.nonNull(server.getSession())) + .filter(server -> server.getSession().isConnected()) + .toList(); + return goodSshServers; + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/uname/UnameChatButtonAggregate.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/uname/UnameChatButtonAggregate.java index f28988e..99a9547 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/uname/UnameChatButtonAggregate.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/uname/UnameChatButtonAggregate.java @@ -12,6 +12,7 @@ import ru.ldeloff.servermonitorbot.utils.ui.UiFormer; import java.util.ArrayList; import java.util.List; +import java.util.Objects; @Component @RequiredArgsConstructor @@ -26,15 +27,19 @@ public class UnameChatButtonAggregate implements UiFormer { InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup(); sshService.getSshServers().forEach(sshServer -> { - List keyboardRow = new ArrayList<>(); - InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton(); - inlineKeyboardButton.setText(sshServer.getName()); - inlineKeyboardButton.setCallbackData("uname: " + sshServer.getName()); - keyboardRow.add(inlineKeyboardButton); - keyboard.add(keyboardRow); + if (Objects.nonNull(sshServer.getSession())) { + if (sshServer.getSession().isConnected()) { + List keyboardRow = new ArrayList<>(); + InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton(); + inlineKeyboardButton.setText(sshServer.getName()); + inlineKeyboardButton.setCallbackData("uname: " + sshServer.getName()); + keyboardRow.add(inlineKeyboardButton); + keyboard.add(keyboardRow); + } + } }); - if (sshService.getSshServers().size() > 1) { + if (keyboard.size() > 1) { List keyboardRow = new ArrayList<>(); InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton(); inlineKeyboardButton.setText("Все сервера");