From 93e04a7e56014c99dae5090695f92284ba6d150d Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sat, 16 Nov 2024 16:35:00 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ServerMonitorBotApplication.java | 6 +- .../{SshConfig.java => SshServerList.java} | 7 +- .../servermonitorbot/config/UserConfig.java | 29 ++++- .../servermonitorbot/init/AddCommands.java | 7 -- .../servermonitorbot/init/AddUsers.java | 30 ++--- .../servermonitorbot/init/SshConnect.java | 14 +-- .../{init => integration/in}/StartBot.java | 13 +-- .../in}/TelegramBotController.java | 23 ++-- .../in}/model/TelegramBot.java | 2 +- .../out/repository/SshRepository.java | 12 ++ .../out/repository/SshRepositoryImpl.java | 37 ++++++ .../integration/out/service/SshService.java | 25 ++++ .../out/service}/SshServiceImpl.java | 72 ++++++++++-- .../cpu/temp/service/CpuTemp.java} | 27 +++-- .../internal/data/mapper/UserMapper.java | 27 +++++ .../{ => internal/data}/model/Role.java | 2 +- .../{ => internal/data}/model/SshCommand.java | 2 +- .../{ => internal/data}/model/SshServer.java | 2 +- .../internal/data/model/User.java | 12 ++ .../data/model/UserEntity.java} | 11 +- .../data}/repository/RoleRepository.java | 4 +- .../data/repository/UserRepository.java | 17 +++ .../internal/data/service/RoleService.java | 9 ++ .../data/service}/RoleServiceImpl.java | 7 +- .../internal/data/service/UserService.java | 19 +++ .../data/service/UserServiceImpl.java | 47 ++++++++ .../hdd/mdadm/service/MdadmStatus.java} | 30 ++--- .../hdd/temp/service/HddTemp.java} | 25 ++-- .../mainmenu/service/FirstUseCommand.java | 34 ++++++ .../mainmenu/service/SwitchToMainMenu.java | 38 ++++++ .../CheckSessionStatusScheduler.java | 18 +++ .../service/CheckSessionStatus.java | 27 +++++ .../template}/CommandTemplate.java | 75 ++++-------- .../internal/template/model/CommandType.java | 4 + .../internal/template/util/UpdateUtil.java | 55 +++++++++ .../ui/ServerListButtons.java | 9 +- .../ui/TelegramBotKeyboard.java | 35 +++--- .../{utils => internal}/ui/UiFormer.java | 2 +- .../internal/ui/util/CommandUtil.java | 21 ++++ .../internal/uname/service/Uname.java | 39 +++++++ .../servermonitorbot/mapper/UserMapper.java | 22 ---- .../servermonitorbot/model/CommandList.java | 28 ----- .../model/dto/InitUserDto.java | 14 --- .../repository/SshRepository.java | 16 --- .../repository/SshRepositoryImpl.java | 108 ------------------ .../repository/UserRepository.java | 15 --- .../service/command/FirstUseCommand.java | 37 ------ .../service/command/GetStatusSessions.java | 27 ----- .../service/command/SwitchToMainMenu.java | 47 -------- .../service/command/UnameCommand.java | 39 ------- .../service/role/RoleService.java | 9 -- .../service/ssh/SshService.java | 16 --- .../service/user/UserService.java | 13 --- .../service/user/UserServiceImpl.java | 34 ------ .../servermonitorbot/utils/CommandUtil.java | 15 --- .../servermonitorbot/utils/RoleChecker.java | 19 --- .../utils/SshServerUtils.java | 17 --- src/main/resources/application.yml | 1 + 58 files changed, 677 insertions(+), 675 deletions(-) rename src/main/java/ru/ldeloff/servermonitorbot/config/{SshConfig.java => SshServerList.java} (75%) delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/init/AddCommands.java rename src/main/java/ru/ldeloff/servermonitorbot/{init => integration/in}/StartBot.java (79%) rename src/main/java/ru/ldeloff/servermonitorbot/{controller => integration/in}/TelegramBotController.java (71%) rename src/main/java/ru/ldeloff/servermonitorbot/{ => integration/in}/model/TelegramBot.java (88%) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/integration/out/repository/SshRepository.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/integration/out/repository/SshRepositoryImpl.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/integration/out/service/SshService.java rename src/main/java/ru/ldeloff/servermonitorbot/{service/ssh => integration/out/service}/SshServiceImpl.java (51%) rename src/main/java/ru/ldeloff/servermonitorbot/{service/command/CpuTempCommand.java => internal/cpu/temp/service/CpuTemp.java} (53%) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/data/mapper/UserMapper.java rename src/main/java/ru/ldeloff/servermonitorbot/{ => internal/data}/model/Role.java (82%) rename src/main/java/ru/ldeloff/servermonitorbot/{ => internal/data}/model/SshCommand.java (90%) rename src/main/java/ru/ldeloff/servermonitorbot/{ => internal/data}/model/SshServer.java (88%) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/User.java rename src/main/java/ru/ldeloff/servermonitorbot/{model/User.java => internal/data/model/UserEntity.java} (69%) rename src/main/java/ru/ldeloff/servermonitorbot/{ => internal/data}/repository/RoleRepository.java (71%) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/data/repository/UserRepository.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/RoleService.java rename src/main/java/ru/ldeloff/servermonitorbot/{service/role => internal/data/service}/RoleServiceImpl.java (80%) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/UserService.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/UserServiceImpl.java rename src/main/java/ru/ldeloff/servermonitorbot/{service/command/MdadmStatusCommand.java => internal/hdd/mdadm/service/MdadmStatus.java} (74%) rename src/main/java/ru/ldeloff/servermonitorbot/{service/command/HddTempCommand.java => internal/hdd/temp/service/HddTemp.java} (54%) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/mainmenu/service/FirstUseCommand.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/mainmenu/service/SwitchToMainMenu.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/statuschecker/scheduler/CheckSessionStatusScheduler.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/statuschecker/service/CheckSessionStatus.java rename src/main/java/ru/ldeloff/servermonitorbot/{service/command => internal/template}/CommandTemplate.java (66%) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/template/model/CommandType.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/template/util/UpdateUtil.java rename src/main/java/ru/ldeloff/servermonitorbot/{utils => internal}/ui/ServerListButtons.java (86%) rename src/main/java/ru/ldeloff/servermonitorbot/{utils => internal}/ui/TelegramBotKeyboard.java (57%) rename src/main/java/ru/ldeloff/servermonitorbot/{utils => internal}/ui/UiFormer.java (74%) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/ui/util/CommandUtil.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/uname/service/Uname.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/mapper/UserMapper.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/model/CommandList.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/model/dto/InitUserDto.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepository.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/repository/UserRepository.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/FirstUseCommand.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/GetStatusSessions.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/SwitchToMainMenu.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/UnameCommand.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleService.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/user/UserService.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/user/UserServiceImpl.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/utils/CommandUtil.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/utils/RoleChecker.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/utils/SshServerUtils.java diff --git a/src/main/java/ru/ldeloff/servermonitorbot/ServerMonitorBotApplication.java b/src/main/java/ru/ldeloff/servermonitorbot/ServerMonitorBotApplication.java index ea862b9..fcdcebe 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/ServerMonitorBotApplication.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/ServerMonitorBotApplication.java @@ -3,10 +3,12 @@ package ru.ldeloff.servermonitorbot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import ru.ldeloff.servermonitorbot.config.SshConfig; +import org.springframework.scheduling.annotation.EnableScheduling; +import ru.ldeloff.servermonitorbot.config.SshServerList; @SpringBootApplication -@EnableConfigurationProperties(SshConfig.class) +@EnableScheduling +@EnableConfigurationProperties(SshServerList.class) public class ServerMonitorBotApplication { public static void main(String[] args) { diff --git a/src/main/java/ru/ldeloff/servermonitorbot/config/SshConfig.java b/src/main/java/ru/ldeloff/servermonitorbot/config/SshServerList.java similarity index 75% rename from src/main/java/ru/ldeloff/servermonitorbot/config/SshConfig.java rename to src/main/java/ru/ldeloff/servermonitorbot/config/SshServerList.java index bac7aed..77a491e 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/config/SshConfig.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/config/SshServerList.java @@ -1,11 +1,10 @@ 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; +import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; import java.util.List; @@ -13,6 +12,8 @@ import java.util.List; @ConfigurationProperties(prefix = "ssh") @Getter @Setter -public class SshConfig { +public class SshServerList { + private List servers; + } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/config/UserConfig.java b/src/main/java/ru/ldeloff/servermonitorbot/config/UserConfig.java index 9c9e51d..edd8bb9 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/config/UserConfig.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/config/UserConfig.java @@ -2,16 +2,37 @@ package ru.ldeloff.servermonitorbot.config; import lombok.Getter; import lombok.Setter; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; -import ru.ldeloff.servermonitorbot.model.dto.InitUserDto; +import org.springframework.stereotype.Component; +import ru.ldeloff.servermonitorbot.internal.data.model.User; +import ru.ldeloff.servermonitorbot.internal.data.service.RoleService; import java.util.List; -@Configuration +@Component @ConfigurationProperties(prefix = "bot") @Getter @Setter public class UserConfig { - private List users; + + private List users; + + @Autowired + private RoleService roleService; + + @Getter + @Setter + public static class UserProperty { + private Long telegramId; + private String role; + } + + public List getUsers() { + return users.stream().map(user -> new User() + .setTelegramId(user.getTelegramId()) + .setRole(roleService.findRoleByName(user.getRole())) + ).toList(); + } + } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/AddCommands.java b/src/main/java/ru/ldeloff/servermonitorbot/init/AddCommands.java deleted file mode 100644 index c623a79..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/AddCommands.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.ldeloff.servermonitorbot.init; - -public class AddCommands { - public static void fillCommandTable() { - - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/AddUsers.java b/src/main/java/ru/ldeloff/servermonitorbot/init/AddUsers.java index 560d72e..62da1fc 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/AddUsers.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/AddUsers.java @@ -1,34 +1,24 @@ package ru.ldeloff.servermonitorbot.init; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; 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; +import ru.ldeloff.servermonitorbot.internal.data.service.UserService; +@Slf4j @Component +@RequiredArgsConstructor 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; - } + final UserConfig userConfig; + final UserService userService; @Override - public void run(ApplicationArguments args) throws Exception { - initUsers.forEach(initUserDto -> { - User user = userService.saveOrUpdateUser(userMapper.dtoToUser(initUserDto)); - }); + public void run(ApplicationArguments args) { + userConfig.getUsers().forEach(userService::saveOrUpdateUser); + log.info("Загружены и обновлены пользователи"); } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java b/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java index d429b0e..d4e2e83 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java @@ -1,20 +1,20 @@ package ru.ldeloff.servermonitorbot.init; +import lombok.RequiredArgsConstructor; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; -import ru.ldeloff.servermonitorbot.repository.SshRepository; +import ru.ldeloff.servermonitorbot.integration.out.repository.SshRepository; +import ru.ldeloff.servermonitorbot.integration.out.service.SshService; @Component +@RequiredArgsConstructor public class SshConnect implements ApplicationRunner { - final SshRepository sshRepository; - public SshConnect(SshRepository sshRepository) { - this.sshRepository = sshRepository; - } + final SshService sshService; @Override - public void run(ApplicationArguments args) throws Exception { - sshRepository.connectToAllServer(); + public void run(ApplicationArguments args) { + sshService.updateConnection(); } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java b/src/main/java/ru/ldeloff/servermonitorbot/integration/in/StartBot.java similarity index 79% rename from src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java rename to src/main/java/ru/ldeloff/servermonitorbot/integration/in/StartBot.java index f5298a5..e9acd0d 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/integration/in/StartBot.java @@ -1,4 +1,4 @@ -package ru.ldeloff.servermonitorbot.init; +package ru.ldeloff.servermonitorbot.integration.in; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -10,13 +10,11 @@ import org.telegram.telegrambots.meta.TelegramBotsApi; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import org.telegram.telegrambots.updatesreceivers.DefaultBotSession; -import ru.ldeloff.servermonitorbot.controller.TelegramBotController; -import ru.ldeloff.servermonitorbot.model.User; -import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; -import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.ui.TelegramBotKeyboard; +import ru.ldeloff.servermonitorbot.internal.data.model.User; +import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; +import ru.ldeloff.servermonitorbot.internal.data.service.UserService; +import ru.ldeloff.servermonitorbot.internal.ui.TelegramBotKeyboard; -import static ru.ldeloff.servermonitorbot.init.AddCommands.fillCommandTable; @Slf4j @Component @@ -35,7 +33,6 @@ public class StartBot implements ApplicationRunner { @Override public void run(ApplicationArguments args) { try { - fillCommandTable(); TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class); botsApi.registerBot(telegramBot); userService.getAllUsers().forEach(this::SendInitMessage); diff --git a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java b/src/main/java/ru/ldeloff/servermonitorbot/integration/in/TelegramBotController.java similarity index 71% rename from src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java rename to src/main/java/ru/ldeloff/servermonitorbot/integration/in/TelegramBotController.java index a1d8793..198f9cc 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/integration/in/TelegramBotController.java @@ -1,24 +1,26 @@ -package ru.ldeloff.servermonitorbot.controller; +package ru.ldeloff.servermonitorbot.integration.in; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.telegram.telegrambots.bots.TelegramLongPollingBot; import org.telegram.telegrambots.meta.api.objects.Message; import org.telegram.telegrambots.meta.api.objects.Update; -import ru.ldeloff.servermonitorbot.model.TelegramBot; -import ru.ldeloff.servermonitorbot.repository.SshRepository; -import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; -import ru.ldeloff.servermonitorbot.service.command.SwitchToMainMenu; +import ru.ldeloff.servermonitorbot.integration.in.model.TelegramBot; +import ru.ldeloff.servermonitorbot.integration.out.service.SshService; +import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; +import ru.ldeloff.servermonitorbot.internal.mainmenu.service.SwitchToMainMenu; import java.util.Map; @Service @RequiredArgsConstructor public class TelegramBotController extends TelegramLongPollingBot { + private final Map commands; - final TelegramBot telegramBot; - final SshRepository sshRepository; - final SwitchToMainMenu switchToMainMenu; + private final TelegramBot telegramBot; + private final SwitchToMainMenu switchToMainMenu; + private final SshService sshService; + @Override public void onUpdateReceived(Update update) { boolean result = false; @@ -37,17 +39,20 @@ public class TelegramBotController extends TelegramLongPollingBot { switchToMainMenu.execute(update, this); } } + @Override public String getBotUsername() { return telegramBot.getBotUsername(); } + @Override public String getBotToken() { return telegramBot.getBotToken(); } + @Override public void onClosing() { super.onClosing(); - sshRepository.disconnectSessions(); + sshService.disconnectAllConnections(); } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/TelegramBot.java b/src/main/java/ru/ldeloff/servermonitorbot/integration/in/model/TelegramBot.java similarity index 88% rename from src/main/java/ru/ldeloff/servermonitorbot/model/TelegramBot.java rename to src/main/java/ru/ldeloff/servermonitorbot/integration/in/model/TelegramBot.java index 8e32ffe..c33d8c1 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/model/TelegramBot.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/integration/in/model/TelegramBot.java @@ -1,4 +1,4 @@ -package ru.ldeloff.servermonitorbot.model; +package ru.ldeloff.servermonitorbot.integration.in.model; import lombok.Getter; import org.springframework.beans.factory.annotation.Value; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/integration/out/repository/SshRepository.java b/src/main/java/ru/ldeloff/servermonitorbot/integration/out/repository/SshRepository.java new file mode 100644 index 0000000..9de3756 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/integration/out/repository/SshRepository.java @@ -0,0 +1,12 @@ +package ru.ldeloff.servermonitorbot.integration.out.repository; + +import com.jcraft.jsch.JSchException; +import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; + +public interface SshRepository { + + void connect(SshServer sshServer) throws JSchException; + + void disconnect(SshServer sshServer); + +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/integration/out/repository/SshRepositoryImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/integration/out/repository/SshRepositoryImpl.java new file mode 100644 index 0000000..db1f915 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/integration/out/repository/SshRepositoryImpl.java @@ -0,0 +1,37 @@ +package ru.ldeloff.servermonitorbot.integration.out.repository; + +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.Session; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Repository; +import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; + +@Repository +@RequiredArgsConstructor +public class SshRepositoryImpl implements SshRepository { + + @Value("${ssh.timeout:5000}") + private int TIMEOUT; + + @Override + public void connect(SshServer sshServer) throws JSchException { + Session session = new JSch().getSession(sshServer.getUser(), + sshServer.getHost(), + sshServer.getPort()); + session.setPassword(sshServer.getPassword()); + session.setConfig("StrictHostKeyChecking", "no"); + session.setTimeout(TIMEOUT); + + session.connect(); + + sshServer.setSession(session); + } + + @Override + public void disconnect(SshServer sshServer) { + sshServer.getSession().disconnect(); + } + +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/integration/out/service/SshService.java b/src/main/java/ru/ldeloff/servermonitorbot/integration/out/service/SshService.java new file mode 100644 index 0000000..1fe1e70 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/integration/out/service/SshService.java @@ -0,0 +1,25 @@ +package ru.ldeloff.servermonitorbot.integration.out.service; + + +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import ru.ldeloff.servermonitorbot.internal.data.model.SshCommand; +import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; + +import java.util.List; + +public interface SshService { + + void updateConnection(); + + void disconnectAllConnections(); + + SendMessage getStatusSessions(SendMessage update); + + List getAllSshServers(); + + List getHealthSshServers(); + + SshCommand execute(SshCommand sshCommand); + + List execute(List sshCommands); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/integration/out/service/SshServiceImpl.java similarity index 51% rename from src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshServiceImpl.java rename to src/main/java/ru/ldeloff/servermonitorbot/integration/out/service/SshServiceImpl.java index 04e4778..5d7eba9 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/integration/out/service/SshServiceImpl.java @@ -1,4 +1,4 @@ -package ru.ldeloff.servermonitorbot.service.ssh; +package ru.ldeloff.servermonitorbot.integration.out.service; import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.JSchException; @@ -7,27 +7,83 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.model.SshCommand; -import ru.ldeloff.servermonitorbot.model.SshServer; -import ru.ldeloff.servermonitorbot.repository.SshRepository; +import ru.ldeloff.servermonitorbot.config.SshServerList; +import ru.ldeloff.servermonitorbot.internal.data.model.SshCommand; +import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; +import ru.ldeloff.servermonitorbot.integration.out.repository.SshRepository; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.List; +import java.util.Objects; @Service @Slf4j @RequiredArgsConstructor public class SshServiceImpl implements SshService { - final SshRepository sshRepository; + + private final SshServerList sshServerList; + private final SshRepository sshRepository; + + @Override + public void updateConnection() { + sshServerList.getServers().forEach(sshServer -> { + try { + sshRepository.connect(sshServer); + log.info("Успешно подключён к {}", sshServer.getHost()); + } catch (JSchException e) { + log.warn("Не удалось соединиться с {}: {}", sshServer.getHost(), e.getMessage()); + } + }); + } + + @Override + public void disconnectAllConnections() { + sshServerList.getServers().forEach(sshRepository::disconnect); + } + @Override public SendMessage getStatusSessions(SendMessage message) { - message.setText(sshRepository.getStatusSessions()); + StringBuilder text = new StringBuilder("Статус соединения (может выполняться долго): \n"); + sshServerList.getServers().forEach(server -> { + text.append(server.getName()) + .append(": ") + .append(checkStatusServer(server)) + .append("\n"); + }); + message.setText(text.toString()); return message; } + + private String checkStatusServer(SshServer server) { + if (Objects.isNull(server.getSession())) { + return "нет соединения"; + } + + if (server.getSession().isConnected()) { + return "OK"; + } else { + return "потеряно соединение"; + } + + } + + private boolean checkHealth(SshServer server) { + if (Objects.isNull(server.getSession())) { + return false; + } + + return server.getSession().isConnected(); + } + @Override - public List getSshServers() { - return sshRepository.getSshServers(); + public List getAllSshServers() { + return sshServerList.getServers(); + } + + @Override + public List getHealthSshServers() { + return sshServerList.getServers().stream().filter(this::checkHealth).toList(); } @Override diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/CpuTempCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/cpu/temp/service/CpuTemp.java similarity index 53% rename from src/main/java/ru/ldeloff/servermonitorbot/service/command/CpuTempCommand.java rename to src/main/java/ru/ldeloff/servermonitorbot/internal/cpu/temp/service/CpuTemp.java index 251cd9f..ed91b8d 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/CpuTempCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/cpu/temp/service/CpuTemp.java @@ -1,30 +1,29 @@ -package ru.ldeloff.servermonitorbot.service.command; +package ru.ldeloff.servermonitorbot.internal.cpu.temp.service; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import ru.ldeloff.servermonitorbot.model.SshCommand; -import ru.ldeloff.servermonitorbot.model.SshServer; -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.ui.ServerListButtons; +import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; +import ru.ldeloff.servermonitorbot.internal.template.util.UpdateUtil; +import ru.ldeloff.servermonitorbot.internal.data.model.SshCommand; +import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; +import ru.ldeloff.servermonitorbot.integration.out.service.SshService; +import ru.ldeloff.servermonitorbot.internal.ui.ServerListButtons; 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, ServerListButtons serverListButtons) { - super(userService, roleService, serverListButtons, sshService); - this.sshService = sshService; +public class CpuTemp extends CommandTemplate { + + public CpuTemp(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService) { + super(updateUtil, serverListButtons, sshService); setName("CPU.temp"); } @Override public String executeCommandSpecificHost(String serverName) { - Optional server = sshService.getSshServers() + Optional server = sshService.getAllSshServers() .stream() .filter(x -> x.getName().equals(serverName)) .findFirst(); @@ -36,7 +35,7 @@ public class CpuTempCommand extends CommandTemplate { Double.parseDouble(result.getResponse().replaceAll("\n", ""))/1000)) + "°C"; } else { - log.error("Ошибка при выполнении команды 'CPUtemp'. Искомый сервер (" + serverName + ") не найден"); + log.error("Ошибка при выполнении команды 'CPUtemp'. Искомый сервер ({}) не найден", serverName); return null; } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/mapper/UserMapper.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/mapper/UserMapper.java new file mode 100644 index 0000000..d1153a7 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/mapper/UserMapper.java @@ -0,0 +1,27 @@ +package ru.ldeloff.servermonitorbot.internal.data.mapper; + +import org.springframework.stereotype.Component; +import ru.ldeloff.servermonitorbot.internal.data.model.User; +import ru.ldeloff.servermonitorbot.internal.data.model.UserEntity; +import ru.ldeloff.servermonitorbot.internal.data.service.RoleService; + +@Component +public class UserMapper { + final RoleService roleService; + + public UserMapper(RoleService roleService) { + this.roleService = roleService; + } + + public UserEntity toEntity(User user) { + return new UserEntity() + .setTelegramId(user.getTelegramId()) + .setRole(user.getRole()); + } + + public User toModel(UserEntity userEntity) { + return new User() + .setTelegramId(userEntity.getTelegramId()) + .setRole(userEntity.getRole()); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/Role.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/Role.java similarity index 82% rename from src/main/java/ru/ldeloff/servermonitorbot/model/Role.java rename to src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/Role.java index d6f800d..2922052 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/model/Role.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/Role.java @@ -1,4 +1,4 @@ -package ru.ldeloff.servermonitorbot.model; +package ru.ldeloff.servermonitorbot.internal.data.model; import jakarta.persistence.*; import lombok.Data; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/SshCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/SshCommand.java similarity index 90% rename from src/main/java/ru/ldeloff/servermonitorbot/model/SshCommand.java rename to src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/SshCommand.java index 2f9ae10..0346e5f 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/model/SshCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/SshCommand.java @@ -1,4 +1,4 @@ -package ru.ldeloff.servermonitorbot.model; +package ru.ldeloff.servermonitorbot.internal.data.model; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/SshServer.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/SshServer.java similarity index 88% rename from src/main/java/ru/ldeloff/servermonitorbot/model/SshServer.java rename to src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/SshServer.java index 9600225..9b9f905 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/model/SshServer.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/SshServer.java @@ -1,4 +1,4 @@ -package ru.ldeloff.servermonitorbot.model; +package ru.ldeloff.servermonitorbot.internal.data.model; import com.jcraft.jsch.Session; import jakarta.validation.constraints.NotNull; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/User.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/User.java new file mode 100644 index 0000000..e1ed852 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/User.java @@ -0,0 +1,12 @@ +package ru.ldeloff.servermonitorbot.internal.data.model; + +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public class User { + private Long telegramId; + private Role role; + private String login; +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/User.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/UserEntity.java similarity index 69% rename from src/main/java/ru/ldeloff/servermonitorbot/model/User.java rename to src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/UserEntity.java index a32c391..dbf9de4 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/model/User.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/UserEntity.java @@ -1,12 +1,14 @@ -package ru.ldeloff.servermonitorbot.model; +package ru.ldeloff.servermonitorbot.internal.data.model; import jakarta.persistence.*; import lombok.Data; +import lombok.experimental.Accessors; @Entity @Data @Table(name = "users") -public class User { +@Accessors(chain = true) +public class UserEntity { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -18,7 +20,4 @@ public class User { @ManyToOne @JoinColumn(name = "role_id") private Role role; - - @Transient - private String login; -} +} \ No newline at end of file diff --git a/src/main/java/ru/ldeloff/servermonitorbot/repository/RoleRepository.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/repository/RoleRepository.java similarity index 71% rename from src/main/java/ru/ldeloff/servermonitorbot/repository/RoleRepository.java rename to src/main/java/ru/ldeloff/servermonitorbot/internal/data/repository/RoleRepository.java index 4bb81ec..6bfd982 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/repository/RoleRepository.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/repository/RoleRepository.java @@ -1,8 +1,8 @@ -package ru.ldeloff.servermonitorbot.repository; +package ru.ldeloff.servermonitorbot.internal.data.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import ru.ldeloff.servermonitorbot.model.Role; +import ru.ldeloff.servermonitorbot.internal.data.model.Role; import java.util.Optional; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/repository/UserRepository.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/repository/UserRepository.java new file mode 100644 index 0000000..f7fc684 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/repository/UserRepository.java @@ -0,0 +1,17 @@ +package ru.ldeloff.servermonitorbot.internal.data.repository; + +import jakarta.validation.constraints.NotNull; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import ru.ldeloff.servermonitorbot.internal.data.model.UserEntity; + +import java.util.List; + +@Repository +public interface UserRepository extends JpaRepository { + + UserEntity getByTelegramId(long id); + + @NotNull List findAll(); + +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/RoleService.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/RoleService.java new file mode 100644 index 0000000..608320f --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/RoleService.java @@ -0,0 +1,9 @@ +package ru.ldeloff.servermonitorbot.internal.data.service; + +import ru.ldeloff.servermonitorbot.internal.data.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/internal/data/service/RoleServiceImpl.java similarity index 80% rename from src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleServiceImpl.java rename to src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/RoleServiceImpl.java index 6cf52a8..ef4cb73 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/RoleServiceImpl.java @@ -1,9 +1,9 @@ -package ru.ldeloff.servermonitorbot.service.role; +package ru.ldeloff.servermonitorbot.internal.data.service; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import ru.ldeloff.servermonitorbot.model.Role; -import ru.ldeloff.servermonitorbot.repository.RoleRepository; +import ru.ldeloff.servermonitorbot.internal.data.model.Role; +import ru.ldeloff.servermonitorbot.internal.data.repository.RoleRepository; import java.util.Locale; import java.util.Optional; @@ -11,6 +11,7 @@ import java.util.Optional; @Service @RequiredArgsConstructor public class RoleServiceImpl implements RoleService { + private final RoleRepository roleRepository; @Override diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/UserService.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/UserService.java new file mode 100644 index 0000000..0112301 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/UserService.java @@ -0,0 +1,19 @@ +package ru.ldeloff.servermonitorbot.internal.data.service; + +import ru.ldeloff.servermonitorbot.internal.data.model.User; +import ru.ldeloff.servermonitorbot.internal.data.model.UserEntity; + +import java.util.List; + +public interface UserService { + + void saveOrUpdateUser(User user); + + UserEntity getEntityByTelegramId(Long id); + + User getByTelegramId(Long id); + + List getAllEntity(); + + List getAllUsers(); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/UserServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/UserServiceImpl.java new file mode 100644 index 0000000..79f5415 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/UserServiceImpl.java @@ -0,0 +1,47 @@ +package ru.ldeloff.servermonitorbot.internal.data.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.ldeloff.servermonitorbot.internal.data.mapper.UserMapper; +import ru.ldeloff.servermonitorbot.internal.data.model.User; +import ru.ldeloff.servermonitorbot.internal.data.model.UserEntity; +import ru.ldeloff.servermonitorbot.internal.data.repository.UserRepository; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Slf4j +public class UserServiceImpl implements UserService { + + final UserRepository userRepository; + final UserMapper userMapper; + + @Override + public void saveOrUpdateUser(User user) { + UserEntity userEntity = getEntityByTelegramId(user.getTelegramId()); + if (userEntity != null) { + userEntity.setRole(user.getRole()); + } else { + userEntity = userMapper.toEntity(user); + } + userRepository.save(userEntity); + } + + @Override + public UserEntity getEntityByTelegramId(Long id) { + return userRepository.getByTelegramId(id); + } + + @Override + public User getByTelegramId(Long id) { + return userMapper.toModel(userRepository.getByTelegramId(id)); + } + + @Override + public List getAllEntity() {return userRepository.findAll(); } + + @Override + public List getAllUsers() {return userRepository.findAll().stream().map(userMapper::toModel).toList(); } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/MdadmStatusCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/hdd/mdadm/service/MdadmStatus.java similarity index 74% rename from src/main/java/ru/ldeloff/servermonitorbot/service/command/MdadmStatusCommand.java rename to src/main/java/ru/ldeloff/servermonitorbot/internal/hdd/mdadm/service/MdadmStatus.java index 6c68d88..c6fe306 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/MdadmStatusCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/hdd/mdadm/service/MdadmStatus.java @@ -1,28 +1,28 @@ -package ru.ldeloff.servermonitorbot.service.command; +package ru.ldeloff.servermonitorbot.internal.hdd.mdadm.service; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import ru.ldeloff.servermonitorbot.model.SshCommand; -import ru.ldeloff.servermonitorbot.model.SshServer; -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.ui.ServerListButtons; +import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; +import ru.ldeloff.servermonitorbot.internal.template.util.UpdateUtil; +import ru.ldeloff.servermonitorbot.internal.data.model.SshCommand; +import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; +import ru.ldeloff.servermonitorbot.integration.out.service.SshService; +import ru.ldeloff.servermonitorbot.internal.ui.ServerListButtons; import java.util.*; @Service @Slf4j -public class MdadmStatusCommand extends CommandTemplate { - final SshService sshService; - public MdadmStatusCommand(UserService userService, RoleService roleService, SshService sshService, ServerListButtons serverListButtons) { - super(userService, roleService, serverListButtons, sshService); - this.sshService = sshService; +public class MdadmStatus extends CommandTemplate { + + public MdadmStatus(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService) { + super(updateUtil, serverListButtons, sshService); setName("MDADM"); } + @Override public String executeCommandSpecificHost(String serverName) { - Optional server = sshService.getSshServers() + Optional server = sshService.getAllSshServers() .stream() .filter(x -> x.getName().equals(serverName)) .findFirst(); @@ -40,10 +40,11 @@ public class MdadmStatusCommand extends CommandTemplate { }); return server.get().getName() + ": \n" + result; } else { - log.error("Ошибка при выполнении команды 'mdadm'. Искомый сервер (" + serverName + ") не найден"); + log.error("Ошибка при выполнении команды 'mdadm'. Искомый сервер ({}) не найден", serverName); return null; } } + private List parseRaidNames(SshCommand result) { List names = new ArrayList<>(); Arrays.stream(result.getResponse().split("\n")) @@ -53,6 +54,7 @@ public class MdadmStatusCommand extends CommandTemplate { .forEach(names::add); return names; } + private List parseHddState(SshCommand result) { List names = new ArrayList<>(); names.add("Number Name State"); diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/HddTempCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/hdd/temp/service/HddTemp.java similarity index 54% rename from src/main/java/ru/ldeloff/servermonitorbot/service/command/HddTempCommand.java rename to src/main/java/ru/ldeloff/servermonitorbot/internal/hdd/temp/service/HddTemp.java index c628b4b..2132f21 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/HddTempCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/hdd/temp/service/HddTemp.java @@ -1,29 +1,28 @@ -package ru.ldeloff.servermonitorbot.service.command; +package ru.ldeloff.servermonitorbot.internal.hdd.temp.service; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import ru.ldeloff.servermonitorbot.model.SshCommand; -import ru.ldeloff.servermonitorbot.model.SshServer; -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.ui.ServerListButtons; +import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; +import ru.ldeloff.servermonitorbot.internal.template.util.UpdateUtil; +import ru.ldeloff.servermonitorbot.internal.data.model.SshCommand; +import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; +import ru.ldeloff.servermonitorbot.integration.out.service.SshService; +import ru.ldeloff.servermonitorbot.internal.ui.ServerListButtons; 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, ServerListButtons serverListButtons) { - super(userService, roleService, serverListButtons, sshService); - this.sshService = sshService; +public class HddTemp extends CommandTemplate { + public HddTemp(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService) { + super(updateUtil, serverListButtons, sshService); setName("HDD.temp"); } + @Override public String executeCommandSpecificHost(String serverName) { - Optional server = sshService.getSshServers() + Optional server = sshService.getAllSshServers() .stream() .filter(x -> x.getName().equals(serverName)) .findFirst(); diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/mainmenu/service/FirstUseCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/mainmenu/service/FirstUseCommand.java new file mode 100644 index 0000000..bc84e3b --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/mainmenu/service/FirstUseCommand.java @@ -0,0 +1,34 @@ +package ru.ldeloff.servermonitorbot.internal.mainmenu.service; + +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; +import ru.ldeloff.servermonitorbot.internal.template.util.UpdateUtil; +import ru.ldeloff.servermonitorbot.internal.data.model.User; +import ru.ldeloff.servermonitorbot.integration.out.service.SshService; +import ru.ldeloff.servermonitorbot.internal.ui.ServerListButtons; +import ru.ldeloff.servermonitorbot.internal.ui.TelegramBotKeyboard; + +@Service +public class FirstUseCommand extends CommandTemplate { + + private final TelegramBotKeyboard telegramBotKeyboard; + + public FirstUseCommand(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService, TelegramBotKeyboard telegramBotKeyboard) { + super(updateUtil, serverListButtons, sshService); + this.telegramBotKeyboard = telegramBotKeyboard; + setName("/start"); + } + + + @Override + public SendMessage executeAggregate(User user, SendMessage message) { + message.setText("Добро пожаловать " + user.getLogin() + "!"); + return telegramBotKeyboard.uiForm(message); + } + + @Override + public String executeCommandSpecificHost(String serverName) { + return null; + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/mainmenu/service/SwitchToMainMenu.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/mainmenu/service/SwitchToMainMenu.java new file mode 100644 index 0000000..b61c882 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/mainmenu/service/SwitchToMainMenu.java @@ -0,0 +1,38 @@ +package ru.ldeloff.servermonitorbot.internal.mainmenu.service; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; +import ru.ldeloff.servermonitorbot.internal.template.util.UpdateUtil; +import ru.ldeloff.servermonitorbot.internal.data.model.User; +import ru.ldeloff.servermonitorbot.integration.out.service.SshService; +import ru.ldeloff.servermonitorbot.internal.ui.ServerListButtons; +import ru.ldeloff.servermonitorbot.internal.ui.TelegramBotKeyboard; + +@Service +@Slf4j +public class SwitchToMainMenu extends CommandTemplate { + + private final TelegramBotKeyboard telegramBotKeyboard; + + public SwitchToMainMenu(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService, TelegramBotKeyboard telegramBotKeyboard) { + super(updateUtil, serverListButtons, sshService); + this.telegramBotKeyboard = telegramBotKeyboard; + setName("Not found"); + } + + @Override + public String executeCommandSpecificHost(String serverName) { + return null; + } + + @Override + public SendMessage executeAggregate(User user, SendMessage message) { + SendMessage answer = new SendMessage(); + answer.setChatId(user.getTelegramId()); + answer.setText("Неверная команда. Попробуем сначала."); + return telegramBotKeyboard.uiForm(answer); + } + +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/statuschecker/scheduler/CheckSessionStatusScheduler.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/statuschecker/scheduler/CheckSessionStatusScheduler.java new file mode 100644 index 0000000..c1de0b2 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/statuschecker/scheduler/CheckSessionStatusScheduler.java @@ -0,0 +1,18 @@ +package ru.ldeloff.servermonitorbot.internal.statuschecker.scheduler; + +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import ru.ldeloff.servermonitorbot.integration.out.service.SshService; + +@Service +@RequiredArgsConstructor +public class CheckSessionStatusScheduler { + + private final SshService sshService; + + @Scheduled(fixedRateString = "${ssh.checkConnectionDelay}") + public void updateSessionStatusCheck() { + sshService.updateConnection(); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/statuschecker/service/CheckSessionStatus.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/statuschecker/service/CheckSessionStatus.java new file mode 100644 index 0000000..5ee9c0f --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/statuschecker/service/CheckSessionStatus.java @@ -0,0 +1,27 @@ +package ru.ldeloff.servermonitorbot.internal.statuschecker.service; + +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; +import ru.ldeloff.servermonitorbot.internal.template.util.UpdateUtil; +import ru.ldeloff.servermonitorbot.internal.data.model.User; +import ru.ldeloff.servermonitorbot.integration.out.service.SshService; +import ru.ldeloff.servermonitorbot.internal.ui.ServerListButtons; + +@Service +public class CheckSessionStatus extends CommandTemplate { + + public CheckSessionStatus(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService) { + super(updateUtil, serverListButtons, sshService); + setName("Статус"); + } + + public SendMessage executeAggregate(User user, SendMessage message) { + return super.sshService.getStatusSessions(message); + } + + @Override + public String executeCommandSpecificHost(String serverName) { + return null; + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandTemplate.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/template/CommandTemplate.java similarity index 66% rename from src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandTemplate.java rename to src/main/java/ru/ldeloff/servermonitorbot/internal/template/CommandTemplate.java index 901602d..d35f55b 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandTemplate.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/template/CommandTemplate.java @@ -1,4 +1,4 @@ -package ru.ldeloff.servermonitorbot.service.command; +package ru.ldeloff.servermonitorbot.internal.template; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -7,14 +7,12 @@ 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.SshServer; -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; -import ru.ldeloff.servermonitorbot.utils.SshServerUtils; -import ru.ldeloff.servermonitorbot.utils.ui.ServerListButtons; +import ru.ldeloff.servermonitorbot.integration.in.TelegramBotController; +import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; +import ru.ldeloff.servermonitorbot.internal.template.util.UpdateUtil; +import ru.ldeloff.servermonitorbot.internal.data.model.User; +import ru.ldeloff.servermonitorbot.integration.out.service.SshService; +import ru.ldeloff.servermonitorbot.internal.ui.ServerListButtons; import java.util.Arrays; import java.util.List; @@ -23,10 +21,10 @@ import java.util.Objects; @Slf4j @RequiredArgsConstructor public abstract class CommandTemplate { - private final UserService userService; - private final RoleService roleService; + + private final UpdateUtil updateUtil; private final ServerListButtons serverListButtons; - private final SshService sshService; + public final SshService sshService; @Getter @Setter private long expectedRole = 1L; @@ -39,13 +37,13 @@ public abstract class CommandTemplate { return false; } - User user = getUser(update); - String message = getMessage(update); + User user = updateUtil.getUser(update); + String message = updateUtil.getMessage(update); SendMessage answer = new SendMessage(); answer.setChatId(user.getTelegramId()); answer.setText(message); - if (!isAuth(update)) { + if (!updateUtil.roleChecker(update, expectedRole)) { logNotAuth(user, message); sendMessage(actionForNotAuth(user, answer), bot); return true; @@ -72,7 +70,7 @@ public abstract class CommandTemplate { if (update.getMessage().hasText()) { String messageText = update.getMessage().getText(); if (Objects.equals(messageText, name)) { - log.debug("Команда " + messageText + " будет выполнена"); + log.debug("Команда {} будет выполнена", messageText); return true; } } @@ -80,7 +78,7 @@ public abstract class CommandTemplate { String [] tags = update.getCallbackQuery().getData().split(":"); if (tags.length > 1) { if (Objects.equals(tags[0], name)) { - log.debug("Команда " + tags[0] + " будет выполнена"); + log.debug("Команда {} будет выполнена", tags[0]); return true; } } else { @@ -106,19 +104,17 @@ public abstract class CommandTemplate { } return "error"; } - private boolean isAuth(Update update) { - User user = getUser(update); - return user.getRole().getId() <= expectedRole; - } + // Методы при верных условиях void logSuccess(User user, String message) { - log.info("Получена команда '" + message + "' от " + user.getLogin() - + " (" + user.getTelegramId() + "). OK"); + log.info("Получена команда '{}' от {} ({}). OK", message, user.getLogin(), user.getTelegramId()); } - SendMessage executeAggregate(User user, SendMessage message) { + + public SendMessage executeAggregate(User user, SendMessage message) { return serverListButtons.uiForm(message); } + SendMessage executeCommand(User user, SendMessage message) { String [] tags = Arrays.stream(message.getText().split(":")) .map(String::trim) @@ -132,7 +128,7 @@ public abstract class CommandTemplate { return message; } private String executeCommandAllHost() { - List servers = SshServerUtils.filterGoodServers(sshService.getSshServers()); + List servers = sshService.getHealthSshServers(); StringBuilder response = new StringBuilder(); servers.forEach(server -> response.append(executeCommandSpecificHost(server.getName())).append("\n")); return response.toString(); @@ -151,35 +147,6 @@ public abstract class CommandTemplate { } // Общее - // TODO: вынести в UpdateUtils - 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; - } - String getMessage(Update update) { - if (update.hasMessage()) { - return update.getMessage().getText(); - } else if (update.hasCallbackQuery()) { - return update.getCallbackQuery().getData(); - } - return ""; - } - // TODO: вынести public static void sendMessage(SendMessage message, TelegramBotController bot) { try { diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/template/model/CommandType.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/template/model/CommandType.java new file mode 100644 index 0000000..d5b3bd4 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/template/model/CommandType.java @@ -0,0 +1,4 @@ +package ru.ldeloff.servermonitorbot.internal.template.model; + +public enum CommandType { +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/template/util/UpdateUtil.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/template/util/UpdateUtil.java new file mode 100644 index 0000000..098dc8d --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/template/util/UpdateUtil.java @@ -0,0 +1,55 @@ +package ru.ldeloff.servermonitorbot.internal.template.util; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.objects.Update; +import ru.ldeloff.servermonitorbot.internal.data.model.Role; +import ru.ldeloff.servermonitorbot.internal.data.model.User; +import ru.ldeloff.servermonitorbot.internal.data.service.RoleService; +import ru.ldeloff.servermonitorbot.internal.data.service.UserService; + +@Service +@RequiredArgsConstructor +public class UpdateUtil { + + private final UserService userService; + private final RoleService roleService; + + public 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; + } + + public Role getRole(Update update) { + return getUser(update).getRole(); + } + + public String getMessage(Update update) { + if (update.hasMessage()) { + return update.getMessage().getText(); + } else if (update.hasCallbackQuery()) { + return update.getCallbackQuery().getData(); + } + return ""; + } + + public boolean roleChecker(Update update, long expectedRole) { + User user = getUser(update); + return user.getRole().getId() <= expectedRole; + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/ServerListButtons.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/ServerListButtons.java similarity index 86% rename from src/main/java/ru/ldeloff/servermonitorbot/utils/ui/ServerListButtons.java rename to src/main/java/ru/ldeloff/servermonitorbot/internal/ui/ServerListButtons.java index 3af0f41..b2a8ebb 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/ServerListButtons.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/ServerListButtons.java @@ -1,14 +1,11 @@ -package ru.ldeloff.servermonitorbot.utils.ui; +package ru.ldeloff.servermonitorbot.internal.ui; import lombok.RequiredArgsConstructor; 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.Role; -import ru.ldeloff.servermonitorbot.service.ssh.SshService; -import ru.ldeloff.servermonitorbot.utils.RoleChecker; -import ru.ldeloff.servermonitorbot.utils.ui.UiFormer; +import ru.ldeloff.servermonitorbot.integration.out.service.SshService; import java.util.ArrayList; import java.util.List; @@ -25,7 +22,7 @@ public class ServerListButtons implements UiFormer { List> keyboard = new ArrayList<>(); InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup(); - sshService.getSshServers().forEach(sshServer -> { + sshService.getAllSshServers().forEach(sshServer -> { if (Objects.nonNull(sshServer.getSession())) { if (sshServer.getSession().isConnected()) { List keyboardRow = new ArrayList<>(); diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/TelegramBotKeyboard.java similarity index 57% rename from src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java rename to src/main/java/ru/ldeloff/servermonitorbot/internal/ui/TelegramBotKeyboard.java index 0aec83b..da91e3c 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/TelegramBotKeyboard.java @@ -1,16 +1,18 @@ -package ru.ldeloff.servermonitorbot.utils.ui; +package ru.ldeloff.servermonitorbot.internal.ui; import lombok.RequiredArgsConstructor; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardMarkup; import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardButton; import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardRow; -import ru.ldeloff.servermonitorbot.model.CommandList; -import ru.ldeloff.servermonitorbot.model.Role; -import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; -import ru.ldeloff.servermonitorbot.utils.CommandUtil; -import ru.ldeloff.servermonitorbot.utils.RoleChecker; +import ru.ldeloff.servermonitorbot.internal.data.model.Role; +import ru.ldeloff.servermonitorbot.internal.data.model.User; +import ru.ldeloff.servermonitorbot.internal.data.service.UserService; +import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; +import ru.ldeloff.servermonitorbot.internal.ui.util.CommandUtil; import java.util.ArrayList; @@ -20,23 +22,28 @@ import java.util.Map; @Component @RequiredArgsConstructor public class TelegramBotKeyboard implements UiFormer { - private final RoleChecker roleChecker; + + private final UserService userService; + private final ApplicationContext applicationContext; + @Override public SendMessage uiForm(SendMessage message) { ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); replyKeyboardMarkup.setResizeKeyboard(true); replyKeyboardMarkup.setOneTimeKeyboard(false); - ArrayList keyboardRows = formKeyboard( - roleChecker.getRole(message).getId()); + String chatId = message.getChatId(); + User user = userService.getByTelegramId(Long.parseLong(chatId)); + Role role = user.getRole(); + ArrayList keyboardRows = formKeyboard(role.getId()); replyKeyboardMarkup.setKeyboard(keyboardRows); message.setReplyMarkup(replyKeyboardMarkup); return message; } private ArrayList formKeyboard(long role) { - HashMap commands = CommandUtil.getCommands(); + Map commands = applicationContext.getBeansOfType(CommandTemplate.class); if (role < 3) { commands.remove("/start"); commands.remove("Not found"); @@ -46,16 +53,16 @@ public class TelegramBotKeyboard implements UiFormer { ArrayList keyboardRows = new ArrayList<>(); KeyboardRow keyboardRow = new KeyboardRow(); - for (Map.Entry entry : commands.entrySet()) { - if (role <= entry.getValue()) { - keyboardRow.add(new KeyboardButton(entry.getKey())); + for (Map.Entry entry : commands.entrySet()) { + if (role <= entry.getValue().getExpectedRole()) { + keyboardRow.add(new KeyboardButton(entry.getValue().getName())); } if (keyboardRow.size()>=buttonOnLine) { keyboardRows.add(keyboardRow); keyboardRow = new KeyboardRow(); } } - if (keyboardRow.size() > 0) { + if (!keyboardRow.isEmpty()) { keyboardRows.add(keyboardRow); } return keyboardRows; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/UiFormer.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/UiFormer.java similarity index 74% rename from src/main/java/ru/ldeloff/servermonitorbot/utils/ui/UiFormer.java rename to src/main/java/ru/ldeloff/servermonitorbot/internal/ui/UiFormer.java index c847293..69f6730 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/UiFormer.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/UiFormer.java @@ -1,4 +1,4 @@ -package ru.ldeloff.servermonitorbot.utils.ui; +package ru.ldeloff.servermonitorbot.internal.ui; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/util/CommandUtil.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/util/CommandUtil.java new file mode 100644 index 0000000..98b5c9b --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/util/CommandUtil.java @@ -0,0 +1,21 @@ +package ru.ldeloff.servermonitorbot.internal.ui.util; + + +import lombok.RequiredArgsConstructor; +import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; + +import java.util.HashMap; +import java.util.Map; + +@RequiredArgsConstructor +public class CommandUtil { + private final Map commandsMap; + + public HashMap getCommands() { + HashMap commands = new HashMap<>(); + for (Map.Entry entry : commandsMap.entrySet()) { + commands.put(entry.getValue().getName(), entry.getValue().getExpectedRole()); + } + return commands; + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/uname/service/Uname.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/uname/service/Uname.java new file mode 100644 index 0000000..05aeddf --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/internal/uname/service/Uname.java @@ -0,0 +1,39 @@ +package ru.ldeloff.servermonitorbot.internal.uname.service; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; +import ru.ldeloff.servermonitorbot.internal.template.util.UpdateUtil; +import ru.ldeloff.servermonitorbot.internal.data.model.SshCommand; +import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; +import ru.ldeloff.servermonitorbot.integration.out.service.SshService; +import ru.ldeloff.servermonitorbot.internal.ui.ServerListButtons; + +import java.util.Objects; +import java.util.Optional; + +@Service +@Slf4j +public class Uname extends CommandTemplate { + + public Uname(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService) { + super(updateUtil, serverListButtons, sshService); + setName("uname"); + } + + @Override + public String executeCommandSpecificHost(String serverName) { + Optional server = sshService.getAllSshServers() + .stream() + .filter(x -> x.getName().equals(serverName)) + .findFirst(); + if (server.isPresent()) { + SshCommand result = sshService.execute(new SshCommand("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/mapper/UserMapper.java b/src/main/java/ru/ldeloff/servermonitorbot/mapper/UserMapper.java deleted file mode 100644 index aa7811a..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/mapper/UserMapper.java +++ /dev/null @@ -1,22 +0,0 @@ -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/CommandList.java b/src/main/java/ru/ldeloff/servermonitorbot/model/CommandList.java deleted file mode 100644 index 0a0ac20..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/model/CommandList.java +++ /dev/null @@ -1,28 +0,0 @@ -package ru.ldeloff.servermonitorbot.model; - - -import jakarta.annotation.PostConstruct; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; -import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; -import ru.ldeloff.servermonitorbot.utils.CommandUtil; - -import java.util.HashMap; -import java.util.Map; - -@Component -@RequiredArgsConstructor -public class CommandList { - private final Map services; - @Getter - private HashMap commands; - @PostConstruct - private void setCommands() { - commands = new HashMap<>(); - for (Map.Entry entry : services.entrySet()) { - commands.put(entry.getValue().getName(), entry.getValue().getExpectedRole()); - } - CommandUtil.setCommands(commands); - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/dto/InitUserDto.java b/src/main/java/ru/ldeloff/servermonitorbot/model/dto/InitUserDto.java deleted file mode 100644 index a18efdf..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/model/dto/InitUserDto.java +++ /dev/null @@ -1,14 +0,0 @@ -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/java/ru/ldeloff/servermonitorbot/repository/SshRepository.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepository.java deleted file mode 100644 index c2821d4..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -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 deleted file mode 100644 index ec028ab..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java +++ /dev/null @@ -1,108 +0,0 @@ -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.beans.factory.annotation.Value; -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.*; - -@Slf4j -@Repository -public class SshRepositoryImpl implements SshRepository { - - private final List sshServers; - - @Value("${ssh.timeout:5000}") - private int TIMEOUT; - - @Autowired - public SshRepositoryImpl(SshConfig sshConfig) { - this.sshServers = sshConfig.getServers(); - } - - private Set sessions = new HashSet<>(); - - @Override - public void connectToAllServer() { - sshServers.forEach(sshServer -> { - try { - Session session = connectToServer(sshServer); - sshServer.setSession(session); - log.info("Успешно подключён к " + sshServer.getHost()); - } 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.setTimeout(TIMEOUT); - session.connect(); - sessions.add(session); - 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(checkStatusServer(server)) - .append("\n"); - }); - return String.valueOf(text); - } - - @Override - public List getSshServers() { - return sshServers; - } - - private String checkStatusServer(SshServer server) { - if (Objects.isNull(server.getSession())) { - try { - connectToServer(server); - return "OK"; - } catch (JSchException e) { - log.warn("Не удалось соединиться с " + server.getHost() + ": " + e.getMessage()); - return "нет соединения"; - } - } - - if (server.getSession().isConnected()) { - return "OK"; - } else { - try { - connectToServer(server); - return "OK"; - } catch (JSchException e) { - log.warn("Не удалось соединиться с " + server.getHost() + ": " + e.getMessage()); - return "потеряно соединение"; - } - } - - } - -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/repository/UserRepository.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/UserRepository.java deleted file mode 100644 index e4a1462..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/repository/UserRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package ru.ldeloff.servermonitorbot.repository; - -import jakarta.validation.constraints.NotNull; -import org.springframework.data.domain.Example; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; -import ru.ldeloff.servermonitorbot.model.User; - -import java.util.List; - -@Repository -public interface UserRepository extends JpaRepository { - User getByTelegramId(long id); - @NotNull List findAll(); -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/FirstUseCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/FirstUseCommand.java deleted file mode 100644 index a617133..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/FirstUseCommand.java +++ /dev/null @@ -1,37 +0,0 @@ -package ru.ldeloff.servermonitorbot.service.command; - -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.User; -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.ui.ServerListButtons; -import ru.ldeloff.servermonitorbot.utils.ui.TelegramBotKeyboard; - -@Service -public class FirstUseCommand extends CommandTemplate { - final TelegramBotKeyboard telegramBotKeyboard; - - public FirstUseCommand(UserService userService, - RoleService roleService, - SshService sshService, - ServerListButtons serverListButtons, - TelegramBotKeyboard telegramBotKeyboard) { - super(userService, roleService, serverListButtons, sshService); - this.telegramBotKeyboard = telegramBotKeyboard; - setName("/start"); - } - - @Override - public SendMessage executeAggregate(User user, SendMessage message) { - message.setText("Добро пожаловать " + user.getLogin() + "!"); - return telegramBotKeyboard.uiForm(message); - } - - @Override - public String executeCommandSpecificHost(String serverName) { - return null; - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/GetStatusSessions.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/GetStatusSessions.java deleted file mode 100644 index 9e31dec..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/GetStatusSessions.java +++ /dev/null @@ -1,27 +0,0 @@ -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; -import ru.ldeloff.servermonitorbot.utils.ui.ServerListButtons; - -@Service -public class GetStatusSessions extends CommandTemplate { - final SshService sshService; - public GetStatusSessions(UserService userService, RoleService roleService, SshService sshService, ServerListButtons serverListButtons) { - super(userService, roleService, serverListButtons, sshService); - this.sshService = sshService; - setName("Статус"); - } - @Override - public SendMessage executeAggregate(User user, SendMessage message) { - return sshService.getStatusSessions(message); - } - @Override - public String executeCommandSpecificHost(String serverName) { - return null; - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/SwitchToMainMenu.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/SwitchToMainMenu.java deleted file mode 100644 index 423f48e..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/SwitchToMainMenu.java +++ /dev/null @@ -1,47 +0,0 @@ -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 org.telegram.telegrambots.meta.api.objects.Update; -import ru.ldeloff.servermonitorbot.controller.TelegramBotController; -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; -import ru.ldeloff.servermonitorbot.utils.ui.ServerListButtons; -import ru.ldeloff.servermonitorbot.utils.ui.TelegramBotKeyboard; - -@Service -@Slf4j -public class SwitchToMainMenu extends CommandTemplate { - final TelegramBotKeyboard telegramBotKeyboard; - - public SwitchToMainMenu(UserService userService, - RoleService roleService, - SshService sshService, - ServerListButtons serverListButtons, - TelegramBotKeyboard telegramBotKeyboard) { - super(userService, roleService, serverListButtons, sshService); - this.telegramBotKeyboard = telegramBotKeyboard; - setName("Not found"); - } - @Override - public String executeCommandSpecificHost(String serverName) { - return null; - } - - @Override - void logSuccess(User user, String message) { - log.warn("Получена несуществующая команда '" + message + "' от " + user.getLogin() - + " (" + user.getTelegramId() + "). OK"); - } - @Override - SendMessage executeAggregate(User user, SendMessage message) { - SendMessage answer = new SendMessage(); - answer.setChatId(user.getTelegramId()); - answer.setText("Неверная команда. Попробуем сначала."); - return telegramBotKeyboard.uiForm(answer); - } - -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/UnameCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/UnameCommand.java deleted file mode 100644 index 48b6ee5..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/UnameCommand.java +++ /dev/null @@ -1,39 +0,0 @@ -package ru.ldeloff.servermonitorbot.service.command; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import ru.ldeloff.servermonitorbot.model.SshCommand; -import ru.ldeloff.servermonitorbot.model.SshServer; -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.ui.ServerListButtons; - -import java.util.Objects; -import java.util.Optional; - -@Service -@Slf4j -public class UnameCommand extends CommandTemplate { - final SshService sshService; - public UnameCommand(UserService userService, RoleService roleService, SshService sshService, ServerListButtons serverListButtons) { - super(userService, roleService, serverListButtons, sshService); - this.sshService = sshService; - setName("uname"); - } - @Override - public String executeCommandSpecificHost(String serverName) { - Optional server = sshService.getSshServers() - .stream() - .filter(x -> x.getName().equals(serverName)) - .findFirst(); - if (server.isPresent()) { - SshCommand result = sshService.execute(new SshCommand("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/service/role/RoleService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleService.java deleted file mode 100644 index b26d5e1..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleService.java +++ /dev/null @@ -1,9 +0,0 @@ -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/ssh/SshService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java deleted file mode 100644 index 6af73f6..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.ldeloff.servermonitorbot.service.ssh; - - -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.model.SshCommand; -import ru.ldeloff.servermonitorbot.model.SshServer; - -import java.util.List; - -public interface SshService { - SendMessage getStatusSessions(SendMessage update); - - List getSshServers(); - SshCommand execute(SshCommand sshCommand); - List execute(List sshCommands); -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserService.java deleted file mode 100644 index fa789e0..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserService.java +++ /dev/null @@ -1,13 +0,0 @@ -package ru.ldeloff.servermonitorbot.service.user; - -import ru.ldeloff.servermonitorbot.model.User; - -import java.util.List; - -public interface UserService { - User saveOrUpdateUser(User user); - - User getByTelegramId(Long id); - - List getAllUsers(); -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserServiceImpl.java deleted file mode 100644 index 43345ed..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserServiceImpl.java +++ /dev/null @@ -1,34 +0,0 @@ -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; - -import java.util.List; - -@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); - } - - @Override - public List getAllUsers() {return userRepository.findAll(); } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/CommandUtil.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/CommandUtil.java deleted file mode 100644 index c2cf560..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/utils/CommandUtil.java +++ /dev/null @@ -1,15 +0,0 @@ -package ru.ldeloff.servermonitorbot.utils; - -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.UtilityClass; - -import java.util.HashMap; - -@UtilityClass -public class CommandUtil { - - @Setter - @Getter - private HashMap commands; -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/RoleChecker.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/RoleChecker.java deleted file mode 100644 index 7b5a00a..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/utils/RoleChecker.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.ldeloff.servermonitorbot.utils; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.model.Role; -import ru.ldeloff.servermonitorbot.model.User; -import ru.ldeloff.servermonitorbot.service.user.UserService; - -@RequiredArgsConstructor -@Component -public class RoleChecker { - final UserService userService; - public Role getRole(SendMessage sendMessage) { - String chatId = sendMessage.getChatId(); - User user = userService.getByTelegramId(Long.parseLong(chatId)); - return user.getRole(); - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/SshServerUtils.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/SshServerUtils.java deleted file mode 100644 index 4db77ca..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/utils/SshServerUtils.java +++ /dev/null @@ -1,17 +0,0 @@ -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/resources/application.yml b/src/main/resources/application.yml index 721da82..86209c4 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -17,6 +17,7 @@ bot: - telegramId: 123456789 role: admin ssh: + checkConnectionDelay: 60000 timeout: 5000 servers: - From d23910af9e98f9893fe3786db4ecf0491d7f7818 Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sun, 24 Nov 2024 17:17:56 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B7=D1=83=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 48 +------------------ .../ServerMonitorBotApplication.java | 4 +- .../CommandTemplate.java | 38 ++++++--------- .../cpu/temp/service/CpuTemp.java | 19 ++++---- .../hdd/mdadm/service/MdadmStatus.java | 19 ++++---- .../hdd/temp/service/HddTemp.java | 19 ++++---- .../CheckSessionStatusScheduler.java | 4 +- .../service/CheckSessionStatus.java | 28 +++++++++++ .../uname/service/Uname.java | 19 ++++---- .../servermonitorbot/config/UserConfig.java | 4 +- .../TelegramBotController.java | 16 ++++--- .../servermonitorbot/init/AddUsers.java | 4 +- .../servermonitorbot/init/SshConnect.java | 5 +- .../{integration/in => init}/StartBot.java | 22 +++++---- .../internal/data/mapper/UserMapper.java | 27 ----------- .../internal/data/model/Role.java | 17 ------- .../internal/data/model/UserEntity.java | 23 --------- .../data/repository/RoleRepository.java | 13 ----- .../data/repository/UserRepository.java | 17 ------- .../internal/data/service/RoleService.java | 9 ---- .../data/service/RoleServiceImpl.java | 29 ----------- .../internal/data/service/UserService.java | 19 -------- .../data/service/UserServiceImpl.java | 47 ------------------ .../service/CheckSessionStatus.java | 27 ----------- .../internal/template/model/CommandType.java | 4 -- .../internal/ui/util/CommandUtil.java | 21 -------- .../{internal/data => }/model/SshCommand.java | 3 +- .../in => }/model/TelegramBot.java | 2 +- .../model/server/ServerStatus.java | 7 +++ .../model => model/server}/SshServer.java | 3 +- .../server/SshServers.java} | 7 +-- .../servermonitorbot/model/user/Role.java | 7 +++ .../data/model => model/user}/User.java | 2 +- .../servermonitorbot/model/user/Users.java | 13 +++++ .../out => }/repository/SshRepository.java | 4 +- .../repository/SshRepositoryImpl.java | 4 +- .../service/MessagingService.java | 9 ++++ .../service/MessagingServiceImpl.java | 38 +++++++++++++++ .../servermonitorbot/service/RoleService.java | 7 +++ .../service/RoleServiceImpl.java | 14 ++++++ .../out => }/service/SshService.java | 6 +-- .../out => }/service/SshServiceImpl.java | 48 ++++++++++++------- .../servermonitorbot/service/UserService.java | 16 +++++++ .../service/UserServiceImpl.java | 42 ++++++++++++++++ .../template => }/util/UpdateUtil.java | 26 +++++----- .../service => view}/FirstUseCommand.java | 17 ++++--- .../ui => view}/ServerListButtons.java | 4 +- .../service => view}/SwitchToMainMenu.java | 17 ++++--- .../ui => view}/TelegramBotKeyboard.java | 27 ++++++----- .../{internal/ui => view}/UiFormer.java | 2 +- .../db/migration/V001__create_table_users.sql | 15 ------ .../db/migration/V002__create_table_roles.sql | 13 ----- .../migration/V003__add_FK_users_to_roles.sql | 2 - .../db/migration/V004__add_roles.sql | 2 - .../db/migration/V005__add_anonymous_role.sql | 1 - .../migration/V006__refactor_users_table.sql | 9 ---- .../migration/V007__refactor_roles_table.sql | 6 --- .../db/migration/V008__add_roles.sql | 4 -- 58 files changed, 362 insertions(+), 517 deletions(-) rename src/main/java/ru/ldeloff/servermonitorbot/{internal/template => commands}/CommandTemplate.java (80%) rename src/main/java/ru/ldeloff/servermonitorbot/{internal => commands}/cpu/temp/service/CpuTemp.java (67%) rename src/main/java/ru/ldeloff/servermonitorbot/{internal => commands}/hdd/mdadm/service/MdadmStatus.java (82%) rename src/main/java/ru/ldeloff/servermonitorbot/{internal => commands}/hdd/temp/service/HddTemp.java (64%) rename src/main/java/ru/ldeloff/servermonitorbot/{internal => commands}/statuschecker/scheduler/CheckSessionStatusScheduler.java (76%) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/commands/statuschecker/service/CheckSessionStatus.java rename src/main/java/ru/ldeloff/servermonitorbot/{internal => commands}/uname/service/Uname.java (64%) rename src/main/java/ru/ldeloff/servermonitorbot/{integration/in => controller}/TelegramBotController.java (75%) rename src/main/java/ru/ldeloff/servermonitorbot/{integration/in => init}/StartBot.java (67%) delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/data/mapper/UserMapper.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/Role.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/UserEntity.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/data/repository/RoleRepository.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/data/repository/UserRepository.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/RoleService.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/RoleServiceImpl.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/UserService.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/UserServiceImpl.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/statuschecker/service/CheckSessionStatus.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/template/model/CommandType.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/internal/ui/util/CommandUtil.java rename src/main/java/ru/ldeloff/servermonitorbot/{internal/data => }/model/SshCommand.java (83%) rename src/main/java/ru/ldeloff/servermonitorbot/{integration/in => }/model/TelegramBot.java (88%) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/model/server/ServerStatus.java rename src/main/java/ru/ldeloff/servermonitorbot/{internal/data/model => model/server}/SshServer.java (84%) rename src/main/java/ru/ldeloff/servermonitorbot/{config/SshServerList.java => model/server/SshServers.java} (69%) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/model/user/Role.java rename src/main/java/ru/ldeloff/servermonitorbot/{internal/data/model => model/user}/User.java (77%) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/model/user/Users.java rename src/main/java/ru/ldeloff/servermonitorbot/{integration/out => }/repository/SshRepository.java (58%) rename src/main/java/ru/ldeloff/servermonitorbot/{integration/out => }/repository/SshRepositoryImpl.java (88%) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/MessagingService.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/MessagingServiceImpl.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/RoleService.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/RoleServiceImpl.java rename src/main/java/ru/ldeloff/servermonitorbot/{integration/out => }/service/SshService.java (69%) rename src/main/java/ru/ldeloff/servermonitorbot/{integration/out => }/service/SshServiceImpl.java (69%) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/UserService.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/UserServiceImpl.java rename src/main/java/ru/ldeloff/servermonitorbot/{internal/template => }/util/UpdateUtil.java (57%) rename src/main/java/ru/ldeloff/servermonitorbot/{internal/mainmenu/service => view}/FirstUseCommand.java (59%) rename src/main/java/ru/ldeloff/servermonitorbot/{internal/ui => view}/ServerListButtons.java (94%) rename src/main/java/ru/ldeloff/servermonitorbot/{internal/mainmenu/service => view}/SwitchToMainMenu.java (63%) rename src/main/java/ru/ldeloff/servermonitorbot/{internal/ui => view}/TelegramBotKeyboard.java (75%) rename src/main/java/ru/ldeloff/servermonitorbot/{internal/ui => view}/UiFormer.java (74%) delete mode 100644 src/main/resources/db/migration/V001__create_table_users.sql delete mode 100644 src/main/resources/db/migration/V002__create_table_roles.sql delete mode 100644 src/main/resources/db/migration/V003__add_FK_users_to_roles.sql delete mode 100644 src/main/resources/db/migration/V004__add_roles.sql delete mode 100644 src/main/resources/db/migration/V005__add_anonymous_role.sql delete mode 100644 src/main/resources/db/migration/V006__refactor_users_table.sql delete mode 100644 src/main/resources/db/migration/V007__refactor_roles_table.sql delete mode 100644 src/main/resources/db/migration/V008__add_roles.sql diff --git a/pom.xml b/pom.xml index 3f3a189..6ee5d1f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.2 + 3.4.0 ru.ldeloff @@ -15,10 +15,6 @@ ServerMonitorBot 17 - 9.16.0 - ${database.url} - ${database.username} - ${database.password} ru.ldeloff.servermonitorbot.ServerMonitorBotApplication @@ -26,7 +22,6 @@ org.springframework.boot spring-boot-starter - org.projectlombok lombok @@ -45,26 +40,13 @@ org.telegram telegrambots - 6.8.0 + 6.9.7.1 com.jcraft jsch 0.1.55 - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.postgresql - postgresql - - - org.flywaydb - flyway-core - ${flyway.version} - @@ -80,32 +62,6 @@ - - - org.flywaydb - flyway-maven-plugin - ${flyway.version} - - - migrate - deploy - - migrate - - - - - ${database.url} - ${database.username} - ${database.password} - - classpath:db/migration - - - - - org.springframework.boot - spring-boot-maven-plugin diff --git a/src/main/java/ru/ldeloff/servermonitorbot/ServerMonitorBotApplication.java b/src/main/java/ru/ldeloff/servermonitorbot/ServerMonitorBotApplication.java index fcdcebe..49a7a39 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/ServerMonitorBotApplication.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/ServerMonitorBotApplication.java @@ -4,11 +4,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.scheduling.annotation.EnableScheduling; -import ru.ldeloff.servermonitorbot.config.SshServerList; +import ru.ldeloff.servermonitorbot.model.server.SshServers; @SpringBootApplication @EnableScheduling -@EnableConfigurationProperties(SshServerList.class) +@EnableConfigurationProperties(SshServers.class) public class ServerMonitorBotApplication { public static void main(String[] args) { diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/template/CommandTemplate.java b/src/main/java/ru/ldeloff/servermonitorbot/commands/CommandTemplate.java similarity index 80% rename from src/main/java/ru/ldeloff/servermonitorbot/internal/template/CommandTemplate.java rename to src/main/java/ru/ldeloff/servermonitorbot/commands/CommandTemplate.java index d35f55b..2753e03 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/template/CommandTemplate.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/commands/CommandTemplate.java @@ -1,4 +1,4 @@ -package ru.ldeloff.servermonitorbot.internal.template; +package ru.ldeloff.servermonitorbot.commands; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -6,13 +6,13 @@ import lombok.Setter; 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.integration.in.TelegramBotController; -import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; -import ru.ldeloff.servermonitorbot.internal.template.util.UpdateUtil; -import ru.ldeloff.servermonitorbot.internal.data.model.User; -import ru.ldeloff.servermonitorbot.integration.out.service.SshService; -import ru.ldeloff.servermonitorbot.internal.ui.ServerListButtons; +import ru.ldeloff.servermonitorbot.model.user.Role; +import ru.ldeloff.servermonitorbot.model.server.SshServer; +import ru.ldeloff.servermonitorbot.service.MessagingService; +import ru.ldeloff.servermonitorbot.util.UpdateUtil; +import ru.ldeloff.servermonitorbot.model.user.User; +import ru.ldeloff.servermonitorbot.service.SshService; +import ru.ldeloff.servermonitorbot.view.ServerListButtons; import java.util.Arrays; import java.util.List; @@ -25,14 +25,15 @@ public abstract class CommandTemplate { private final UpdateUtil updateUtil; private final ServerListButtons serverListButtons; public final SshService sshService; + private final MessagingService messagingService; @Getter @Setter - private long expectedRole = 1L; + private List expectedRole = List.of(Role.ADMIN); @Getter @Setter private String name; - public boolean execute(Update update, TelegramBotController bot) { + public boolean execute(Update update) { if (!isExecute(update)) { return false; } @@ -45,7 +46,7 @@ public abstract class CommandTemplate { if (!updateUtil.roleChecker(update, expectedRole)) { logNotAuth(user, message); - sendMessage(actionForNotAuth(user, answer), bot); + messagingService.send(actionForNotAuth(user, answer)); return true; } @@ -53,11 +54,11 @@ public abstract class CommandTemplate { switch (type) { case "aggregate": logSuccess(user, message); - sendMessage(executeAggregate(user, answer), bot); + messagingService.send(executeAggregate(user, answer)); return true; case "command": logSuccess(user, message); - sendMessage(executeCommand(user, answer), bot); + messagingService.send(executeCommand(user, answer)); return true; default: return false; @@ -145,15 +146,4 @@ public abstract class CommandTemplate { + ") недостаточно прав для выполнения этой команды"); return message; } - - // Общее - // TODO: вынести - public static 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/internal/cpu/temp/service/CpuTemp.java b/src/main/java/ru/ldeloff/servermonitorbot/commands/cpu/temp/service/CpuTemp.java similarity index 67% rename from src/main/java/ru/ldeloff/servermonitorbot/internal/cpu/temp/service/CpuTemp.java rename to src/main/java/ru/ldeloff/servermonitorbot/commands/cpu/temp/service/CpuTemp.java index ed91b8d..32f18eb 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/cpu/temp/service/CpuTemp.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/commands/cpu/temp/service/CpuTemp.java @@ -1,13 +1,14 @@ -package ru.ldeloff.servermonitorbot.internal.cpu.temp.service; +package ru.ldeloff.servermonitorbot.commands.cpu.temp.service; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; -import ru.ldeloff.servermonitorbot.internal.template.util.UpdateUtil; -import ru.ldeloff.servermonitorbot.internal.data.model.SshCommand; -import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; -import ru.ldeloff.servermonitorbot.integration.out.service.SshService; -import ru.ldeloff.servermonitorbot.internal.ui.ServerListButtons; +import ru.ldeloff.servermonitorbot.commands.CommandTemplate; +import ru.ldeloff.servermonitorbot.service.MessagingService; +import ru.ldeloff.servermonitorbot.util.UpdateUtil; +import ru.ldeloff.servermonitorbot.model.SshCommand; +import ru.ldeloff.servermonitorbot.model.server.SshServer; +import ru.ldeloff.servermonitorbot.service.SshService; +import ru.ldeloff.servermonitorbot.view.ServerListButtons; import java.util.Objects; import java.util.Optional; @@ -16,8 +17,8 @@ import java.util.Optional; @Slf4j public class CpuTemp extends CommandTemplate { - public CpuTemp(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService) { - super(updateUtil, serverListButtons, sshService); + public CpuTemp(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService, MessagingService messagingService) { + super(updateUtil, serverListButtons, sshService, messagingService); setName("CPU.temp"); } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/hdd/mdadm/service/MdadmStatus.java b/src/main/java/ru/ldeloff/servermonitorbot/commands/hdd/mdadm/service/MdadmStatus.java similarity index 82% rename from src/main/java/ru/ldeloff/servermonitorbot/internal/hdd/mdadm/service/MdadmStatus.java rename to src/main/java/ru/ldeloff/servermonitorbot/commands/hdd/mdadm/service/MdadmStatus.java index c6fe306..d00974f 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/hdd/mdadm/service/MdadmStatus.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/commands/hdd/mdadm/service/MdadmStatus.java @@ -1,13 +1,14 @@ -package ru.ldeloff.servermonitorbot.internal.hdd.mdadm.service; +package ru.ldeloff.servermonitorbot.commands.hdd.mdadm.service; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; -import ru.ldeloff.servermonitorbot.internal.template.util.UpdateUtil; -import ru.ldeloff.servermonitorbot.internal.data.model.SshCommand; -import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; -import ru.ldeloff.servermonitorbot.integration.out.service.SshService; -import ru.ldeloff.servermonitorbot.internal.ui.ServerListButtons; +import ru.ldeloff.servermonitorbot.commands.CommandTemplate; +import ru.ldeloff.servermonitorbot.service.MessagingService; +import ru.ldeloff.servermonitorbot.util.UpdateUtil; +import ru.ldeloff.servermonitorbot.model.SshCommand; +import ru.ldeloff.servermonitorbot.model.server.SshServer; +import ru.ldeloff.servermonitorbot.service.SshService; +import ru.ldeloff.servermonitorbot.view.ServerListButtons; import java.util.*; @@ -15,8 +16,8 @@ import java.util.*; @Slf4j public class MdadmStatus extends CommandTemplate { - public MdadmStatus(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService) { - super(updateUtil, serverListButtons, sshService); + public MdadmStatus(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService, MessagingService messagingService) { + super(updateUtil, serverListButtons, sshService, messagingService); setName("MDADM"); } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/hdd/temp/service/HddTemp.java b/src/main/java/ru/ldeloff/servermonitorbot/commands/hdd/temp/service/HddTemp.java similarity index 64% rename from src/main/java/ru/ldeloff/servermonitorbot/internal/hdd/temp/service/HddTemp.java rename to src/main/java/ru/ldeloff/servermonitorbot/commands/hdd/temp/service/HddTemp.java index 2132f21..a92e8b9 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/hdd/temp/service/HddTemp.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/commands/hdd/temp/service/HddTemp.java @@ -1,13 +1,14 @@ -package ru.ldeloff.servermonitorbot.internal.hdd.temp.service; +package ru.ldeloff.servermonitorbot.commands.hdd.temp.service; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; -import ru.ldeloff.servermonitorbot.internal.template.util.UpdateUtil; -import ru.ldeloff.servermonitorbot.internal.data.model.SshCommand; -import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; -import ru.ldeloff.servermonitorbot.integration.out.service.SshService; -import ru.ldeloff.servermonitorbot.internal.ui.ServerListButtons; +import ru.ldeloff.servermonitorbot.commands.CommandTemplate; +import ru.ldeloff.servermonitorbot.service.MessagingService; +import ru.ldeloff.servermonitorbot.util.UpdateUtil; +import ru.ldeloff.servermonitorbot.model.SshCommand; +import ru.ldeloff.servermonitorbot.model.server.SshServer; +import ru.ldeloff.servermonitorbot.service.SshService; +import ru.ldeloff.servermonitorbot.view.ServerListButtons; import java.util.Objects; import java.util.Optional; @@ -15,8 +16,8 @@ import java.util.Optional; @Service @Slf4j public class HddTemp extends CommandTemplate { - public HddTemp(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService) { - super(updateUtil, serverListButtons, sshService); + public HddTemp(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService, MessagingService messagingService) { + super(updateUtil, serverListButtons, sshService, messagingService); setName("HDD.temp"); } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/statuschecker/scheduler/CheckSessionStatusScheduler.java b/src/main/java/ru/ldeloff/servermonitorbot/commands/statuschecker/scheduler/CheckSessionStatusScheduler.java similarity index 76% rename from src/main/java/ru/ldeloff/servermonitorbot/internal/statuschecker/scheduler/CheckSessionStatusScheduler.java rename to src/main/java/ru/ldeloff/servermonitorbot/commands/statuschecker/scheduler/CheckSessionStatusScheduler.java index c1de0b2..bca5cad 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/statuschecker/scheduler/CheckSessionStatusScheduler.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/commands/statuschecker/scheduler/CheckSessionStatusScheduler.java @@ -1,9 +1,9 @@ -package ru.ldeloff.servermonitorbot.internal.statuschecker.scheduler; +package ru.ldeloff.servermonitorbot.commands.statuschecker.scheduler; import lombok.RequiredArgsConstructor; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; -import ru.ldeloff.servermonitorbot.integration.out.service.SshService; +import ru.ldeloff.servermonitorbot.service.SshService; @Service @RequiredArgsConstructor diff --git a/src/main/java/ru/ldeloff/servermonitorbot/commands/statuschecker/service/CheckSessionStatus.java b/src/main/java/ru/ldeloff/servermonitorbot/commands/statuschecker/service/CheckSessionStatus.java new file mode 100644 index 0000000..e2fc9d4 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/commands/statuschecker/service/CheckSessionStatus.java @@ -0,0 +1,28 @@ +package ru.ldeloff.servermonitorbot.commands.statuschecker.service; + +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import ru.ldeloff.servermonitorbot.commands.CommandTemplate; +import ru.ldeloff.servermonitorbot.service.MessagingService; +import ru.ldeloff.servermonitorbot.util.UpdateUtil; +import ru.ldeloff.servermonitorbot.model.user.User; +import ru.ldeloff.servermonitorbot.service.SshService; +import ru.ldeloff.servermonitorbot.view.ServerListButtons; + +@Service +public class CheckSessionStatus extends CommandTemplate { + + public CheckSessionStatus(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService, MessagingService messagingService) { + super(updateUtil, serverListButtons, sshService, messagingService); + setName("Статус"); + } + + public SendMessage executeAggregate(User user, SendMessage message) { + return super.sshService.getStatusSessions(message); + } + + @Override + public String executeCommandSpecificHost(String serverName) { + return null; + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/uname/service/Uname.java b/src/main/java/ru/ldeloff/servermonitorbot/commands/uname/service/Uname.java similarity index 64% rename from src/main/java/ru/ldeloff/servermonitorbot/internal/uname/service/Uname.java rename to src/main/java/ru/ldeloff/servermonitorbot/commands/uname/service/Uname.java index 05aeddf..2aef92b 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/uname/service/Uname.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/commands/uname/service/Uname.java @@ -1,13 +1,14 @@ -package ru.ldeloff.servermonitorbot.internal.uname.service; +package ru.ldeloff.servermonitorbot.commands.uname.service; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; -import ru.ldeloff.servermonitorbot.internal.template.util.UpdateUtil; -import ru.ldeloff.servermonitorbot.internal.data.model.SshCommand; -import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; -import ru.ldeloff.servermonitorbot.integration.out.service.SshService; -import ru.ldeloff.servermonitorbot.internal.ui.ServerListButtons; +import ru.ldeloff.servermonitorbot.commands.CommandTemplate; +import ru.ldeloff.servermonitorbot.service.MessagingService; +import ru.ldeloff.servermonitorbot.util.UpdateUtil; +import ru.ldeloff.servermonitorbot.model.SshCommand; +import ru.ldeloff.servermonitorbot.model.server.SshServer; +import ru.ldeloff.servermonitorbot.service.SshService; +import ru.ldeloff.servermonitorbot.view.ServerListButtons; import java.util.Objects; import java.util.Optional; @@ -16,8 +17,8 @@ import java.util.Optional; @Slf4j public class Uname extends CommandTemplate { - public Uname(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService) { - super(updateUtil, serverListButtons, sshService); + public Uname(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService, MessagingService messagingService) { + super(updateUtil, serverListButtons, sshService, messagingService); setName("uname"); } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/config/UserConfig.java b/src/main/java/ru/ldeloff/servermonitorbot/config/UserConfig.java index edd8bb9..5384d12 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/config/UserConfig.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/config/UserConfig.java @@ -5,8 +5,8 @@ import lombok.Setter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; -import ru.ldeloff.servermonitorbot.internal.data.model.User; -import ru.ldeloff.servermonitorbot.internal.data.service.RoleService; +import ru.ldeloff.servermonitorbot.model.user.User; +import ru.ldeloff.servermonitorbot.service.RoleService; import java.util.List; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/integration/in/TelegramBotController.java b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java similarity index 75% rename from src/main/java/ru/ldeloff/servermonitorbot/integration/in/TelegramBotController.java rename to src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java index 198f9cc..fafea88 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/integration/in/TelegramBotController.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java @@ -1,14 +1,14 @@ -package ru.ldeloff.servermonitorbot.integration.in; +package ru.ldeloff.servermonitorbot.controller; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.telegram.telegrambots.bots.TelegramLongPollingBot; import org.telegram.telegrambots.meta.api.objects.Message; import org.telegram.telegrambots.meta.api.objects.Update; -import ru.ldeloff.servermonitorbot.integration.in.model.TelegramBot; -import ru.ldeloff.servermonitorbot.integration.out.service.SshService; -import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; -import ru.ldeloff.servermonitorbot.internal.mainmenu.service.SwitchToMainMenu; +import ru.ldeloff.servermonitorbot.model.TelegramBot; +import ru.ldeloff.servermonitorbot.service.SshService; +import ru.ldeloff.servermonitorbot.commands.CommandTemplate; +import ru.ldeloff.servermonitorbot.view.SwitchToMainMenu; import java.util.Map; @@ -17,15 +17,17 @@ import java.util.Map; public class TelegramBotController extends TelegramLongPollingBot { private final Map commands; + private final TelegramBot telegramBot; private final SwitchToMainMenu switchToMainMenu; private final SshService sshService; + @Override public void onUpdateReceived(Update update) { boolean result = false; for (Map.Entry entry : commands.entrySet()) { - result = entry.getValue().execute(update, this); + result = entry.getValue().execute(update); if (result) { break; } @@ -36,7 +38,7 @@ public class TelegramBotController extends TelegramLongPollingBot { message.setText("Not found"); } update.setMessage(message); - switchToMainMenu.execute(update, this); + switchToMainMenu.execute(update); } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/AddUsers.java b/src/main/java/ru/ldeloff/servermonitorbot/init/AddUsers.java index 62da1fc..7d31eef 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/AddUsers.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/AddUsers.java @@ -4,13 +4,15 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; +import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import ru.ldeloff.servermonitorbot.config.UserConfig; -import ru.ldeloff.servermonitorbot.internal.data.service.UserService; +import ru.ldeloff.servermonitorbot.service.UserService; @Slf4j @Component @RequiredArgsConstructor +@Order(2) public class AddUsers implements ApplicationRunner { final UserConfig userConfig; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java b/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java index d4e2e83..5456af0 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java @@ -3,12 +3,13 @@ package ru.ldeloff.servermonitorbot.init; import lombok.RequiredArgsConstructor; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; +import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import ru.ldeloff.servermonitorbot.integration.out.repository.SshRepository; -import ru.ldeloff.servermonitorbot.integration.out.service.SshService; +import ru.ldeloff.servermonitorbot.service.SshService; @Component @RequiredArgsConstructor +@Order(3) public class SshConnect implements ApplicationRunner { final SshService sshService; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/integration/in/StartBot.java b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java similarity index 67% rename from src/main/java/ru/ldeloff/servermonitorbot/integration/in/StartBot.java rename to src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java index e9acd0d..5845f07 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/integration/in/StartBot.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java @@ -1,31 +1,35 @@ -package ru.ldeloff.servermonitorbot.integration.in; +package ru.ldeloff.servermonitorbot.init; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; +import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.telegram.telegrambots.meta.TelegramBotsApi; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import org.telegram.telegrambots.updatesreceivers.DefaultBotSession; -import ru.ldeloff.servermonitorbot.internal.data.model.User; -import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; -import ru.ldeloff.servermonitorbot.internal.data.service.UserService; -import ru.ldeloff.servermonitorbot.internal.ui.TelegramBotKeyboard; +import ru.ldeloff.servermonitorbot.controller.TelegramBotController; +import ru.ldeloff.servermonitorbot.model.user.User; +import ru.ldeloff.servermonitorbot.service.MessagingService; +import ru.ldeloff.servermonitorbot.service.UserService; +import ru.ldeloff.servermonitorbot.view.TelegramBotKeyboard; @Slf4j @Component @NoArgsConstructor +@Order(1) public class StartBot implements ApplicationRunner { private TelegramBotController telegramBot; private TelegramBotKeyboard telegramBotKeyboard; private UserService userService; + private MessagingService messagingService; @Autowired - public StartBot(TelegramBotController telegramBot, TelegramBotKeyboard telegramBotKeyboard, UserService userService) { + public StartBot(TelegramBotController telegramBot, TelegramBotKeyboard telegramBotKeyboard, UserService userService, MessagingService messagingService) { this.telegramBot = telegramBot; this.telegramBotKeyboard = telegramBotKeyboard; this.userService = userService; @@ -35,16 +39,16 @@ public class StartBot implements ApplicationRunner { try { TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class); botsApi.registerBot(telegramBot); - userService.getAllUsers().forEach(this::SendInitMessage); + userService.getAllUsers().forEach(this::sendInitMessage); log.info("Бот запущен"); } catch (TelegramApiException e) { log.error(e.getMessage()); } } - private void SendInitMessage(User user) { + private void sendInitMessage(User user) { SendMessage answer = new SendMessage(); answer.setChatId(user.getTelegramId()); answer.setText("Бот перезапущен"); - CommandTemplate.sendMessage(telegramBotKeyboard.uiForm(answer), telegramBot); + messagingService.send(telegramBotKeyboard.uiForm(answer)); } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/mapper/UserMapper.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/mapper/UserMapper.java deleted file mode 100644 index d1153a7..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/mapper/UserMapper.java +++ /dev/null @@ -1,27 +0,0 @@ -package ru.ldeloff.servermonitorbot.internal.data.mapper; - -import org.springframework.stereotype.Component; -import ru.ldeloff.servermonitorbot.internal.data.model.User; -import ru.ldeloff.servermonitorbot.internal.data.model.UserEntity; -import ru.ldeloff.servermonitorbot.internal.data.service.RoleService; - -@Component -public class UserMapper { - final RoleService roleService; - - public UserMapper(RoleService roleService) { - this.roleService = roleService; - } - - public UserEntity toEntity(User user) { - return new UserEntity() - .setTelegramId(user.getTelegramId()) - .setRole(user.getRole()); - } - - public User toModel(UserEntity userEntity) { - return new User() - .setTelegramId(userEntity.getTelegramId()) - .setRole(userEntity.getRole()); - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/Role.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/Role.java deleted file mode 100644 index 2922052..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/Role.java +++ /dev/null @@ -1,17 +0,0 @@ -package ru.ldeloff.servermonitorbot.internal.data.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 = "name") - private String name; -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/UserEntity.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/UserEntity.java deleted file mode 100644 index dbf9de4..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/UserEntity.java +++ /dev/null @@ -1,23 +0,0 @@ -package ru.ldeloff.servermonitorbot.internal.data.model; - -import jakarta.persistence.*; -import lombok.Data; -import lombok.experimental.Accessors; - -@Entity -@Data -@Table(name = "users") -@Accessors(chain = true) -public class UserEntity { - @Id - @Column(name = "id") - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "telegram_id") - private Long telegramId; - - @ManyToOne - @JoinColumn(name = "role_id") - private Role role; -} \ No newline at end of file diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/repository/RoleRepository.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/repository/RoleRepository.java deleted file mode 100644 index 6bfd982..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/repository/RoleRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package ru.ldeloff.servermonitorbot.internal.data.repository; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; -import ru.ldeloff.servermonitorbot.internal.data.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/internal/data/repository/UserRepository.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/repository/UserRepository.java deleted file mode 100644 index f7fc684..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/repository/UserRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package ru.ldeloff.servermonitorbot.internal.data.repository; - -import jakarta.validation.constraints.NotNull; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; -import ru.ldeloff.servermonitorbot.internal.data.model.UserEntity; - -import java.util.List; - -@Repository -public interface UserRepository extends JpaRepository { - - UserEntity getByTelegramId(long id); - - @NotNull List findAll(); - -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/RoleService.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/RoleService.java deleted file mode 100644 index 608320f..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/RoleService.java +++ /dev/null @@ -1,9 +0,0 @@ -package ru.ldeloff.servermonitorbot.internal.data.service; - -import ru.ldeloff.servermonitorbot.internal.data.model.Role; - -public interface RoleService { - Role findRoleByName(String name); - - Role findRoleById(Long id); -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/RoleServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/RoleServiceImpl.java deleted file mode 100644 index ef4cb73..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/RoleServiceImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -package ru.ldeloff.servermonitorbot.internal.data.service; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import ru.ldeloff.servermonitorbot.internal.data.model.Role; -import ru.ldeloff.servermonitorbot.internal.data.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/internal/data/service/UserService.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/UserService.java deleted file mode 100644 index 0112301..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/UserService.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.ldeloff.servermonitorbot.internal.data.service; - -import ru.ldeloff.servermonitorbot.internal.data.model.User; -import ru.ldeloff.servermonitorbot.internal.data.model.UserEntity; - -import java.util.List; - -public interface UserService { - - void saveOrUpdateUser(User user); - - UserEntity getEntityByTelegramId(Long id); - - User getByTelegramId(Long id); - - List getAllEntity(); - - List getAllUsers(); -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/UserServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/UserServiceImpl.java deleted file mode 100644 index 79f5415..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/service/UserServiceImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package ru.ldeloff.servermonitorbot.internal.data.service; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import ru.ldeloff.servermonitorbot.internal.data.mapper.UserMapper; -import ru.ldeloff.servermonitorbot.internal.data.model.User; -import ru.ldeloff.servermonitorbot.internal.data.model.UserEntity; -import ru.ldeloff.servermonitorbot.internal.data.repository.UserRepository; - -import java.util.List; - -@Service -@RequiredArgsConstructor -@Slf4j -public class UserServiceImpl implements UserService { - - final UserRepository userRepository; - final UserMapper userMapper; - - @Override - public void saveOrUpdateUser(User user) { - UserEntity userEntity = getEntityByTelegramId(user.getTelegramId()); - if (userEntity != null) { - userEntity.setRole(user.getRole()); - } else { - userEntity = userMapper.toEntity(user); - } - userRepository.save(userEntity); - } - - @Override - public UserEntity getEntityByTelegramId(Long id) { - return userRepository.getByTelegramId(id); - } - - @Override - public User getByTelegramId(Long id) { - return userMapper.toModel(userRepository.getByTelegramId(id)); - } - - @Override - public List getAllEntity() {return userRepository.findAll(); } - - @Override - public List getAllUsers() {return userRepository.findAll().stream().map(userMapper::toModel).toList(); } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/statuschecker/service/CheckSessionStatus.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/statuschecker/service/CheckSessionStatus.java deleted file mode 100644 index 5ee9c0f..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/statuschecker/service/CheckSessionStatus.java +++ /dev/null @@ -1,27 +0,0 @@ -package ru.ldeloff.servermonitorbot.internal.statuschecker.service; - -import org.springframework.stereotype.Service; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; -import ru.ldeloff.servermonitorbot.internal.template.util.UpdateUtil; -import ru.ldeloff.servermonitorbot.internal.data.model.User; -import ru.ldeloff.servermonitorbot.integration.out.service.SshService; -import ru.ldeloff.servermonitorbot.internal.ui.ServerListButtons; - -@Service -public class CheckSessionStatus extends CommandTemplate { - - public CheckSessionStatus(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService) { - super(updateUtil, serverListButtons, sshService); - setName("Статус"); - } - - public SendMessage executeAggregate(User user, SendMessage message) { - return super.sshService.getStatusSessions(message); - } - - @Override - public String executeCommandSpecificHost(String serverName) { - return null; - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/template/model/CommandType.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/template/model/CommandType.java deleted file mode 100644 index d5b3bd4..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/template/model/CommandType.java +++ /dev/null @@ -1,4 +0,0 @@ -package ru.ldeloff.servermonitorbot.internal.template.model; - -public enum CommandType { -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/util/CommandUtil.java b/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/util/CommandUtil.java deleted file mode 100644 index 98b5c9b..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/util/CommandUtil.java +++ /dev/null @@ -1,21 +0,0 @@ -package ru.ldeloff.servermonitorbot.internal.ui.util; - - -import lombok.RequiredArgsConstructor; -import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; - -import java.util.HashMap; -import java.util.Map; - -@RequiredArgsConstructor -public class CommandUtil { - private final Map commandsMap; - - public HashMap getCommands() { - HashMap commands = new HashMap<>(); - for (Map.Entry entry : commandsMap.entrySet()) { - commands.put(entry.getValue().getName(), entry.getValue().getExpectedRole()); - } - return commands; - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/SshCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/model/SshCommand.java similarity index 83% rename from src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/SshCommand.java rename to src/main/java/ru/ldeloff/servermonitorbot/model/SshCommand.java index 0346e5f..8ddf3f2 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/SshCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/SshCommand.java @@ -1,9 +1,10 @@ -package ru.ldeloff.servermonitorbot.internal.data.model; +package ru.ldeloff.servermonitorbot.model; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; +import ru.ldeloff.servermonitorbot.model.server.SshServer; @Getter @Setter diff --git a/src/main/java/ru/ldeloff/servermonitorbot/integration/in/model/TelegramBot.java b/src/main/java/ru/ldeloff/servermonitorbot/model/TelegramBot.java similarity index 88% rename from src/main/java/ru/ldeloff/servermonitorbot/integration/in/model/TelegramBot.java rename to src/main/java/ru/ldeloff/servermonitorbot/model/TelegramBot.java index c33d8c1..8e32ffe 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/integration/in/model/TelegramBot.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/TelegramBot.java @@ -1,4 +1,4 @@ -package ru.ldeloff.servermonitorbot.integration.in.model; +package ru.ldeloff.servermonitorbot.model; import lombok.Getter; import org.springframework.beans.factory.annotation.Value; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/server/ServerStatus.java b/src/main/java/ru/ldeloff/servermonitorbot/model/server/ServerStatus.java new file mode 100644 index 0000000..b4b91f2 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/server/ServerStatus.java @@ -0,0 +1,7 @@ +package ru.ldeloff.servermonitorbot.model.server; + +public enum ServerStatus { + ONLINE, + OFFLINE, + CONNECTION_LOST +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/SshServer.java b/src/main/java/ru/ldeloff/servermonitorbot/model/server/SshServer.java similarity index 84% rename from src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/SshServer.java rename to src/main/java/ru/ldeloff/servermonitorbot/model/server/SshServer.java index 9b9f905..39b11ba 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/SshServer.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/server/SshServer.java @@ -1,4 +1,4 @@ -package ru.ldeloff.servermonitorbot.internal.data.model; +package ru.ldeloff.servermonitorbot.model.server; import com.jcraft.jsch.Session; import jakarta.validation.constraints.NotNull; @@ -21,4 +21,5 @@ public class SshServer { @NotNull private String password; private Session session; + private ServerStatus status; } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/config/SshServerList.java b/src/main/java/ru/ldeloff/servermonitorbot/model/server/SshServers.java similarity index 69% rename from src/main/java/ru/ldeloff/servermonitorbot/config/SshServerList.java rename to src/main/java/ru/ldeloff/servermonitorbot/model/server/SshServers.java index 77a491e..31bbd50 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/config/SshServerList.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/server/SshServers.java @@ -1,10 +1,9 @@ -package ru.ldeloff.servermonitorbot.config; +package ru.ldeloff.servermonitorbot.model.server; import lombok.Getter; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; -import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; import java.util.List; @@ -12,8 +11,6 @@ import java.util.List; @ConfigurationProperties(prefix = "ssh") @Getter @Setter -public class SshServerList { - +public class SshServers { private List servers; - } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/user/Role.java b/src/main/java/ru/ldeloff/servermonitorbot/model/user/Role.java new file mode 100644 index 0000000..a304148 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/user/Role.java @@ -0,0 +1,7 @@ +package ru.ldeloff.servermonitorbot.model.user; + +public enum Role { + ADMIN, + USER, + ANONYMOUS +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/User.java b/src/main/java/ru/ldeloff/servermonitorbot/model/user/User.java similarity index 77% rename from src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/User.java rename to src/main/java/ru/ldeloff/servermonitorbot/model/user/User.java index e1ed852..eb6af47 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/data/model/User.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/user/User.java @@ -1,4 +1,4 @@ -package ru.ldeloff.servermonitorbot.internal.data.model; +package ru.ldeloff.servermonitorbot.model.user; import lombok.Data; import lombok.experimental.Accessors; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/user/Users.java b/src/main/java/ru/ldeloff/servermonitorbot/model/user/Users.java new file mode 100644 index 0000000..442dab5 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/user/Users.java @@ -0,0 +1,13 @@ +package ru.ldeloff.servermonitorbot.model.user; + +import lombok.Getter; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@Component +public class Users { + private final List users = new ArrayList<>(); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/integration/out/repository/SshRepository.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepository.java similarity index 58% rename from src/main/java/ru/ldeloff/servermonitorbot/integration/out/repository/SshRepository.java rename to src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepository.java index 9de3756..7b43f07 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/integration/out/repository/SshRepository.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepository.java @@ -1,7 +1,7 @@ -package ru.ldeloff.servermonitorbot.integration.out.repository; +package ru.ldeloff.servermonitorbot.repository; import com.jcraft.jsch.JSchException; -import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; +import ru.ldeloff.servermonitorbot.model.server.SshServer; public interface SshRepository { diff --git a/src/main/java/ru/ldeloff/servermonitorbot/integration/out/repository/SshRepositoryImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java similarity index 88% rename from src/main/java/ru/ldeloff/servermonitorbot/integration/out/repository/SshRepositoryImpl.java rename to src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java index db1f915..548d66f 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/integration/out/repository/SshRepositoryImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java @@ -1,4 +1,4 @@ -package ru.ldeloff.servermonitorbot.integration.out.repository; +package ru.ldeloff.servermonitorbot.repository; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; @@ -6,7 +6,7 @@ import com.jcraft.jsch.Session; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Repository; -import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; +import ru.ldeloff.servermonitorbot.model.server.SshServer; @Repository @RequiredArgsConstructor diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/MessagingService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/MessagingService.java new file mode 100644 index 0000000..f4a2707 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/MessagingService.java @@ -0,0 +1,9 @@ +package ru.ldeloff.servermonitorbot.service; + +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; + +public interface MessagingService { + void sendMessageToAdmins(String message); + + void send(SendMessage message); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/MessagingServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/MessagingServiceImpl.java new file mode 100644 index 0000000..938e209 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/MessagingServiceImpl.java @@ -0,0 +1,38 @@ +package ru.ldeloff.servermonitorbot.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import org.telegram.telegrambots.meta.exceptions.TelegramApiException; +import ru.ldeloff.servermonitorbot.controller.TelegramBotController; + + +@Slf4j +@Service +@RequiredArgsConstructor +public class MessagingServiceImpl implements MessagingService { + + private final UserService userService; + private final ApplicationContext applicationContext; + + @Override + public void sendMessageToAdmins(String message) { + userService.getAllAdmins().forEach(user -> { + SendMessage sendMessage = new SendMessage(); + sendMessage.setChatId(user.getTelegramId()); + sendMessage.setText(message); + send(sendMessage); + }); + } + + @Override + public void send(SendMessage message) { + try { + applicationContext.getBean(TelegramBotController.class).execute(message); + } catch (TelegramApiException e) { + log.warn("Ошибка при отправке сообщения", e.getMessage()); + } + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/RoleService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/RoleService.java new file mode 100644 index 0000000..6cd1d70 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/RoleService.java @@ -0,0 +1,7 @@ +package ru.ldeloff.servermonitorbot.service; + +import ru.ldeloff.servermonitorbot.model.user.Role; + +public interface RoleService { + Role findRoleByName(String name); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/RoleServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/RoleServiceImpl.java new file mode 100644 index 0000000..407d0ce --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/RoleServiceImpl.java @@ -0,0 +1,14 @@ +package ru.ldeloff.servermonitorbot.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import ru.ldeloff.servermonitorbot.model.user.Role; + +@Service +@RequiredArgsConstructor +public class RoleServiceImpl implements RoleService { + @Override + public Role findRoleByName(String name) { + return Role.valueOf(name); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/integration/out/service/SshService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java similarity index 69% rename from src/main/java/ru/ldeloff/servermonitorbot/integration/out/service/SshService.java rename to src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java index 1fe1e70..3231fb0 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/integration/out/service/SshService.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java @@ -1,9 +1,9 @@ -package ru.ldeloff.servermonitorbot.integration.out.service; +package ru.ldeloff.servermonitorbot.service; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.internal.data.model.SshCommand; -import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; +import ru.ldeloff.servermonitorbot.model.SshCommand; +import ru.ldeloff.servermonitorbot.model.server.SshServer; import java.util.List; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/integration/out/service/SshServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java similarity index 69% rename from src/main/java/ru/ldeloff/servermonitorbot/integration/out/service/SshServiceImpl.java rename to src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java index 5d7eba9..cda3154 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/integration/out/service/SshServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java @@ -1,4 +1,4 @@ -package ru.ldeloff.servermonitorbot.integration.out.service; +package ru.ldeloff.servermonitorbot.service; import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.JSchException; @@ -7,10 +7,11 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.config.SshServerList; -import ru.ldeloff.servermonitorbot.internal.data.model.SshCommand; -import ru.ldeloff.servermonitorbot.internal.data.model.SshServer; -import ru.ldeloff.servermonitorbot.integration.out.repository.SshRepository; +import ru.ldeloff.servermonitorbot.model.server.ServerStatus; +import ru.ldeloff.servermonitorbot.model.server.SshServers; +import ru.ldeloff.servermonitorbot.model.SshCommand; +import ru.ldeloff.servermonitorbot.model.server.SshServer; +import ru.ldeloff.servermonitorbot.repository.SshRepository; import java.io.ByteArrayOutputStream; import java.util.ArrayList; @@ -22,16 +23,24 @@ import java.util.Objects; @RequiredArgsConstructor public class SshServiceImpl implements SshService { - private final SshServerList sshServerList; + private final SshServers sshServers; private final SshRepository sshRepository; + private final MessagingService messagingService; @Override public void updateConnection() { - sshServerList.getServers().forEach(sshServer -> { + sshServers.getServers().forEach(sshServer -> { try { sshRepository.connect(sshServer); + updateServerStatus(sshServer, ServerStatus.ONLINE); log.info("Успешно подключён к {}", sshServer.getHost()); } catch (JSchException e) { + if (sshServer.getStatus() == null) { + updateServerStatus(sshServer, ServerStatus.OFFLINE); + } + if (sshServer.getStatus() == ServerStatus.ONLINE) { + updateServerStatus(sshServer, ServerStatus.CONNECTION_LOST); + } log.warn("Не удалось соединиться с {}: {}", sshServer.getHost(), e.getMessage()); } }); @@ -39,18 +48,16 @@ public class SshServiceImpl implements SshService { @Override public void disconnectAllConnections() { - sshServerList.getServers().forEach(sshRepository::disconnect); + sshServers.getServers().forEach(sshRepository::disconnect); } @Override public SendMessage getStatusSessions(SendMessage message) { StringBuilder text = new StringBuilder("Статус соединения (может выполняться долго): \n"); - sshServerList.getServers().forEach(server -> { - text.append(server.getName()) - .append(": ") - .append(checkStatusServer(server)) - .append("\n"); - }); + sshServers.getServers().forEach(server -> text.append(server.getName()) + .append(": ") + .append(checkStatusServer(server)) + .append("\n")); message.setText(text.toString()); return message; } @@ -78,12 +85,12 @@ public class SshServiceImpl implements SshService { @Override public List getAllSshServers() { - return sshServerList.getServers(); + return sshServers.getServers(); } @Override public List getHealthSshServers() { - return sshServerList.getServers().stream().filter(this::checkHealth).toList(); + return sshServers.getServers().stream().filter(this::checkHealth).toList(); } @Override @@ -127,4 +134,13 @@ public class SshServiceImpl implements SshService { } return sshCommands; } + + public void updateServerStatus(SshServer server, ServerStatus newStatus) { + ServerStatus oldStatus = server.getStatus(); + if (oldStatus != newStatus) { + server.setStatus(newStatus); + messagingService.sendMessageToAdmins("Server status changed for " + server.getName() + + ": " + oldStatus + " -> " + newStatus); + } + } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/UserService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/UserService.java new file mode 100644 index 0000000..566ac80 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/UserService.java @@ -0,0 +1,16 @@ +package ru.ldeloff.servermonitorbot.service; + +import ru.ldeloff.servermonitorbot.model.user.User; + +import java.util.List; + +public interface UserService { + + void saveOrUpdateUser(User user); + + User getByTelegramId(Long id); + + List getAllUsers(); + + List getAllAdmins(); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/UserServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/UserServiceImpl.java new file mode 100644 index 0000000..380dcd1 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/UserServiceImpl.java @@ -0,0 +1,42 @@ +package ru.ldeloff.servermonitorbot.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.ldeloff.servermonitorbot.model.user.Role; +import ru.ldeloff.servermonitorbot.model.user.User; +import ru.ldeloff.servermonitorbot.model.user.Users; + +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +public class UserServiceImpl implements UserService { + + private final Users users; + + @Override + public void saveOrUpdateUser(User user) { + if (getByTelegramId(user.getTelegramId()) == null) { + users.getUsers().add(user); + } + } + + @Override + public User getByTelegramId(Long telegramId) { + return users.getUsers().stream() + .filter(user -> user.getTelegramId().equals(telegramId)) + .findFirst() + .orElse(null); + } + + @Override + public List getAllUsers() {return users.getUsers(); } + + @Override + public List getAllAdmins() { + return users.getUsers().stream().filter(user -> user.getRole().equals(Role.ADMIN)).toList(); + } + +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/template/util/UpdateUtil.java b/src/main/java/ru/ldeloff/servermonitorbot/util/UpdateUtil.java similarity index 57% rename from src/main/java/ru/ldeloff/servermonitorbot/internal/template/util/UpdateUtil.java rename to src/main/java/ru/ldeloff/servermonitorbot/util/UpdateUtil.java index 098dc8d..a4cd7bb 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/template/util/UpdateUtil.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/util/UpdateUtil.java @@ -1,19 +1,19 @@ -package ru.ldeloff.servermonitorbot.internal.template.util; +package ru.ldeloff.servermonitorbot.util; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.telegram.telegrambots.meta.api.objects.Update; -import ru.ldeloff.servermonitorbot.internal.data.model.Role; -import ru.ldeloff.servermonitorbot.internal.data.model.User; -import ru.ldeloff.servermonitorbot.internal.data.service.RoleService; -import ru.ldeloff.servermonitorbot.internal.data.service.UserService; +import ru.ldeloff.servermonitorbot.model.user.Role; +import ru.ldeloff.servermonitorbot.model.user.User; +import ru.ldeloff.servermonitorbot.service.UserService; + +import java.util.List; @Service @RequiredArgsConstructor public class UpdateUtil { private final UserService userService; - private final RoleService roleService; public User getUser(Update update) { long id = -1L; @@ -22,23 +22,19 @@ public class UpdateUtil { 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(); + id = update.getCallbackQuery().getMessage().getChatId(); + login = update.getCallbackQuery().getFrom().getUserName(); } User user = userService.getByTelegramId(id); if (user == null) { user = new User(); user.setTelegramId(id); - user.setRole(roleService.findRoleById(3L)); + user.setRole(Role.ANONYMOUS); } user.setLogin(login); return user; } - public Role getRole(Update update) { - return getUser(update).getRole(); - } - public String getMessage(Update update) { if (update.hasMessage()) { return update.getMessage().getText(); @@ -48,8 +44,8 @@ public class UpdateUtil { return ""; } - public boolean roleChecker(Update update, long expectedRole) { + public boolean roleChecker(Update update, List expectedRoles) { User user = getUser(update); - return user.getRole().getId() <= expectedRole; + return expectedRoles.contains(user.getRole()); } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/mainmenu/service/FirstUseCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/view/FirstUseCommand.java similarity index 59% rename from src/main/java/ru/ldeloff/servermonitorbot/internal/mainmenu/service/FirstUseCommand.java rename to src/main/java/ru/ldeloff/servermonitorbot/view/FirstUseCommand.java index bc84e3b..0a6d48d 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/mainmenu/service/FirstUseCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/view/FirstUseCommand.java @@ -1,21 +1,20 @@ -package ru.ldeloff.servermonitorbot.internal.mainmenu.service; +package ru.ldeloff.servermonitorbot.view; import org.springframework.stereotype.Service; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; -import ru.ldeloff.servermonitorbot.internal.template.util.UpdateUtil; -import ru.ldeloff.servermonitorbot.internal.data.model.User; -import ru.ldeloff.servermonitorbot.integration.out.service.SshService; -import ru.ldeloff.servermonitorbot.internal.ui.ServerListButtons; -import ru.ldeloff.servermonitorbot.internal.ui.TelegramBotKeyboard; +import ru.ldeloff.servermonitorbot.commands.CommandTemplate; +import ru.ldeloff.servermonitorbot.service.MessagingService; +import ru.ldeloff.servermonitorbot.util.UpdateUtil; +import ru.ldeloff.servermonitorbot.model.user.User; +import ru.ldeloff.servermonitorbot.service.SshService; @Service public class FirstUseCommand extends CommandTemplate { private final TelegramBotKeyboard telegramBotKeyboard; - public FirstUseCommand(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService, TelegramBotKeyboard telegramBotKeyboard) { - super(updateUtil, serverListButtons, sshService); + public FirstUseCommand(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService, TelegramBotKeyboard telegramBotKeyboard, MessagingService messagingService) { + super(updateUtil, serverListButtons, sshService, messagingService); this.telegramBotKeyboard = telegramBotKeyboard; setName("/start"); } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/ServerListButtons.java b/src/main/java/ru/ldeloff/servermonitorbot/view/ServerListButtons.java similarity index 94% rename from src/main/java/ru/ldeloff/servermonitorbot/internal/ui/ServerListButtons.java rename to src/main/java/ru/ldeloff/servermonitorbot/view/ServerListButtons.java index b2a8ebb..aeb70b7 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/ServerListButtons.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/view/ServerListButtons.java @@ -1,11 +1,11 @@ -package ru.ldeloff.servermonitorbot.internal.ui; +package ru.ldeloff.servermonitorbot.view; import lombok.RequiredArgsConstructor; 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.integration.out.service.SshService; +import ru.ldeloff.servermonitorbot.service.SshService; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/mainmenu/service/SwitchToMainMenu.java b/src/main/java/ru/ldeloff/servermonitorbot/view/SwitchToMainMenu.java similarity index 63% rename from src/main/java/ru/ldeloff/servermonitorbot/internal/mainmenu/service/SwitchToMainMenu.java rename to src/main/java/ru/ldeloff/servermonitorbot/view/SwitchToMainMenu.java index b61c882..bbd5d59 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/mainmenu/service/SwitchToMainMenu.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/view/SwitchToMainMenu.java @@ -1,14 +1,13 @@ -package ru.ldeloff.servermonitorbot.internal.mainmenu.service; +package ru.ldeloff.servermonitorbot.view; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; -import ru.ldeloff.servermonitorbot.internal.template.util.UpdateUtil; -import ru.ldeloff.servermonitorbot.internal.data.model.User; -import ru.ldeloff.servermonitorbot.integration.out.service.SshService; -import ru.ldeloff.servermonitorbot.internal.ui.ServerListButtons; -import ru.ldeloff.servermonitorbot.internal.ui.TelegramBotKeyboard; +import ru.ldeloff.servermonitorbot.commands.CommandTemplate; +import ru.ldeloff.servermonitorbot.service.MessagingService; +import ru.ldeloff.servermonitorbot.util.UpdateUtil; +import ru.ldeloff.servermonitorbot.model.user.User; +import ru.ldeloff.servermonitorbot.service.SshService; @Service @Slf4j @@ -16,8 +15,8 @@ public class SwitchToMainMenu extends CommandTemplate { private final TelegramBotKeyboard telegramBotKeyboard; - public SwitchToMainMenu(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService, TelegramBotKeyboard telegramBotKeyboard) { - super(updateUtil, serverListButtons, sshService); + public SwitchToMainMenu(UpdateUtil updateUtil, ServerListButtons serverListButtons, SshService sshService, TelegramBotKeyboard telegramBotKeyboard, MessagingService messagingService) { + super(updateUtil, serverListButtons, sshService, messagingService); this.telegramBotKeyboard = telegramBotKeyboard; setName("Not found"); } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/TelegramBotKeyboard.java b/src/main/java/ru/ldeloff/servermonitorbot/view/TelegramBotKeyboard.java similarity index 75% rename from src/main/java/ru/ldeloff/servermonitorbot/internal/ui/TelegramBotKeyboard.java rename to src/main/java/ru/ldeloff/servermonitorbot/view/TelegramBotKeyboard.java index da91e3c..7bb7b03 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/TelegramBotKeyboard.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/view/TelegramBotKeyboard.java @@ -1,24 +1,25 @@ -package ru.ldeloff.servermonitorbot.internal.ui; +package ru.ldeloff.servermonitorbot.view; import lombok.RequiredArgsConstructor; import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardMarkup; import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardButton; import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardRow; -import ru.ldeloff.servermonitorbot.internal.data.model.Role; -import ru.ldeloff.servermonitorbot.internal.data.model.User; -import ru.ldeloff.servermonitorbot.internal.data.service.UserService; -import ru.ldeloff.servermonitorbot.internal.template.CommandTemplate; -import ru.ldeloff.servermonitorbot.internal.ui.util.CommandUtil; +import ru.ldeloff.servermonitorbot.model.user.Role; +import ru.ldeloff.servermonitorbot.model.user.User; +import ru.ldeloff.servermonitorbot.service.UserService; +import ru.ldeloff.servermonitorbot.commands.CommandTemplate; import java.util.ArrayList; -import java.util.HashMap; +import java.util.List; import java.util.Map; +import static ru.ldeloff.servermonitorbot.model.user.Role.ADMIN; +import static ru.ldeloff.servermonitorbot.model.user.Role.USER; + @Component @RequiredArgsConstructor public class TelegramBotKeyboard implements UiFormer { @@ -34,17 +35,17 @@ public class TelegramBotKeyboard implements UiFormer { String chatId = message.getChatId(); User user = userService.getByTelegramId(Long.parseLong(chatId)); - Role role = user.getRole(); - ArrayList keyboardRows = formKeyboard(role.getId()); + ArrayList keyboardRows = formKeyboard(user); replyKeyboardMarkup.setKeyboard(keyboardRows); message.setReplyMarkup(replyKeyboardMarkup); return message; } - private ArrayList formKeyboard(long role) { + private ArrayList formKeyboard(User user) { + Role role = user.getRole(); Map commands = applicationContext.getBeansOfType(CommandTemplate.class); - if (role < 3) { + if (List.of(ADMIN, USER).contains(role)) { commands.remove("/start"); commands.remove("Not found"); } @@ -54,7 +55,7 @@ public class TelegramBotKeyboard implements UiFormer { KeyboardRow keyboardRow = new KeyboardRow(); for (Map.Entry entry : commands.entrySet()) { - if (role <= entry.getValue().getExpectedRole()) { + if (entry.getValue().getExpectedRole().contains(role)) { keyboardRow.add(new KeyboardButton(entry.getValue().getName())); } if (keyboardRow.size()>=buttonOnLine) { diff --git a/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/UiFormer.java b/src/main/java/ru/ldeloff/servermonitorbot/view/UiFormer.java similarity index 74% rename from src/main/java/ru/ldeloff/servermonitorbot/internal/ui/UiFormer.java rename to src/main/java/ru/ldeloff/servermonitorbot/view/UiFormer.java index 69f6730..0ba554a 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/internal/ui/UiFormer.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/view/UiFormer.java @@ -1,4 +1,4 @@ -package ru.ldeloff.servermonitorbot.internal.ui; +package ru.ldeloff.servermonitorbot.view; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; diff --git a/src/main/resources/db/migration/V001__create_table_users.sql b/src/main/resources/db/migration/V001__create_table_users.sql deleted file mode 100644 index 058d3f4..0000000 --- a/src/main/resources/db/migration/V001__create_table_users.sql +++ /dev/null @@ -1,15 +0,0 @@ ---changeset L_DelOff:create_table_users rollbackSplitStatements:true ---comment: Создание таблицы пользователей -CREATE TABLE users -( - id SERIAL PRIMARY KEY, - login VARCHAR(128), - id_role integer -); - -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 users; \ No newline at end of file diff --git a/src/main/resources/db/migration/V002__create_table_roles.sql b/src/main/resources/db/migration/V002__create_table_roles.sql deleted file mode 100644 index 76c5559..0000000 --- a/src/main/resources/db/migration/V002__create_table_roles.sql +++ /dev/null @@ -1,13 +0,0 @@ ---changeset L_DelOff:create_table_roles rollbackSplitStatements:true ---comment: Создание таблицы ролей -CREATE TABLE roles -( - id SERIAL 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/migration/V003__add_FK_users_to_roles.sql b/src/main/resources/db/migration/V003__add_FK_users_to_roles.sql deleted file mode 100644 index 6225766..0000000 --- a/src/main/resources/db/migration/V003__add_FK_users_to_roles.sql +++ /dev/null @@ -1,2 +0,0 @@ -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/migration/V004__add_roles.sql b/src/main/resources/db/migration/V004__add_roles.sql deleted file mode 100644 index 65c0cbf..0000000 --- a/src/main/resources/db/migration/V004__add_roles.sql +++ /dev/null @@ -1,2 +0,0 @@ -INSERT INTO roles (id, role) VALUES (1, 'ADMIN'); -INSERT INTO roles (id, role) VALUES (2, 'USER'); \ No newline at end of file diff --git a/src/main/resources/db/migration/V005__add_anonymous_role.sql b/src/main/resources/db/migration/V005__add_anonymous_role.sql deleted file mode 100644 index ba5a19a..0000000 --- a/src/main/resources/db/migration/V005__add_anonymous_role.sql +++ /dev/null @@ -1 +0,0 @@ -INSERT INTO roles (id, role) VALUES (3, 'ANONYMOUS'); \ No newline at end of file diff --git a/src/main/resources/db/migration/V006__refactor_users_table.sql b/src/main/resources/db/migration/V006__refactor_users_table.sql deleted file mode 100644 index 4a51d65..0000000 --- a/src/main/resources/db/migration/V006__refactor_users_table.sql +++ /dev/null @@ -1,9 +0,0 @@ -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/migration/V007__refactor_roles_table.sql b/src/main/resources/db/migration/V007__refactor_roles_table.sql deleted file mode 100644 index c39ec05..0000000 --- a/src/main/resources/db/migration/V007__refactor_roles_table.sql +++ /dev/null @@ -1,6 +0,0 @@ -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/migration/V008__add_roles.sql b/src/main/resources/db/migration/V008__add_roles.sql deleted file mode 100644 index cdce579..0000000 --- a/src/main/resources/db/migration/V008__add_roles.sql +++ /dev/null @@ -1,4 +0,0 @@ -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 From 68d0fb2ced203bb9f0826fd2d7b99e4625b3989c Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sun, 24 Nov 2024 17:39:48 +0300 Subject: [PATCH 3/4] fix --- .../init/ReloadNotification.java | 33 +++++++++++++++++++ .../servermonitorbot/init/SshConnect.java | 2 +- .../servermonitorbot/init/StartBot.java | 27 ++------------- .../service/MessagingService.java | 2 ++ .../service/MessagingServiceImpl.java | 10 ++++++ src/main/resources/application.yml | 11 +------ 6 files changed, 50 insertions(+), 35 deletions(-) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/init/ReloadNotification.java diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/ReloadNotification.java b/src/main/java/ru/ldeloff/servermonitorbot/init/ReloadNotification.java new file mode 100644 index 0000000..d3ca38c --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/ReloadNotification.java @@ -0,0 +1,33 @@ +package ru.ldeloff.servermonitorbot.init; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import ru.ldeloff.servermonitorbot.service.MessagingService; +import ru.ldeloff.servermonitorbot.service.UserService; +import ru.ldeloff.servermonitorbot.view.TelegramBotKeyboard; + +@Slf4j +@Component +@RequiredArgsConstructor +@Order(3) +public class ReloadNotification implements ApplicationRunner { + + private final TelegramBotKeyboard telegramBotKeyboard; + private final MessagingService messagingService; + private final UserService userService; + + @Override + public void run(ApplicationArguments args) { + userService.getAllUsers().forEach(user -> { + SendMessage sendMessage = new SendMessage(); + sendMessage.setChatId(user.getTelegramId()); + sendMessage.setText("Бот перезапущен"); + messagingService.send(telegramBotKeyboard.uiForm(sendMessage)); + }); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java b/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java index 5456af0..ebd4ebf 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java @@ -9,7 +9,7 @@ import ru.ldeloff.servermonitorbot.service.SshService; @Component @RequiredArgsConstructor -@Order(3) +@Order(4) public class SshConnect implements ApplicationRunner { final SshService sshService; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java index 5845f07..1fa2244 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java @@ -1,54 +1,33 @@ package ru.ldeloff.servermonitorbot.init; import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.telegram.telegrambots.meta.TelegramBotsApi; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import org.telegram.telegrambots.updatesreceivers.DefaultBotSession; import ru.ldeloff.servermonitorbot.controller.TelegramBotController; -import ru.ldeloff.servermonitorbot.model.user.User; -import ru.ldeloff.servermonitorbot.service.MessagingService; -import ru.ldeloff.servermonitorbot.service.UserService; -import ru.ldeloff.servermonitorbot.view.TelegramBotKeyboard; @Slf4j @Component -@NoArgsConstructor +@RequiredArgsConstructor @Order(1) public class StartBot implements ApplicationRunner { - private TelegramBotController telegramBot; - private TelegramBotKeyboard telegramBotKeyboard; - private UserService userService; - private MessagingService messagingService; + private final TelegramBotController telegramBot; - @Autowired - public StartBot(TelegramBotController telegramBot, TelegramBotKeyboard telegramBotKeyboard, UserService userService, MessagingService messagingService) { - this.telegramBot = telegramBot; - this.telegramBotKeyboard = telegramBotKeyboard; - this.userService = userService; - } @Override public void run(ApplicationArguments args) { try { TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class); botsApi.registerBot(telegramBot); - userService.getAllUsers().forEach(this::sendInitMessage); log.info("Бот запущен"); } catch (TelegramApiException e) { log.error(e.getMessage()); } } - private void sendInitMessage(User user) { - SendMessage answer = new SendMessage(); - answer.setChatId(user.getTelegramId()); - answer.setText("Бот перезапущен"); - messagingService.send(telegramBotKeyboard.uiForm(answer)); - } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/MessagingService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/MessagingService.java index f4a2707..f9f6d9b 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/MessagingService.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/MessagingService.java @@ -3,6 +3,8 @@ package ru.ldeloff.servermonitorbot.service; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; public interface MessagingService { + void sendMessageToAll(String message); + void sendMessageToAdmins(String message); void send(SendMessage message); diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/MessagingServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/MessagingServiceImpl.java index 938e209..a7ad461 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/MessagingServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/MessagingServiceImpl.java @@ -17,6 +17,16 @@ public class MessagingServiceImpl implements MessagingService { private final UserService userService; private final ApplicationContext applicationContext; + @Override + public void sendMessageToAll(String message) { + userService.getAllUsers().forEach(user -> { + SendMessage sendMessage = new SendMessage(); + sendMessage.setChatId(user.getTelegramId()); + sendMessage.setText(message); + send(sendMessage); + }); + } + @Override public void sendMessageToAdmins(String message) { userService.getAllAdmins().forEach(user -> { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 86209c4..2facf7b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,15 +1,6 @@ spring: application: name: ServerMonitorBot - datasource: - url: jdbc:postgresql://db:5432/servermonitorbot - username: servermonitorbot - password: servermonitorbot - jpa: - hibernate: - ddl-auto: none - flyway: - locations: classpath:db/migration bot: name: "ServerMonitorBot" token: "token" @@ -17,7 +8,7 @@ bot: - telegramId: 123456789 role: admin ssh: - checkConnectionDelay: 60000 + checkConnectionDelay: 300000 timeout: 5000 servers: - From a648865083e6aa8c81f5b64cfdd2eacc5c36b754 Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sun, 24 Nov 2024 17:56:15 +0300 Subject: [PATCH 4/4] fix --- .../commands/cpu/temp/service/CpuTemp.java | 34 +++++++++++-------- .../view/TelegramBotKeyboard.java | 7 ++-- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/main/java/ru/ldeloff/servermonitorbot/commands/cpu/temp/service/CpuTemp.java b/src/main/java/ru/ldeloff/servermonitorbot/commands/cpu/temp/service/CpuTemp.java index 32f18eb..80df2c1 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/commands/cpu/temp/service/CpuTemp.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/commands/cpu/temp/service/CpuTemp.java @@ -24,20 +24,26 @@ public class CpuTemp extends CommandTemplate { @Override public String executeCommandSpecificHost(String serverName) { - Optional server = sshService.getAllSshServers() - .stream() - .filter(x -> x.getName().equals(serverName)) - .findFirst(); - if (server.isPresent()) { - SshCommand result = sshService.execute(new SshCommand("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; + try { + Optional server = sshService.getAllSshServers() + .stream() + .filter(x -> x.getName().equals(serverName)) + .findFirst(); + if (server.isPresent()) { + SshCommand result = sshService.execute(new SshCommand("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; + } + } catch (NumberFormatException e) { + log.error("Ошибка при выполнении команды 'CPUtemp'" ,e.getMessage()); + return "Сервер " + serverName + " не поддерживает команду 'CPUtemp'"; } + } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/view/TelegramBotKeyboard.java b/src/main/java/ru/ldeloff/servermonitorbot/view/TelegramBotKeyboard.java index 7bb7b03..89ac91d 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/view/TelegramBotKeyboard.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/view/TelegramBotKeyboard.java @@ -45,10 +45,9 @@ public class TelegramBotKeyboard implements UiFormer { private ArrayList formKeyboard(User user) { Role role = user.getRole(); Map commands = applicationContext.getBeansOfType(CommandTemplate.class); - if (List.of(ADMIN, USER).contains(role)) { - commands.remove("/start"); - commands.remove("Not found"); - } + commands.remove("firstUseCommand"); + commands.remove("switchToMainMenu"); + int buttonOnLine = 3; ArrayList keyboardRows = new ArrayList<>();