From 7b18162d30e625abbdd6680448c7b36b32948d33 Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sun, 6 Aug 2023 00:55:44 +0300 Subject: [PATCH 01/13] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B0=20una?= =?UTF-8?q?me,=20=D0=BF=D0=BE=D0=BA=D0=B0=20=D0=BD=D0=B5=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=BD=D1=8B=D0=B9=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D0=BE=D0=BD=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servermonitorbot/init/StartBot.java | 1 - .../servermonitorbot/service/SshService.java | 3 +- .../service/SshServiceImpl.java | 5 ++ .../service/TelegramBotService.java | 28 ++++----- .../service/ui/TelegramBotKeyboard.java | 39 ++++++++++++ .../service/ui/uname/UnameChatButton.java | 54 ++++++++++++++++ .../util/TelegramBotMenu.java | 61 ------------------- 7 files changed, 114 insertions(+), 77 deletions(-) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/ui/TelegramBotKeyboard.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/ui/uname/UnameChatButton.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/util/TelegramBotMenu.java diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java index c97bc49..a8493cb 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java @@ -9,7 +9,6 @@ import org.springframework.stereotype.Component; import org.telegram.telegrambots.meta.TelegramBotsApi; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import org.telegram.telegrambots.updatesreceivers.DefaultBotSession; -import ru.ldeloff.servermonitorbot.model.TelegramBot; import ru.ldeloff.servermonitorbot.service.TelegramBotService; @Slf4j diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java index 32c11dd..9c3fa78 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java @@ -7,10 +7,11 @@ import ru.ldeloff.servermonitorbot.model.SshServer; import java.util.List; - public interface SshService { void connectToAllServer(); Session connectToServer(SshServer sshServer) throws JSchException; void disconnectSessions(); SendMessage getStatusSessions(Long chatId); + + List getSshServers(); } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java index 0580f9f..10aaf6d 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java @@ -73,4 +73,9 @@ public class SshServiceImpl implements SshService{ message.setChatId(chatId); return message; } + + @Override + public List getSshServers() { + return sshServers; + } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java index 5837580..40af16a 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java @@ -8,7 +8,8 @@ import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Update; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import ru.ldeloff.servermonitorbot.model.TelegramBot; -import ru.ldeloff.servermonitorbot.util.TelegramBotMenu; +import ru.ldeloff.servermonitorbot.service.ui.TelegramBotKeyboard; +import ru.ldeloff.servermonitorbot.service.ui.uname.UnameChatButton; @Service @Slf4j @@ -16,14 +17,16 @@ public class TelegramBotService extends TelegramLongPollingBot { final TelegramBot telegramBot; final SshService sshService; - final TelegramBotMenu telegramBotMenu; + final TelegramBotKeyboard telegramBotKeyboard; + final UnameChatButton unameChatButton; @Autowired - public TelegramBotService(TelegramBot telegramBot, SshService sshService, TelegramBotMenu telegramBotMenu) { + public TelegramBotService(TelegramBot telegramBot, SshService sshService, TelegramBotKeyboard telegramBotKeyboard, UnameChatButton unameChatButton) { this.telegramBot = telegramBot; this.sshService = sshService; - this.telegramBotMenu = telegramBotMenu; + this.telegramBotKeyboard = telegramBotKeyboard; + this.unameChatButton = unameChatButton; } @Override @@ -37,7 +40,7 @@ public class TelegramBotService extends TelegramLongPollingBot { case "/start": message.setText("Привет: " + update.getMessage().getChat().getUserName()); message.setChatId(chatId); - message.setReplyMarkup(telegramBotMenu.initKeyboard()); + message.setReplyMarkup(telegramBotKeyboard.initKeyboardButtons()); sendMessage(message); log.info("Получена команда /start"); break; @@ -45,23 +48,20 @@ public class TelegramBotService extends TelegramLongPollingBot { sendMessage(sshService.getStatusSessions(chatId)); log.info("Получена команда 'Статус'"); break; + case "uname": + sendMessage(unameChatButton.initMenu(chatId)); + log.info("Получена команда 'uname'"); + break; default: message.setText("unknown command:" + messageText); message.setChatId(chatId); - message.setReplyMarkup(telegramBotMenu.initKeyboard()); + message.setReplyMarkup(telegramBotKeyboard.initKeyboardButtons()); sendMessage(message); log.warn("Неизвестная команда:" + messageText); } } } else if (update.hasCallbackQuery()) { - try { - SendMessage message = new SendMessage(); - message.setText(update.getCallbackQuery().getData()); - message.setChatId(update.getCallbackQuery().getMessage().getChatId()); - execute(message); - } catch (TelegramApiException e) { - e.printStackTrace(); - } + System.out.println(update.getCallbackQuery().getData()); // TODO } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/ui/TelegramBotKeyboard.java b/src/main/java/ru/ldeloff/servermonitorbot/service/ui/TelegramBotKeyboard.java new file mode 100644 index 0000000..4715e6e --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/ui/TelegramBotKeyboard.java @@ -0,0 +1,39 @@ +package ru.ldeloff.servermonitorbot.service.ui; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup; +import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardMarkup; +import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton; +import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardButton; +import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardRow; + + +import java.util.ArrayList; +import java.util.List; + +@Service +public class TelegramBotKeyboard { + private final String STATUS = "Статус"; + private final String UNAME = "uname"; + public ReplyKeyboardMarkup initKeyboardButtons() + { + ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); + replyKeyboardMarkup.setResizeKeyboard(true); //подгоняем размер + replyKeyboardMarkup.setOneTimeKeyboard(false); //скрываем после использования + + + ArrayList keyboardRows = new ArrayList<>(); + + KeyboardRow keyboardRow = new KeyboardRow(); + keyboardRows.add(keyboardRow); + + keyboardRow.add(new KeyboardButton(STATUS)); + keyboardRow.add(new KeyboardButton(UNAME)); + + replyKeyboardMarkup.setKeyboard(keyboardRows); + return replyKeyboardMarkup; + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/ui/uname/UnameChatButton.java b/src/main/java/ru/ldeloff/servermonitorbot/service/ui/uname/UnameChatButton.java new file mode 100644 index 0000000..7b6ac38 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/ui/uname/UnameChatButton.java @@ -0,0 +1,54 @@ +package ru.ldeloff.servermonitorbot.service.ui.uname; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup; +import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton; +import ru.ldeloff.servermonitorbot.model.SshServer; +import ru.ldeloff.servermonitorbot.service.SshService; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class UnameChatButton { + + private final SshService sshService; + + @Autowired + public UnameChatButton(SshService sshService) { + this.sshService = sshService; + } + + public SendMessage initMenu(long chatId) { + SendMessage message = new SendMessage(); + message.setChatId(chatId); + message.setText("Сервер:"); + + List> keyboard = new ArrayList<>(); + + 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); + }); + List keyboardRow = new ArrayList<>(); + InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton(); + inlineKeyboardButton.setText("Все сервера"); + inlineKeyboardButton.setCallbackData("uname: all"); + keyboardRow.add(inlineKeyboardButton); + keyboard.add(keyboardRow); + + + inlineKeyboardMarkup.setKeyboard(keyboard); + message.setReplyMarkup(inlineKeyboardMarkup); + + return message; + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/util/TelegramBotMenu.java b/src/main/java/ru/ldeloff/servermonitorbot/util/TelegramBotMenu.java deleted file mode 100644 index e853a4f..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/util/TelegramBotMenu.java +++ /dev/null @@ -1,61 +0,0 @@ -package ru.ldeloff.servermonitorbot.util; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup; -import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardMarkup; -import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton; -import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardButton; -import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardRow; - - -import java.util.ArrayList; -import java.util.List; - -@Slf4j -@Component -public class TelegramBotMenu { - private final String STATUS = "Статус"; - public ReplyKeyboardMarkup initKeyboard() - { - //Создаем объект будущей клавиатуры и выставляем нужные настройки - ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); - replyKeyboardMarkup.setResizeKeyboard(true); //подгоняем размер - replyKeyboardMarkup.setOneTimeKeyboard(false); //скрываем после использования - - //Создаем список с рядами кнопок - ArrayList keyboardRows = new ArrayList<>(); - //Создаем один ряд кнопок и добавляем его в список - KeyboardRow keyboardRow = new KeyboardRow(); - keyboardRows.add(keyboardRow); - //Добавляем одну кнопку с текстом "Просвяти" наш ряд - keyboardRow.add(new KeyboardButton(STATUS)); - //добавляем лист с одним рядом кнопок в главный объект - replyKeyboardMarkup.setKeyboard(keyboardRows); - return replyKeyboardMarkup; - } - - public SendMessage mainMenu(long chatId) { - SendMessage message = new SendMessage(); - message.setChatId(chatId); - message.setText("Choose an option:"); - - InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup(); - List keyboardRow = new ArrayList<>(); - - InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton(); - inlineKeyboardButton.setText(STATUS); - inlineKeyboardButton.setCallbackData("Button \"" + STATUS + "\" has been pressed"); - - keyboardRow.add(inlineKeyboardButton); - - List> keyboard = new ArrayList<>(); - keyboard.add(keyboardRow); - - inlineKeyboardMarkup.setKeyboard(keyboard); - message.setReplyMarkup(inlineKeyboardMarkup); - - return message; - } -} -- 2.40.1 From fcd4929e0cc07768e51250fb3200031b36249ba2 Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sun, 6 Aug 2023 23:01:58 +0300 Subject: [PATCH 02/13] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TelegramBotController.java | 98 +++++++++++++++++++ .../servermonitorbot/init/SshConnect.java | 10 +- .../servermonitorbot/init/StartBot.java | 6 +- .../repository/SshRepository.java | 16 +++ .../repository/SshRepositoryImpl.java | 78 +++++++++++++++ .../servermonitorbot/service/SshService.java | 12 --- .../service/SshServiceImpl.java | 75 +------------- .../service/TelegramBotService.java | 91 +---------------- .../service/TelegramBotServiceImpl.java | 63 ++++++++++++ .../ui/TelegramBotKeyboard.java | 20 ++-- .../servermonitorbot/utils/ui/UiFormer.java | 7 ++ .../ui/uname/UnameChatButtonAggregate.java} | 28 +++--- 12 files changed, 296 insertions(+), 208 deletions(-) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepository.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java rename src/main/java/ru/ldeloff/servermonitorbot/{service => utils}/ui/TelegramBotKeyboard.java (70%) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/utils/ui/UiFormer.java rename src/main/java/ru/ldeloff/servermonitorbot/{service/ui/uname/UnameChatButton.java => utils/ui/uname/UnameChatButtonAggregate.java} (70%) diff --git a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java new file mode 100644 index 0000000..b878c67 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java @@ -0,0 +1,98 @@ +package ru.ldeloff.servermonitorbot.controller; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.bots.TelegramLongPollingBot; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import org.telegram.telegrambots.meta.api.objects.Update; +import org.telegram.telegrambots.meta.exceptions.TelegramApiException; +import ru.ldeloff.servermonitorbot.model.TelegramBot; +import ru.ldeloff.servermonitorbot.repository.SshRepository; +import ru.ldeloff.servermonitorbot.service.TelegramBotService; +import ru.ldeloff.servermonitorbot.utils.ui.TelegramBotKeyboard; +import ru.ldeloff.servermonitorbot.utils.ui.uname.UnameChatButtonAggregate; + +@Service +@Slf4j +public class TelegramBotController extends TelegramLongPollingBot { + + final TelegramBot telegramBot; + final SshRepository sshRepository; + final TelegramBotKeyboard telegramBotKeyboard; + final UnameChatButtonAggregate unameChatButtonAggregate; + final TelegramBotService telegramBotService; + + public TelegramBotController(TelegramBot telegramBot, SshRepository sshRepository, TelegramBotKeyboard telegramBotKeyboard, UnameChatButtonAggregate unameChatButtonAggregate, TelegramBotService telegramBotService) { + this.telegramBot = telegramBot; + this.sshRepository = sshRepository; + this.telegramBotKeyboard = telegramBotKeyboard; + this.unameChatButtonAggregate = unameChatButtonAggregate; + this.telegramBotService = telegramBotService; + } + + @Override + public void onUpdateReceived(Update update) { + if (update.hasMessage()) { + if (update.getMessage().hasText()) { + String messageText = update.getMessage().getText(); + switch (messageText) { + case "/start" -> { + log.info("Получена команда /start"); + telegramBotService.switchToMainMenu(update, this); + } + case "Статус" -> { + log.info("Получена команда 'Статус'"); + telegramBotService.getStatusSessions(update, this); + } + case "uname" -> { + log.info("Получена команда 'uname'"); + telegramBotService.sendUnameAggregate(update, this); + } + default -> { + log.warn("Неизвестная команда:" + messageText); + telegramBotService.switchToMainMenu(update, this); + } + } + } + } else if (update.hasCallbackQuery()) { + String messageText = update.getCallbackQuery().getData(); + String [] tags = messageText.split(":"); + switch (tags[0]) { + case "uname": + if (tags.length > 1) { + switch (tags[1]) { + default -> { + log.warn("Неверный формат команды:" + messageText); + telegramBotService.switchToMainMenu(update, this); + break; + } + } + } else { + log.warn("Неверный формат команды:" + messageText); + telegramBotService.switchToMainMenu(update, this); + } + break; + default : + log.warn("Неизвестная команда:" + messageText); + telegramBotService.switchToMainMenu(update, this); + break; + } + } + } + + @Override + public String getBotUsername() { + return telegramBot.getBotUsername(); + } + + @Override + public String getBotToken() { + return telegramBot.getBotToken(); + } + + @Override + public void onClosing() { + super.onClosing(); + sshRepository.disconnectSessions(); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java b/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java index 7aae5d7..d429b0e 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java @@ -3,18 +3,18 @@ package ru.ldeloff.servermonitorbot.init; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; -import ru.ldeloff.servermonitorbot.service.SshService; +import ru.ldeloff.servermonitorbot.repository.SshRepository; @Component public class SshConnect implements ApplicationRunner { - final SshService sshService; + final SshRepository sshRepository; - public SshConnect(SshService sshService) { - this.sshService = sshService; + public SshConnect(SshRepository sshRepository) { + this.sshRepository = sshRepository; } @Override public void run(ApplicationArguments args) throws Exception { - sshService.connectToAllServer(); + sshRepository.connectToAllServer(); } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java index a8493cb..5530238 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java @@ -9,16 +9,16 @@ import org.springframework.stereotype.Component; import org.telegram.telegrambots.meta.TelegramBotsApi; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import org.telegram.telegrambots.updatesreceivers.DefaultBotSession; -import ru.ldeloff.servermonitorbot.service.TelegramBotService; +import ru.ldeloff.servermonitorbot.controller.TelegramBotController; @Slf4j @Component @NoArgsConstructor public class StartBot implements ApplicationRunner { - private TelegramBotService telegramBot; + private TelegramBotController telegramBot; @Autowired - public StartBot(TelegramBotService telegramBot) { + public StartBot(TelegramBotController telegramBot) { this.telegramBot = telegramBot; } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepository.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepository.java new file mode 100644 index 0000000..c2821d4 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepository.java @@ -0,0 +1,16 @@ +package ru.ldeloff.servermonitorbot.repository; + +import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.Session; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import ru.ldeloff.servermonitorbot.model.SshServer; + +import java.util.List; + +public interface SshRepository { + void connectToAllServer(); + Session connectToServer(SshServer sshServer) throws JSchException; + void disconnectSessions(); + String getStatusSessions(); + List getSshServers(); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java new file mode 100644 index 0000000..2817664 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java @@ -0,0 +1,78 @@ +package ru.ldeloff.servermonitorbot.repository; + +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.Session; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import ru.ldeloff.servermonitorbot.config.SshConfig; +import ru.ldeloff.servermonitorbot.model.SshServer; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Repository +public class SshRepositoryImpl implements SshRepository { + + private final List sshServers; + + @Autowired + public SshRepositoryImpl(SshConfig sshConfig) { + this.sshServers = sshConfig.getServers(); + } + + private List sessions = new ArrayList<>(); + + @Override + public void connectToAllServer() { + sshServers.forEach(sshServer -> { + try { + Session session = connectToServer(sshServer); + sshServer.setSession(session); + log.info("Успешно подключён к " + sshServer.getHost()); + sessions.add(session); + } catch (JSchException e) { + log.warn("Не удалось соединиться с " + sshServer.getHost() + ": " + e.getMessage()); + } + }); + } + + @Override + public Session connectToServer(SshServer sshServer) throws JSchException { + Session session = new JSch().getSession(sshServer.getUser(), + sshServer.getHost(), + sshServer.getPort()); + session.setPassword(sshServer.getPassword()); + session.setConfig("StrictHostKeyChecking", "no"); + session.connect(); + return session; + } + + @Override + public void disconnectSessions() { + if (!sessions.isEmpty()) { + sessions.forEach(Session::disconnect); + sessions.forEach(sessions::remove); + } + } + + @Override + public String getStatusSessions() { + StringBuilder text = new StringBuilder("Статус соединения: \n"); + sshServers.forEach(server -> { + text.append(server.getName()) + .append(": ") + .append(server.getSession().isConnected() ? "OK" : "отключён") + .append("\n"); + }); + return String.valueOf(text); + } + + @Override + public List getSshServers() { + return sshServers; + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java index 9c3fa78..eece20b 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java @@ -1,17 +1,5 @@ package ru.ldeloff.servermonitorbot.service; -import com.jcraft.jsch.JSchException; -import com.jcraft.jsch.Session; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.model.SshServer; - -import java.util.List; public interface SshService { - void connectToAllServer(); - Session connectToServer(SshServer sshServer) throws JSchException; - void disconnectSessions(); - SendMessage getStatusSessions(Long chatId); - - List getSshServers(); } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java index 10aaf6d..967e87b 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java @@ -1,81 +1,8 @@ package ru.ldeloff.servermonitorbot.service; -import com.jcraft.jsch.JSch; -import com.jcraft.jsch.JSchException; -import com.jcraft.jsch.Session; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.config.SshConfig; -import ru.ldeloff.servermonitorbot.model.SshServer; -import java.util.ArrayList; -import java.util.List; - -@Slf4j @Service -public class SshServiceImpl implements SshService{ +public class SshServiceImpl implements SshService { - private final List sshServers; - - @Autowired - public SshServiceImpl(SshConfig sshConfig) { - this.sshServers = sshConfig.getServers(); - } - - private List sessions = new ArrayList<>(); - - @Override - public void connectToAllServer() { - sshServers.forEach(sshServer -> { - try { - Session session = connectToServer(sshServer); - sshServer.setSession(session); - log.info("Успешно подключён к " + sshServer.getHost()); - sessions.add(session); - } catch (JSchException e) { - log.warn("Не удалось соединиться с " + sshServer.getHost() + ": " + e.getMessage()); - } - }); - } - - @Override - public Session connectToServer(SshServer sshServer) throws JSchException { - Session session = new JSch().getSession(sshServer.getUser(), - sshServer.getHost(), - sshServer.getPort()); - session.setPassword(sshServer.getPassword()); - session.setConfig("StrictHostKeyChecking", "no"); - session.connect(); - return session; - } - - @Override - public void disconnectSessions() { - if (!sessions.isEmpty()) { - sessions.forEach(Session::disconnect); - sessions.forEach(sessions::remove); - } - } - - @Override - public SendMessage getStatusSessions(Long chatId) { - StringBuilder text = new StringBuilder("Статус соединения: \n"); - sshServers.forEach(server -> { - text.append(server.getName()) - .append(": ") - .append(server.getSession().isConnected() ? "OK" : "отключён") - .append("\n"); - }); - SendMessage message = new SendMessage(); - message.setText(String.valueOf(text)); - message.setChatId(chatId); - return message; - } - - @Override - public List getSshServers() { - return sshServers; - } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java index 40af16a..426a636 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java @@ -1,92 +1,11 @@ package ru.ldeloff.servermonitorbot.service; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.telegram.telegrambots.bots.TelegramLongPollingBot; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Update; -import org.telegram.telegrambots.meta.exceptions.TelegramApiException; -import ru.ldeloff.servermonitorbot.model.TelegramBot; -import ru.ldeloff.servermonitorbot.service.ui.TelegramBotKeyboard; -import ru.ldeloff.servermonitorbot.service.ui.uname.UnameChatButton; +import ru.ldeloff.servermonitorbot.controller.TelegramBotController; -@Service -@Slf4j -public class TelegramBotService extends TelegramLongPollingBot { +public interface TelegramBotService { - final TelegramBot telegramBot; - final SshService sshService; - final TelegramBotKeyboard telegramBotKeyboard; - final UnameChatButton unameChatButton; - - - @Autowired - public TelegramBotService(TelegramBot telegramBot, SshService sshService, TelegramBotKeyboard telegramBotKeyboard, UnameChatButton unameChatButton) { - this.telegramBot = telegramBot; - this.sshService = sshService; - this.telegramBotKeyboard = telegramBotKeyboard; - this.unameChatButton = unameChatButton; - } - - @Override - public void onUpdateReceived(Update update) { - if (update.hasMessage()) { - if (update.getMessage().hasText()) { - SendMessage message = new SendMessage(); - String messageText = update.getMessage().getText(); - long chatId = update.getMessage().getChatId(); - switch (messageText) { - case "/start": - message.setText("Привет: " + update.getMessage().getChat().getUserName()); - message.setChatId(chatId); - message.setReplyMarkup(telegramBotKeyboard.initKeyboardButtons()); - sendMessage(message); - log.info("Получена команда /start"); - break; - case "Статус": - sendMessage(sshService.getStatusSessions(chatId)); - log.info("Получена команда 'Статус'"); - break; - case "uname": - sendMessage(unameChatButton.initMenu(chatId)); - log.info("Получена команда 'uname'"); - break; - default: - message.setText("unknown command:" + messageText); - message.setChatId(chatId); - message.setReplyMarkup(telegramBotKeyboard.initKeyboardButtons()); - sendMessage(message); - log.warn("Неизвестная команда:" + messageText); - } - } - } else if (update.hasCallbackQuery()) { - System.out.println(update.getCallbackQuery().getData()); // TODO - } - } - - private void sendMessage(SendMessage message) { - try { - execute(message); - } catch (TelegramApiException e) { - e.printStackTrace(); - log.warn(e.getMessage()); - } - } - - @Override - public String getBotUsername() { - return telegramBot.getBotUsername(); - } - - @Override - public String getBotToken() { - return telegramBot.getBotToken(); - } - - @Override - public void onClosing() { - super.onClosing(); - sshService.disconnectSessions(); - } + void switchToMainMenu(Update update, TelegramBotController bot); + void getStatusSessions(Update update, TelegramBotController bot); + void sendUnameAggregate(Update update, TelegramBotController bot); } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java new file mode 100644 index 0000000..aebbce9 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java @@ -0,0 +1,63 @@ +package ru.ldeloff.servermonitorbot.service; + +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 org.telegram.telegrambots.meta.exceptions.TelegramApiException; +import ru.ldeloff.servermonitorbot.controller.TelegramBotController; +import ru.ldeloff.servermonitorbot.repository.SshRepository; +import ru.ldeloff.servermonitorbot.utils.ui.TelegramBotKeyboard; +import ru.ldeloff.servermonitorbot.utils.ui.uname.UnameChatButtonAggregate; + +@Slf4j +@Service +public class TelegramBotServiceImpl implements TelegramBotService { + final TelegramBotKeyboard telegramBotKeyboard; + final SshRepository sshRepository; + final UnameChatButtonAggregate unameChatButtonAggregate; + + public TelegramBotServiceImpl(TelegramBotKeyboard telegramBotKeyboard, SshRepository sshRepository, UnameChatButtonAggregate unameChatButtonAggregate) { + this.telegramBotKeyboard = telegramBotKeyboard; + this.sshRepository = sshRepository; + this.unameChatButtonAggregate = unameChatButtonAggregate; + } + @Override + public void switchToMainMenu(Update update, TelegramBotController bot) { + SendMessage message = new SendMessage(); + long chatId = 0L; + try { + chatId = update.getMessage().getChatId(); + } catch (Exception e) { + chatId = update.getCallbackQuery().getMessage().getChatId(); + + } + message.setText("Неверная команда и или формат. Попробуем сначала."); + message.setChatId(chatId); + sendMessage(telegramBotKeyboard.uiForm(message), bot); + } + @Override + public void getStatusSessions(Update update, TelegramBotController bot) { + SendMessage message = new SendMessage(); + long chatId = update.getMessage().getChatId(); + message.setText(String.valueOf(sshRepository.getStatusSessions())); + message.setChatId(chatId); + sendMessage(message, bot); + } + @Override + public void sendUnameAggregate(Update update, TelegramBotController bot) { + SendMessage message = new SendMessage(); + long chatId = update.getMessage().getChatId(); + message.setText(String.valueOf(sshRepository.getStatusSessions())); + message.setChatId(chatId); + sendMessage(unameChatButtonAggregate.uiForm(message), bot); + } + private void sendMessage(SendMessage message, TelegramBotController bot) { + try { + bot.execute(message); + } catch (TelegramApiException e) { + e.printStackTrace(); + log.warn(e.getMessage()); + } + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/ui/TelegramBotKeyboard.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java similarity index 70% rename from src/main/java/ru/ldeloff/servermonitorbot/service/ui/TelegramBotKeyboard.java rename to src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java index 4715e6e..3ab4b9f 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/ui/TelegramBotKeyboard.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java @@ -1,30 +1,25 @@ -package ru.ldeloff.servermonitorbot.service.ui; +package ru.ldeloff.servermonitorbot.utils.ui; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import org.springframework.stereotype.Service; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup; import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardMarkup; -import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton; import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardButton; import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardRow; import java.util.ArrayList; -import java.util.List; -@Service -public class TelegramBotKeyboard { +@Component +public class TelegramBotKeyboard implements UiFormer { private final String STATUS = "Статус"; private final String UNAME = "uname"; - public ReplyKeyboardMarkup initKeyboardButtons() - { + + @Override + public SendMessage uiForm(SendMessage message) { ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); replyKeyboardMarkup.setResizeKeyboard(true); //подгоняем размер replyKeyboardMarkup.setOneTimeKeyboard(false); //скрываем после использования - ArrayList keyboardRows = new ArrayList<>(); KeyboardRow keyboardRow = new KeyboardRow(); @@ -34,6 +29,7 @@ public class TelegramBotKeyboard { keyboardRow.add(new KeyboardButton(UNAME)); replyKeyboardMarkup.setKeyboard(keyboardRows); - return replyKeyboardMarkup; + message.setReplyMarkup(replyKeyboardMarkup); + return message; } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/UiFormer.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/UiFormer.java new file mode 100644 index 0000000..c847293 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/UiFormer.java @@ -0,0 +1,7 @@ +package ru.ldeloff.servermonitorbot.utils.ui; + +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; + +public interface UiFormer { + SendMessage uiForm(SendMessage message); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/ui/uname/UnameChatButton.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/uname/UnameChatButtonAggregate.java similarity index 70% rename from src/main/java/ru/ldeloff/servermonitorbot/service/ui/uname/UnameChatButton.java rename to src/main/java/ru/ldeloff/servermonitorbot/utils/ui/uname/UnameChatButtonAggregate.java index 7b6ac38..e355b1a 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/ui/uname/UnameChatButton.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/uname/UnameChatButtonAggregate.java @@ -1,36 +1,33 @@ -package ru.ldeloff.servermonitorbot.service.ui.uname; +package ru.ldeloff.servermonitorbot.utils.ui.uname; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup; import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton; -import ru.ldeloff.servermonitorbot.model.SshServer; -import ru.ldeloff.servermonitorbot.service.SshService; +import ru.ldeloff.servermonitorbot.repository.SshRepository; +import ru.ldeloff.servermonitorbot.utils.ui.UiFormer; import java.util.ArrayList; import java.util.List; -@Service -public class UnameChatButton { +@Component +public class UnameChatButtonAggregate implements UiFormer { - private final SshService sshService; + private final SshRepository sshRepository; @Autowired - public UnameChatButton(SshService sshService) { - this.sshService = sshService; + public UnameChatButtonAggregate(SshRepository sshRepository) { + this.sshRepository = sshRepository; } - public SendMessage initMenu(long chatId) { - SendMessage message = new SendMessage(); - message.setChatId(chatId); - message.setText("Сервер:"); - + @Override + public SendMessage uiForm(SendMessage message) { List> keyboard = new ArrayList<>(); InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup(); - sshService.getSshServers().forEach(sshServer -> { + sshRepository.getSshServers().forEach(sshServer -> { List keyboardRow = new ArrayList<>(); InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton(); inlineKeyboardButton.setText(sshServer.getName()); @@ -45,7 +42,6 @@ public class UnameChatButton { keyboardRow.add(inlineKeyboardButton); keyboard.add(keyboardRow); - inlineKeyboardMarkup.setKeyboard(keyboard); message.setReplyMarkup(inlineKeyboardMarkup); -- 2.40.1 From b6147e9e91fccff18acb76848f9b1262ca8a253a Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Mon, 7 Aug 2023 23:49:02 +0300 Subject: [PATCH 03/13] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD?= =?UTF-8?q?=D0=B4=D0=B0=20uname?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TelegramBotController.java | 41 ++++------ .../servermonitorbot/service/SshService.java | 5 -- .../service/SshServiceImpl.java | 8 -- .../service/TelegramBotService.java | 2 + .../service/TelegramBotServiceImpl.java | 38 ++++++---- .../service/ssh/SshService.java | 16 ++++ .../service/ssh/SshServiceImpl.java | 66 +++++++++++++++++ .../service/uname/UnameService.java | 10 +++ .../service/uname/UnameServiceImpl.java | 74 +++++++++++++++++++ .../ui/uname/UnameChatButtonAggregate.java | 13 ++-- 10 files changed, 211 insertions(+), 62 deletions(-) delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshServiceImpl.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameService.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameServiceImpl.java diff --git a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java index b878c67..a3501bf 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java @@ -1,5 +1,6 @@ package ru.ldeloff.servermonitorbot.controller; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.telegram.telegrambots.bots.TelegramLongPollingBot; @@ -14,6 +15,7 @@ import ru.ldeloff.servermonitorbot.utils.ui.uname.UnameChatButtonAggregate; @Service @Slf4j +@RequiredArgsConstructor public class TelegramBotController extends TelegramLongPollingBot { final TelegramBot telegramBot; @@ -22,14 +24,6 @@ public class TelegramBotController extends TelegramLongPollingBot { final UnameChatButtonAggregate unameChatButtonAggregate; final TelegramBotService telegramBotService; - public TelegramBotController(TelegramBot telegramBot, SshRepository sshRepository, TelegramBotKeyboard telegramBotKeyboard, UnameChatButtonAggregate unameChatButtonAggregate, TelegramBotService telegramBotService) { - this.telegramBot = telegramBot; - this.sshRepository = sshRepository; - this.telegramBotKeyboard = telegramBotKeyboard; - this.unameChatButtonAggregate = unameChatButtonAggregate; - this.telegramBotService = telegramBotService; - } - @Override public void onUpdateReceived(Update update) { if (update.hasMessage()) { @@ -38,7 +32,7 @@ public class TelegramBotController extends TelegramLongPollingBot { switch (messageText) { case "/start" -> { log.info("Получена команда /start"); - telegramBotService.switchToMainMenu(update, this); + telegramBotService.firstUse(update, this); } case "Статус" -> { log.info("Получена команда 'Статус'"); @@ -57,25 +51,20 @@ public class TelegramBotController extends TelegramLongPollingBot { } else if (update.hasCallbackQuery()) { String messageText = update.getCallbackQuery().getData(); String [] tags = messageText.split(":"); - switch (tags[0]) { - case "uname": - if (tags.length > 1) { - switch (tags[1]) { - default -> { - log.warn("Неверный формат команды:" + messageText); - telegramBotService.switchToMainMenu(update, this); - break; - } - } - } else { - log.warn("Неверный формат команды:" + messageText); + if (tags.length > 1) { + switch (tags[0]) { + case "uname": + log.info("Получена команда '" + messageText + "'"); + telegramBotService.uname(update, this); + break; + default: + log.warn("Неизвестная команда:" + messageText); telegramBotService.switchToMainMenu(update, this); - } - break; - default : - log.warn("Неизвестная команда:" + messageText); + break; + } + } else { + log.warn("Неверный формат команды:" + messageText); telegramBotService.switchToMainMenu(update, this); - break; } } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java deleted file mode 100644 index eece20b..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java +++ /dev/null @@ -1,5 +0,0 @@ -package ru.ldeloff.servermonitorbot.service; - - -public interface SshService { -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java deleted file mode 100644 index 967e87b..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java +++ /dev/null @@ -1,8 +0,0 @@ -package ru.ldeloff.servermonitorbot.service; - -import org.springframework.stereotype.Service; - -@Service -public class SshServiceImpl implements SshService { - -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java index 426a636..cf86879 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java @@ -8,4 +8,6 @@ public interface TelegramBotService { void switchToMainMenu(Update update, TelegramBotController bot); void getStatusSessions(Update update, TelegramBotController bot); void sendUnameAggregate(Update update, TelegramBotController bot); + void uname(Update update, TelegramBotController bot); + void firstUse(Update update, TelegramBotController telegramBotController); } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java index aebbce9..1f0ca6b 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java @@ -1,5 +1,6 @@ package ru.ldeloff.servermonitorbot.service; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; @@ -7,20 +8,28 @@ import org.telegram.telegrambots.meta.api.objects.Update; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import ru.ldeloff.servermonitorbot.controller.TelegramBotController; import ru.ldeloff.servermonitorbot.repository.SshRepository; +import ru.ldeloff.servermonitorbot.service.ssh.SshService; +import ru.ldeloff.servermonitorbot.service.uname.UnameService; import ru.ldeloff.servermonitorbot.utils.ui.TelegramBotKeyboard; import ru.ldeloff.servermonitorbot.utils.ui.uname.UnameChatButtonAggregate; @Slf4j @Service +@RequiredArgsConstructor public class TelegramBotServiceImpl implements TelegramBotService { final TelegramBotKeyboard telegramBotKeyboard; - final SshRepository sshRepository; final UnameChatButtonAggregate unameChatButtonAggregate; + final UnameService unameService; + final SshService sshService; - public TelegramBotServiceImpl(TelegramBotKeyboard telegramBotKeyboard, SshRepository sshRepository, UnameChatButtonAggregate unameChatButtonAggregate) { - this.telegramBotKeyboard = telegramBotKeyboard; - this.sshRepository = sshRepository; - this.unameChatButtonAggregate = unameChatButtonAggregate; + @Override + public void firstUse(Update update, TelegramBotController bot) { + SendMessage message = new SendMessage(); + long chatId = 0L; + chatId = update.getMessage().getChatId(); + message.setText("Добро пожалвать " + update.getMessage().getChat().getUserName() + "!"); + message.setChatId(chatId); + sendMessage(telegramBotKeyboard.uiForm(message), bot); } @Override public void switchToMainMenu(Update update, TelegramBotController bot) { @@ -30,7 +39,6 @@ public class TelegramBotServiceImpl implements TelegramBotService { chatId = update.getMessage().getChatId(); } catch (Exception e) { chatId = update.getCallbackQuery().getMessage().getChatId(); - } message.setText("Неверная команда и или формат. Попробуем сначала."); message.setChatId(chatId); @@ -38,20 +46,18 @@ public class TelegramBotServiceImpl implements TelegramBotService { } @Override public void getStatusSessions(Update update, TelegramBotController bot) { - SendMessage message = new SendMessage(); - long chatId = update.getMessage().getChatId(); - message.setText(String.valueOf(sshRepository.getStatusSessions())); - message.setChatId(chatId); - sendMessage(message, bot); + sendMessage(sshService.getStatusSessions(update), bot); } @Override public void sendUnameAggregate(Update update, TelegramBotController bot) { - SendMessage message = new SendMessage(); - long chatId = update.getMessage().getChatId(); - message.setText(String.valueOf(sshRepository.getStatusSessions())); - message.setChatId(chatId); - sendMessage(unameChatButtonAggregate.uiForm(message), bot); + sendMessage(unameService.sendUnameAggregate(update), bot); } + + @Override + public void uname(Update update, TelegramBotController bot) { + sendMessage(unameService.uname(update), bot); + } + private void sendMessage(SendMessage message, TelegramBotController bot) { try { bot.execute(message); diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java new file mode 100644 index 0000000..ce46ba1 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java @@ -0,0 +1,16 @@ +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.SshServer; + +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); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshServiceImpl.java new file mode 100644 index 0000000..2638cdd --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshServiceImpl.java @@ -0,0 +1,66 @@ +package ru.ldeloff.servermonitorbot.service.ssh; + +import com.jcraft.jsch.ChannelExec; +import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.Session; +import lombok.RequiredArgsConstructor; +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.SshServer; +import ru.ldeloff.servermonitorbot.repository.SshRepository; + +import java.io.ByteArrayOutputStream; +import java.util.List; + +@Service +@Slf4j +@RequiredArgsConstructor +public class SshServiceImpl implements SshService { + final SshRepository sshRepository; + @Override + public SendMessage getStatusSessions(Update update) { + SendMessage message = new SendMessage(); + long chatId = update.getMessage().getChatId(); + message.setText(sshRepository.getStatusSessions()); + message.setChatId(chatId); + return message; + } + @Override + public List getSshServers() { + return sshRepository.getSshServers(); + } + + @Override + public String execute(String s, SshServer sshServer) { + return execute(s, sshServer, 100); + } + + @Override + public String execute(String s, SshServer sshServer, int timeout) { + Session session = sshServer.getSession(); + ChannelExec channel = null; + try { + channel = (ChannelExec) session.openChannel("exec"); + channel.setCommand(s); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + channel.setOutputStream(responseStream); + channel.connect(); + + while (channel.isConnected()) { + Thread.sleep(timeout); + } + + String responseString = new String(responseStream.toByteArray()); + return responseString; + } catch (JSchException | InterruptedException e) { + log.error(e.getMessage()); + return null; + } finally { + if (channel != null) { + channel.disconnect(); + } + } + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameService.java new file mode 100644 index 0000000..46e9096 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameService.java @@ -0,0 +1,10 @@ +package ru.ldeloff.servermonitorbot.service.uname; + +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import org.telegram.telegrambots.meta.api.objects.Update; + +public interface UnameService { + SendMessage sendUnameAggregate(Update update); + + SendMessage uname(Update update); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameServiceImpl.java new file mode 100644 index 0000000..c6eb657 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameServiceImpl.java @@ -0,0 +1,74 @@ +package ru.ldeloff.servermonitorbot.service.uname; + +import lombok.RequiredArgsConstructor; +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.SshServer; +import ru.ldeloff.servermonitorbot.service.ssh.SshService; +import ru.ldeloff.servermonitorbot.utils.ui.uname.UnameChatButtonAggregate; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +@Slf4j +public class UnameServiceImpl implements UnameService { + final SshService sshService; + final UnameChatButtonAggregate unameChatButtonAggregate; + @Override + public SendMessage sendUnameAggregate(Update update) { + SendMessage message = new SendMessage(); + long chatId = update.getMessage().getChatId(); + message.setChatId(chatId); + return unameChatButtonAggregate.uiForm(message); + } + @Override + public SendMessage uname(Update update) { + String messageText = update.getCallbackQuery().getData(); + + String [] tags = Arrays.stream(messageText.split(":")) + .map(String::trim) + .toArray(String[]::new); + + String result; + if (tags[1].equals("all")) { + result = unameAllHost(); + } else { + result = unameSpecificHost(tags[1]); + } + SendMessage message = new SendMessage(); + long chatId = update.getCallbackQuery().getMessage().getChatId(); + message.setChatId(chatId); + message.setText(result); + return message; + } + + private String unameAllHost() { + List servers = sshService.getSshServers(); + StringBuilder response = new StringBuilder(); + servers.forEach(server -> { + response.append(unameSpecificHost(server.getName())).append("\n"); + }); + return response.toString(); + } + + private String unameSpecificHost(String serverName) { + Optional server = sshService.getSshServers() + .stream() + .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); + + } else { + log.error("Ошибка при выполнении команды 'uname'. Искомый сервер (" + serverName + ") не найден"); + return null; + } + } +} 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 e355b1a..8c01338 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 @@ -1,25 +1,23 @@ package ru.ldeloff.servermonitorbot.utils.ui.uname; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup; import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton; import ru.ldeloff.servermonitorbot.repository.SshRepository; +import ru.ldeloff.servermonitorbot.service.ssh.SshService; import ru.ldeloff.servermonitorbot.utils.ui.UiFormer; import java.util.ArrayList; import java.util.List; @Component +@RequiredArgsConstructor public class UnameChatButtonAggregate implements UiFormer { - private final SshRepository sshRepository; - - @Autowired - public UnameChatButtonAggregate(SshRepository sshRepository) { - this.sshRepository = sshRepository; - } + private final SshService sshService; @Override public SendMessage uiForm(SendMessage message) { @@ -27,7 +25,7 @@ public class UnameChatButtonAggregate implements UiFormer { InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup(); - sshRepository.getSshServers().forEach(sshServer -> { + sshService.getSshServers().forEach(sshServer -> { List keyboardRow = new ArrayList<>(); InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton(); inlineKeyboardButton.setText(sshServer.getName()); @@ -44,6 +42,7 @@ public class UnameChatButtonAggregate implements UiFormer { inlineKeyboardMarkup.setKeyboard(keyboard); message.setReplyMarkup(inlineKeyboardMarkup); + message.setText("Выполнить uname для"); return message; } -- 2.40.1 From e6fac12e15298e2d7f956d8d6d57846569ea2645 Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Tue, 8 Aug 2023 21:01:10 +0300 Subject: [PATCH 04/13] =?UTF-8?q?=D0=95=D1=81=D0=BB=D0=B8=20=D1=81=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D0=B5=D1=80=20=D0=BE=D0=B4=D0=B8=D0=BD,=20=D1=82?= =?UTF-8?q?=D0=BE=20=D0=BD=D0=B5=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D1=8E=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D1=83=20"?= =?UTF-8?q?=D0=B2=D1=81=D0=B5=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0?= =?UTF-8?q?"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utils/ui/uname/UnameChatButtonAggregate.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) 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 8c01338..f28988e 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 @@ -33,12 +33,15 @@ public class UnameChatButtonAggregate implements UiFormer { keyboardRow.add(inlineKeyboardButton); keyboard.add(keyboardRow); }); - List keyboardRow = new ArrayList<>(); - InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton(); - inlineKeyboardButton.setText("Все сервера"); - inlineKeyboardButton.setCallbackData("uname: all"); - keyboardRow.add(inlineKeyboardButton); - keyboard.add(keyboardRow); + + if (sshService.getSshServers().size() > 1) { + List keyboardRow = new ArrayList<>(); + InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton(); + inlineKeyboardButton.setText("Все сервера"); + inlineKeyboardButton.setCallbackData("uname: all"); + keyboardRow.add(inlineKeyboardButton); + keyboard.add(keyboardRow); + } inlineKeyboardMarkup.setKeyboard(keyboard); message.setReplyMarkup(inlineKeyboardMarkup); -- 2.40.1 From 619996b91306e0a1fb2cdb73aa4e54d309e0697a Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Tue, 8 Aug 2023 22:36:06 +0300 Subject: [PATCH 05/13] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B3=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("Все сервера"); -- 2.40.1 From 047502916a84c2c679ea2dd97148a3779da8aa38 Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Wed, 9 Aug 2023 22:18:02 +0300 Subject: [PATCH 06/13] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20spring=20jpa=20=D0=B8=20liquibase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 ++++++++ .../controller/TelegramBotController.java | 2 -- src/main/resources/application.yml | 18 ++++++++++++++++++ .../resources/db/scripts/changelog-master.xml | 10 ++++++++++ .../db/scripts/release_0_0_1/changelog.xml | 9 +++++++++ .../scripts/01_create_table_users.sql | 15 +++++++++++++++ 6 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/db/scripts/changelog-master.xml create mode 100644 src/main/resources/db/scripts/release_0_0_1/changelog.xml create mode 100644 src/main/resources/db/scripts/release_0_0_1/scripts/01_create_table_users.sql diff --git a/pom.xml b/pom.xml index 10966a9..ca8d61a 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,14 @@ jsch 0.1.55 + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.liquibase + liquibase-core + diff --git a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java index 5f533ff..1f0b5ce 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java @@ -20,8 +20,6 @@ public class TelegramBotController extends TelegramLongPollingBot { final TelegramBot telegramBot; final SshRepository sshRepository; - final TelegramBotKeyboard telegramBotKeyboard; - final UnameChatButtonAggregate unameChatButtonAggregate; final TelegramBotService telegramBotService; @Override diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index e1b733b..fd384fc 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,3 +1,21 @@ +spring: + application: + name: ServerMonitorBot + datasource: + url: jdbc:postgresql://localhost:5432/servermonitorbot + username: servermonitorbot + password: servermonitorbot + jpa: + hibernate: + ddl-auto: none + liquibase: + enabled: true + change-log: classpath:db/scripts/changelog-master.xml + url: jdbc:postgresql://localhost:5432/servermonitorbot + user: servermonitorbot + password: servermonitorbot + liquibase-schema: "liquibase" + default-schema: "servermonitorbot" bot: name: "ServerMonitorBot" token: "token" diff --git a/src/main/resources/db/scripts/changelog-master.xml b/src/main/resources/db/scripts/changelog-master.xml new file mode 100644 index 0000000..bd90cc4 --- /dev/null +++ b/src/main/resources/db/scripts/changelog-master.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db/scripts/release_0_0_1/changelog.xml b/src/main/resources/db/scripts/release_0_0_1/changelog.xml new file mode 100644 index 0000000..38031e7 --- /dev/null +++ b/src/main/resources/db/scripts/release_0_0_1/changelog.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/src/main/resources/db/scripts/release_0_0_1/scripts/01_create_table_users.sql b/src/main/resources/db/scripts/release_0_0_1/scripts/01_create_table_users.sql new file mode 100644 index 0000000..540868e --- /dev/null +++ b/src/main/resources/db/scripts/release_0_0_1/scripts/01_create_table_users.sql @@ -0,0 +1,15 @@ +--liquibase formatted sql + +--changeset L_DelOff:create_table_users rollbackSplitStatements:true +--comment: Создание таблицы пользователей +CREATE TABLE USERS +( + ID VARCHAR(36) PRIMARY KEY, + NAME VARCHAR(128) +); + +COMMENT ON TABLE USERS IS 'Пользователи'; +COMMENT ON COLUMN USERS.ID IS 'Идентификатор пользователя'; +COMMENT ON COLUMN USERS.NAME IS 'Логин пользователя'; + +--rollback DROP TABLE RELEASES; \ No newline at end of file -- 2.40.1 From 4974796f0a7d7dd8c5806df716eea5679b2bb08f Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Thu, 10 Aug 2023 22:21:30 +0300 Subject: [PATCH 07/13] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20rol?= =?UTF-8?q?e=20=D0=B8=20user?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 ++++-- .../ldeloff/servermonitorbot/model/Role.java | 17 +++++++++++++++ .../ldeloff/servermonitorbot/model/User.java | 21 +++++++++++++++++++ .../db/scripts/release_0_0_1/changelog.xml | 3 +++ .../00_create_schema_servermonitorbot.sql | 0 .../scripts/01_create_table_users.sql | 16 +++++++------- .../scripts/02_create_table_roles.sql | 15 +++++++++++++ .../scripts/03_add_FK_users_to_roles.sql | 2 ++ .../release_0_0_1/scripts/04_add_roles.sql | 2 ++ 9 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/model/Role.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/model/User.java create mode 100644 src/main/resources/db/scripts/release_0_0_1/scripts/00_create_schema_servermonitorbot.sql create mode 100644 src/main/resources/db/scripts/release_0_0_1/scripts/02_create_table_roles.sql create mode 100644 src/main/resources/db/scripts/release_0_0_1/scripts/03_add_FK_users_to_roles.sql create mode 100644 src/main/resources/db/scripts/release_0_0_1/scripts/04_add_roles.sql diff --git a/pom.xml b/pom.xml index ca8d61a..fbc64ec 100644 --- a/pom.xml +++ b/pom.xml @@ -55,8 +55,10 @@ org.liquibase liquibase-core - - + + org.postgresql + postgresql + diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/Role.java b/src/main/java/ru/ldeloff/servermonitorbot/model/Role.java new file mode 100644 index 0000000..bdbbccf --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/Role.java @@ -0,0 +1,17 @@ +package ru.ldeloff.servermonitorbot.model; + +import jakarta.persistence.*; +import lombok.Data; + +@Entity +@Data +@Table(name = "roles") +public class Role { + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "role") + private String role; +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/User.java b/src/main/java/ru/ldeloff/servermonitorbot/model/User.java new file mode 100644 index 0000000..b4a0ddd --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/User.java @@ -0,0 +1,21 @@ +package ru.ldeloff.servermonitorbot.model; + +import jakarta.persistence.*; +import lombok.Data; + +@Entity +@Data +@Table(name = "users") +public class User { + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "login") + private Long login; + + @ManyToOne + @JoinColumn(name = "id_role") + private Role role; +} diff --git a/src/main/resources/db/scripts/release_0_0_1/changelog.xml b/src/main/resources/db/scripts/release_0_0_1/changelog.xml index 38031e7..9607261 100644 --- a/src/main/resources/db/scripts/release_0_0_1/changelog.xml +++ b/src/main/resources/db/scripts/release_0_0_1/changelog.xml @@ -5,5 +5,8 @@ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> + + + \ No newline at end of file diff --git a/src/main/resources/db/scripts/release_0_0_1/scripts/00_create_schema_servermonitorbot.sql b/src/main/resources/db/scripts/release_0_0_1/scripts/00_create_schema_servermonitorbot.sql new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/db/scripts/release_0_0_1/scripts/01_create_table_users.sql b/src/main/resources/db/scripts/release_0_0_1/scripts/01_create_table_users.sql index 540868e..8d5f188 100644 --- a/src/main/resources/db/scripts/release_0_0_1/scripts/01_create_table_users.sql +++ b/src/main/resources/db/scripts/release_0_0_1/scripts/01_create_table_users.sql @@ -2,14 +2,16 @@ --changeset L_DelOff:create_table_users rollbackSplitStatements:true --comment: Создание таблицы пользователей -CREATE TABLE USERS +CREATE TABLE users ( - ID VARCHAR(36) PRIMARY KEY, - NAME VARCHAR(128) + id integer PRIMARY KEY, + login VARCHAR(128), + id_role integer ); -COMMENT ON TABLE USERS IS 'Пользователи'; -COMMENT ON COLUMN USERS.ID IS 'Идентификатор пользователя'; -COMMENT ON COLUMN USERS.NAME IS 'Логин пользователя'; +COMMENT ON TABLE users IS 'Пользователи'; +COMMENT ON COLUMN users.id IS 'Идентификатор пользователя'; +COMMENT ON COLUMN users.login IS 'Логин пользователя'; +COMMENT ON COLUMN users.id_role IS 'Ссылка на роль пользователя'; ---rollback DROP TABLE RELEASES; \ No newline at end of file +--rollback DROP TABLE users; \ No newline at end of file diff --git a/src/main/resources/db/scripts/release_0_0_1/scripts/02_create_table_roles.sql b/src/main/resources/db/scripts/release_0_0_1/scripts/02_create_table_roles.sql new file mode 100644 index 0000000..d09119d --- /dev/null +++ b/src/main/resources/db/scripts/release_0_0_1/scripts/02_create_table_roles.sql @@ -0,0 +1,15 @@ +--liquibase formatted sql + +--changeset L_DelOff:create_table_roles rollbackSplitStatements:true +--comment: Создание таблицы ролей +CREATE TABLE roles +( + id integer PRIMARY KEY, + role VARCHAR(128) +); + +COMMENT ON TABLE roles IS 'Пользователи'; +COMMENT ON COLUMN roles.id IS 'Идентификатор пользователя'; +COMMENT ON COLUMN roles.role IS 'Логин пользователя'; + +--rollback DROP TABLE roles; \ No newline at end of file diff --git a/src/main/resources/db/scripts/release_0_0_1/scripts/03_add_FK_users_to_roles.sql b/src/main/resources/db/scripts/release_0_0_1/scripts/03_add_FK_users_to_roles.sql new file mode 100644 index 0000000..6225766 --- /dev/null +++ b/src/main/resources/db/scripts/release_0_0_1/scripts/03_add_FK_users_to_roles.sql @@ -0,0 +1,2 @@ +ALTER TABLE users +ADD COLUMN role_id INT NOT NULL REFERENCES roles(id); \ No newline at end of file diff --git a/src/main/resources/db/scripts/release_0_0_1/scripts/04_add_roles.sql b/src/main/resources/db/scripts/release_0_0_1/scripts/04_add_roles.sql new file mode 100644 index 0000000..65c0cbf --- /dev/null +++ b/src/main/resources/db/scripts/release_0_0_1/scripts/04_add_roles.sql @@ -0,0 +1,2 @@ +INSERT INTO roles (id, role) VALUES (1, 'ADMIN'); +INSERT INTO roles (id, role) VALUES (2, 'USER'); \ No newline at end of file -- 2.40.1 From 148c511b9eed20c810b44158e9b93f523bd452eb Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sat, 12 Aug 2023 19:43:04 +0300 Subject: [PATCH 08/13] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B9=D0=BA=D0=B0=20=D0=91=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/ldeloff/servermonitorbot/model/Role.java | 4 ++-- .../java/ru/ldeloff/servermonitorbot/model/User.java | 6 +++--- .../resources/db/scripts/release_0_0_1/changelog.xml | 4 ++++ .../release_0_0_1/scripts/01_create_table_users.sql | 2 +- .../release_0_0_1/scripts/02_create_table_roles.sql | 2 +- .../release_0_0_1/scripts/05_add_anonymous_role.sql | 1 + .../release_0_0_1/scripts/06_refactor_users_table.sql | 9 +++++++++ .../release_0_0_1/scripts/07_refactor_roles_table.sql | 6 ++++++ .../db/scripts/release_0_0_1/scripts/08_add_roles.sql | 4 ++++ 9 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/db/scripts/release_0_0_1/scripts/05_add_anonymous_role.sql create mode 100644 src/main/resources/db/scripts/release_0_0_1/scripts/06_refactor_users_table.sql create mode 100644 src/main/resources/db/scripts/release_0_0_1/scripts/07_refactor_roles_table.sql create mode 100644 src/main/resources/db/scripts/release_0_0_1/scripts/08_add_roles.sql diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/Role.java b/src/main/java/ru/ldeloff/servermonitorbot/model/Role.java index bdbbccf..d6f800d 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/model/Role.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/Role.java @@ -12,6 +12,6 @@ public class Role { @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; - @Column(name = "role") - private String role; + @Column(name = "name") + private String name; } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/User.java b/src/main/java/ru/ldeloff/servermonitorbot/model/User.java index b4a0ddd..c732b3e 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/model/User.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/User.java @@ -12,10 +12,10 @@ public class User { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(name = "login") - private Long login; + @Column(name = "telegram_id") + private Long telegramId; @ManyToOne - @JoinColumn(name = "id_role") + @JoinColumn(name = "role_id") private Role role; } diff --git a/src/main/resources/db/scripts/release_0_0_1/changelog.xml b/src/main/resources/db/scripts/release_0_0_1/changelog.xml index 9607261..1b0334d 100644 --- a/src/main/resources/db/scripts/release_0_0_1/changelog.xml +++ b/src/main/resources/db/scripts/release_0_0_1/changelog.xml @@ -8,5 +8,9 @@ + + + + \ No newline at end of file diff --git a/src/main/resources/db/scripts/release_0_0_1/scripts/01_create_table_users.sql b/src/main/resources/db/scripts/release_0_0_1/scripts/01_create_table_users.sql index 8d5f188..9164f99 100644 --- a/src/main/resources/db/scripts/release_0_0_1/scripts/01_create_table_users.sql +++ b/src/main/resources/db/scripts/release_0_0_1/scripts/01_create_table_users.sql @@ -4,7 +4,7 @@ --comment: Создание таблицы пользователей CREATE TABLE users ( - id integer PRIMARY KEY, + id SERIAL PRIMARY KEY, login VARCHAR(128), id_role integer ); diff --git a/src/main/resources/db/scripts/release_0_0_1/scripts/02_create_table_roles.sql b/src/main/resources/db/scripts/release_0_0_1/scripts/02_create_table_roles.sql index d09119d..e7d5fad 100644 --- a/src/main/resources/db/scripts/release_0_0_1/scripts/02_create_table_roles.sql +++ b/src/main/resources/db/scripts/release_0_0_1/scripts/02_create_table_roles.sql @@ -4,7 +4,7 @@ --comment: Создание таблицы ролей CREATE TABLE roles ( - id integer PRIMARY KEY, + id SERIAL PRIMARY KEY, role VARCHAR(128) ); diff --git a/src/main/resources/db/scripts/release_0_0_1/scripts/05_add_anonymous_role.sql b/src/main/resources/db/scripts/release_0_0_1/scripts/05_add_anonymous_role.sql new file mode 100644 index 0000000..ba5a19a --- /dev/null +++ b/src/main/resources/db/scripts/release_0_0_1/scripts/05_add_anonymous_role.sql @@ -0,0 +1 @@ +INSERT INTO roles (id, role) VALUES (3, 'ANONYMOUS'); \ No newline at end of file diff --git a/src/main/resources/db/scripts/release_0_0_1/scripts/06_refactor_users_table.sql b/src/main/resources/db/scripts/release_0_0_1/scripts/06_refactor_users_table.sql new file mode 100644 index 0000000..4a51d65 --- /dev/null +++ b/src/main/resources/db/scripts/release_0_0_1/scripts/06_refactor_users_table.sql @@ -0,0 +1,9 @@ +ALTER TABLE users + DROP COLUMN login; + +ALTER TABLE users + ADD COLUMN telegram_id INTEGER UNIQUE; + COMMENT ON COLUMN users.telegram_id IS 'Telegram ID пользователя'; + +ALTER TABLE users + DROP COLUMN id_role; \ No newline at end of file diff --git a/src/main/resources/db/scripts/release_0_0_1/scripts/07_refactor_roles_table.sql b/src/main/resources/db/scripts/release_0_0_1/scripts/07_refactor_roles_table.sql new file mode 100644 index 0000000..c39ec05 --- /dev/null +++ b/src/main/resources/db/scripts/release_0_0_1/scripts/07_refactor_roles_table.sql @@ -0,0 +1,6 @@ +ALTER TABLE roles + DROP COLUMN role; + +ALTER TABLE roles + ADD COLUMN name VARCHAR(128); +COMMENT ON COLUMN roles.name IS 'Имя роли'; \ No newline at end of file diff --git a/src/main/resources/db/scripts/release_0_0_1/scripts/08_add_roles.sql b/src/main/resources/db/scripts/release_0_0_1/scripts/08_add_roles.sql new file mode 100644 index 0000000..cdce579 --- /dev/null +++ b/src/main/resources/db/scripts/release_0_0_1/scripts/08_add_roles.sql @@ -0,0 +1,4 @@ +TRUNCATE TABLE roles CASCADE; +INSERT INTO roles (id, name) VALUES (1, 'ADMIN'); +INSERT INTO roles (id, name) VALUES (2, 'USER'); +INSERT INTO roles (id, name) VALUES (3, 'ANONYMOUS'); \ No newline at end of file -- 2.40.1 From e1ea86b36bfa6a426ac9db67bfaad14183c645ae Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sat, 12 Aug 2023 19:43:49 +0300 Subject: [PATCH 09/13] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=B7=D0=B0?= =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9=20=D0=B2?= =?UTF-8?q?=20=D0=91=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servermonitorbot/config/UserConfig.java | 17 ++++++++++ .../servermonitorbot/init/AddUsers.java | 34 +++++++++++++++++++ .../servermonitorbot/mapper/UserMapper.java | 22 ++++++++++++ .../model/dto/InitUserDto.java | 14 ++++++++ src/main/resources/application.yml | 3 ++ 5 files changed, 90 insertions(+) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/config/UserConfig.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/init/AddUsers.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/mapper/UserMapper.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/model/dto/InitUserDto.java diff --git a/src/main/java/ru/ldeloff/servermonitorbot/config/UserConfig.java b/src/main/java/ru/ldeloff/servermonitorbot/config/UserConfig.java new file mode 100644 index 0000000..9c9e51d --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/config/UserConfig.java @@ -0,0 +1,17 @@ +package ru.ldeloff.servermonitorbot.config; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import ru.ldeloff.servermonitorbot.model.dto.InitUserDto; + +import java.util.List; + +@Configuration +@ConfigurationProperties(prefix = "bot") +@Getter +@Setter +public class UserConfig { + private List users; +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/AddUsers.java b/src/main/java/ru/ldeloff/servermonitorbot/init/AddUsers.java new file mode 100644 index 0000000..560d72e --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/AddUsers.java @@ -0,0 +1,34 @@ +package ru.ldeloff.servermonitorbot.init; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; +import ru.ldeloff.servermonitorbot.config.UserConfig; +import ru.ldeloff.servermonitorbot.mapper.UserMapper; +import ru.ldeloff.servermonitorbot.model.User; +import ru.ldeloff.servermonitorbot.model.dto.InitUserDto; +import ru.ldeloff.servermonitorbot.service.user.UserService; + +import java.util.List; + +@Component +public class AddUsers implements ApplicationRunner { + final List initUsers; + final UserService userService; + final UserMapper userMapper; + + @Autowired + public AddUsers(UserConfig userConfig, UserService userService, UserMapper userMapper) { + this.initUsers = userConfig.getUsers(); + this.userService = userService; + this.userMapper = userMapper; + } + + @Override + public void run(ApplicationArguments args) throws Exception { + initUsers.forEach(initUserDto -> { + User user = userService.saveOrUpdateUser(userMapper.dtoToUser(initUserDto)); + }); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/mapper/UserMapper.java b/src/main/java/ru/ldeloff/servermonitorbot/mapper/UserMapper.java new file mode 100644 index 0000000..aa7811a --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/mapper/UserMapper.java @@ -0,0 +1,22 @@ +package ru.ldeloff.servermonitorbot.mapper; + +import org.springframework.stereotype.Component; +import ru.ldeloff.servermonitorbot.model.User; +import ru.ldeloff.servermonitorbot.model.dto.InitUserDto; +import ru.ldeloff.servermonitorbot.service.role.RoleService; + +@Component +public class UserMapper { + final RoleService roleService; + + public UserMapper(RoleService roleService) { + this.roleService = roleService; + } + + public User dtoToUser(InitUserDto initUserDto) { + User user = new User(); + user.setTelegramId(initUserDto.getTelegramId()); + user.setRole(roleService.findRoleByName(initUserDto.getRole())); + return user; + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/dto/InitUserDto.java b/src/main/java/ru/ldeloff/servermonitorbot/model/dto/InitUserDto.java new file mode 100644 index 0000000..a18efdf --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/dto/InitUserDto.java @@ -0,0 +1,14 @@ +package ru.ldeloff.servermonitorbot.model.dto; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.springframework.stereotype.Component; + +@Data +@Component +public class InitUserDto { + @NotNull + private long telegramId; + @NotNull + private String role; +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index fd384fc..35a985d 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -19,6 +19,9 @@ spring: bot: name: "ServerMonitorBot" token: "token" + users: + - telegramId: 123456789 + role: admin ssh: servers: - -- 2.40.1 From ad7ee9a96cce82b11aa10029da9e626c9b7e7684 Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sat, 12 Aug 2023 19:44:30 +0300 Subject: [PATCH 10/13] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=80=D0=BE=D0=BB=D0=B5=D0=B2=D0=B0=D1=8F?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servermonitorbot/config/SshConfig.java | 13 +- .../controller/TelegramBotController.java | 116 +++++++++++++++--- .../repository/RoleRepository.java | 13 ++ .../repository/UserRepository.java | 10 ++ .../service/TelegramBotService.java | 3 +- .../service/TelegramBotServiceImpl.java | 22 ++++ .../service/role/RoleService.java | 9 ++ .../service/role/RoleServiceImpl.java | 28 +++++ .../service/user/UserService.java | 9 ++ .../service/user/UserServiceImpl.java | 29 +++++ .../utils/ui/TelegramBotKeyboard.java | 4 +- 11 files changed, 226 insertions(+), 30 deletions(-) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/repository/RoleRepository.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/repository/UserRepository.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleService.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleServiceImpl.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/user/UserService.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/user/UserServiceImpl.java diff --git a/src/main/java/ru/ldeloff/servermonitorbot/config/SshConfig.java b/src/main/java/ru/ldeloff/servermonitorbot/config/SshConfig.java index deb3255..bac7aed 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/config/SshConfig.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/config/SshConfig.java @@ -1,5 +1,8 @@ package ru.ldeloff.servermonitorbot.config; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import ru.ldeloff.servermonitorbot.model.SshServer; @@ -8,14 +11,8 @@ import java.util.List; @Configuration @ConfigurationProperties(prefix = "ssh") +@Getter +@Setter public class SshConfig { private List servers; - - public List getServers() { - return servers; - } - - public void setServers(List servers) { - this.servers = servers; - } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java index 1f0b5ce..c589eab 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java @@ -7,9 +7,13 @@ import org.telegram.telegrambots.bots.TelegramLongPollingBot; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Update; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; +import ru.ldeloff.servermonitorbot.model.Role; import ru.ldeloff.servermonitorbot.model.TelegramBot; +import ru.ldeloff.servermonitorbot.model.User; import ru.ldeloff.servermonitorbot.repository.SshRepository; import ru.ldeloff.servermonitorbot.service.TelegramBotService; +import ru.ldeloff.servermonitorbot.service.role.RoleService; +import ru.ldeloff.servermonitorbot.service.user.UserService; import ru.ldeloff.servermonitorbot.utils.ui.TelegramBotKeyboard; import ru.ldeloff.servermonitorbot.utils.ui.uname.UnameChatButtonAggregate; @@ -21,32 +25,67 @@ public class TelegramBotController extends TelegramLongPollingBot { final TelegramBot telegramBot; final SshRepository sshRepository; final TelegramBotService telegramBotService; + final UserService userService; + final RoleService roleService; @Override public void onUpdateReceived(Update update) { + Role role = getRole(update); if (update.hasMessage()) { if (update.getMessage().hasText()) { String messageText = update.getMessage().getText(); switch (messageText) { case "/start" -> { - log.info("Получена команда '" + messageText - + "' от " + update.getMessage().getChat().getUserName()); - telegramBotService.firstUse(update, this); + if (role.getId() < 3) { + log.info("Получена команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName() + + " (" + update.getMessage().getChat().getId() + "). OK"); + telegramBotService.firstUse(update, this); + } else { + log.warn("Получена команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName() + + " (" + update.getMessage().getChat().getId() + "). Нет прав"); + telegramBotService.notAuthorization(update, this); + } } case "Статус" -> { - log.info("Получена команда '" + messageText - + "' от " + update.getMessage().getChat().getUserName()); - telegramBotService.getStatusSessions(update, this); + if (role.getId() < 3) { + log.info("Получена команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName() + + " (" + update.getMessage().getChat().getId() + "). OK"); + telegramBotService.getStatusSessions(update, this); + } else { + log.warn("Получена команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName() + + " (" + update.getMessage().getChat().getId() + "). Нет прав"); + telegramBotService.notAuthorization(update, this); + } } case "uname" -> { - log.info("Получена команда '" + messageText - + "' от " + update.getMessage().getChat().getUserName()); - telegramBotService.sendUnameAggregate(update, this); + if (role.getId() < 3) { + log.info("Получена команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName() + + " (" + update.getMessage().getChat().getId() + "). OK"); + telegramBotService.sendUnameAggregate(update, this); + } else { + log.warn("Получена команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName() + + " (" + update.getMessage().getChat().getId() + "). Нет прав"); + telegramBotService.notAuthorization(update, this); + } } default -> { - log.warn("Неизвестная команда '" + messageText - + "' от " + update.getMessage().getChat().getUserName()); - telegramBotService.switchToMainMenu(update, this); + if (role.getId() < 3) { + log.warn("Неизвестная команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName() + + " (" + update.getMessage().getChat().getId() + "). ОК"); + telegramBotService.switchToMainMenu(update, this); + } else { + log.warn("Неизвестная команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName() + + " (" + update.getMessage().getChat().getId() + "). Нет прав"); + telegramBotService.notAuthorization(update, this); + } } } } @@ -56,20 +95,44 @@ public class TelegramBotController extends TelegramLongPollingBot { if (tags.length > 1) { switch (tags[0]) { case "uname": - log.info("Получена команда '" + messageText - + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName()); - telegramBotService.uname(update, this); + if (role.getId() < 3) { + log.info("Получена команда '" + messageText + + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() + + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). ОК"); + telegramBotService.uname(update, this); + } else { + log.info("Получена команда '" + messageText + + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() + + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). Нет прав"); + telegramBotService.notAuthorization(update, this); + } break; default: - log.warn("Неизвестная команда '" + messageText - + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName()); - telegramBotService.switchToMainMenu(update, this); + if (role.getId() < 3) { + log.warn("Неизвестная команда '" + messageText + + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() + + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). ОК"); + telegramBotService.switchToMainMenu(update, this); + } else { + log.warn("Неизвестная команда '" + messageText + + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() + + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). Нет прав"); + telegramBotService.notAuthorization(update, this); + } break; } } else { + if (role.getId() < 3) { log.warn("Неверный формат команды '" + messageText - + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName()); + + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() + + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). ОК"); telegramBotService.switchToMainMenu(update, this); + } else { + log.warn("Неверный формат команды '" + messageText + + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() + + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). Нет прав"); + telegramBotService.notAuthorization(update, this); + } } } } @@ -89,4 +152,19 @@ public class TelegramBotController extends TelegramLongPollingBot { super.onClosing(); sshRepository.disconnectSessions(); } + + private Role getRole(Update update) { + Long id = null; + if (update.hasMessage()) { + id = update.getMessage().getChat().getId(); + } else if (update.hasCallbackQuery()) { + id = update.getCallbackQuery().getMessage().getChat().getId(); + } + User user = userService.getByTelegramId(id); + if (user == null) { + return roleService.findRoleById(3L); + } else { + return user.getRole(); + } + } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/repository/RoleRepository.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/RoleRepository.java new file mode 100644 index 0000000..4bb81ec --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/repository/RoleRepository.java @@ -0,0 +1,13 @@ +package ru.ldeloff.servermonitorbot.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import ru.ldeloff.servermonitorbot.model.Role; + +import java.util.Optional; + +@Repository +public interface RoleRepository extends JpaRepository { + Optional findRoleByName(String name); + Optional findRoleById(Long id); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/repository/UserRepository.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/UserRepository.java new file mode 100644 index 0000000..ceaacd3 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/repository/UserRepository.java @@ -0,0 +1,10 @@ +package ru.ldeloff.servermonitorbot.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import ru.ldeloff.servermonitorbot.model.User; + +@Repository +public interface UserRepository extends JpaRepository { + User getByTelegramId(long id); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java index cf86879..507a7fc 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java @@ -9,5 +9,6 @@ public interface TelegramBotService { void getStatusSessions(Update update, TelegramBotController bot); void sendUnameAggregate(Update update, TelegramBotController bot); void uname(Update update, TelegramBotController bot); - void firstUse(Update update, TelegramBotController telegramBotController); + void firstUse(Update update, TelegramBotController bot); + void notAuthorization(Update update, TelegramBotController bot); } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java index 53df118..84b24af 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java @@ -31,6 +31,28 @@ public class TelegramBotServiceImpl implements TelegramBotService { message.setChatId(chatId); sendMessage(telegramBotKeyboard.uiForm(message), bot); } + + @Override + public void notAuthorization(Update update, TelegramBotController bot) { + long id = 0L; + String login = null; + long chatId = 0L; + if (update.hasMessage()) { + id = update.getMessage().getChat().getId(); + login = update.getMessage().getChat().getUserName(); + chatId = update.getMessage().getChatId(); + } else if (update.hasCallbackQuery()) { + id = update.getCallbackQuery().getMessage().getChat().getId(); + login = update.getCallbackQuery().getMessage().getChat().getUserName(); + chatId = update.getCallbackQuery().getMessage().getChatId(); + } + SendMessage message = new SendMessage(); + message.setText("У пользователя " + login + + " (" + id + ") недостаточно прав для выполнения этой команды"); + message.setChatId(chatId); + sendMessage(message, bot); + } + @Override public void switchToMainMenu(Update update, TelegramBotController bot) { SendMessage message = new SendMessage(); diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleService.java new file mode 100644 index 0000000..b26d5e1 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleService.java @@ -0,0 +1,9 @@ +package ru.ldeloff.servermonitorbot.service.role; + +import ru.ldeloff.servermonitorbot.model.Role; + +public interface RoleService { + Role findRoleByName(String name); + + Role findRoleById(Long id); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleServiceImpl.java new file mode 100644 index 0000000..6cf52a8 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleServiceImpl.java @@ -0,0 +1,28 @@ +package ru.ldeloff.servermonitorbot.service.role; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import ru.ldeloff.servermonitorbot.model.Role; +import ru.ldeloff.servermonitorbot.repository.RoleRepository; + +import java.util.Locale; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class RoleServiceImpl implements RoleService { + private final RoleRepository roleRepository; + + @Override + public Role findRoleByName(String name) { + Optional role = roleRepository.findRoleByName(name.toUpperCase(Locale.ROOT)); + //noinspection OptionalGetWithoutIsPresent + return role.orElseGet(() -> roleRepository.findRoleByName("ANONYMOUS").get()); + } + + @Override + public Role findRoleById(Long id) { + Optional role = roleRepository.findRoleById(id); + return role.orElseGet(() -> roleRepository.findRoleByName("ANONYMOUS").get()); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserService.java new file mode 100644 index 0000000..e7ea1ff --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserService.java @@ -0,0 +1,9 @@ +package ru.ldeloff.servermonitorbot.service.user; + +import ru.ldeloff.servermonitorbot.model.User; + +public interface UserService { + User saveOrUpdateUser(User user); + + User getByTelegramId(Long id); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserServiceImpl.java new file mode 100644 index 0000000..ff2844a --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserServiceImpl.java @@ -0,0 +1,29 @@ +package ru.ldeloff.servermonitorbot.service.user; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.ldeloff.servermonitorbot.model.User; +import ru.ldeloff.servermonitorbot.repository.UserRepository; + +@Service +@RequiredArgsConstructor +@Slf4j +public class UserServiceImpl implements UserService { + + final UserRepository userRepository; + + @Override + public User saveOrUpdateUser(User user) { + User existUser = userRepository.getByTelegramId(user.getTelegramId()); + if (existUser != null) { + user.setId(existUser.getId()); + } + return userRepository.save(user); + } + + @Override + public User getByTelegramId(Long id) { + return userRepository.getByTelegramId(id); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java index 3ab4b9f..a07a478 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java @@ -17,8 +17,8 @@ public class TelegramBotKeyboard implements UiFormer { @Override public SendMessage uiForm(SendMessage message) { ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); - replyKeyboardMarkup.setResizeKeyboard(true); //подгоняем размер - replyKeyboardMarkup.setOneTimeKeyboard(false); //скрываем после использования + replyKeyboardMarkup.setResizeKeyboard(true); + replyKeyboardMarkup.setOneTimeKeyboard(false); ArrayList keyboardRows = new ArrayList<>(); -- 2.40.1 From 32147b0e526dc5133e9ec496265e70cf004ea14b Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sun, 13 Aug 2023 18:24:29 +0300 Subject: [PATCH 11/13] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BF=D0=B0=D1=82=D1=82=D0=B5=D1=80=D0=BD=20Tem?= =?UTF-8?q?plate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TelegramBotController.java | 134 +++--------------- .../ldeloff/servermonitorbot/model/User.java | 3 + .../service/TelegramBotService.java | 14 -- .../service/TelegramBotServiceImpl.java | 91 ------------ .../service/command/CommandTemplate.java | 87 ++++++++++++ .../service/command/FirstUseCommand.java | 23 +++ .../service/command/GetStatusSessions.java | 23 +++ .../service/command/SwitchToMainMenu.java | 35 +++++ .../command/uname/UnameAggregateCommand.java | 24 ++++ .../uname/UnameCommand.java} | 47 +++--- .../service/ssh/SshService.java | 4 +- .../service/ssh/SshServiceImpl.java | 8 +- .../service/uname/UnameService.java | 10 -- 13 files changed, 239 insertions(+), 264 deletions(-) delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandTemplate.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/FirstUseCommand.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/GetStatusSessions.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/SwitchToMainMenu.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameAggregateCommand.java rename src/main/java/ru/ldeloff/servermonitorbot/service/{uname/UnameServiceImpl.java => command/uname/UnameCommand.java} (51%) delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameService.java diff --git a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java index c589eab..d5b17aa 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java @@ -4,18 +4,14 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.telegram.telegrambots.bots.TelegramLongPollingBot; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Update; -import org.telegram.telegrambots.meta.exceptions.TelegramApiException; -import ru.ldeloff.servermonitorbot.model.Role; import ru.ldeloff.servermonitorbot.model.TelegramBot; -import ru.ldeloff.servermonitorbot.model.User; import ru.ldeloff.servermonitorbot.repository.SshRepository; -import ru.ldeloff.servermonitorbot.service.TelegramBotService; -import ru.ldeloff.servermonitorbot.service.role.RoleService; -import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.ui.TelegramBotKeyboard; -import ru.ldeloff.servermonitorbot.utils.ui.uname.UnameChatButtonAggregate; +import ru.ldeloff.servermonitorbot.service.command.FirstUseCommand; +import ru.ldeloff.servermonitorbot.service.command.GetStatusSessions; +import ru.ldeloff.servermonitorbot.service.command.SwitchToMainMenu; +import ru.ldeloff.servermonitorbot.service.command.uname.UnameAggregateCommand; +import ru.ldeloff.servermonitorbot.service.command.uname.UnameCommand; @Service @Slf4j @@ -24,115 +20,46 @@ public class TelegramBotController extends TelegramLongPollingBot { final TelegramBot telegramBot; final SshRepository sshRepository; - final TelegramBotService telegramBotService; - final UserService userService; - final RoleService roleService; + + final FirstUseCommand firstUseCommand; + final GetStatusSessions getStatusSessions; + final UnameAggregateCommand unameAggregateCommand; + final SwitchToMainMenu switchToMainMenu; + final UnameCommand unameCommand; @Override public void onUpdateReceived(Update update) { - Role role = getRole(update); if (update.hasMessage()) { if (update.getMessage().hasText()) { String messageText = update.getMessage().getText(); switch (messageText) { case "/start" -> { - if (role.getId() < 3) { - log.info("Получена команда '" + messageText - + "' от " + update.getMessage().getChat().getUserName() - + " (" + update.getMessage().getChat().getId() + "). OK"); - telegramBotService.firstUse(update, this); - } else { - log.warn("Получена команда '" + messageText - + "' от " + update.getMessage().getChat().getUserName() - + " (" + update.getMessage().getChat().getId() + "). Нет прав"); - telegramBotService.notAuthorization(update, this); - } + firstUseCommand.execute(update, this); } case "Статус" -> { - if (role.getId() < 3) { - log.info("Получена команда '" + messageText - + "' от " + update.getMessage().getChat().getUserName() - + " (" + update.getMessage().getChat().getId() + "). OK"); - telegramBotService.getStatusSessions(update, this); - } else { - log.warn("Получена команда '" + messageText - + "' от " + update.getMessage().getChat().getUserName() - + " (" + update.getMessage().getChat().getId() + "). Нет прав"); - telegramBotService.notAuthorization(update, this); - } + getStatusSessions.execute(update, this); } case "uname" -> { - if (role.getId() < 3) { - log.info("Получена команда '" + messageText - + "' от " + update.getMessage().getChat().getUserName() - + " (" + update.getMessage().getChat().getId() + "). OK"); - telegramBotService.sendUnameAggregate(update, this); - } else { - log.warn("Получена команда '" + messageText - + "' от " + update.getMessage().getChat().getUserName() - + " (" + update.getMessage().getChat().getId() + "). Нет прав"); - telegramBotService.notAuthorization(update, this); - } + unameAggregateCommand.execute(update, this); } default -> { - if (role.getId() < 3) { - log.warn("Неизвестная команда '" + messageText - + "' от " + update.getMessage().getChat().getUserName() - + " (" + update.getMessage().getChat().getId() + "). ОК"); - telegramBotService.switchToMainMenu(update, this); - } else { - log.warn("Неизвестная команда '" + messageText - + "' от " + update.getMessage().getChat().getUserName() - + " (" + update.getMessage().getChat().getId() + "). Нет прав"); - telegramBotService.notAuthorization(update, this); - } + switchToMainMenu.execute(update, this); } } } } else if (update.hasCallbackQuery()) { - String messageText = update.getCallbackQuery().getData(); - String [] tags = messageText.split(":"); + String [] tags = update.getCallbackQuery().getData().split(":"); if (tags.length > 1) { switch (tags[0]) { - case "uname": - if (role.getId() < 3) { - log.info("Получена команда '" + messageText - + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() - + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). ОК"); - telegramBotService.uname(update, this); - } else { - log.info("Получена команда '" + messageText - + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() - + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). Нет прав"); - telegramBotService.notAuthorization(update, this); - } - break; - default: - if (role.getId() < 3) { - log.warn("Неизвестная команда '" + messageText - + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() - + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). ОК"); - telegramBotService.switchToMainMenu(update, this); - } else { - log.warn("Неизвестная команда '" + messageText - + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() - + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). Нет прав"); - telegramBotService.notAuthorization(update, this); - } - break; + case "uname" -> { + unameCommand.execute(update, this); + } + default -> { + switchToMainMenu.execute(update, this); + } } } else { - if (role.getId() < 3) { - log.warn("Неверный формат команды '" + messageText - + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() - + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). ОК"); - telegramBotService.switchToMainMenu(update, this); - } else { - log.warn("Неверный формат команды '" + messageText - + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() - + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). Нет прав"); - telegramBotService.notAuthorization(update, this); - } + switchToMainMenu.execute(update, this); } } } @@ -152,19 +79,4 @@ public class TelegramBotController extends TelegramLongPollingBot { super.onClosing(); sshRepository.disconnectSessions(); } - - private Role getRole(Update update) { - Long id = null; - if (update.hasMessage()) { - id = update.getMessage().getChat().getId(); - } else if (update.hasCallbackQuery()) { - id = update.getCallbackQuery().getMessage().getChat().getId(); - } - User user = userService.getByTelegramId(id); - if (user == null) { - return roleService.findRoleById(3L); - } else { - return user.getRole(); - } - } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/User.java b/src/main/java/ru/ldeloff/servermonitorbot/model/User.java index c732b3e..a32c391 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/model/User.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/User.java @@ -18,4 +18,7 @@ public class User { @ManyToOne @JoinColumn(name = "role_id") private Role role; + + @Transient + private String login; } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java deleted file mode 100644 index 507a7fc..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.ldeloff.servermonitorbot.service; - -import org.telegram.telegrambots.meta.api.objects.Update; -import ru.ldeloff.servermonitorbot.controller.TelegramBotController; - -public interface TelegramBotService { - - void switchToMainMenu(Update update, TelegramBotController bot); - void getStatusSessions(Update update, TelegramBotController bot); - void sendUnameAggregate(Update update, TelegramBotController bot); - void uname(Update update, TelegramBotController bot); - void firstUse(Update update, TelegramBotController bot); - void notAuthorization(Update update, TelegramBotController bot); -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java deleted file mode 100644 index 84b24af..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java +++ /dev/null @@ -1,91 +0,0 @@ -package ru.ldeloff.servermonitorbot.service; - -import lombok.RequiredArgsConstructor; -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 org.telegram.telegrambots.meta.exceptions.TelegramApiException; -import ru.ldeloff.servermonitorbot.controller.TelegramBotController; -import ru.ldeloff.servermonitorbot.repository.SshRepository; -import ru.ldeloff.servermonitorbot.service.ssh.SshService; -import ru.ldeloff.servermonitorbot.service.uname.UnameService; -import ru.ldeloff.servermonitorbot.utils.ui.TelegramBotKeyboard; -import ru.ldeloff.servermonitorbot.utils.ui.uname.UnameChatButtonAggregate; - -@Slf4j -@Service -@RequiredArgsConstructor -public class TelegramBotServiceImpl implements TelegramBotService { - final TelegramBotKeyboard telegramBotKeyboard; - final UnameChatButtonAggregate unameChatButtonAggregate; - final UnameService unameService; - final SshService sshService; - - @Override - public void firstUse(Update update, TelegramBotController bot) { - SendMessage message = new SendMessage(); - long chatId = 0L; - chatId = update.getMessage().getChatId(); - message.setText("Добро пожаловать " + update.getMessage().getChat().getUserName() + "!"); - message.setChatId(chatId); - sendMessage(telegramBotKeyboard.uiForm(message), bot); - } - - @Override - public void notAuthorization(Update update, TelegramBotController bot) { - long id = 0L; - String login = null; - long chatId = 0L; - if (update.hasMessage()) { - id = update.getMessage().getChat().getId(); - login = update.getMessage().getChat().getUserName(); - chatId = update.getMessage().getChatId(); - } else if (update.hasCallbackQuery()) { - id = update.getCallbackQuery().getMessage().getChat().getId(); - login = update.getCallbackQuery().getMessage().getChat().getUserName(); - chatId = update.getCallbackQuery().getMessage().getChatId(); - } - SendMessage message = new SendMessage(); - message.setText("У пользователя " + login - + " (" + id + ") недостаточно прав для выполнения этой команды"); - message.setChatId(chatId); - sendMessage(message, bot); - } - - @Override - public void switchToMainMenu(Update update, TelegramBotController bot) { - SendMessage message = new SendMessage(); - long chatId = 0L; - try { - chatId = update.getMessage().getChatId(); - } catch (Exception e) { - chatId = update.getCallbackQuery().getMessage().getChatId(); - } - message.setText("Неверная команда и или формат. Попробуем сначала."); - message.setChatId(chatId); - sendMessage(telegramBotKeyboard.uiForm(message), bot); - } - @Override - public void getStatusSessions(Update update, TelegramBotController bot) { - sendMessage(sshService.getStatusSessions(update), bot); - } - @Override - public void sendUnameAggregate(Update update, TelegramBotController bot) { - sendMessage(unameService.sendUnameAggregate(update), bot); - } - - @Override - public void uname(Update update, TelegramBotController bot) { - sendMessage(unameService.uname(update), bot); - } - - private void sendMessage(SendMessage message, TelegramBotController bot) { - try { - bot.execute(message); - } catch (TelegramApiException e) { - e.printStackTrace(); - log.warn(e.getMessage()); - } - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandTemplate.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandTemplate.java new file mode 100644 index 0000000..0f178d7 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandTemplate.java @@ -0,0 +1,87 @@ +package ru.ldeloff.servermonitorbot.service.command; + +import lombok.Data; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import org.telegram.telegrambots.meta.api.objects.Update; +import org.telegram.telegrambots.meta.exceptions.TelegramApiException; +import ru.ldeloff.servermonitorbot.controller.TelegramBotController; +import ru.ldeloff.servermonitorbot.model.User; +import ru.ldeloff.servermonitorbot.service.role.RoleService; +import ru.ldeloff.servermonitorbot.service.user.UserService; + +@Data +@Slf4j +@RequiredArgsConstructor +public abstract class CommandTemplate { + final UserService userService; + final RoleService roleService; + long expectedRole = 2L; + public abstract SendMessage actionForAuth(User user, SendMessage message); + + public SendMessage actionForNotAuth(User user, SendMessage message) { + message.setText("У пользователя " + user.getLogin() + " (" + user.getTelegramId() + + ") недостаточно прав для выполнения этой команды"); + return message; + } + public void execute(Update update, TelegramBotController bot) { + User user = getUser(update); + String message = getMessage(update); + SendMessage answer = new SendMessage(); + answer.setChatId(user.getTelegramId()); + answer.setText(message); + if (user.getRole().getId() <= expectedRole) { + logSuccess(user, message); + sendMessage(actionForAuth(user, answer), bot); + } else { + logNotAuth(user, message); + sendMessage(actionForNotAuth(user, answer), bot); + } + } + protected void logSuccess(User user, String message) { + log.info("Получена команда '" + message + "' от " + user.getLogin() + + " (" + user.getTelegramId() + "). OK"); + } + protected void logNotAuth(User user, String message) { + log.warn("Получена команда '" + message + "' от " + user.getLogin() + + " (" + user.getTelegramId() + "). Нет прав"); + } + private User getUser(Update update) { + long id = -1L; + String login = null; + if (update.hasMessage()) { + id = update.getMessage().getChat().getId(); + login = update.getMessage().getChat().getUserName(); + } else if (update.hasCallbackQuery()) { + id = update.getCallbackQuery().getMessage().getChat().getId(); + login = update.getCallbackQuery().getMessage().getChat().getUserName(); + } + User user = userService.getByTelegramId(id); + if (user == null) { + user = new User(); + user.setTelegramId(id); + user.setRole(roleService.findRoleById(3L)); + } + user.setLogin(login); + return user; + } + + private String getMessage(Update update) { + if (update.hasMessage()) { + return update.getMessage().getText(); + } else if (update.hasCallbackQuery()) { + return update.getCallbackQuery().getData(); + } + return ""; + } + + private void sendMessage(SendMessage message, TelegramBotController bot) { + try { + bot.execute(message); + } catch (TelegramApiException e) { + e.printStackTrace(); + log.warn(e.getMessage()); + } + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/FirstUseCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/FirstUseCommand.java new file mode 100644 index 0000000..dfab89d --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/FirstUseCommand.java @@ -0,0 +1,23 @@ +package ru.ldeloff.servermonitorbot.service.command; + +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import ru.ldeloff.servermonitorbot.model.User; +import ru.ldeloff.servermonitorbot.service.role.RoleService; +import ru.ldeloff.servermonitorbot.service.user.UserService; +import ru.ldeloff.servermonitorbot.utils.ui.TelegramBotKeyboard; + +@Service +public class FirstUseCommand extends CommandTemplate { + final TelegramBotKeyboard telegramBotKeyboard; + + public FirstUseCommand(UserService userService, RoleService roleService, TelegramBotKeyboard telegramBotKeyboard) { + super(userService, roleService); + this.telegramBotKeyboard = telegramBotKeyboard; + } + @Override + public SendMessage actionForAuth(User user, SendMessage message) { + message.setText("Добро пожаловать " + user.getLogin() + "!"); + return telegramBotKeyboard.uiForm(message); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/GetStatusSessions.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/GetStatusSessions.java new file mode 100644 index 0000000..af5d29e --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/GetStatusSessions.java @@ -0,0 +1,23 @@ +package ru.ldeloff.servermonitorbot.service.command; + +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import ru.ldeloff.servermonitorbot.model.User; +import ru.ldeloff.servermonitorbot.service.role.RoleService; +import ru.ldeloff.servermonitorbot.service.ssh.SshService; +import ru.ldeloff.servermonitorbot.service.user.UserService; + +@Service +public class GetStatusSessions extends CommandTemplate { + final SshService sshService; + + public GetStatusSessions(UserService userService, RoleService roleService, SshService sshService) { + super(userService, roleService); + this.sshService = sshService; + } + + @Override + public SendMessage actionForAuth(User user, SendMessage message) { + return sshService.getStatusSessions(message); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/SwitchToMainMenu.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/SwitchToMainMenu.java new file mode 100644 index 0000000..43dec0e --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/SwitchToMainMenu.java @@ -0,0 +1,35 @@ +package ru.ldeloff.servermonitorbot.service.command; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import ru.ldeloff.servermonitorbot.model.User; +import ru.ldeloff.servermonitorbot.service.role.RoleService; +import ru.ldeloff.servermonitorbot.service.user.UserService; +import ru.ldeloff.servermonitorbot.utils.ui.TelegramBotKeyboard; + +@Service +@Slf4j +public class SwitchToMainMenu extends CommandTemplate { + final TelegramBotKeyboard telegramBotKeyboard; + + public SwitchToMainMenu(UserService userService, RoleService roleService, TelegramBotKeyboard telegramBotKeyboard) { + super(userService, roleService); + this.telegramBotKeyboard = telegramBotKeyboard; + } + @Override + public SendMessage actionForAuth(User user, SendMessage message) { + message.setText("Неверная команда. Попробуем сначала."); + return telegramBotKeyboard.uiForm(message); + } + @Override + public void logSuccess(User user, String message) { + log.warn("Получена несуществующая команда '" + message + "' от " + user.getLogin() + + " (" + user.getTelegramId() + "). OK"); + } + @Override + public void logNotAuth(User user, String message) { + log.warn("Получена несуществующая команда '" + message + "' от " + user.getLogin() + + " (" + user.getTelegramId() + "). Нет прав"); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameAggregateCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameAggregateCommand.java new file mode 100644 index 0000000..5bee9c1 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameAggregateCommand.java @@ -0,0 +1,24 @@ +package ru.ldeloff.servermonitorbot.service.command.uname; + +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import ru.ldeloff.servermonitorbot.model.User; +import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; +import ru.ldeloff.servermonitorbot.service.role.RoleService; +import ru.ldeloff.servermonitorbot.service.user.UserService; +import ru.ldeloff.servermonitorbot.utils.ui.uname.UnameChatButtonAggregate; + +@Service +public class UnameAggregateCommand extends CommandTemplate { + final UnameChatButtonAggregate unameChatButtonAggregate; + + public UnameAggregateCommand(UserService userService, RoleService roleService, UnameChatButtonAggregate unameChatButtonAggregate) { + super(userService, roleService); + this.unameChatButtonAggregate = unameChatButtonAggregate; + } + + @Override + public SendMessage actionForAuth(User user, SendMessage message) { + return unameChatButtonAggregate.uiForm(message); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameCommand.java similarity index 51% rename from src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameServiceImpl.java rename to src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameCommand.java index e7a3304..94e3b73 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameCommand.java @@ -1,15 +1,16 @@ -package ru.ldeloff.servermonitorbot.service.uname; +package ru.ldeloff.servermonitorbot.service.command.uname; -import lombok.RequiredArgsConstructor; 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.model.User; +import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; +import ru.ldeloff.servermonitorbot.service.role.RoleService; import ru.ldeloff.servermonitorbot.service.ssh.SshService; +import ru.ldeloff.servermonitorbot.service.user.UserService; import ru.ldeloff.servermonitorbot.utils.SshServerUtils; -import ru.ldeloff.servermonitorbot.utils.ui.uname.UnameChatButtonAggregate; import java.util.Arrays; import java.util.List; @@ -17,46 +18,32 @@ import java.util.Objects; import java.util.Optional; @Service -@RequiredArgsConstructor @Slf4j -public class UnameServiceImpl implements UnameService { +public class UnameCommand extends CommandTemplate { final SshService sshService; - final UnameChatButtonAggregate unameChatButtonAggregate; - @Override - public SendMessage sendUnameAggregate(Update update) { - SendMessage message = new SendMessage(); - long chatId = update.getMessage().getChatId(); - message.setChatId(chatId); - return unameChatButtonAggregate.uiForm(message); + public UnameCommand(UserService userService, RoleService roleService, SshService sshService) { + super(userService, roleService); + this.sshService = sshService; } @Override - public SendMessage uname(Update update) { - String messageText = update.getCallbackQuery().getData(); - - String [] tags = Arrays.stream(messageText.split(":")) + public SendMessage actionForAuth(User user, SendMessage message) { + String [] tags = Arrays.stream(message.getText().split(":")) .map(String::trim) .toArray(String[]::new); - String result; if (tags[1].equals("all")) { - result = unameAllHost(); + message.setText(unameAllHost()); } else { - result = unameSpecificHost(tags[1]); + message.setText(Objects.requireNonNull(unameSpecificHost(tags[1]))); } - SendMessage message = new SendMessage(); - long chatId = update.getCallbackQuery().getMessage().getChatId(); - message.setChatId(chatId); - message.setText(result); return message; } private String unameAllHost() { - List servers = SshServerUtils.filterGoodServers(sshService.getSshServers()); - StringBuilder response = new StringBuilder(); - servers.forEach(server -> { - response.append(unameSpecificHost(server.getName())).append("\n"); - }); - return response.toString(); + List servers = SshServerUtils.filterGoodServers(sshService.getSshServers()); + StringBuilder response = new StringBuilder(); + servers.forEach(server -> response.append(unameSpecificHost(server.getName())).append("\n")); + return response.toString(); } private String unameSpecificHost(String serverName) { 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 80c4378..126e358 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java @@ -2,14 +2,14 @@ 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; public interface SshService { - SendMessage getStatusSessions(Update update); + SendMessage getStatusSessions(SendMessage update); + List getSshServers(); 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 565c3c4..f5ebec4 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshServiceImpl.java @@ -7,7 +7,6 @@ import lombok.RequiredArgsConstructor; 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; @@ -19,14 +18,11 @@ import java.util.List; @Service @Slf4j @RequiredArgsConstructor -public class SshServiceImpl implements SshService { +public class SshServiceImpl implements SshService { final SshRepository sshRepository; @Override - public SendMessage getStatusSessions(Update update) { - SendMessage message = new SendMessage(); - long chatId = update.getMessage().getChatId(); + public SendMessage getStatusSessions(SendMessage message) { message.setText(sshRepository.getStatusSessions()); - message.setChatId(chatId); return message; } @Override diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameService.java deleted file mode 100644 index 46e9096..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/uname/UnameService.java +++ /dev/null @@ -1,10 +0,0 @@ -package ru.ldeloff.servermonitorbot.service.uname; - -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import org.telegram.telegrambots.meta.api.objects.Update; - -public interface UnameService { - SendMessage sendUnameAggregate(Update update); - - SendMessage uname(Update update); -} -- 2.40.1 From d0be1f0a6271fce5c8ea2d97b271cda41fd801e3 Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sun, 13 Aug 2023 19:36:12 +0300 Subject: [PATCH 12/13] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D1=83=20=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BC=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D1=83=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=B4=D0=B8=D1=81=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TelegramBotController.java | 14 ++-- .../hddtemp/HddTempAggregateCommand.java | 24 +++++++ .../command/hddtemp/HddTempCommand.java | 64 +++++++++++++++++++ .../command/uname/UnameAggregateCommand.java | 10 +-- .../utils/ui/TelegramBotKeyboard.java | 2 + ...nAggregate.java => ServerListButtons.java} | 10 ++- 6 files changed, 109 insertions(+), 15 deletions(-) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempAggregateCommand.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempCommand.java rename src/main/java/ru/ldeloff/servermonitorbot/utils/ui/uname/{UnameChatButtonAggregate.java => ServerListButtons.java} (83%) diff --git a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java index d5b17aa..a9147f3 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java @@ -10,6 +10,8 @@ import ru.ldeloff.servermonitorbot.repository.SshRepository; import ru.ldeloff.servermonitorbot.service.command.FirstUseCommand; import ru.ldeloff.servermonitorbot.service.command.GetStatusSessions; import ru.ldeloff.servermonitorbot.service.command.SwitchToMainMenu; +import ru.ldeloff.servermonitorbot.service.command.hddtemp.HddTempAggregateCommand; +import ru.ldeloff.servermonitorbot.service.command.hddtemp.HddTempCommand; import ru.ldeloff.servermonitorbot.service.command.uname.UnameAggregateCommand; import ru.ldeloff.servermonitorbot.service.command.uname.UnameCommand; @@ -17,7 +19,6 @@ import ru.ldeloff.servermonitorbot.service.command.uname.UnameCommand; @Slf4j @RequiredArgsConstructor public class TelegramBotController extends TelegramLongPollingBot { - final TelegramBot telegramBot; final SshRepository sshRepository; @@ -26,6 +27,8 @@ public class TelegramBotController extends TelegramLongPollingBot { final UnameAggregateCommand unameAggregateCommand; final SwitchToMainMenu switchToMainMenu; final UnameCommand unameCommand; + final HddTempAggregateCommand hddTempAggregateCommand; + final HddTempCommand hddTempCommand; @Override public void onUpdateReceived(Update update) { @@ -42,6 +45,9 @@ public class TelegramBotController extends TelegramLongPollingBot { case "uname" -> { unameAggregateCommand.execute(update, this); } + case "HDD.temp" -> { + hddTempAggregateCommand.execute(update, this); + } default -> { switchToMainMenu.execute(update, this); } @@ -54,6 +60,9 @@ public class TelegramBotController extends TelegramLongPollingBot { case "uname" -> { unameCommand.execute(update, this); } + case "HDD.temp" -> { + hddTempCommand.execute(update, this); + } default -> { switchToMainMenu.execute(update, this); } @@ -63,17 +72,14 @@ public class TelegramBotController extends TelegramLongPollingBot { } } } - @Override public String getBotUsername() { return telegramBot.getBotUsername(); } - @Override public String getBotToken() { return telegramBot.getBotToken(); } - @Override public void onClosing() { super.onClosing(); diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempAggregateCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempAggregateCommand.java new file mode 100644 index 0000000..1f0ea18 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempAggregateCommand.java @@ -0,0 +1,24 @@ +package ru.ldeloff.servermonitorbot.service.command.hddtemp; + +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import ru.ldeloff.servermonitorbot.model.User; +import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; +import ru.ldeloff.servermonitorbot.service.role.RoleService; +import ru.ldeloff.servermonitorbot.service.user.UserService; +import ru.ldeloff.servermonitorbot.utils.ui.uname.ServerListButtons; + +@Service +public class HddTempAggregateCommand extends CommandTemplate { + final ServerListButtons serverListButtons; + + public HddTempAggregateCommand(UserService userService, RoleService roleService, ServerListButtons serverListButtons) { + super(userService, roleService); + this.serverListButtons = serverListButtons; + } + + @Override + public SendMessage actionForAuth(User user, SendMessage message) { + return serverListButtons.uiForm(message); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempCommand.java new file mode 100644 index 0000000..48793cc --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempCommand.java @@ -0,0 +1,64 @@ +package ru.ldeloff.servermonitorbot.service.command.hddtemp; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import ru.ldeloff.servermonitorbot.model.Command; +import ru.ldeloff.servermonitorbot.model.SshServer; +import ru.ldeloff.servermonitorbot.model.User; +import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; +import ru.ldeloff.servermonitorbot.service.role.RoleService; +import ru.ldeloff.servermonitorbot.service.ssh.SshService; +import ru.ldeloff.servermonitorbot.service.user.UserService; +import ru.ldeloff.servermonitorbot.utils.SshServerUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +@Service +@Slf4j +public class HddTempCommand extends CommandTemplate { + final SshService sshService; + public HddTempCommand(UserService userService, RoleService roleService, SshService sshService) { + super(userService, roleService); + this.sshService = sshService; + } + + @Override + public SendMessage actionForAuth(User user, SendMessage message) { + String [] tags = Arrays.stream(message.getText().split(":")) + .map(String::trim) + .toArray(String[]::new); + + if (tags[1].equals("all")) { + message.setText(hddTempAllHost()); + } else { + message.setText(Objects.requireNonNull(hddTempSpecificHost(tags[1]))); + } + return message; + } + + private String hddTempAllHost() { + List servers = SshServerUtils.filterGoodServers(sshService.getSshServers()); + StringBuilder response = new StringBuilder(); + servers.forEach(server -> response.append(hddTempSpecificHost(server.getName())).append("\n")); + return response.toString(); + } + + private String hddTempSpecificHost(String serverName) { + Optional server = sshService.getSshServers() + .stream() + .filter(x -> x.getName().equals(serverName)) + .findFirst(); + if (server.isPresent()) { + Command result = sshService.execute(new Command("hddtemp /dev/sd*", 500, server.get())); + return server.get().getName() + ": \n" + + (Objects.isNull(result.getResponse()) ? "ошибка при выполнении команды" : result.getResponse()); + } else { + log.error("Ошибка при выполнении команды 'hddtemp'. Искомый сервер (" + serverName + ") не найден"); + return null; + } + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameAggregateCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameAggregateCommand.java index 5bee9c1..2ac594e 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameAggregateCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameAggregateCommand.java @@ -6,19 +6,19 @@ import ru.ldeloff.servermonitorbot.model.User; import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; import ru.ldeloff.servermonitorbot.service.role.RoleService; import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.ui.uname.UnameChatButtonAggregate; +import ru.ldeloff.servermonitorbot.utils.ui.uname.ServerListButtons; @Service public class UnameAggregateCommand extends CommandTemplate { - final UnameChatButtonAggregate unameChatButtonAggregate; + final ServerListButtons serverListButtons; - public UnameAggregateCommand(UserService userService, RoleService roleService, UnameChatButtonAggregate unameChatButtonAggregate) { + public UnameAggregateCommand(UserService userService, RoleService roleService, ServerListButtons serverListButtons) { super(userService, roleService); - this.unameChatButtonAggregate = unameChatButtonAggregate; + this.serverListButtons = serverListButtons; } @Override public SendMessage actionForAuth(User user, SendMessage message) { - return unameChatButtonAggregate.uiForm(message); + return serverListButtons.uiForm(message); } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java index a07a478..817c456 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java @@ -13,6 +13,7 @@ import java.util.ArrayList; public class TelegramBotKeyboard implements UiFormer { private final String STATUS = "Статус"; private final String UNAME = "uname"; + private final String HDD_TEMP = "HDD.temp"; @Override public SendMessage uiForm(SendMessage message) { @@ -27,6 +28,7 @@ public class TelegramBotKeyboard implements UiFormer { keyboardRow.add(new KeyboardButton(STATUS)); keyboardRow.add(new KeyboardButton(UNAME)); + keyboardRow.add(new KeyboardButton(HDD_TEMP)); replyKeyboardMarkup.setKeyboard(keyboardRows); message.setReplyMarkup(replyKeyboardMarkup); diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/uname/UnameChatButtonAggregate.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/uname/ServerListButtons.java similarity index 83% rename from src/main/java/ru/ldeloff/servermonitorbot/utils/ui/uname/UnameChatButtonAggregate.java rename to src/main/java/ru/ldeloff/servermonitorbot/utils/ui/uname/ServerListButtons.java index 99a9547..c6d0b4e 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/uname/UnameChatButtonAggregate.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/uname/ServerListButtons.java @@ -1,12 +1,10 @@ package ru.ldeloff.servermonitorbot.utils.ui.uname; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup; import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton; -import ru.ldeloff.servermonitorbot.repository.SshRepository; import ru.ldeloff.servermonitorbot.service.ssh.SshService; import ru.ldeloff.servermonitorbot.utils.ui.UiFormer; @@ -16,7 +14,7 @@ import java.util.Objects; @Component @RequiredArgsConstructor -public class UnameChatButtonAggregate implements UiFormer { +public class ServerListButtons implements UiFormer { private final SshService sshService; @@ -32,7 +30,7 @@ public class UnameChatButtonAggregate implements UiFormer { List keyboardRow = new ArrayList<>(); InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton(); inlineKeyboardButton.setText(sshServer.getName()); - inlineKeyboardButton.setCallbackData("uname: " + sshServer.getName()); + inlineKeyboardButton.setCallbackData(message.getText() + ": " + sshServer.getName()); keyboardRow.add(inlineKeyboardButton); keyboard.add(keyboardRow); } @@ -43,14 +41,14 @@ public class UnameChatButtonAggregate implements UiFormer { List keyboardRow = new ArrayList<>(); InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton(); inlineKeyboardButton.setText("Все сервера"); - inlineKeyboardButton.setCallbackData("uname: all"); + inlineKeyboardButton.setCallbackData(message.getText() + ": all"); keyboardRow.add(inlineKeyboardButton); keyboard.add(keyboardRow); } inlineKeyboardMarkup.setKeyboard(keyboard); message.setReplyMarkup(inlineKeyboardMarkup); - message.setText("Выполнить uname для"); + message.setText("Выполнить " + message.getText() + " для"); return message; } -- 2.40.1 From c42781c5ee8db1fb94927b96cf30114b01d35b27 Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sun, 13 Aug 2023 21:00:43 +0300 Subject: [PATCH 13/13] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D1=83=20=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BC=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D1=83=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=20CPU?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TelegramBotController.java | 10 +++ .../cputemp/CpuTempAggregateCommand.java | 24 +++++++ .../command/cputemp/CpuTempCommand.java | 67 +++++++++++++++++++ .../utils/ui/TelegramBotKeyboard.java | 3 + 4 files changed, 104 insertions(+) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempAggregateCommand.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempCommand.java diff --git a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java index a9147f3..4ec8c43 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java @@ -10,6 +10,8 @@ import ru.ldeloff.servermonitorbot.repository.SshRepository; import ru.ldeloff.servermonitorbot.service.command.FirstUseCommand; import ru.ldeloff.servermonitorbot.service.command.GetStatusSessions; import ru.ldeloff.servermonitorbot.service.command.SwitchToMainMenu; +import ru.ldeloff.servermonitorbot.service.command.cputemp.CpuTempAggregateCommand; +import ru.ldeloff.servermonitorbot.service.command.cputemp.CpuTempCommand; import ru.ldeloff.servermonitorbot.service.command.hddtemp.HddTempAggregateCommand; import ru.ldeloff.servermonitorbot.service.command.hddtemp.HddTempCommand; import ru.ldeloff.servermonitorbot.service.command.uname.UnameAggregateCommand; @@ -27,6 +29,8 @@ public class TelegramBotController extends TelegramLongPollingBot { final UnameAggregateCommand unameAggregateCommand; final SwitchToMainMenu switchToMainMenu; final UnameCommand unameCommand; + final CpuTempAggregateCommand cpuTempAggregateCommand; + final CpuTempCommand cpuTempCommand; final HddTempAggregateCommand hddTempAggregateCommand; final HddTempCommand hddTempCommand; @@ -45,6 +49,9 @@ public class TelegramBotController extends TelegramLongPollingBot { case "uname" -> { unameAggregateCommand.execute(update, this); } + case "CPU.temp" -> { + cpuTempAggregateCommand.execute(update, this); + } case "HDD.temp" -> { hddTempAggregateCommand.execute(update, this); } @@ -60,6 +67,9 @@ public class TelegramBotController extends TelegramLongPollingBot { case "uname" -> { unameCommand.execute(update, this); } + case "CPU.temp" -> { + cpuTempCommand.execute(update, this); + } case "HDD.temp" -> { hddTempCommand.execute(update, this); } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempAggregateCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempAggregateCommand.java new file mode 100644 index 0000000..90d2eb2 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempAggregateCommand.java @@ -0,0 +1,24 @@ +package ru.ldeloff.servermonitorbot.service.command.cputemp; + +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import ru.ldeloff.servermonitorbot.model.User; +import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; +import ru.ldeloff.servermonitorbot.service.role.RoleService; +import ru.ldeloff.servermonitorbot.service.user.UserService; +import ru.ldeloff.servermonitorbot.utils.ui.uname.ServerListButtons; + +@Service +public class CpuTempAggregateCommand extends CommandTemplate { + final ServerListButtons serverListButtons; + + public CpuTempAggregateCommand(UserService userService, RoleService roleService, ServerListButtons serverListButtons) { + super(userService, roleService); + this.serverListButtons = serverListButtons; + } + + @Override + public SendMessage actionForAuth(User user, SendMessage message) { + return serverListButtons.uiForm(message); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempCommand.java new file mode 100644 index 0000000..fb046c1 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempCommand.java @@ -0,0 +1,67 @@ +package ru.ldeloff.servermonitorbot.service.command.cputemp; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import ru.ldeloff.servermonitorbot.model.Command; +import ru.ldeloff.servermonitorbot.model.SshServer; +import ru.ldeloff.servermonitorbot.model.User; +import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; +import ru.ldeloff.servermonitorbot.service.role.RoleService; +import ru.ldeloff.servermonitorbot.service.ssh.SshService; +import ru.ldeloff.servermonitorbot.service.user.UserService; +import ru.ldeloff.servermonitorbot.utils.SshServerUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +@Service +@Slf4j +public class CpuTempCommand extends CommandTemplate { + final SshService sshService; + public CpuTempCommand(UserService userService, RoleService roleService, SshService sshService) { + super(userService, roleService); + this.sshService = sshService; + } + + @Override + public SendMessage actionForAuth(User user, SendMessage message) { + String [] tags = Arrays.stream(message.getText().split(":")) + .map(String::trim) + .toArray(String[]::new); + + if (tags[1].equals("all")) { + message.setText(hddTempAllHost()); + } else { + message.setText(Objects.requireNonNull(hddTempSpecificHost(tags[1]))); + } + return message; + } + + private String hddTempAllHost() { + List servers = SshServerUtils.filterGoodServers(sshService.getSshServers()); + StringBuilder response = new StringBuilder(); + servers.forEach(server -> response.append(hddTempSpecificHost(server.getName())).append("\n")); + return response.toString(); + } + + private String hddTempSpecificHost(String serverName) { + Optional server = sshService.getSshServers() + .stream() + .filter(x -> x.getName().equals(serverName)) + .findFirst(); + if (server.isPresent()) { + Command result = sshService.execute(new Command("cat /sys/class/thermal/thermal_zone0/temp", 100, server.get())); + return server.get().getName() + ": \n" + + (Objects.isNull(result.getResponse()) ? "ошибка при выполнении команды" : + String.format("%.1f", + Double.parseDouble(result.getResponse().replaceAll("\n", ""))/1000)) + + "°C"; + } else { + log.error("Ошибка при выполнении команды 'CPUtemp'. Искомый сервер (" + serverName + ") не найден"); + return null; + } + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java index 817c456..a7f776c 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java @@ -13,8 +13,10 @@ import java.util.ArrayList; public class TelegramBotKeyboard implements UiFormer { private final String STATUS = "Статус"; private final String UNAME = "uname"; + private final String CPU_TEMP = "CPU.temp"; private final String HDD_TEMP = "HDD.temp"; + @Override public SendMessage uiForm(SendMessage message) { ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); @@ -28,6 +30,7 @@ public class TelegramBotKeyboard implements UiFormer { keyboardRow.add(new KeyboardButton(STATUS)); keyboardRow.add(new KeyboardButton(UNAME)); + keyboardRow.add(new KeyboardButton(CPU_TEMP)); keyboardRow.add(new KeyboardButton(HDD_TEMP)); replyKeyboardMarkup.setKeyboard(keyboardRows); -- 2.40.1