114 lines
5.5 KiB
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();
|
|
}
|
|
}
|