From 3a967e399bfa30517f02dff98f406cb3e576dbef Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sun, 17 Dec 2023 14:57:12 +0300 Subject: [PATCH 1/7] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D1=80=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D1=82=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=B9?= =?UTF-8?q?=D0=BD=D0=B5=D1=80=D0=BE=D0=B2=20=D0=BF=D1=80=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=B4=D0=B5=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 652f996..7a602dc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,6 +5,7 @@ services: context: . depends_on: - db + restart: always networks: default: @@ -14,6 +15,7 @@ services: POSTGRES_USER: servermonitorbot POSTGRES_PASSWORD: servermonitorbot POSTGRES_DB: servermonitorbot + restart: always networks: default: From 25b73feb482b68bc9bc07a0d6ae4f868f6321643 Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sun, 17 Dec 2023 15:11:13 +0300 Subject: [PATCH 2/7] =?UTF-8?q?=D0=A2=D0=B0=D0=B9=D0=BC=D0=B0=D1=83=D1=82?= =?UTF-8?q?=D1=8B=20=D0=BD=D0=B0=20=D1=81=D0=BE=D0=B5=D0=B4=D0=B8=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servermonitorbot/repository/SshRepositoryImpl.java | 5 +++++ src/main/resources/application.yml | 1 + 2 files changed, 6 insertions(+) diff --git a/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java index 8210141..42f2f72 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java @@ -5,6 +5,7 @@ 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; @@ -20,6 +21,9 @@ 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(); @@ -48,6 +52,7 @@ public class SshRepositoryImpl implements SshRepository { sshServer.getPort()); session.setPassword(sshServer.getPassword()); session.setConfig("StrictHostKeyChecking", "no"); + session.setTimeout(TIMEOUT); session.connect(); return session; } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index e4c33ae..721da82 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -17,6 +17,7 @@ bot: - telegramId: 123456789 role: admin ssh: + timeout: 5000 servers: - name: "Server Name" From 21f4a71c63ade23ef690c1dff15670efb2859d74 Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sun, 17 Dec 2023 16:41:24 +0300 Subject: [PATCH 3/7] =?UTF-8?q?=D0=A3=D0=B2=D0=B5=D0=B4=D0=BE=D0=BC=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servermonitorbot/init/StartBot.java | 18 ++++++++++++++++-- .../repository/UserRepository.java | 5 +++++ .../service/command/CommandTemplate.java | 3 ++- .../service/user/UserService.java | 4 ++++ .../service/user/UserServiceImpl.java | 5 +++++ 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java index 5530238..ec24ba4 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java @@ -7,19 +7,25 @@ import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; 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; +import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; +import ru.ldeloff.servermonitorbot.service.user.UserService; @Slf4j @Component @NoArgsConstructor public class StartBot implements ApplicationRunner { private TelegramBotController telegramBot; + private UserService userService; @Autowired - public StartBot(TelegramBotController telegramBot) { + public StartBot(TelegramBotController telegramBot, UserService userService) { this.telegramBot = telegramBot; + this.userService = userService; } @Override @@ -27,10 +33,18 @@ public class StartBot implements ApplicationRunner { try { TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class); botsApi.registerBot(telegramBot); + userService.getAllUsers().forEach(this::SendInitMessage); log.info("Бот запущен"); } catch (TelegramApiException e) { - e.printStackTrace(); + //e.printStackTrace(); log.error(e.getMessage()); } } + + private void SendInitMessage(User user) { + SendMessage answer = new SendMessage(); + answer.setChatId(user.getTelegramId()); + answer.setText("Бот перезапущен"); + CommandTemplate.sendMessage(answer, telegramBot); + } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/repository/UserRepository.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/UserRepository.java index ceaacd3..e4a1462 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/repository/UserRepository.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/repository/UserRepository.java @@ -1,10 +1,15 @@ 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/CommandTemplate.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandTemplate.java index 0f178d7..c659778 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandTemplate.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandTemplate.java @@ -39,6 +39,7 @@ public abstract class CommandTemplate { sendMessage(actionForNotAuth(user, answer), bot); } } + protected void logSuccess(User user, String message) { log.info("Получена команда '" + message + "' от " + user.getLogin() + " (" + user.getTelegramId() + "). OK"); @@ -76,7 +77,7 @@ public abstract class CommandTemplate { return ""; } - private void sendMessage(SendMessage message, TelegramBotController bot) { + public static void sendMessage(SendMessage message, TelegramBotController bot) { try { bot.execute(message); } catch (TelegramApiException e) { diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserService.java index e7ea1ff..fa789e0 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserService.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserService.java @@ -2,8 +2,12 @@ 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 index ff2844a..43345ed 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserServiceImpl.java @@ -6,6 +6,8 @@ import org.springframework.stereotype.Service; import ru.ldeloff.servermonitorbot.model.User; import ru.ldeloff.servermonitorbot.repository.UserRepository; +import java.util.List; + @Service @RequiredArgsConstructor @Slf4j @@ -26,4 +28,7 @@ public class UserServiceImpl implements UserService { public User getByTelegramId(Long id) { return userRepository.getByTelegramId(id); } + + @Override + public List getAllUsers() {return userRepository.findAll(); } } From 39c2d6e6fc378396b12db825ff84957fe545a602 Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sun, 17 Dec 2023 17:20:12 +0300 Subject: [PATCH 4/7] =?UTF-8?q?=D0=A1=D1=82=D0=B0=D1=82=D1=83=D1=81=20?= =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BF=D1=8B=D1=82=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=D1=81=D1=8F=20=D1=80=D0=B5=D0=BA=D0=BE=D0=BD=D0=BD?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/SshRepositoryImpl.java | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java index 42f2f72..ec028ab 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java @@ -11,9 +11,7 @@ import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import ru.ldeloff.servermonitorbot.config.SshConfig; import ru.ldeloff.servermonitorbot.model.SshServer; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; +import java.util.*; @Slf4j @Repository @@ -29,7 +27,7 @@ public class SshRepositoryImpl implements SshRepository { this.sshServers = sshConfig.getServers(); } - private List sessions = new ArrayList<>(); + private Set sessions = new HashSet<>(); @Override public void connectToAllServer() { @@ -38,7 +36,6 @@ public class SshRepositoryImpl implements SshRepository { Session session = connectToServer(sshServer); sshServer.setSession(session); log.info("Успешно подключён к " + sshServer.getHost()); - sessions.add(session); } catch (JSchException e) { log.warn("Не удалось соединиться с " + sshServer.getHost() + ": " + e.getMessage()); } @@ -54,6 +51,7 @@ public class SshRepositoryImpl implements SshRepository { session.setConfig("StrictHostKeyChecking", "no"); session.setTimeout(TIMEOUT); session.connect(); + sessions.add(session); return session; } @@ -67,7 +65,7 @@ public class SshRepositoryImpl implements SshRepository { @Override public String getStatusSessions() { - StringBuilder text = new StringBuilder("Статус соединения: \n"); + StringBuilder text = new StringBuilder("Статус соединения (может выполняться долго): \n"); sshServers.forEach(server -> { text.append(server.getName()) .append(": ") @@ -84,10 +82,27 @@ public class SshRepositoryImpl implements SshRepository { private String checkStatusServer(SshServer server) { if (Objects.isNull(server.getSession())) { - return "нет соединения"; - } else { - return server.getSession().isConnected() ? "OK" : "отключён"; + 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 "потеряно соединение"; + } + } + } } From c3711bb571d668e2a08fb8da3e3e84f73374c755 Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sun, 21 Jan 2024 15:38:00 +0300 Subject: [PATCH 5/7] =?UTF-8?q?=D0=A0=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 --- .../controller/TelegramBotController.java | 6 +++- .../servermonitorbot/init/AddCommands.java | 7 ++++ .../servermonitorbot/init/StartBot.java | 4 ++- .../servermonitorbot/model/Command.java | 34 ++++++++----------- .../servermonitorbot/model/SshCommand.java | 25 ++++++++++++++ .../repository/CommandRepository.java | 13 +++++++ .../service/command/CommandService.java | 4 +++ .../service/command/CommandServiceImpl.java | 8 +++++ .../cputemp/CpuTempAggregateCommand.java | 2 +- .../command/cputemp/CpuTempCommand.java | 4 +-- .../hddtemp/HddTempAggregateCommand.java | 2 +- .../command/hddtemp/HddTempCommand.java | 4 +-- .../mdadm/MdadmStatusAggregateCommand.java | 2 +- .../command/mdadm/MdadmStatusCommand.java | 17 ++++------ .../command/uname/UnameAggregateCommand.java | 2 +- .../service/command/uname/UnameCommand.java | 4 +-- .../service/ssh/SshService.java | 6 ++-- .../service/ssh/SshServiceImpl.java | 18 +++++----- .../servermonitorbot/utils/RoleChecker.java | 19 +++++++++++ .../ui/{uname => }/ServerListButtons.java | 5 +-- .../utils/ui/TelegramBotKeyboard.java | 8 +++++ .../migration/V009__create_table_commands.sql | 11 ++++++ 22 files changed, 149 insertions(+), 56 deletions(-) create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/init/AddCommands.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/model/SshCommand.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/repository/CommandRepository.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandService.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandServiceImpl.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/utils/RoleChecker.java rename src/main/java/ru/ldeloff/servermonitorbot/utils/ui/{uname => }/ServerListButtons.java (93%) create mode 100644 src/main/resources/db/migration/V009__create_table_commands.sql diff --git a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java index f324553..b71dff5 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java @@ -5,8 +5,10 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.telegram.telegrambots.bots.TelegramLongPollingBot; import org.telegram.telegrambots.meta.api.objects.Update; +import ru.ldeloff.servermonitorbot.model.Command; 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.FirstUseCommand; import ru.ldeloff.servermonitorbot.service.command.GetStatusSessions; import ru.ldeloff.servermonitorbot.service.command.SwitchToMainMenu; @@ -19,13 +21,15 @@ import ru.ldeloff.servermonitorbot.service.command.mdadm.MdadmStatusCommand; import ru.ldeloff.servermonitorbot.service.command.uname.UnameAggregateCommand; import ru.ldeloff.servermonitorbot.service.command.uname.UnameCommand; +import java.util.Map; + @Service @Slf4j @RequiredArgsConstructor public class TelegramBotController extends TelegramLongPollingBot { + //private final Map commands; final TelegramBot telegramBot; final SshRepository sshRepository; - final FirstUseCommand firstUseCommand; final GetStatusSessions getStatusSessions; final UnameAggregateCommand unameAggregateCommand; diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/AddCommands.java b/src/main/java/ru/ldeloff/servermonitorbot/init/AddCommands.java new file mode 100644 index 0000000..c623a79 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/AddCommands.java @@ -0,0 +1,7 @@ +package ru.ldeloff.servermonitorbot.init; + +public class AddCommands { + public static void fillCommandTable() { + + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java index ec24ba4..9b3f7a8 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java @@ -15,6 +15,8 @@ import ru.ldeloff.servermonitorbot.model.User; import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; import ru.ldeloff.servermonitorbot.service.user.UserService; +import static ru.ldeloff.servermonitorbot.init.AddCommands.fillCommandTable; + @Slf4j @Component @NoArgsConstructor @@ -31,12 +33,12 @@ 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); log.info("Бот запущен"); } catch (TelegramApiException e) { - //e.printStackTrace(); log.error(e.getMessage()); } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/Command.java b/src/main/java/ru/ldeloff/servermonitorbot/model/Command.java index 936f89b..40961ed 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/model/Command.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/Command.java @@ -1,25 +1,19 @@ package ru.ldeloff.servermonitorbot.model; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotNull; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter +import jakarta.persistence.*; +import lombok.Data; +@Entity +@Data +@Table(name = "commands") public class Command { - @NotNull - private String command; - @NotNull - @Min(100) - private int timeout; - @NotNull - private SshServer sshServer; - private String response; + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; - public Command(String command, int timeout, SshServer sshServer) { - this.command = command; - this.timeout = timeout; - this.sshServer = sshServer; - } + @Column(name = "name") + private String name; + + @Column(name = "level") + private int level; } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/SshCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/model/SshCommand.java new file mode 100644 index 0000000..2f9ae10 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/SshCommand.java @@ -0,0 +1,25 @@ +package ru.ldeloff.servermonitorbot.model; + +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SshCommand { + @NotNull + private String command; + @NotNull + @Min(100) + private int timeout; + @NotNull + private SshServer sshServer; + private String response; + + public SshCommand(String command, int timeout, SshServer sshServer) { + this.command = command; + this.timeout = timeout; + this.sshServer = sshServer; + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/repository/CommandRepository.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/CommandRepository.java new file mode 100644 index 0000000..f33822f --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/repository/CommandRepository.java @@ -0,0 +1,13 @@ +package ru.ldeloff.servermonitorbot.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import ru.ldeloff.servermonitorbot.model.Command; + +import java.util.Optional; + +@Repository +public interface CommandRepository extends JpaRepository { + Optional findCommandByName(String name); + Optional findCommandById(Long id); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandService.java new file mode 100644 index 0000000..c61fa7f --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandService.java @@ -0,0 +1,4 @@ +package ru.ldeloff.servermonitorbot.service.command; + +public interface CommandService { +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandServiceImpl.java new file mode 100644 index 0000000..60c9799 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandServiceImpl.java @@ -0,0 +1,8 @@ +package ru.ldeloff.servermonitorbot.service.command; + +import org.jvnet.hk2.annotations.Service; + +@Service +public class CommandServiceImpl implements CommandService { + +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempAggregateCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempAggregateCommand.java index 90d2eb2..68c3857 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempAggregateCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempAggregateCommand.java @@ -6,7 +6,7 @@ import ru.ldeloff.servermonitorbot.model.User; import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; import ru.ldeloff.servermonitorbot.service.role.RoleService; import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.ui.uname.ServerListButtons; +import ru.ldeloff.servermonitorbot.utils.ui.ServerListButtons; @Service public class CpuTempAggregateCommand extends CommandTemplate { diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempCommand.java index fb046c1..7d3047c 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempCommand.java @@ -3,7 +3,7 @@ package ru.ldeloff.servermonitorbot.service.command.cputemp; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.model.Command; +import ru.ldeloff.servermonitorbot.model.SshCommand; import ru.ldeloff.servermonitorbot.model.SshServer; import ru.ldeloff.servermonitorbot.model.User; import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; @@ -53,7 +53,7 @@ public class CpuTempCommand extends CommandTemplate { .filter(x -> x.getName().equals(serverName)) .findFirst(); if (server.isPresent()) { - Command result = sshService.execute(new Command("cat /sys/class/thermal/thermal_zone0/temp", 100, server.get())); + 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", diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempAggregateCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempAggregateCommand.java index 1f0ea18..3c9f7ed 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempAggregateCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempAggregateCommand.java @@ -6,7 +6,7 @@ import ru.ldeloff.servermonitorbot.model.User; import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; import ru.ldeloff.servermonitorbot.service.role.RoleService; import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.ui.uname.ServerListButtons; +import ru.ldeloff.servermonitorbot.utils.ui.ServerListButtons; @Service public class HddTempAggregateCommand extends CommandTemplate { diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempCommand.java index 48793cc..d42e1cd 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempCommand.java @@ -3,7 +3,7 @@ package ru.ldeloff.servermonitorbot.service.command.hddtemp; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.model.Command; +import ru.ldeloff.servermonitorbot.model.SshCommand; import ru.ldeloff.servermonitorbot.model.SshServer; import ru.ldeloff.servermonitorbot.model.User; import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; @@ -53,7 +53,7 @@ public class HddTempCommand extends CommandTemplate { .filter(x -> x.getName().equals(serverName)) .findFirst(); if (server.isPresent()) { - Command result = sshService.execute(new Command("hddtemp /dev/sd*", 500, server.get())); + SshCommand result = sshService.execute(new SshCommand("hddtemp /dev/sd*", 500, server.get())); return server.get().getName() + ": \n" + (Objects.isNull(result.getResponse()) ? "ошибка при выполнении команды" : result.getResponse()); } else { diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusAggregateCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusAggregateCommand.java index feb6c7a..d3abf52 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusAggregateCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusAggregateCommand.java @@ -6,7 +6,7 @@ import ru.ldeloff.servermonitorbot.model.User; import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; import ru.ldeloff.servermonitorbot.service.role.RoleService; import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.ui.uname.ServerListButtons; +import ru.ldeloff.servermonitorbot.utils.ui.ServerListButtons; @Service public class MdadmStatusAggregateCommand extends CommandTemplate { diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusCommand.java index 0aca9f9..7da3b7f 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusCommand.java @@ -3,7 +3,7 @@ package ru.ldeloff.servermonitorbot.service.command.mdadm; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.model.Command; +import ru.ldeloff.servermonitorbot.model.SshCommand; import ru.ldeloff.servermonitorbot.model.SshServer; import ru.ldeloff.servermonitorbot.model.User; import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; @@ -13,9 +13,6 @@ import ru.ldeloff.servermonitorbot.service.user.UserService; import ru.ldeloff.servermonitorbot.utils.SshServerUtils; import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; @Service @Slf4j @@ -56,14 +53,14 @@ public class MdadmStatusCommand extends CommandTemplate { .findFirst(); if (server.isPresent()) { // узнаю скок рейдов - Command commandRaid = sshService.execute(new Command("mdadm --detail --scan", 500, server.get())); - List raidNames = parseRaidNames(commandRaid); + SshCommand sshCommandRaid = sshService.execute(new SshCommand("mdadm --detail --scan", 500, server.get())); + List raidNames = parseRaidNames(sshCommandRaid); // Для каждого рейда надо выяснить статус StringBuilder result = new StringBuilder(); raidNames.forEach(raid -> { result.append(raid).append(":\n"); - Command commandHdd = sshService.execute(new Command("mdadm --detail " + raid, 500, server.get())); - List hdds = parseHddState(commandHdd); + SshCommand sshCommandHdd = sshService.execute(new SshCommand("mdadm --detail " + raid, 500, server.get())); + List hdds = parseHddState(sshCommandHdd); hdds.forEach(hdd -> result.append(hdd).append("\n")); }); return server.get().getName() + ": \n" + result; @@ -72,7 +69,7 @@ public class MdadmStatusCommand extends CommandTemplate { return null; } } - private List parseRaidNames(Command result) { + private List parseRaidNames(SshCommand result) { List names = new ArrayList<>(); Arrays.stream(result.getResponse().split("\n")) .map(line -> line.split(" ")) @@ -82,7 +79,7 @@ public class MdadmStatusCommand extends CommandTemplate { return names; } - private List parseHddState(Command result) { + 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/uname/UnameAggregateCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameAggregateCommand.java index 2ac594e..74bdbff 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameAggregateCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameAggregateCommand.java @@ -6,7 +6,7 @@ import ru.ldeloff.servermonitorbot.model.User; import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; import ru.ldeloff.servermonitorbot.service.role.RoleService; import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.ui.uname.ServerListButtons; +import ru.ldeloff.servermonitorbot.utils.ui.ServerListButtons; @Service public class UnameAggregateCommand extends CommandTemplate { diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameCommand.java index 94e3b73..a81f937 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameCommand.java @@ -3,7 +3,7 @@ package ru.ldeloff.servermonitorbot.service.command.uname; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.model.Command; +import ru.ldeloff.servermonitorbot.model.SshCommand; import ru.ldeloff.servermonitorbot.model.SshServer; import ru.ldeloff.servermonitorbot.model.User; import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; @@ -52,7 +52,7 @@ public class UnameCommand extends CommandTemplate { .filter(x -> x.getName().equals(serverName)) .findFirst(); if (server.isPresent()) { - Command result = sshService.execute(new Command("uname -a", 100, server.get())); + SshCommand result = sshService.execute(new SshCommand("uname -a", 100, server.get())); return server.get().getName() + ": " + (Objects.isNull(result.getResponse()) ? "ошибка при выполнении команды" : result.getResponse()); } else { diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java index 126e358..6af73f6 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshService.java @@ -2,7 +2,7 @@ package ru.ldeloff.servermonitorbot.service.ssh; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.model.Command; +import ru.ldeloff.servermonitorbot.model.SshCommand; import ru.ldeloff.servermonitorbot.model.SshServer; import java.util.List; @@ -11,6 +11,6 @@ public interface SshService { SendMessage getStatusSessions(SendMessage update); List getSshServers(); - Command execute(Command command); - List execute(List commands); + 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/service/ssh/SshServiceImpl.java index f5ebec4..04e4778 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/ssh/SshServiceImpl.java @@ -7,7 +7,7 @@ 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.Command; +import ru.ldeloff.servermonitorbot.model.SshCommand; import ru.ldeloff.servermonitorbot.model.SshServer; import ru.ldeloff.servermonitorbot.repository.SshRepository; @@ -31,21 +31,21 @@ public class SshServiceImpl implements SshService { } @Override - public Command execute(Command command) { - List commands = new ArrayList<>(); - commands.add(command); - return execute(commands).get(0); + public SshCommand execute(SshCommand sshCommand) { + List sshCommands = new ArrayList<>(); + sshCommands.add(sshCommand); + return execute(sshCommands).get(0); } @Override - public List execute(List commands) { - Session session = commands.get(0).getSshServer().getSession(); // подразумевается, что в листе с командами сервер один и тот же + public List execute(List sshCommands) { + Session session = sshCommands.get(0).getSshServer().getSession(); // подразумевается, что в листе с командами сервер один и тот же ChannelExec channel = null; try { channel = (ChannelExec) session.openChannel("exec"); ChannelExec finalChannel = channel; - commands.forEach(command -> { + sshCommands.forEach(command -> { try { finalChannel.setCommand(command.getCommand()); ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); @@ -69,6 +69,6 @@ public class SshServiceImpl implements SshService { channel.disconnect(); } } - return commands; + return sshCommands; } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/RoleChecker.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/RoleChecker.java new file mode 100644 index 0000000..7b5a00a --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/utils/RoleChecker.java @@ -0,0 +1,19 @@ +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/ui/uname/ServerListButtons.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/ServerListButtons.java similarity index 93% rename from src/main/java/ru/ldeloff/servermonitorbot/utils/ui/uname/ServerListButtons.java rename to src/main/java/ru/ldeloff/servermonitorbot/utils/ui/ServerListButtons.java index c6d0b4e..3af0f41 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/uname/ServerListButtons.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/ServerListButtons.java @@ -1,11 +1,13 @@ -package ru.ldeloff.servermonitorbot.utils.ui.uname; +package ru.ldeloff.servermonitorbot.utils.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 java.util.ArrayList; @@ -21,7 +23,6 @@ public class ServerListButtons implements UiFormer { @Override public SendMessage uiForm(SendMessage message) { List> keyboard = new ArrayList<>(); - InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup(); sshService.getSshServers().forEach(sshServer -> { diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java index 15004cb..d431d73 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java @@ -1,25 +1,33 @@ package ru.ldeloff.servermonitorbot.utils.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.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.Role; +import ru.ldeloff.servermonitorbot.utils.RoleChecker; import java.util.ArrayList; @Component +@RequiredArgsConstructor public class TelegramBotKeyboard implements UiFormer { private final String STATUS = "Статус"; private final String UNAME = "uname"; private final String CPU_TEMP = "CPU.temp"; private final String HDD_TEMP = "HDD.temp"; private final String MDADM = "MDADM"; + private final RoleChecker roleChecker; @Override public SendMessage uiForm(SendMessage message) { + + Role role = roleChecker.getRole(message); + ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); replyKeyboardMarkup.setResizeKeyboard(true); replyKeyboardMarkup.setOneTimeKeyboard(false); diff --git a/src/main/resources/db/migration/V009__create_table_commands.sql b/src/main/resources/db/migration/V009__create_table_commands.sql new file mode 100644 index 0000000..db5ec4a --- /dev/null +++ b/src/main/resources/db/migration/V009__create_table_commands.sql @@ -0,0 +1,11 @@ +CREATE TABLE commands +( + id SERIAL PRIMARY KEY, + name VARCHAR(128), + level integer +); + +COMMENT ON TABLE commands IS 'Команды'; +COMMENT ON COLUMN commands.id IS 'ID'; +COMMENT ON COLUMN commands.name IS 'Имя команды'; +COMMENT ON COLUMN commands.level IS 'Уровень доступа'; \ No newline at end of file From 0fe1d7e670d789ffa74f4a8d349789699f4a4b89 Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sun, 21 Jan 2024 18:46:56 +0300 Subject: [PATCH 6/7] =?UTF-8?q?=D0=9F=D0=B0=D1=82=D1=82=D0=B5=D1=80=D0=BD?= =?UTF-8?q?=20=D1=86=D0=B5=D0=BF=D0=BE=D1=87=D0=BA=D0=B0=20=D1=81=20=D0=B0?= =?UTF-8?q?=D0=B2=D1=82=D0=BE=D0=BF=D0=BE=D0=B4=D1=82=D1=8F=D0=B3=D0=B8?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=BA=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=81=D0=BE=D0=B2-=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TelegramBotController.java | 87 ++--------- .../servermonitorbot/init/StartBot.java | 9 +- .../service/command/CommandService.java | 4 - .../service/command/CommandServiceImpl.java | 8 - .../service/command/CommandTemplate.java | 146 +++++++++++++++--- .../command/{cputemp => }/CpuTempCommand.java | 36 +---- .../service/command/FirstUseCommand.java | 20 ++- .../service/command/GetStatusSessions.java | 14 +- .../command/{hddtemp => }/HddTempCommand.java | 37 +---- .../{mdadm => }/MdadmStatusCommand.java | 38 +---- .../service/command/SwitchToMainMenu.java | 30 ++-- .../command/{uname => }/UnameCommand.java | 36 +---- .../cputemp/CpuTempAggregateCommand.java | 24 --- .../hddtemp/HddTempAggregateCommand.java | 24 --- .../mdadm/MdadmStatusAggregateCommand.java | 25 --- .../command/uname/UnameAggregateCommand.java | 24 --- .../migration/V009__create_table_commands.sql | 11 -- 17 files changed, 215 insertions(+), 358 deletions(-) delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandService.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandServiceImpl.java rename src/main/java/ru/ldeloff/servermonitorbot/service/command/{cputemp => }/CpuTempCommand.java (55%) rename src/main/java/ru/ldeloff/servermonitorbot/service/command/{hddtemp => }/HddTempCommand.java (52%) rename src/main/java/ru/ldeloff/servermonitorbot/service/command/{mdadm => }/MdadmStatusCommand.java (72%) rename src/main/java/ru/ldeloff/servermonitorbot/service/command/{uname => }/UnameCommand.java (52%) delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempAggregateCommand.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempAggregateCommand.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusAggregateCommand.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameAggregateCommand.java delete mode 100644 src/main/resources/db/migration/V009__create_table_commands.sql diff --git a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java index b71dff5..a1d8793 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java @@ -1,99 +1,40 @@ package ru.ldeloff.servermonitorbot.controller; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.telegram.telegrambots.bots.TelegramLongPollingBot; +import org.telegram.telegrambots.meta.api.objects.Message; import org.telegram.telegrambots.meta.api.objects.Update; -import ru.ldeloff.servermonitorbot.model.Command; 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.FirstUseCommand; -import ru.ldeloff.servermonitorbot.service.command.GetStatusSessions; import ru.ldeloff.servermonitorbot.service.command.SwitchToMainMenu; -import ru.ldeloff.servermonitorbot.service.command.cputemp.CpuTempAggregateCommand; -import ru.ldeloff.servermonitorbot.service.command.cputemp.CpuTempCommand; -import ru.ldeloff.servermonitorbot.service.command.hddtemp.HddTempAggregateCommand; -import ru.ldeloff.servermonitorbot.service.command.hddtemp.HddTempCommand; -import ru.ldeloff.servermonitorbot.service.command.mdadm.MdadmStatusAggregateCommand; -import ru.ldeloff.servermonitorbot.service.command.mdadm.MdadmStatusCommand; -import ru.ldeloff.servermonitorbot.service.command.uname.UnameAggregateCommand; -import ru.ldeloff.servermonitorbot.service.command.uname.UnameCommand; import java.util.Map; @Service -@Slf4j @RequiredArgsConstructor public class TelegramBotController extends TelegramLongPollingBot { - //private final Map commands; + private final Map commands; final TelegramBot telegramBot; final SshRepository sshRepository; - final FirstUseCommand firstUseCommand; - final GetStatusSessions getStatusSessions; - final UnameAggregateCommand unameAggregateCommand; final SwitchToMainMenu switchToMainMenu; - final UnameCommand unameCommand; - final CpuTempAggregateCommand cpuTempAggregateCommand; - final CpuTempCommand cpuTempCommand; - final HddTempAggregateCommand hddTempAggregateCommand; - final HddTempCommand hddTempCommand; - final MdadmStatusAggregateCommand mdadmStatusAggregateCommand; - final MdadmStatusCommand mdadmStatusCommand; - @Override public void onUpdateReceived(Update update) { - if (update.hasMessage()) { - if (update.getMessage().hasText()) { - String messageText = update.getMessage().getText(); - switch (messageText) { - case "/start" -> { - firstUseCommand.execute(update, this); - } - case "Статус" -> { - getStatusSessions.execute(update, this); - } - case "uname" -> { - unameAggregateCommand.execute(update, this); - } - case "CPU.temp" -> { - cpuTempAggregateCommand.execute(update, this); - } - case "HDD.temp" -> { - hddTempAggregateCommand.execute(update, this); - } - case "MDADM" -> { - mdadmStatusAggregateCommand.execute(update,this); - } - default -> { - switchToMainMenu.execute(update, this); - } - } + boolean result = false; + for (Map.Entry entry : commands.entrySet()) { + result = entry.getValue().execute(update, this); + if (result) { + break; } - } else if (update.hasCallbackQuery()) { - String [] tags = update.getCallbackQuery().getData().split(":"); - if (tags.length > 1) { - switch (tags[0]) { - case "uname" -> { - unameCommand.execute(update, this); - } - case "CPU.temp" -> { - cpuTempCommand.execute(update, this); - } - case "HDD.temp" -> { - hddTempCommand.execute(update, this); - } - case "MDADM" -> { - mdadmStatusCommand.execute(update,this); - } - default -> { - switchToMainMenu.execute(update, this); - } - } - } else { - switchToMainMenu.execute(update, this); + } + if (!result) { + Message message = update.getMessage(); + if (message!=null) { + message.setText("Not found"); } + update.setMessage(message); + switchToMainMenu.execute(update, this); } } @Override diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java index 9b3f7a8..f5298a5 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java @@ -14,6 +14,7 @@ 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 static ru.ldeloff.servermonitorbot.init.AddCommands.fillCommandTable; @@ -22,14 +23,15 @@ import static ru.ldeloff.servermonitorbot.init.AddCommands.fillCommandTable; @NoArgsConstructor public class StartBot implements ApplicationRunner { private TelegramBotController telegramBot; + private TelegramBotKeyboard telegramBotKeyboard; private UserService userService; @Autowired - public StartBot(TelegramBotController telegramBot, UserService userService) { + public StartBot(TelegramBotController telegramBot, TelegramBotKeyboard telegramBotKeyboard, UserService userService) { this.telegramBot = telegramBot; + this.telegramBotKeyboard = telegramBotKeyboard; this.userService = userService; } - @Override public void run(ApplicationArguments args) { try { @@ -42,11 +44,10 @@ public class StartBot implements ApplicationRunner { log.error(e.getMessage()); } } - private void SendInitMessage(User user) { SendMessage answer = new SendMessage(); answer.setChatId(user.getTelegramId()); answer.setText("Бот перезапущен"); - CommandTemplate.sendMessage(answer, telegramBot); + CommandTemplate.sendMessage(telegramBotKeyboard.uiForm(answer), telegramBot); } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandService.java deleted file mode 100644 index c61fa7f..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandService.java +++ /dev/null @@ -1,4 +0,0 @@ -package ru.ldeloff.servermonitorbot.service.command; - -public interface CommandService { -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandServiceImpl.java deleted file mode 100644 index 60c9799..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandServiceImpl.java +++ /dev/null @@ -1,8 +0,0 @@ -package ru.ldeloff.servermonitorbot.service.command; - -import org.jvnet.hk2.annotations.Service; - -@Service -public class CommandServiceImpl implements CommandService { - -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandTemplate.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandTemplate.java index c659778..901602d 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandTemplate.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/CommandTemplate.java @@ -1,54 +1,158 @@ package ru.ldeloff.servermonitorbot.service.command; -import lombok.Data; +import lombok.Getter; import lombok.RequiredArgsConstructor; +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.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 java.util.Arrays; +import java.util.List; +import java.util.Objects; -@Data @Slf4j @RequiredArgsConstructor public abstract class CommandTemplate { - final UserService userService; - final RoleService roleService; - long expectedRole = 2L; - public abstract SendMessage actionForAuth(User user, SendMessage message); + private final UserService userService; + private final RoleService roleService; + private final ServerListButtons serverListButtons; + private final SshService sshService; + @Getter + @Setter + private long expectedRole = 1L; + @Getter + @Setter + private String name; + + public boolean execute(Update update, TelegramBotController bot) { + if (!isExecute(update)) { + return false; + } - public SendMessage actionForNotAuth(User user, SendMessage message) { - message.setText("У пользователя " + user.getLogin() + " (" + user.getTelegramId() - + ") недостаточно прав для выполнения этой команды"); - return message; - } - public void execute(Update update, TelegramBotController bot) { User user = getUser(update); String message = getMessage(update); SendMessage answer = new SendMessage(); answer.setChatId(user.getTelegramId()); answer.setText(message); - if (user.getRole().getId() <= expectedRole) { - logSuccess(user, message); - sendMessage(actionForAuth(user, answer), bot); - } else { + + if (!isAuth(update)) { logNotAuth(user, message); sendMessage(actionForNotAuth(user, answer), bot); + return true; + } + + String type = checkTypeCommand(update); + switch (type) { + case "aggregate": + logSuccess(user, message); + sendMessage(executeAggregate(user, answer), bot); + return true; + case "command": + logSuccess(user, message); + sendMessage(executeCommand(user, answer), bot); + return true; + default: + return false; } } - protected void logSuccess(User user, String message) { + // Методы для проверки команды + private boolean isExecute(Update update) { + if (update.hasMessage()) { + if (update.getMessage().hasText()) { + String messageText = update.getMessage().getText(); + if (Objects.equals(messageText, name)) { + log.debug("Команда " + messageText + " будет выполнена"); + return true; + } + } + } else if (update.hasCallbackQuery()) { + String [] tags = update.getCallbackQuery().getData().split(":"); + if (tags.length > 1) { + if (Objects.equals(tags[0], name)) { + log.debug("Команда " + tags[0] + " будет выполнена"); + return true; + } + } else { + log.debug("Команда не будет выполнена"); + return false; + } + } + log.debug("Команда не будет выполнена"); + return false; + } + private String checkTypeCommand(Update update) { + if (update.hasMessage()) { + if (update.getMessage().hasText()) { + return "aggregate"; + } + } else if (update.hasCallbackQuery()) { + String [] tags = update.getCallbackQuery().getData().split(":"); + if (tags.length > 1) { + return "command"; + } else { + return "error"; + } + } + 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"); } - protected void logNotAuth(User user, String message) { + 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) + .toArray(String[]::new); + + if (tags[1].equals("all")) { + message.setText(executeCommandAllHost()); + } else { + message.setText(Objects.requireNonNull(executeCommandSpecificHost(tags[1]))); + } + return message; + } + private String executeCommandAllHost() { + List servers = SshServerUtils.filterGoodServers(sshService.getSshServers()); + StringBuilder response = new StringBuilder(); + servers.forEach(server -> response.append(executeCommandSpecificHost(server.getName())).append("\n")); + return response.toString(); + } + public abstract String executeCommandSpecificHost(String serverName); + + // Методы при неверных условиях + void logNotAuth(User user, String message) { log.warn("Получена команда '" + message + "' от " + user.getLogin() + " (" + user.getTelegramId() + "). Нет прав"); } - private User getUser(Update update) { + private SendMessage actionForNotAuth(User user, SendMessage message) { + message.setText("У пользователя " + user.getLogin() + " (" + user.getTelegramId() + + ") недостаточно прав для выполнения этой команды"); + return message; + } + + // Общее + // TODO: вынести в UpdateUtils + User getUser(Update update) { long id = -1L; String login = null; if (update.hasMessage()) { @@ -67,8 +171,7 @@ public abstract class CommandTemplate { user.setLogin(login); return user; } - - private String getMessage(Update update) { + String getMessage(Update update) { if (update.hasMessage()) { return update.getMessage().getText(); } else if (update.hasCallbackQuery()) { @@ -77,6 +180,7 @@ public abstract class CommandTemplate { return ""; } + // TODO: вынести public static void sendMessage(SendMessage message, TelegramBotController bot) { try { bot.execute(message); diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/CpuTempCommand.java similarity index 55% rename from src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempCommand.java rename to src/main/java/ru/ldeloff/servermonitorbot/service/command/CpuTempCommand.java index 7d3047c..251cd9f 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/CpuTempCommand.java @@ -1,19 +1,14 @@ -package ru.ldeloff.servermonitorbot.service.command.cputemp; +package ru.ldeloff.servermonitorbot.service.command; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import ru.ldeloff.servermonitorbot.model.SshCommand; import ru.ldeloff.servermonitorbot.model.SshServer; -import ru.ldeloff.servermonitorbot.model.User; -import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; import ru.ldeloff.servermonitorbot.service.role.RoleService; import ru.ldeloff.servermonitorbot.service.ssh.SshService; import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.SshServerUtils; +import ru.ldeloff.servermonitorbot.utils.ui.ServerListButtons; -import java.util.Arrays; -import java.util.List; import java.util.Objects; import java.util.Optional; @@ -21,33 +16,14 @@ import java.util.Optional; @Slf4j public class CpuTempCommand extends CommandTemplate { final SshService sshService; - public CpuTempCommand(UserService userService, RoleService roleService, SshService sshService) { - super(userService, roleService); + public CpuTempCommand(UserService userService, RoleService roleService, SshService sshService, ServerListButtons serverListButtons) { + super(userService, roleService, serverListButtons, sshService); this.sshService = sshService; + setName("CPU.temp"); } @Override - public SendMessage actionForAuth(User user, SendMessage message) { - String [] tags = Arrays.stream(message.getText().split(":")) - .map(String::trim) - .toArray(String[]::new); - - if (tags[1].equals("all")) { - message.setText(hddTempAllHost()); - } else { - message.setText(Objects.requireNonNull(hddTempSpecificHost(tags[1]))); - } - return message; - } - - private String hddTempAllHost() { - List servers = SshServerUtils.filterGoodServers(sshService.getSshServers()); - StringBuilder response = new StringBuilder(); - servers.forEach(server -> response.append(hddTempSpecificHost(server.getName())).append("\n")); - return response.toString(); - } - - private String hddTempSpecificHost(String serverName) { + public String executeCommandSpecificHost(String serverName) { Optional server = sshService.getSshServers() .stream() .filter(x -> x.getName().equals(serverName)) diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/FirstUseCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/FirstUseCommand.java index dfab89d..a617133 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/FirstUseCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/FirstUseCommand.java @@ -2,22 +2,36 @@ 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, TelegramBotKeyboard telegramBotKeyboard) { - super(userService, roleService); + 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 actionForAuth(User user, SendMessage message) { + 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 index af5d29e..9e31dec 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/GetStatusSessions.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/GetStatusSessions.java @@ -6,18 +6,22 @@ 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) { - super(userService, roleService); + public GetStatusSessions(UserService userService, RoleService roleService, SshService sshService, ServerListButtons serverListButtons) { + super(userService, roleService, serverListButtons, sshService); this.sshService = sshService; + setName("Статус"); } - @Override - public SendMessage actionForAuth(User user, SendMessage message) { + 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/hddtemp/HddTempCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/HddTempCommand.java similarity index 52% rename from src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempCommand.java rename to src/main/java/ru/ldeloff/servermonitorbot/service/command/HddTempCommand.java index d42e1cd..c628b4b 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/HddTempCommand.java @@ -1,19 +1,14 @@ -package ru.ldeloff.servermonitorbot.service.command.hddtemp; +package ru.ldeloff.servermonitorbot.service.command; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import ru.ldeloff.servermonitorbot.model.SshCommand; import ru.ldeloff.servermonitorbot.model.SshServer; -import ru.ldeloff.servermonitorbot.model.User; -import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; import ru.ldeloff.servermonitorbot.service.role.RoleService; import ru.ldeloff.servermonitorbot.service.ssh.SshService; import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.SshServerUtils; +import ru.ldeloff.servermonitorbot.utils.ui.ServerListButtons; -import java.util.Arrays; -import java.util.List; import java.util.Objects; import java.util.Optional; @@ -21,33 +16,13 @@ import java.util.Optional; @Slf4j public class HddTempCommand extends CommandTemplate { final SshService sshService; - public HddTempCommand(UserService userService, RoleService roleService, SshService sshService) { - super(userService, roleService); + public HddTempCommand(UserService userService, RoleService roleService, SshService sshService, ServerListButtons serverListButtons) { + super(userService, roleService, serverListButtons, sshService); this.sshService = sshService; + setName("HDD.temp"); } - @Override - public SendMessage actionForAuth(User user, SendMessage message) { - String [] tags = Arrays.stream(message.getText().split(":")) - .map(String::trim) - .toArray(String[]::new); - - if (tags[1].equals("all")) { - message.setText(hddTempAllHost()); - } else { - message.setText(Objects.requireNonNull(hddTempSpecificHost(tags[1]))); - } - return message; - } - - private String hddTempAllHost() { - List servers = SshServerUtils.filterGoodServers(sshService.getSshServers()); - StringBuilder response = new StringBuilder(); - servers.forEach(server -> response.append(hddTempSpecificHost(server.getName())).append("\n")); - return response.toString(); - } - - private String hddTempSpecificHost(String serverName) { + public String executeCommandSpecificHost(String serverName) { Optional server = sshService.getSshServers() .stream() .filter(x -> x.getName().equals(serverName)) diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/MdadmStatusCommand.java similarity index 72% rename from src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusCommand.java rename to src/main/java/ru/ldeloff/servermonitorbot/service/command/MdadmStatusCommand.java index 7da3b7f..6c68d88 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/MdadmStatusCommand.java @@ -1,52 +1,27 @@ -package ru.ldeloff.servermonitorbot.service.command.mdadm; +package ru.ldeloff.servermonitorbot.service.command; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import ru.ldeloff.servermonitorbot.model.SshCommand; import ru.ldeloff.servermonitorbot.model.SshServer; -import ru.ldeloff.servermonitorbot.model.User; -import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; import ru.ldeloff.servermonitorbot.service.role.RoleService; import ru.ldeloff.servermonitorbot.service.ssh.SshService; import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.SshServerUtils; +import ru.ldeloff.servermonitorbot.utils.ui.ServerListButtons; import java.util.*; @Service @Slf4j public class MdadmStatusCommand extends CommandTemplate { - final SshService sshService; - - public MdadmStatusCommand(UserService userService, RoleService roleService, SshService sshService) { - super(userService, roleService); + public MdadmStatusCommand(UserService userService, RoleService roleService, SshService sshService, ServerListButtons serverListButtons) { + super(userService, roleService, serverListButtons, sshService); this.sshService = sshService; + setName("MDADM"); } - @Override - public SendMessage actionForAuth(User user, SendMessage message) { - String [] tags = Arrays.stream(message.getText().split(":")) - .map(String::trim) - .toArray(String[]::new); - - if (tags[1].equals("all")) { - message.setText(mdadmStatusAllHost()); - } else { - message.setText(Objects.requireNonNull(mdadmStatusSpecificHost(tags[1]))); - } - return message; - } - - private String mdadmStatusAllHost() { - List servers = SshServerUtils.filterGoodServers(sshService.getSshServers()); - StringBuilder response = new StringBuilder(); - servers.forEach(server -> response.append(mdadmStatusSpecificHost(server.getName())).append("\n")); - return response.toString(); - } - - private String mdadmStatusSpecificHost(String serverName) { + public String executeCommandSpecificHost(String serverName) { Optional server = sshService.getSshServers() .stream() .filter(x -> x.getName().equals(serverName)) @@ -78,7 +53,6 @@ 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/SwitchToMainMenu.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/SwitchToMainMenu.java index 43dec0e..423f48e 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/SwitchToMainMenu.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/SwitchToMainMenu.java @@ -3,9 +3,13 @@ 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 @@ -13,23 +17,31 @@ import ru.ldeloff.servermonitorbot.utils.ui.TelegramBotKeyboard; public class SwitchToMainMenu extends CommandTemplate { final TelegramBotKeyboard telegramBotKeyboard; - public SwitchToMainMenu(UserService userService, RoleService roleService, TelegramBotKeyboard telegramBotKeyboard) { - super(userService, roleService); + 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 SendMessage actionForAuth(User user, SendMessage message) { - message.setText("Неверная команда. Попробуем сначала."); - return telegramBotKeyboard.uiForm(message); + public String executeCommandSpecificHost(String serverName) { + return null; } + @Override - public void logSuccess(User user, String message) { + void logSuccess(User user, String message) { log.warn("Получена несуществующая команда '" + message + "' от " + user.getLogin() + " (" + user.getTelegramId() + "). OK"); } @Override - public void logNotAuth(User user, String message) { - log.warn("Получена несуществующая команда '" + message + "' от " + user.getLogin() - + " (" + user.getTelegramId() + "). Нет прав"); + 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/uname/UnameCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/UnameCommand.java similarity index 52% rename from src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameCommand.java rename to src/main/java/ru/ldeloff/servermonitorbot/service/command/UnameCommand.java index a81f937..48b6ee5 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/UnameCommand.java @@ -1,19 +1,14 @@ -package ru.ldeloff.servermonitorbot.service.command.uname; +package ru.ldeloff.servermonitorbot.service.command; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import ru.ldeloff.servermonitorbot.model.SshCommand; import ru.ldeloff.servermonitorbot.model.SshServer; -import ru.ldeloff.servermonitorbot.model.User; -import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; import ru.ldeloff.servermonitorbot.service.role.RoleService; import ru.ldeloff.servermonitorbot.service.ssh.SshService; import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.SshServerUtils; +import ru.ldeloff.servermonitorbot.utils.ui.ServerListButtons; -import java.util.Arrays; -import java.util.List; import java.util.Objects; import java.util.Optional; @@ -21,32 +16,13 @@ import java.util.Optional; @Slf4j public class UnameCommand extends CommandTemplate { final SshService sshService; - public UnameCommand(UserService userService, RoleService roleService, SshService sshService) { - super(userService, roleService); + public UnameCommand(UserService userService, RoleService roleService, SshService sshService, ServerListButtons serverListButtons) { + super(userService, roleService, serverListButtons, sshService); this.sshService = sshService; + setName("uname"); } @Override - public SendMessage actionForAuth(User user, SendMessage message) { - String [] tags = Arrays.stream(message.getText().split(":")) - .map(String::trim) - .toArray(String[]::new); - - if (tags[1].equals("all")) { - message.setText(unameAllHost()); - } else { - message.setText(Objects.requireNonNull(unameSpecificHost(tags[1]))); - } - return message; - } - - private String unameAllHost() { - List servers = SshServerUtils.filterGoodServers(sshService.getSshServers()); - StringBuilder response = new StringBuilder(); - servers.forEach(server -> response.append(unameSpecificHost(server.getName())).append("\n")); - return response.toString(); - } - - private String unameSpecificHost(String serverName) { + public String executeCommandSpecificHost(String serverName) { Optional server = sshService.getSshServers() .stream() .filter(x -> x.getName().equals(serverName)) diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempAggregateCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempAggregateCommand.java deleted file mode 100644 index 68c3857..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempAggregateCommand.java +++ /dev/null @@ -1,24 +0,0 @@ -package ru.ldeloff.servermonitorbot.service.command.cputemp; - -import org.springframework.stereotype.Service; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.model.User; -import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; -import ru.ldeloff.servermonitorbot.service.role.RoleService; -import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.ui.ServerListButtons; - -@Service -public class CpuTempAggregateCommand extends CommandTemplate { - final ServerListButtons serverListButtons; - - public CpuTempAggregateCommand(UserService userService, RoleService roleService, ServerListButtons serverListButtons) { - super(userService, roleService); - this.serverListButtons = serverListButtons; - } - - @Override - public SendMessage actionForAuth(User user, SendMessage message) { - return serverListButtons.uiForm(message); - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempAggregateCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempAggregateCommand.java deleted file mode 100644 index 3c9f7ed..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempAggregateCommand.java +++ /dev/null @@ -1,24 +0,0 @@ -package ru.ldeloff.servermonitorbot.service.command.hddtemp; - -import org.springframework.stereotype.Service; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.model.User; -import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; -import ru.ldeloff.servermonitorbot.service.role.RoleService; -import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.ui.ServerListButtons; - -@Service -public class HddTempAggregateCommand extends CommandTemplate { - final ServerListButtons serverListButtons; - - public HddTempAggregateCommand(UserService userService, RoleService roleService, ServerListButtons serverListButtons) { - super(userService, roleService); - this.serverListButtons = serverListButtons; - } - - @Override - public SendMessage actionForAuth(User user, SendMessage message) { - return serverListButtons.uiForm(message); - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusAggregateCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusAggregateCommand.java deleted file mode 100644 index d3abf52..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusAggregateCommand.java +++ /dev/null @@ -1,25 +0,0 @@ -package ru.ldeloff.servermonitorbot.service.command.mdadm; - -import org.springframework.stereotype.Service; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.model.User; -import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; -import ru.ldeloff.servermonitorbot.service.role.RoleService; -import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.ui.ServerListButtons; - -@Service -public class MdadmStatusAggregateCommand extends CommandTemplate { - - final ServerListButtons serverListButtons; - - public MdadmStatusAggregateCommand(UserService userService, RoleService roleService, ServerListButtons serverListButtons) { - super(userService, roleService); - this.serverListButtons = serverListButtons; - } - - @Override - public SendMessage actionForAuth(User user, SendMessage message) { - return serverListButtons.uiForm(message); - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameAggregateCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameAggregateCommand.java deleted file mode 100644 index 74bdbff..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameAggregateCommand.java +++ /dev/null @@ -1,24 +0,0 @@ -package ru.ldeloff.servermonitorbot.service.command.uname; - -import org.springframework.stereotype.Service; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.model.User; -import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; -import ru.ldeloff.servermonitorbot.service.role.RoleService; -import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.ui.ServerListButtons; - -@Service -public class UnameAggregateCommand extends CommandTemplate { - final ServerListButtons serverListButtons; - - public UnameAggregateCommand(UserService userService, RoleService roleService, ServerListButtons serverListButtons) { - super(userService, roleService); - this.serverListButtons = serverListButtons; - } - - @Override - public SendMessage actionForAuth(User user, SendMessage message) { - return serverListButtons.uiForm(message); - } -} diff --git a/src/main/resources/db/migration/V009__create_table_commands.sql b/src/main/resources/db/migration/V009__create_table_commands.sql deleted file mode 100644 index db5ec4a..0000000 --- a/src/main/resources/db/migration/V009__create_table_commands.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE commands -( - id SERIAL PRIMARY KEY, - name VARCHAR(128), - level integer -); - -COMMENT ON TABLE commands IS 'Команды'; -COMMENT ON COLUMN commands.id IS 'ID'; -COMMENT ON COLUMN commands.name IS 'Имя команды'; -COMMENT ON COLUMN commands.level IS 'Уровень доступа'; \ No newline at end of file From a03a6abdfc6f15150c90aab021080b6ef1451f3d Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sun, 21 Jan 2024 20:16:27 +0300 Subject: [PATCH 7/7] =?UTF-8?q?=D0=9E=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6?= =?UTF-8?q?=D0=B0=D1=8E=D1=82=D1=81=D1=8F=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA?= =?UTF-8?q?=D0=BE=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=BD=D1=8B=D0=B5?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=BE=D0=BB=D0=B8=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=B0=D0=BD=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servermonitorbot/model/Command.java | 19 ------- .../servermonitorbot/model/CommandList.java | 28 ++++++++++ .../repository/CommandRepository.java | 13 ----- .../servermonitorbot/utils/CommandUtil.java | 15 +++++ .../utils/ui/TelegramBotKeyboard.java | 56 +++++++++++-------- 5 files changed, 76 insertions(+), 55 deletions(-) delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/model/Command.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/model/CommandList.java delete mode 100644 src/main/java/ru/ldeloff/servermonitorbot/repository/CommandRepository.java create mode 100644 src/main/java/ru/ldeloff/servermonitorbot/utils/CommandUtil.java diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/Command.java b/src/main/java/ru/ldeloff/servermonitorbot/model/Command.java deleted file mode 100644 index 40961ed..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/model/Command.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.ldeloff.servermonitorbot.model; - -import jakarta.persistence.*; -import lombok.Data; -@Entity -@Data -@Table(name = "commands") -public class Command { - @Id - @Column(name = "id") - @GeneratedValue(strategy = GenerationType.IDENTITY) - private long id; - - @Column(name = "name") - private String name; - - @Column(name = "level") - private int level; -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/CommandList.java b/src/main/java/ru/ldeloff/servermonitorbot/model/CommandList.java new file mode 100644 index 0000000..0a0ac20 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/CommandList.java @@ -0,0 +1,28 @@ +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/repository/CommandRepository.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/CommandRepository.java deleted file mode 100644 index f33822f..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/repository/CommandRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package ru.ldeloff.servermonitorbot.repository; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; -import ru.ldeloff.servermonitorbot.model.Command; - -import java.util.Optional; - -@Repository -public interface CommandRepository extends JpaRepository { - Optional findCommandByName(String name); - Optional findCommandById(Long id); -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/CommandUtil.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/CommandUtil.java new file mode 100644 index 0000000..c2cf560 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/utils/CommandUtil.java @@ -0,0 +1,15 @@ +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/ui/TelegramBotKeyboard.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java index d431d73..0aec83b 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java @@ -6,48 +6,58 @@ 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 java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; @Component @RequiredArgsConstructor public class TelegramBotKeyboard implements UiFormer { - private final String STATUS = "Статус"; - private final String UNAME = "uname"; - private final String CPU_TEMP = "CPU.temp"; - private final String HDD_TEMP = "HDD.temp"; - private final String MDADM = "MDADM"; private final RoleChecker roleChecker; - - @Override public SendMessage uiForm(SendMessage message) { - - Role role = roleChecker.getRole(message); - ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); replyKeyboardMarkup.setResizeKeyboard(true); replyKeyboardMarkup.setOneTimeKeyboard(false); - ArrayList keyboardRows = new ArrayList<>(); - - KeyboardRow keyboardRow1 = new KeyboardRow(); - keyboardRows.add(keyboardRow1); - - keyboardRow1.add(new KeyboardButton(STATUS)); - keyboardRow1.add(new KeyboardButton(UNAME)); - keyboardRow1.add(new KeyboardButton(CPU_TEMP)); - keyboardRow1.add(new KeyboardButton(HDD_TEMP)); - - KeyboardRow keyboardRow2 = new KeyboardRow(); - keyboardRows.add(keyboardRow2); - keyboardRow2.add(new KeyboardButton(MDADM)); + ArrayList keyboardRows = formKeyboard( + roleChecker.getRole(message).getId()); replyKeyboardMarkup.setKeyboard(keyboardRows); message.setReplyMarkup(replyKeyboardMarkup); return message; } + + private ArrayList formKeyboard(long role) { + HashMap commands = CommandUtil.getCommands(); + if (role < 3) { + commands.remove("/start"); + commands.remove("Not found"); + } + int buttonOnLine = 3; + + ArrayList keyboardRows = new ArrayList<>(); + KeyboardRow keyboardRow = new KeyboardRow(); + + for (Map.Entry entry : commands.entrySet()) { + if (role <= entry.getValue()) { + keyboardRow.add(new KeyboardButton(entry.getKey())); + } + if (keyboardRow.size()>=buttonOnLine) { + keyboardRows.add(keyboardRow); + keyboardRow = new KeyboardRow(); + } + } + if (keyboardRow.size() > 0) { + keyboardRows.add(keyboardRow); + } + return keyboardRows; + } }