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: diff --git a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java index f324553..a1d8793 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java @@ -1,95 +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.TelegramBot; import ru.ldeloff.servermonitorbot.repository.SshRepository; -import ru.ldeloff.servermonitorbot.service.command.FirstUseCommand; -import ru.ldeloff.servermonitorbot.service.command.GetStatusSessions; +import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; 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; 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/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 5530238..f5298a5 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java @@ -7,30 +7,47 @@ 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; +import ru.ldeloff.servermonitorbot.utils.ui.TelegramBotKeyboard; + +import static ru.ldeloff.servermonitorbot.init.AddCommands.fillCommandTable; @Slf4j @Component @NoArgsConstructor public class StartBot implements ApplicationRunner { private TelegramBotController telegramBot; + private TelegramBotKeyboard telegramBotKeyboard; + private UserService userService; @Autowired - public StartBot(TelegramBotController telegramBot) { + public StartBot(TelegramBotController telegramBot, TelegramBotKeyboard telegramBotKeyboard, UserService userService) { this.telegramBot = telegramBot; + this.telegramBotKeyboard = telegramBotKeyboard; + this.userService = userService; } - @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()); } } + private void SendInitMessage(User user) { + SendMessage answer = new SendMessage(); + answer.setChatId(user.getTelegramId()); + answer.setText("Бот перезапущен"); + CommandTemplate.sendMessage(telegramBotKeyboard.uiForm(answer), telegramBot); + } } 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/model/Command.java b/src/main/java/ru/ldeloff/servermonitorbot/model/SshCommand.java similarity index 82% rename from src/main/java/ru/ldeloff/servermonitorbot/model/Command.java rename to src/main/java/ru/ldeloff/servermonitorbot/model/SshCommand.java index 936f89b..2f9ae10 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/model/Command.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/SshCommand.java @@ -7,7 +7,7 @@ import lombok.Setter; @Getter @Setter -public class Command { +public class SshCommand { @NotNull private String command; @NotNull @@ -17,7 +17,7 @@ public class Command { private SshServer sshServer; private String response; - public Command(String command, int timeout, SshServer sshServer) { + 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/SshRepositoryImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java index 8210141..ec028ab 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/repository/SshRepositoryImpl.java @@ -5,14 +5,13 @@ 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.ArrayList; -import java.util.List; -import java.util.Objects; +import java.util.*; @Slf4j @Repository @@ -20,12 +19,15 @@ 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 List sessions = new ArrayList<>(); + private Set sessions = new HashSet<>(); @Override public void connectToAllServer() { @@ -34,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()); } @@ -48,7 +49,9 @@ public class SshRepositoryImpl implements SshRepository { sshServer.getPort()); session.setPassword(sshServer.getPassword()); session.setConfig("StrictHostKeyChecking", "no"); + session.setTimeout(TIMEOUT); session.connect(); + sessions.add(session); return session; } @@ -62,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(": ") @@ -79,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 "потеряно соединение"; + } + } + } } 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..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,53 +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()) { @@ -66,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()) { @@ -76,7 +180,8 @@ public abstract class CommandTemplate { return ""; } - private void sendMessage(SendMessage message, TelegramBotController bot) { + // TODO: вынести + 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/command/CpuTempCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/CpuTempCommand.java new file mode 100644 index 0000000..251cd9f --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/CpuTempCommand.java @@ -0,0 +1,43 @@ +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 CpuTempCommand extends CommandTemplate { + final SshService sshService; + public CpuTempCommand(UserService userService, RoleService roleService, SshService sshService, ServerListButtons serverListButtons) { + super(userService, roleService, serverListButtons, sshService); + this.sshService = sshService; + setName("CPU.temp"); + } + + @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("cat /sys/class/thermal/thermal_zone0/temp", 100, server.get())); + return server.get().getName() + ": \n" + + (Objects.isNull(result.getResponse()) ? "ошибка при выполнении команды" : + String.format("%.1f", + Double.parseDouble(result.getResponse().replaceAll("\n", ""))/1000)) + + "°C"; + } else { + log.error("Ошибка при выполнении команды 'CPUtemp'. Искомый сервер (" + serverName + ") не найден"); + return null; + } + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/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/HddTempCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/HddTempCommand.java new file mode 100644 index 0000000..c628b4b --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/HddTempCommand.java @@ -0,0 +1,39 @@ +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 HddTempCommand extends CommandTemplate { + final SshService sshService; + public HddTempCommand(UserService userService, RoleService roleService, SshService sshService, ServerListButtons serverListButtons) { + super(userService, roleService, serverListButtons, sshService); + this.sshService = sshService; + setName("HDD.temp"); + } + @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("hddtemp /dev/sd*", 500, server.get())); + return server.get().getName() + ": \n" + + (Objects.isNull(result.getResponse()) ? "ошибка при выполнении команды" : result.getResponse()); + } else { + log.error("Ошибка при выполнении команды 'hddtemp'. Искомый сервер (" + serverName + ") не найден"); + return null; + } + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/MdadmStatusCommand.java similarity index 59% 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 0aca9f9..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,69 +1,41 @@ -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.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; 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.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; @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)) .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 +44,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(" ")) @@ -81,8 +53,7 @@ public class MdadmStatusCommand extends CommandTemplate { .forEach(names::add); 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/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/UnameCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/UnameCommand.java new file mode 100644 index 0000000..48b6ee5 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/UnameCommand.java @@ -0,0 +1,39 @@ +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/command/cputemp/CpuTempAggregateCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempAggregateCommand.java deleted file mode 100644 index 90d2eb2..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.uname.ServerListButtons; - -@Service -public class CpuTempAggregateCommand extends CommandTemplate { - final ServerListButtons serverListButtons; - - public CpuTempAggregateCommand(UserService userService, RoleService roleService, ServerListButtons serverListButtons) { - super(userService, roleService); - this.serverListButtons = serverListButtons; - } - - @Override - public SendMessage actionForAuth(User user, SendMessage message) { - return serverListButtons.uiForm(message); - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempCommand.java deleted file mode 100644 index fb046c1..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/cputemp/CpuTempCommand.java +++ /dev/null @@ -1,67 +0,0 @@ -package ru.ldeloff.servermonitorbot.service.command.cputemp; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.model.Command; -import ru.ldeloff.servermonitorbot.model.SshServer; -import ru.ldeloff.servermonitorbot.model.User; -import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; -import ru.ldeloff.servermonitorbot.service.role.RoleService; -import ru.ldeloff.servermonitorbot.service.ssh.SshService; -import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.SshServerUtils; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -@Service -@Slf4j -public class CpuTempCommand extends CommandTemplate { - final SshService sshService; - public CpuTempCommand(UserService userService, RoleService roleService, SshService sshService) { - super(userService, roleService); - this.sshService = sshService; - } - - @Override - public SendMessage actionForAuth(User user, SendMessage message) { - String [] tags = Arrays.stream(message.getText().split(":")) - .map(String::trim) - .toArray(String[]::new); - - if (tags[1].equals("all")) { - message.setText(hddTempAllHost()); - } else { - message.setText(Objects.requireNonNull(hddTempSpecificHost(tags[1]))); - } - return message; - } - - private String hddTempAllHost() { - List servers = SshServerUtils.filterGoodServers(sshService.getSshServers()); - StringBuilder response = new StringBuilder(); - servers.forEach(server -> response.append(hddTempSpecificHost(server.getName())).append("\n")); - return response.toString(); - } - - private String hddTempSpecificHost(String serverName) { - Optional server = sshService.getSshServers() - .stream() - .filter(x -> x.getName().equals(serverName)) - .findFirst(); - if (server.isPresent()) { - Command result = sshService.execute(new Command("cat /sys/class/thermal/thermal_zone0/temp", 100, server.get())); - return server.get().getName() + ": \n" + - (Objects.isNull(result.getResponse()) ? "ошибка при выполнении команды" : - String.format("%.1f", - Double.parseDouble(result.getResponse().replaceAll("\n", ""))/1000)) - + "°C"; - } else { - log.error("Ошибка при выполнении команды 'CPUtemp'. Искомый сервер (" + serverName + ") не найден"); - return null; - } - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempAggregateCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempAggregateCommand.java deleted file mode 100644 index 1f0ea18..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.uname.ServerListButtons; - -@Service -public class HddTempAggregateCommand extends CommandTemplate { - final ServerListButtons serverListButtons; - - public HddTempAggregateCommand(UserService userService, RoleService roleService, ServerListButtons serverListButtons) { - super(userService, roleService); - this.serverListButtons = serverListButtons; - } - - @Override - public SendMessage actionForAuth(User user, SendMessage message) { - return serverListButtons.uiForm(message); - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempCommand.java deleted file mode 100644 index 48793cc..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/hddtemp/HddTempCommand.java +++ /dev/null @@ -1,64 +0,0 @@ -package ru.ldeloff.servermonitorbot.service.command.hddtemp; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import ru.ldeloff.servermonitorbot.model.Command; -import ru.ldeloff.servermonitorbot.model.SshServer; -import ru.ldeloff.servermonitorbot.model.User; -import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; -import ru.ldeloff.servermonitorbot.service.role.RoleService; -import ru.ldeloff.servermonitorbot.service.ssh.SshService; -import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.SshServerUtils; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -@Service -@Slf4j -public class HddTempCommand extends CommandTemplate { - final SshService sshService; - public HddTempCommand(UserService userService, RoleService roleService, SshService sshService) { - super(userService, roleService); - this.sshService = sshService; - } - - @Override - public SendMessage actionForAuth(User user, SendMessage message) { - String [] tags = Arrays.stream(message.getText().split(":")) - .map(String::trim) - .toArray(String[]::new); - - if (tags[1].equals("all")) { - message.setText(hddTempAllHost()); - } else { - message.setText(Objects.requireNonNull(hddTempSpecificHost(tags[1]))); - } - return message; - } - - private String hddTempAllHost() { - List servers = SshServerUtils.filterGoodServers(sshService.getSshServers()); - StringBuilder response = new StringBuilder(); - servers.forEach(server -> response.append(hddTempSpecificHost(server.getName())).append("\n")); - return response.toString(); - } - - private String hddTempSpecificHost(String serverName) { - Optional server = sshService.getSshServers() - .stream() - .filter(x -> x.getName().equals(serverName)) - .findFirst(); - if (server.isPresent()) { - Command result = sshService.execute(new Command("hddtemp /dev/sd*", 500, server.get())); - return server.get().getName() + ": \n" + - (Objects.isNull(result.getResponse()) ? "ошибка при выполнении команды" : result.getResponse()); - } else { - log.error("Ошибка при выполнении команды 'hddtemp'. Искомый сервер (" + serverName + ") не найден"); - return null; - } - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusAggregateCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusAggregateCommand.java deleted file mode 100644 index feb6c7a..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.uname.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 2ac594e..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.uname.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/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameCommand.java deleted file mode 100644 index 94e3b73..0000000 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/uname/UnameCommand.java +++ /dev/null @@ -1,63 +0,0 @@ -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.SshServer; -import ru.ldeloff.servermonitorbot.model.User; -import ru.ldeloff.servermonitorbot.service.command.CommandTemplate; -import ru.ldeloff.servermonitorbot.service.role.RoleService; -import ru.ldeloff.servermonitorbot.service.ssh.SshService; -import ru.ldeloff.servermonitorbot.service.user.UserService; -import ru.ldeloff.servermonitorbot.utils.SshServerUtils; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -@Service -@Slf4j -public class UnameCommand extends CommandTemplate { - final SshService sshService; - public UnameCommand(UserService userService, RoleService roleService, SshService sshService) { - super(userService, roleService); - this.sshService = sshService; - } - @Override - public SendMessage actionForAuth(User user, SendMessage message) { - String [] tags = Arrays.stream(message.getText().split(":")) - .map(String::trim) - .toArray(String[]::new); - - if (tags[1].equals("all")) { - message.setText(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) { - Optional server = sshService.getSshServers() - .stream() - .filter(x -> x.getName().equals(serverName)) - .findFirst(); - if (server.isPresent()) { - Command result = sshService.execute(new Command("uname -a", 100, server.get())); - return server.get().getName() + ": " + - (Objects.isNull(result.getResponse()) ? "ошибка при выполнении команды" : result.getResponse()); - } else { - log.error("Ошибка при выполнении команды 'uname'. Искомый сервер (" + serverName + ") не найден"); - return null; - } - } -} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/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/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(); } } 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/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..0aec83b 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java @@ -1,45 +1,63 @@ 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.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) { 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; + } } 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"