servermanager/src/main/java/de/gurkengewuerz/monitoring/Poller.java

114 lines
5.5 KiB
Java

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);
if (!StartUp.getPrivateKey().exists()) {
Logger.error(StartUp.getPrivateKey().getPath() + " wurde nicht gefunden!");
return;
}
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.getPrivateKey());
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();
}
}