init Repo
This commit is contained in:
commit
9641f9dd96
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
.idea/
|
||||
target/
|
||||
*.sqlite3
|
||||
*.iml
|
89
pom.xml
Normal file
89
pom.xml
Normal file
@ -0,0 +1,89 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>de.gurkengewuerz.monitoring</groupId>
|
||||
<artifactId>monitoring</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.jcraft</groupId>
|
||||
<artifactId>jsch</artifactId>
|
||||
<version>0.1.54</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.xerial</groupId>
|
||||
<artifactId>sqlite-jdbc</artifactId>
|
||||
<version>3.15.1
|
||||
</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.json</groupId>
|
||||
<artifactId>json</artifactId>
|
||||
<version>20170516</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.tinylog</groupId>
|
||||
<artifactId>slf4j-binding</artifactId>
|
||||
<version>1.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-cli</groupId>
|
||||
<artifactId>commons-cli</artifactId>
|
||||
<version>1.3.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-validator</groupId>
|
||||
<artifactId>commons-validator</artifactId>
|
||||
<version>1.6</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.googlecode.lanterna</groupId>
|
||||
<artifactId>lanterna</artifactId>
|
||||
<version>3.0.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.5.1</version>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-assembly-plugin</artifactId>
|
||||
<version>2.6</version>
|
||||
<configuration>
|
||||
<appendAssemblyId>false</appendAssemblyId>
|
||||
<finalName>${project.artifactId}</finalName>
|
||||
<descriptorRefs>
|
||||
<descriptorRef>
|
||||
jar-with-dependencies
|
||||
</descriptorRef>
|
||||
</descriptorRefs>
|
||||
<archive>
|
||||
<manifest>
|
||||
<mainClass>${project.groupId}.StartUp</mainClass>
|
||||
</manifest>
|
||||
</archive>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>assamble</id>
|
||||
<goals>
|
||||
<goal>single</goal>
|
||||
</goals>
|
||||
<phase>package</phase>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
254
src/main/java/de/gurkengewuerz/monitoring/GUI.java
Normal file
254
src/main/java/de/gurkengewuerz/monitoring/GUI.java
Normal file
@ -0,0 +1,254 @@
|
||||
package de.gurkengewuerz.monitoring;
|
||||
|
||||
import com.googlecode.lanterna.TerminalSize;
|
||||
import com.googlecode.lanterna.TextColor;
|
||||
import com.googlecode.lanterna.gui2.*;
|
||||
import com.googlecode.lanterna.gui2.dialogs.ActionListDialogBuilder;
|
||||
import com.googlecode.lanterna.gui2.dialogs.MessageDialog;
|
||||
import com.googlecode.lanterna.gui2.dialogs.MessageDialogButton;
|
||||
import com.googlecode.lanterna.gui2.dialogs.TextInputDialog;
|
||||
import com.googlecode.lanterna.gui2.table.Table;
|
||||
import com.googlecode.lanterna.screen.Screen;
|
||||
import com.googlecode.lanterna.screen.TerminalScreen;
|
||||
import com.googlecode.lanterna.terminal.DefaultTerminalFactory;
|
||||
import com.googlecode.lanterna.terminal.Terminal;
|
||||
import de.gurkengewuerz.monitoring.object.MassCommand;
|
||||
import de.gurkengewuerz.monitoring.object.Server;
|
||||
import de.gurkengewuerz.monitoring.object.ServerStatus;
|
||||
import org.apache.commons.validator.routines.InetAddressValidator;
|
||||
import org.pmw.tinylog.Logger;
|
||||
import org.sqlite.date.DateFormatUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by gurkengewuerz.de on 21.10.2017.
|
||||
*/
|
||||
public class GUI {
|
||||
public GUI() {
|
||||
HashMap<String, Server> serverlist = Server.getServerList(StartUp.getDb());
|
||||
Poller poller = new Poller();
|
||||
try {
|
||||
Terminal terminal = new DefaultTerminalFactory()
|
||||
.setTerminalEmulatorTitle("Servermanagment").createTerminal();
|
||||
//TODO: Set GUI Icon
|
||||
Screen screen = new TerminalScreen(terminal);
|
||||
screen.startScreen();
|
||||
|
||||
Panel mainPanel = new Panel();
|
||||
mainPanel.setLayoutManager(new LinearLayout(Direction.HORIZONTAL));
|
||||
mainPanel.setPreferredSize(new TerminalSize(40, 20));
|
||||
|
||||
Panel leftPanel = new Panel();
|
||||
mainPanel.addComponent(leftPanel.withBorder(Borders.singleLine("Serverliste")));
|
||||
|
||||
Panel rightPanel = new Panel();
|
||||
mainPanel.addComponent(rightPanel.withBorder(Borders.singleLine("Aktionen")));
|
||||
|
||||
BasicWindow window = new BasicWindow();
|
||||
window.setComponent(mainPanel.withBorder(Borders.singleLine("Servermanagment")));
|
||||
window.setHints(Arrays.asList(Window.Hint.CENTERED));
|
||||
|
||||
MultiWindowTextGUI gui = new MultiWindowTextGUI(screen, new DefaultWindowManager(), new EmptySpace(TextColor.ANSI.BLUE));
|
||||
|
||||
CheckBoxList<String> checkBoxList = new CheckBoxList<String>().addTo(leftPanel);
|
||||
updateList(checkBoxList, serverlist);
|
||||
|
||||
new Button("Server hinzufügen", () -> {
|
||||
String servername = TextInputDialog.showDialog(gui, "Servername", "Wie soll der Identifiziert werden (Servername)", "Server_Cloud");
|
||||
if (servername == null) return;
|
||||
|
||||
if (serverlist.containsKey(servername)) {
|
||||
MessageDialog.showMessageDialog(gui, "ERROR!", "Server bereits vorhanden", MessageDialogButton.Cancel);
|
||||
return;
|
||||
}
|
||||
|
||||
String stringIPPort = TextInputDialog.showDialog(gui, "username@IP:Port", "Wie lautet der Hostname und Port des SSH Servers", "root@10.10.2.156:22");
|
||||
if (stringIPPort == null) return;
|
||||
|
||||
String ss = "ssh://" + stringIPPort;
|
||||
|
||||
URI uri;
|
||||
try {
|
||||
uri = new URI(ss);
|
||||
} catch (URISyntaxException e) {
|
||||
MessageDialog.showMessageDialog(gui, "ERROR!", "Fehler beim lesen der URL", MessageDialogButton.Cancel);
|
||||
return;
|
||||
}
|
||||
|
||||
String ip = uri.getHost();
|
||||
int port = uri.getPort();
|
||||
String username = uri.getUserInfo() == null ? "root" : uri.getUserInfo();
|
||||
|
||||
if (port <= 0 || port > 65535) {
|
||||
MessageDialog.showMessageDialog(gui, "ERROR!", "Port muss größer NUll und kleiner 65535 sein", MessageDialogButton.Cancel);
|
||||
return;
|
||||
}
|
||||
|
||||
InetAddressValidator inetAddressValidator = new InetAddressValidator();
|
||||
if (!inetAddressValidator.isValid(ip)) {
|
||||
MessageDialog.showMessageDialog(gui, "ERROR!", "Inkorrekte IP Adresse", MessageDialogButton.Cancel);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
PreparedStatement ps = StartUp.getDb().getPreparedStatement("INSERT INTO server (servername, username, ip, port, adddate) VALUES (?, ?, ?, ?, ?);");
|
||||
ps.setString(1, servername);
|
||||
ps.setString(2, username);
|
||||
ps.setString(3, ip);
|
||||
ps.setInt(4, port);
|
||||
ps.setLong(5, System.currentTimeMillis() / 1000);
|
||||
ps.execute();
|
||||
|
||||
ResultSet rs = ps.getGeneratedKeys();
|
||||
rs.next();
|
||||
int serverid = rs.getInt(1);
|
||||
Server server = new Server(serverid, servername, username, ip, port);
|
||||
serverlist.put(servername, server);
|
||||
checkBoxList.addItem(servername);
|
||||
Logger.info("Added: " + ip + " " + port);
|
||||
MessageDialog.showMessageDialog(gui, "INFO", "Server hinzugefügt.\n" +
|
||||
"Gehe sicher das der Public Key von " + StartUp.getPrivate_key() + " auf dem Server abgelegt wurde.", MessageDialogButton.Continue);
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
}).addTo(rightPanel).takeFocus();
|
||||
|
||||
new Button("Alle auswählen", () -> checkBoxList.getItems().forEach(s -> checkBoxList.setChecked(s, true))).addTo(rightPanel);
|
||||
|
||||
new Button("Aktion ausführen", () -> {
|
||||
List<String> checkedItems = checkBoxList.getCheckedItems();
|
||||
if (checkedItems.size() <= 0) {
|
||||
MessageDialog.showMessageDialog(gui, "ERROR!", "Bitte wähle zuerst Server aus!");
|
||||
return;
|
||||
}
|
||||
|
||||
List<Server> serverarray = new ArrayList<>();
|
||||
checkedItems.forEach(s -> serverarray.add(serverlist.get(s)));
|
||||
|
||||
new ActionListDialogBuilder()
|
||||
.setTitle("Aktion ausführen")
|
||||
.setDescription("Was möchtest du unternhmen")
|
||||
.addAction("Server löschen", () -> {
|
||||
try {
|
||||
PreparedStatement ps = StartUp.getDb().getPreparedStatement("DELETE FROM server WHERE id = ?");
|
||||
serverarray.forEach(server -> {
|
||||
try {
|
||||
ps.setInt(1, server.getId());
|
||||
ps.addBatch();
|
||||
serverlist.remove(server.getName());
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
});
|
||||
ps.executeBatch();
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
updateList(checkBoxList, serverlist);
|
||||
})
|
||||
.addAction("Server Status", () -> {
|
||||
BasicWindow windowStatus = getStatusWindow(checkBoxList, serverlist);
|
||||
gui.addWindow(windowStatus);
|
||||
gui.setActiveWindow(windowStatus);
|
||||
})
|
||||
.addAction("Server updaten", () -> MassCommand.run("apt-get update && apt-get upgrade -y", gui, serverarray, StartUp.getPrivate_key()))
|
||||
.addAction("Herunterfahren", () -> MassCommand.run("shutdown -h now", gui, serverarray, StartUp.getPrivate_key()))
|
||||
.addAction("Neustart", () -> MassCommand.run("reboot", gui, serverarray, StartUp.getPrivate_key()))
|
||||
.build()
|
||||
.showDialog(gui);
|
||||
}).addTo(rightPanel);
|
||||
|
||||
new Button("Aktualisieren", () -> {
|
||||
// TODO: serverlist = Server.getServerList(db);
|
||||
updateList(checkBoxList, serverlist);
|
||||
}).addTo(rightPanel);
|
||||
|
||||
new Button("Beenden", () -> {
|
||||
poller.stop();
|
||||
StartUp.getDb().closeConnection();
|
||||
System.exit(0);
|
||||
}).addTo(rightPanel);
|
||||
|
||||
screen.setCursorPosition(null);
|
||||
|
||||
gui.addWindowAndWait(window);
|
||||
} catch (IOException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateList(CheckBoxList<String> checkBoxList, HashMap<String, Server> serverlist) {
|
||||
checkBoxList.clearItems();
|
||||
serverlist.forEach((s, server) -> checkBoxList.addItem(s));
|
||||
}
|
||||
|
||||
private BasicWindow getStatusWindow(CheckBoxList<String> checkBoxList, HashMap<String, Server> serverlist) {
|
||||
Panel statusPanel = new Panel();
|
||||
statusPanel.setLayoutManager(new LinearLayout(Direction.VERTICAL));
|
||||
|
||||
BasicWindow windowStatus = new BasicWindow();
|
||||
windowStatus.setComponent(statusPanel.withBorder(Borders.singleLine("Server Status")));
|
||||
windowStatus.setHints(Arrays.asList(Window.Hint.CENTERED));
|
||||
|
||||
Table<String> table = new Table<String>("Name", "OS", "CPU", "RAM", "Uptime", "Last", "Status").addTo(statusPanel);
|
||||
|
||||
updateTable(table, checkBoxList, serverlist);
|
||||
|
||||
Button back = new Button("Zurück", windowStatus::close).addTo(statusPanel);
|
||||
|
||||
back.takeFocus();
|
||||
return windowStatus;
|
||||
}
|
||||
|
||||
private void updateTable(Table<String> table, CheckBoxList<String> checkBoxList, HashMap<String, Server> serverlist) {
|
||||
for (String s : checkBoxList.getCheckedItems()) {
|
||||
Server server = serverlist.get(s);
|
||||
ServerStatus status = server.getStatus();
|
||||
if (status.getLastpoll() == 0) {
|
||||
return;
|
||||
}
|
||||
double totalMB = round(status.getMemTotal() / 1024.0, 2);
|
||||
double freeMB = round(status.getMemFree() / 1024.0, 2);
|
||||
|
||||
table.getTableModel().addRow(server.getName(),
|
||||
status.getOS(), status.getCPUcount() + "x " + status.getCPUModel(),
|
||||
freeMB + "MB/" + totalMB + "MB", DateFormatUtils.format(status.getUptime() * 1000, "HH:mm:ss"),
|
||||
String.valueOf(status.getLoad()), status.getState().toString());
|
||||
}
|
||||
// "Name", "OS", "CPU", "RAM", "Uptime", "Last", "Status"
|
||||
}
|
||||
|
||||
public static BasicWindow getCallbackWindow(Label label, Button abort) {
|
||||
Panel statusPanel = new Panel();
|
||||
statusPanel.setLayoutManager(new LinearLayout(Direction.VERTICAL));
|
||||
|
||||
BasicWindow windowStatus = new BasicWindow();
|
||||
windowStatus.setComponent(statusPanel.withBorder(Borders.singleLine("Update Status")));
|
||||
windowStatus.setHints(Arrays.asList(Window.Hint.CENTERED));
|
||||
|
||||
label.addTo(statusPanel);
|
||||
|
||||
abort.addTo(statusPanel);
|
||||
return windowStatus;
|
||||
}
|
||||
|
||||
private double round(double value, int places) {
|
||||
if (places < 0) throw new IllegalArgumentException();
|
||||
|
||||
BigDecimal bd = new BigDecimal(value);
|
||||
bd = bd.setScale(places, RoundingMode.HALF_UP);
|
||||
return bd.doubleValue();
|
||||
}
|
||||
}
|
109
src/main/java/de/gurkengewuerz/monitoring/Poller.java
Normal file
109
src/main/java/de/gurkengewuerz/monitoring/Poller.java
Normal file
@ -0,0 +1,109 @@
|
||||
package de.gurkengewuerz.monitoring;
|
||||
|
||||
import de.gurkengewuerz.monitoring.object.SSHManager;
|
||||
import de.gurkengewuerz.monitoring.object.Server;
|
||||
import de.gurkengewuerz.monitoring.object.ServerStatus;
|
||||
import de.gurkengewuerz.monitoring.object.State;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.SQLException;
|
||||
import java.text.NumberFormat;
|
||||
import java.text.ParseException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* Created by gurkengewuerz.de on 21.10.2017.
|
||||
*/
|
||||
public class Poller {
|
||||
final ScheduledExecutorService scheduler;
|
||||
|
||||
public Poller() {
|
||||
scheduler = Executors.newScheduledThreadPool(1);
|
||||
scheduler.scheduleAtFixedRate(() -> {
|
||||
HashMap<String, Server> serverlist = Server.getServerList(StartUp.getDb());
|
||||
|
||||
serverlist.forEach((s, server) -> {
|
||||
Logger.info("Poling " + s);
|
||||
ServerStatus status = server.getStatus();
|
||||
if (status.getState() == State.PAUSED) {
|
||||
Logger.info("Paused!");
|
||||
return;
|
||||
}
|
||||
SSHManager manager = server.getSSHSession(StartUp.getPrivate_key());
|
||||
if (manager.hasError()) {
|
||||
status.setState(State.OFFLINE);
|
||||
Logger.error("Offline!");
|
||||
|
||||
try {
|
||||
if (status.getLastpoll() == 0) return;
|
||||
PreparedStatement ps = StartUp.getDb().getPreparedStatement("UPDATE status SET state = ?, lastpoll = ? WHERE server_id = ?;");
|
||||
ps.setString(1, status.getState().toString());
|
||||
ps.setLong(2, System.currentTimeMillis() / 1000);
|
||||
ps.setInt(3, server.getId());
|
||||
ps.execute();
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
status.setLastpoll(System.currentTimeMillis() / 1000);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
status.setState(State.ONLINE);
|
||||
Logger.info("Online!");
|
||||
|
||||
NumberFormat format = NumberFormat.getInstance(Locale.US);
|
||||
String os = manager.sendCommand(". /etc/os-release; echo ${PRETTY_NAME/*, /}").replace("\n", "");
|
||||
status.setOS(os);
|
||||
String cpumodel = manager.sendCommand("grep \"model name\" /proc/cpuinfo | cut -c14- | head -n 1").replace("\n", "");
|
||||
status.setCPU(cpumodel);
|
||||
String cpucount = manager.sendCommand("cat /proc/cpuinfo | grep processor | wc -l").replace("\n", "");
|
||||
status.setCPUcount(format.parse(cpucount).intValue());
|
||||
String memtotal = manager.sendCommand("awk '/MemTotal/ { print $2 }' /proc/meminfo").replace("\n", "");
|
||||
status.setMemTotal(format.parse(memtotal).intValue());
|
||||
String memfree = manager.sendCommand("awk '/MemFree/ { print $2 }' /proc/meminfo").replace("\n", "");
|
||||
status.setMemFree(format.parse(memfree).intValue());
|
||||
String load = manager.sendCommand("if [[ -z `uptime | awk '{print $12}' | cut -d \",\" -f 1` ]]; then uptime | awk '{print $10}' | cut -d \",\" -f 1; else uptime | awk '{print $12}' | cut -d \",\" -f 1; fi;").replace("\n", "");
|
||||
status.setLoad(format.parse(load).floatValue());
|
||||
String uptimeseconds = manager.sendCommand("awk '{print $1}' /proc/uptime").replace("\n", "");
|
||||
status.setUptime(format.parse(uptimeseconds).longValue());
|
||||
|
||||
try {
|
||||
PreparedStatement ps = StartUp.getDb().getPreparedStatement("UPDATE status SET os = ?, cpu = ?, cpucount = ?, max_ram = ?, current_ram = ?, load = ?, uptime = ?, state = ?, lastpoll = ? WHERE server_id = ?;");
|
||||
if (status.getLastpoll() == 0) {
|
||||
ps = StartUp.getDb().getPreparedStatement("INSERT INTO status (os, cpu, cpucount, max_ram, current_ram, load, uptime, state, lastpoll, server_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
|
||||
|
||||
}
|
||||
ps.setString(1, os);
|
||||
ps.setString(2, cpumodel);
|
||||
ps.setInt(3, format.parse(cpucount).intValue());
|
||||
ps.setInt(4, format.parse(memtotal).intValue());
|
||||
ps.setInt(5, format.parse(memfree).intValue());
|
||||
ps.setFloat(6, format.parse(load).floatValue());
|
||||
ps.setLong(7, format.parse(uptimeseconds).longValue());
|
||||
ps.setString(8, status.getState().toString());
|
||||
ps.setLong(9, System.currentTimeMillis() / 1000);
|
||||
ps.setInt(10, server.getId());
|
||||
ps.execute();
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
|
||||
status.setLastpoll(System.currentTimeMillis() / 1000);
|
||||
} catch (ParseException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
manager.close();
|
||||
});
|
||||
}, 0, 90, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
scheduler.shutdown();
|
||||
}
|
||||
}
|
107
src/main/java/de/gurkengewuerz/monitoring/StartUp.java
Normal file
107
src/main/java/de/gurkengewuerz/monitoring/StartUp.java
Normal file
@ -0,0 +1,107 @@
|
||||
package de.gurkengewuerz.monitoring;
|
||||
|
||||
import de.gurkengewuerz.monitoring.object.Database;
|
||||
import org.apache.commons.cli.*;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.io.File;
|
||||
import java.sql.SQLException;
|
||||
|
||||
/**
|
||||
* Created by gurkengewuerz.de on 21.10.2017.
|
||||
*/
|
||||
public class StartUp {
|
||||
private static Database db;
|
||||
private static String private_key;
|
||||
|
||||
public static void main(String... args) {
|
||||
Options options = new Options();
|
||||
|
||||
Option database = new Option("d", "database", true, "Database Path");
|
||||
database.setRequired(false);
|
||||
options.addOption(database);
|
||||
|
||||
Option poller = new Option("p", "poller", false, "Start only the poller");
|
||||
poller.setRequired(false);
|
||||
options.addOption(poller);
|
||||
|
||||
Option sshkey = new Option("s", "key", true, "Set ssh private key");
|
||||
sshkey.setRequired(false);
|
||||
options.addOption(sshkey);
|
||||
|
||||
CommandLineParser parser = new DefaultParser();
|
||||
HelpFormatter formatter = new HelpFormatter();
|
||||
CommandLine cmd;
|
||||
|
||||
try {
|
||||
cmd = parser.parse(options, args);
|
||||
} catch (ParseException e) {
|
||||
Logger.error(e);
|
||||
formatter.printHelp("utility-name", options);
|
||||
|
||||
System.exit(1);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
db = new Database(cmd.getOptionValue("d", Variables.DATABASE_NAME));
|
||||
} catch (Exception e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
|
||||
if (db == null) System.exit(1);
|
||||
|
||||
try {
|
||||
createDatabase();
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
private_key = cmd.getOptionValue("s", Variables.PRIVATE_KEY);
|
||||
if (!new File(private_key).exists()) {
|
||||
Logger.error(private_key + " wurde nicht gefunden!");
|
||||
System.exit(1);
|
||||
}
|
||||
if (cmd.hasOption("p")) {
|
||||
new Poller();
|
||||
} else {
|
||||
new GUI();
|
||||
}
|
||||
}
|
||||
|
||||
public static Database getDb() {
|
||||
return db;
|
||||
}
|
||||
|
||||
public static String getPrivate_key() {
|
||||
return private_key;
|
||||
}
|
||||
|
||||
private static void createDatabase() throws SQLException {
|
||||
db.executeUpdate(
|
||||
"CREATE TABLE IF NOT EXISTS server (" +
|
||||
" id INTEGER PRIMARY KEY AUTOINCREMENT," +
|
||||
" servername text NULL," +
|
||||
" username text NULL," +
|
||||
" ip text NULL," +
|
||||
" port int NULL," +
|
||||
" adddate float NOT NULL" +
|
||||
");"
|
||||
);
|
||||
|
||||
db.executeUpdate("CREATE TABLE IF NOT EXISTS status (" +
|
||||
"server_id INTEGER," +
|
||||
"os TEXT," +
|
||||
"cpu TEXT," +
|
||||
"cpucount INTEGER," +
|
||||
"max_ram INTEGER," +
|
||||
"current_ram INTEGER," +
|
||||
"load float," +
|
||||
"uptime INTEGER," +
|
||||
"state text," +
|
||||
"lastpoll INTEGER" +
|
||||
");"
|
||||
);
|
||||
}
|
||||
}
|
10
src/main/java/de/gurkengewuerz/monitoring/Variables.java
Normal file
10
src/main/java/de/gurkengewuerz/monitoring/Variables.java
Normal file
@ -0,0 +1,10 @@
|
||||
package de.gurkengewuerz.monitoring;
|
||||
|
||||
/**
|
||||
* Created by gurkengewuerz.de on 21.10.2017.
|
||||
*/
|
||||
public class Variables {
|
||||
|
||||
public static final String DATABASE_NAME = "data.sqlite3";
|
||||
public static final String PRIVATE_KEY = System.getProperty("user.home") + "/.ssh/id_rsa";
|
||||
}
|
128
src/main/java/de/gurkengewuerz/monitoring/object/Database.java
Normal file
128
src/main/java/de/gurkengewuerz/monitoring/object/Database.java
Normal file
@ -0,0 +1,128 @@
|
||||
package de.gurkengewuerz.monitoring.object;
|
||||
|
||||
import java.sql.*;
|
||||
|
||||
/**
|
||||
* Created by gurkengewuerz.de on 08.04.2017.
|
||||
*/
|
||||
public class Database {
|
||||
|
||||
private String sUrl = null;
|
||||
private int iTimeout = 30;
|
||||
private Connection conn = null;
|
||||
private Statement statement = null;
|
||||
|
||||
|
||||
public Database(String sUrlToLoad) throws Exception {
|
||||
setUrl(sUrlToLoad);
|
||||
setConnection();
|
||||
setStatement();
|
||||
}
|
||||
|
||||
private void setUrl(String sUrlVar) {
|
||||
sUrl = sUrlVar;
|
||||
}
|
||||
|
||||
private void setConnection() throws Exception {
|
||||
conn = DriverManager.getConnection("jdbc:sqlite:" + sUrl);
|
||||
}
|
||||
|
||||
|
||||
public Connection getConnection() {
|
||||
return conn;
|
||||
}
|
||||
|
||||
private void setStatement() throws Exception {
|
||||
if (conn == null) {
|
||||
setConnection();
|
||||
}
|
||||
statement = conn.createStatement();
|
||||
statement.setQueryTimeout(iTimeout); // set timeout to 30 sec.
|
||||
}
|
||||
|
||||
public PreparedStatement getPreparedStatement(String sql) throws SQLException {
|
||||
return conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
|
||||
}
|
||||
|
||||
public void executeUpdate(String instruction) throws SQLException {
|
||||
statement.executeUpdate(instruction);
|
||||
}
|
||||
|
||||
public ResultSet executeQuery(String instruction) throws SQLException {
|
||||
return statement.executeQuery(instruction);
|
||||
}
|
||||
|
||||
public void closeConnection() {
|
||||
try {
|
||||
conn.close();
|
||||
} catch (Exception ignore) {
|
||||
}
|
||||
}
|
||||
|
||||
public static String escapeString(String x, boolean escapeDoubleQuotes) {
|
||||
StringBuilder sBuilder = new StringBuilder(x.length() * 11 / 10);
|
||||
|
||||
int stringLength = x.length();
|
||||
|
||||
for (int i = 0; i < stringLength; ++i) {
|
||||
char c = x.charAt(i);
|
||||
|
||||
switch (c) {
|
||||
case 0: /* Must be escaped for 'mysql' */
|
||||
sBuilder.append('\\');
|
||||
sBuilder.append('0');
|
||||
|
||||
break;
|
||||
|
||||
case '\n': /* Must be escaped for logs */
|
||||
sBuilder.append('\\');
|
||||
sBuilder.append('n');
|
||||
|
||||
break;
|
||||
|
||||
case '\r':
|
||||
sBuilder.append('\\');
|
||||
sBuilder.append('r');
|
||||
|
||||
break;
|
||||
|
||||
case '\\':
|
||||
sBuilder.append('\\');
|
||||
sBuilder.append('\\');
|
||||
|
||||
break;
|
||||
|
||||
case '\'':
|
||||
sBuilder.append('\\');
|
||||
sBuilder.append('\'');
|
||||
|
||||
break;
|
||||
|
||||
case '"': /* Better safe than sorry */
|
||||
if (escapeDoubleQuotes) {
|
||||
sBuilder.append('\\');
|
||||
}
|
||||
|
||||
sBuilder.append('"');
|
||||
|
||||
break;
|
||||
|
||||
case '\032': /* This gives problems on Win32 */
|
||||
sBuilder.append('\\');
|
||||
sBuilder.append('Z');
|
||||
|
||||
break;
|
||||
|
||||
case '\u00a5':
|
||||
case '\u20a9':
|
||||
// escape characters interpreted as backslash by mysql
|
||||
// fall through
|
||||
|
||||
default:
|
||||
sBuilder.append(c);
|
||||
}
|
||||
}
|
||||
|
||||
return sBuilder.toString();
|
||||
}
|
||||
}
|
@ -0,0 +1,128 @@
|
||||
package de.gurkengewuerz.monitoring.object;
|
||||
|
||||
import com.googlecode.lanterna.gui2.BasicWindow;
|
||||
import com.googlecode.lanterna.gui2.Button;
|
||||
import com.googlecode.lanterna.gui2.Label;
|
||||
import com.googlecode.lanterna.gui2.MultiWindowTextGUI;
|
||||
import com.googlecode.lanterna.gui2.dialogs.MessageDialog;
|
||||
import com.googlecode.lanterna.gui2.dialogs.MessageDialogButton;
|
||||
import de.gurkengewuerz.monitoring.GUI;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by gurkengewuerz.de on 22.10.2017.
|
||||
*/
|
||||
public class MassCommand {
|
||||
|
||||
private String command;
|
||||
private String private_key;
|
||||
private List<Server> serverList = new ArrayList<>();
|
||||
private StatusReply answer;
|
||||
private boolean stop = false;
|
||||
private Thread t;
|
||||
|
||||
public MassCommand(String command, String private_key, List<Server> serverList, StatusReply answer) {
|
||||
this.command = command;
|
||||
this.private_key = private_key;
|
||||
this.serverList = serverList;
|
||||
this.answer = answer;
|
||||
}
|
||||
|
||||
public MassCommand(String command, List<Server> serverList, StatusReply answer) {
|
||||
this(command, "", serverList, answer);
|
||||
}
|
||||
|
||||
public MassCommand setPrivateKey(String private_key) {
|
||||
this.private_key = private_key;
|
||||
return this;
|
||||
}
|
||||
|
||||
public void start() {
|
||||
t = new Thread(() -> {
|
||||
final boolean[] failed = {false};
|
||||
final int[] counter = {0};
|
||||
answer.onStart();
|
||||
serverList.forEach(server -> {
|
||||
if (stop) return;
|
||||
if (failed[0]) return;
|
||||
SSHManager manager = server.getSSHSession(private_key);
|
||||
if (manager.hasError()) {
|
||||
failed[0] = true;
|
||||
answer.onFail(manager.getErrorMessage());
|
||||
return;
|
||||
}
|
||||
if (failed[0]) return;
|
||||
|
||||
String result = manager.sendCommand(command);
|
||||
Logger.info(result);
|
||||
|
||||
manager.close();
|
||||
answer.onUpdate(counter[0] + 1, serverList.size());
|
||||
counter[0]++;
|
||||
});
|
||||
|
||||
if (!failed[0]) answer.onFinish();
|
||||
});
|
||||
|
||||
t.start();
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
stop = true;
|
||||
t.interrupt();
|
||||
}
|
||||
|
||||
public static void run(String command, MultiWindowTextGUI gui, List<Server> serverarray, String ssh_private) {
|
||||
Label label = new Label("[ ] 00%");
|
||||
Button button = new Button("Abbruch");
|
||||
BasicWindow windowStatus = GUI.getCallbackWindow(label, button);
|
||||
gui.addWindow(windowStatus);
|
||||
gui.setActiveWindow(windowStatus);
|
||||
|
||||
MassCommand mc = new MassCommand(command, serverarray, new StatusReply() {
|
||||
@Override
|
||||
public void onFinish() {
|
||||
windowStatus.close();
|
||||
MessageDialog.showMessageDialog(gui, "Erfolgreich", "Befehle erfolgreich auf allen Servern ausgeführt", MessageDialogButton.OK);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpdate(int current, int to_go) {
|
||||
double perc = (double) current / (double) to_go;
|
||||
double d = Math.round(perc * 20) / 20.0; // round up to multiple of 0.05
|
||||
int percInt = (int) (d * 100);
|
||||
int count = percInt / 5;
|
||||
|
||||
StringBuilder stringtext = new StringBuilder("[");
|
||||
for (int i = 0; i < 20; i++) {
|
||||
if (i + 1 <= count) {
|
||||
stringtext.append("#");
|
||||
} else {
|
||||
stringtext.append(" ");
|
||||
}
|
||||
}
|
||||
stringtext.append("] ").append(percInt).append("%");
|
||||
|
||||
label.setText(stringtext.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFail(String message) {
|
||||
windowStatus.close();
|
||||
MessageDialog.showMessageDialog(gui, "ERROR!", "Verbindung zum Server konnte nicht hergestellt werden!\n" + message, MessageDialogButton.Close);
|
||||
}
|
||||
}).setPrivateKey(ssh_private);
|
||||
mc.start();
|
||||
|
||||
button.addListener(button1 -> mc.stop());
|
||||
button.takeFocus();
|
||||
}
|
||||
}
|
140
src/main/java/de/gurkengewuerz/monitoring/object/SSHManager.java
Normal file
140
src/main/java/de/gurkengewuerz/monitoring/object/SSHManager.java
Normal file
@ -0,0 +1,140 @@
|
||||
package de.gurkengewuerz.monitoring.object;
|
||||
|
||||
import com.jcraft.jsch.*;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
|
||||
/*
|
||||
* SSHManager
|
||||
*
|
||||
* @author cabbott
|
||||
* @version 1.0
|
||||
*/
|
||||
public class SSHManager {
|
||||
private static final Logger LOGGER =
|
||||
Logger.getLogger(SSHManager.class.getName());
|
||||
private JSch jschSSHChannel;
|
||||
private String strUserName;
|
||||
private String strConnectionIP;
|
||||
private int intConnectionPort;
|
||||
private String strPassword;
|
||||
private Session sesConnection;
|
||||
private String errorMessage = null;
|
||||
private int intTimeOut;
|
||||
|
||||
private void doCommonConstructorActions(String userName,
|
||||
String password, String connectionIP, String knownHostsFileName) {
|
||||
jschSSHChannel = new JSch();
|
||||
|
||||
try {
|
||||
jschSSHChannel.addIdentity(password);
|
||||
jschSSHChannel.setKnownHosts(knownHostsFileName);
|
||||
} catch (JSchException jschX) {
|
||||
logError(jschX.getMessage());
|
||||
}
|
||||
|
||||
strUserName = userName;
|
||||
strPassword = password;
|
||||
strConnectionIP = connectionIP;
|
||||
}
|
||||
|
||||
public SSHManager(String userName, String password,
|
||||
String connectionIP, String knownHostsFileName) {
|
||||
doCommonConstructorActions(userName, password,
|
||||
connectionIP, knownHostsFileName);
|
||||
intConnectionPort = 22;
|
||||
intTimeOut = 60000;
|
||||
}
|
||||
|
||||
public SSHManager(String userName, String password, String connectionIP,
|
||||
String knownHostsFileName, int connectionPort) {
|
||||
doCommonConstructorActions(userName, password, connectionIP,
|
||||
knownHostsFileName);
|
||||
intConnectionPort = connectionPort;
|
||||
intTimeOut = 60000;
|
||||
}
|
||||
|
||||
public SSHManager(String userName, String password, String connectionIP,
|
||||
String knownHostsFileName, int connectionPort, int timeOutMilliseconds) {
|
||||
doCommonConstructorActions(userName, password, connectionIP,
|
||||
knownHostsFileName);
|
||||
intConnectionPort = connectionPort;
|
||||
intTimeOut = timeOutMilliseconds;
|
||||
}
|
||||
|
||||
public String connect() {
|
||||
errorMessage = null;
|
||||
|
||||
try {
|
||||
sesConnection = jschSSHChannel.getSession(strUserName,
|
||||
strConnectionIP, intConnectionPort);
|
||||
//sesConnection.setPassword(strPassword);
|
||||
// UNCOMMENT THIS FOR TESTING PURPOSES, BUT DO NOT USE IN PRODUCTION
|
||||
sesConnection.setConfig("StrictHostKeyChecking", "no");
|
||||
sesConnection.connect(intTimeOut);
|
||||
} catch (JSchException jschX) {
|
||||
errorMessage = jschX.getMessage();
|
||||
}
|
||||
|
||||
return errorMessage;
|
||||
}
|
||||
|
||||
public boolean hasError() {
|
||||
return errorMessage != null;
|
||||
}
|
||||
|
||||
public String getErrorMessage() {
|
||||
return errorMessage;
|
||||
}
|
||||
|
||||
private String logError(String errorMessage) {
|
||||
if (errorMessage != null) {
|
||||
LOGGER.log(Level.SEVERE, "{0}:{1} - {2}",
|
||||
new Object[]{strConnectionIP, intConnectionPort, errorMessage});
|
||||
}
|
||||
|
||||
return errorMessage;
|
||||
}
|
||||
|
||||
private String logWarning(String warnMessage) {
|
||||
if (warnMessage != null) {
|
||||
LOGGER.log(Level.WARNING, "{0}:{1} - {2}",
|
||||
new Object[]{strConnectionIP, intConnectionPort, warnMessage});
|
||||
}
|
||||
|
||||
return warnMessage;
|
||||
}
|
||||
|
||||
public String sendCommand(String command) {
|
||||
StringBuilder outputBuffer = new StringBuilder();
|
||||
|
||||
try {
|
||||
Channel channel = sesConnection.openChannel("exec");
|
||||
((ChannelExec) channel).setCommand(command);
|
||||
InputStream commandOutput = channel.getInputStream();
|
||||
channel.connect();
|
||||
int readByte = commandOutput.read();
|
||||
|
||||
while (readByte != 0xffffffff) {
|
||||
outputBuffer.append((char) readByte);
|
||||
readByte = commandOutput.read();
|
||||
}
|
||||
|
||||
channel.disconnect();
|
||||
} catch (IOException | JSchException ioX) {
|
||||
logWarning(ioX.getMessage());
|
||||
return null;
|
||||
}
|
||||
|
||||
return outputBuffer.toString();
|
||||
}
|
||||
|
||||
public void close() {
|
||||
sesConnection.disconnect();
|
||||
}
|
||||
|
||||
}
|
90
src/main/java/de/gurkengewuerz/monitoring/object/Server.java
Normal file
90
src/main/java/de/gurkengewuerz/monitoring/object/Server.java
Normal file
@ -0,0 +1,90 @@
|
||||
package de.gurkengewuerz.monitoring.object;
|
||||
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* Created by gurkengewuerz.de on 21.10.2017.
|
||||
*/
|
||||
public class Server {
|
||||
|
||||
private int id;
|
||||
private String name;
|
||||
private String username;
|
||||
private String ip;
|
||||
private int port;
|
||||
private long timeAdded;
|
||||
private ServerStatus status;
|
||||
|
||||
public Server(int id, String name, String username, String ip, int port, long timeAdded, ServerStatus status) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.username = username;
|
||||
this.ip = ip;
|
||||
this.port = port;
|
||||
this.timeAdded = timeAdded;
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public Server(int id, String name, String username, String ip, int port) {
|
||||
this(id, name, username, ip, port, System.currentTimeMillis() / 1000,
|
||||
new ServerStatus(null, null, 0, 0, 0, 0, 0, State.OFFLINE, 0));
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
public long getTimeAdded() {
|
||||
return timeAdded;
|
||||
}
|
||||
|
||||
public ServerStatus getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(ServerStatus status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public SSHManager getSSHSession(String ssh_private) {
|
||||
SSHManager instance = new SSHManager(getUsername(), ssh_private, ip, "", port);
|
||||
String errorMessage = instance.connect();
|
||||
|
||||
if (errorMessage != null) {
|
||||
Logger.error(errorMessage);
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
public static HashMap<String, Server> getServerList(Database db) {
|
||||
HashMap<String, Server> serverlist = new HashMap<>();
|
||||
|
||||
try {
|
||||
ResultSet rs = db.executeQuery("SELECT * FROM server LEFT JOIN status ON server.id = status.server_id;");
|
||||
while (rs.next()) {
|
||||
ServerStatus status = new ServerStatus(rs.getString("os"),
|
||||
rs.getString("cpu"), rs.getInt("cpucount"), rs.getInt("max_ram"),
|
||||
rs.getInt("current_ram"), rs.getFloat("load"),
|
||||
rs.getLong("uptime"), State.getByName(rs.getString("state")), rs.getLong("lastpoll"));
|
||||
Server s = new Server(rs.getInt("id"), rs.getString("servername"), rs.getString("username"),
|
||||
rs.getString("ip"), rs.getInt("port"), rs.getLong("adddate"), status);
|
||||
serverlist.put(rs.getString("servername"), s);
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
return serverlist;
|
||||
}
|
||||
}
|
@ -0,0 +1,101 @@
|
||||
package de.gurkengewuerz.monitoring.object;
|
||||
|
||||
/**
|
||||
* Created by gurkengewuerz.de on 21.10.2017.
|
||||
*/
|
||||
public class ServerStatus {
|
||||
|
||||
private String os;
|
||||
private String cpu;
|
||||
private int cpucount;
|
||||
private int memTotal;
|
||||
private int memFree;
|
||||
private float load;
|
||||
private long uptime;
|
||||
private State state;
|
||||
private long lastpoll;
|
||||
|
||||
public ServerStatus(String os, String cpu, int cpucount, int memTotal, int memFree, float load, long uptime, State state, long lastpoll) {
|
||||
this.os = os == null ? "Unknown" : os;
|
||||
this.cpu = cpu == null ? "Unknown" : cpu;
|
||||
this.cpucount = cpucount;
|
||||
this.memTotal = memTotal;
|
||||
this.memFree = memFree;
|
||||
this.load = load;
|
||||
this.uptime = uptime;
|
||||
this.state = state;
|
||||
this.lastpoll = lastpoll;
|
||||
}
|
||||
|
||||
public String getOS() {
|
||||
return os;
|
||||
}
|
||||
|
||||
public String getCPUModel() {
|
||||
return cpu;
|
||||
}
|
||||
|
||||
public int getCPUcount() {
|
||||
return cpucount;
|
||||
}
|
||||
|
||||
public int getMemTotal() {
|
||||
return memTotal;
|
||||
}
|
||||
|
||||
public int getMemFree() {
|
||||
return memFree;
|
||||
}
|
||||
|
||||
public float getLoad() {
|
||||
return load;
|
||||
}
|
||||
|
||||
public long getUptime() {
|
||||
return uptime;
|
||||
}
|
||||
|
||||
public State getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
public long getLastpoll() {
|
||||
return lastpoll;
|
||||
}
|
||||
|
||||
public void setOS(String os) {
|
||||
this.os = os;
|
||||
}
|
||||
|
||||
public void setCPU(String cpu) {
|
||||
this.cpu = cpu;
|
||||
}
|
||||
|
||||
public void setCPUcount(int cpucount) {
|
||||
this.cpucount = cpucount;
|
||||
}
|
||||
|
||||
public void setMemTotal(int memTotal) {
|
||||
this.memTotal = memTotal;
|
||||
}
|
||||
|
||||
public void setMemFree(int memFree) {
|
||||
this.memFree = memFree;
|
||||
}
|
||||
|
||||
public void setLoad(float load) {
|
||||
this.load = load;
|
||||
}
|
||||
|
||||
public void setUptime(long uptime) {
|
||||
this.uptime = uptime;
|
||||
}
|
||||
|
||||
public void setState(State state) {
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
public void setLastpoll(long lastpoll) {
|
||||
this.lastpoll = lastpoll;
|
||||
}
|
||||
}
|
38
src/main/java/de/gurkengewuerz/monitoring/object/State.java
Normal file
38
src/main/java/de/gurkengewuerz/monitoring/object/State.java
Normal file
@ -0,0 +1,38 @@
|
||||
package de.gurkengewuerz.monitoring.object;
|
||||
|
||||
/**
|
||||
* Created by gurkengewuerz.de on 21.10.2017.
|
||||
*/
|
||||
public enum State {
|
||||
ONLINE {
|
||||
@Override
|
||||
public String toString() {
|
||||
return "online";
|
||||
}
|
||||
},
|
||||
OFFLINE {
|
||||
@Override
|
||||
public String toString() {
|
||||
return "offline";
|
||||
}
|
||||
},
|
||||
PAUSED {
|
||||
@Override
|
||||
public String toString() {
|
||||
return "paused";
|
||||
}
|
||||
};
|
||||
|
||||
public static State getByName(String state) {
|
||||
if (state == null) return null;
|
||||
switch (state.toLowerCase()) {
|
||||
case "offline":
|
||||
return OFFLINE;
|
||||
case "online":
|
||||
return ONLINE;
|
||||
case "paused":
|
||||
return PAUSED;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package de.gurkengewuerz.monitoring.object;
|
||||
|
||||
/**
|
||||
* Created by gurkengewuerz.de on 22.10.2017.
|
||||
*/
|
||||
public interface StatusReply {
|
||||
|
||||
void onFinish();
|
||||
|
||||
void onStart();
|
||||
|
||||
void onUpdate(int current, int to_go);
|
||||
|
||||
void onFail(String message);
|
||||
}
|
Loading…
Reference in New Issue
Block a user