Added Config and custom Commands

also refactor
This commit is contained in:
Niklas 2017-10-24 23:07:38 +02:00
parent 33abcaccc5
commit b2b6a8cae3
5 changed files with 181 additions and 28 deletions

1
.gitignore vendored
View File

@ -2,3 +2,4 @@
target/ target/
*.sqlite3 *.sqlite3
*.iml *.iml
settings.json

View File

@ -0,0 +1,118 @@
package de.gurkengewuerz.monitoring;
import org.json.JSONObject;
import org.json.JSONTokener;
import org.pmw.tinylog.Logger;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.AccessDeniedException;
import java.nio.file.Files;
/**
* Created by gurkengewuerz.de on 24.10.2017.
*/
public class Config extends JSONObject {
private File file;
private boolean firstRun = false;
public Config(File file) throws IOException {
this.file = file;
if (!file.exists()) {
file.createNewFile();
firstRun = true;
}
if (!file.isFile()) {
throw new FileNotFoundException(file.getAbsolutePath() + " not found");
}
if (!file.canRead() || !file.canWrite()) {
throw new AccessDeniedException(file.getAbsolutePath() + " is not accessable");
}
this.put("debug", true);
this.put("sqlite", Variables.DATABASE_NAME);
this.put("private_key", Variables.PRIVATE_KEY);
JSONObject custom_commands = new JSONObject();
custom_commands.put("Screen installieren", "apt-get install screen");
this.put("commands", custom_commands);
}
public void save() {
try {
FileWriter fw = new FileWriter(file.getAbsolutePath());
fw.write(this.toString(4));
fw.close();
} catch (IOException e) {
Logger.error(e);
}
}
public void load() {
try {
String content = new String(Files.readAllBytes(file.toPath()), "UTF-8");
if (content.isEmpty()) {
save();
return;
}
JSONTokener jt = new JSONTokener(content);
if (jt.nextClean() != 123) {
throw jt.syntaxError("A JSONObject text must begin with '{'");
} else {
while (jt.more()) {
char c = jt.nextClean();
switch (c) {
case '\u0000':
throw jt.syntaxError("A JSONObject text must end with '}'");
case '}':
return;
default:
jt.back();
String key = jt.nextValue().toString();
c = jt.nextClean();
if (c != 58) {
throw jt.syntaxError("Expected a ':' after a key");
}
this.remove(key);
this.putOnce(key, jt.nextValue());
switch (jt.nextClean()) {
case ',':
case ';':
if (jt.nextClean() == 125) {
return;
}
jt.back();
break;
case '}':
save();
return;
default:
throw jt.syntaxError("Expected a ',' or '}'");
}
}
}
}
} catch (IOException e) {
Logger.error(e);
}
}
public boolean debug() {
return getBoolean("debug");
}
public JSONObject getCustomCommands() {
return getJSONObject("commands");
}
public boolean isFirstRun() {
return firstRun;
}
}

View File

@ -17,6 +17,7 @@ import de.gurkengewuerz.monitoring.object.MassCommand;
import de.gurkengewuerz.monitoring.object.Server; import de.gurkengewuerz.monitoring.object.Server;
import de.gurkengewuerz.monitoring.object.ServerStatus; import de.gurkengewuerz.monitoring.object.ServerStatus;
import org.apache.commons.validator.routines.InetAddressValidator; import org.apache.commons.validator.routines.InetAddressValidator;
import org.json.JSONObject;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import javax.swing.*; import javax.swing.*;
@ -162,7 +163,7 @@ public class GUI {
List<Server> serverarray = new ArrayList<>(); List<Server> serverarray = new ArrayList<>();
checkedItems.forEach(s -> serverarray.add(serverlist.get(s))); checkedItems.forEach(s -> serverarray.add(serverlist.get(s)));
new ActionListDialogBuilder() ActionListDialogBuilder pre = new ActionListDialogBuilder()
.setTitle("Aktion ausführen") .setTitle("Aktion ausführen")
.setDescription("Was möchtest du unternhmen") .setDescription("Was möchtest du unternhmen")
.addAction("Löschen", () -> { .addAction("Löschen", () -> {
@ -191,9 +192,17 @@ public class GUI {
}) })
.addAction("Updaten", () -> MassCommand.run("apt-get update && apt-get upgrade -y", gui, serverarray, StartUp.getPrivate_key())) .addAction("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("Herunterfahren", () -> MassCommand.run("shutdown -h now", gui, serverarray, StartUp.getPrivate_key()))
.addAction("Neustart", () -> MassCommand.run("reboot", gui, serverarray, StartUp.getPrivate_key())) .addAction("Neustart", () -> MassCommand.run("reboot", gui, serverarray, StartUp.getPrivate_key()));
.build()
.showDialog(gui); JSONObject customCommands = StartUp.getConfig().getCustomCommands();
for (int i = 0; i < customCommands.names().length(); i++) {
String key = customCommands.names().getString(i);
String value = customCommands.getString(key);
pre.addAction(key, () -> MassCommand.run(value, gui, serverarray, StartUp.getPrivate_key()));
}
pre.build().showDialog(gui);
}).addTo(rightPanel); }).addTo(rightPanel);
new Button("Aktualisieren", () -> { new Button("Aktualisieren", () -> {
@ -215,6 +224,20 @@ public class GUI {
} }
} }
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 void updateList(CheckBoxList<String> checkBoxList, HashMap<String, Server> serverlist) { private void updateList(CheckBoxList<String> checkBoxList, HashMap<String, Server> serverlist) {
checkBoxList.clearItems(); checkBoxList.clearItems();
serverlist.forEach((s, server) -> checkBoxList.addItem(s)); serverlist.forEach((s, server) -> checkBoxList.addItem(s));
@ -256,20 +279,6 @@ public class GUI {
// "Name", "OS", "CPU", "RAM", "Uptime", "Last", "Status" // "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) { private double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException(); if (places < 0) throw new IllegalArgumentException();

View File

@ -5,6 +5,7 @@ import org.apache.commons.cli.*;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.sql.SQLException; import java.sql.SQLException;
/** /**
@ -12,22 +13,20 @@ import java.sql.SQLException;
*/ */
public class StartUp { public class StartUp {
private static Database db; private static Database db;
private static Config conf;
private static String private_key; private static String private_key;
public static void main(String... args) { public static void main(String... args) throws IOException {
// START-ARGUMENTS
Options options = new Options(); 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"); Option poller = new Option("p", "poller", false, "Start only the poller");
poller.setRequired(false); poller.setRequired(false);
options.addOption(poller); options.addOption(poller);
Option sshkey = new Option("s", "key", true, "Set ssh private key"); Option settingsfile = new Option("f", "file", true, "Set Settings file");
sshkey.setRequired(false); settingsfile.setRequired(false);
options.addOption(sshkey); options.addOption(settingsfile);
CommandLineParser parser = new DefaultParser(); CommandLineParser parser = new DefaultParser();
HelpFormatter formatter = new HelpFormatter(); HelpFormatter formatter = new HelpFormatter();
@ -42,9 +41,25 @@ public class StartUp {
System.exit(1); System.exit(1);
return; return;
} }
// END-ARGUMENTS
// START-CONFIG
String settingsFile = "." + File.separator + "settings.json";
File f = new File(cmd.getOptionValue("f", settingsFile));
conf = new Config(f);
conf.load();
if (conf.debug())
Logger.info("Benutze Konfig: " + f.getAbsolutePath());
Logger.info("Wechseln der Konfig mit --file <Pfad>");
if (conf.isFirstRun()) System.exit(0);
// END-CONFIG
// START-Datenbank
try { try {
db = new Database(cmd.getOptionValue("d", Variables.DATABASE_NAME)); db = new Database(conf.getString("sqlite"));
} catch (Exception e) { } catch (Exception e) {
Logger.error(e); Logger.error(e);
} }
@ -57,12 +72,16 @@ public class StartUp {
Logger.error(e); Logger.error(e);
System.exit(1); System.exit(1);
} }
// END-Datenbank
private_key = cmd.getOptionValue("s", Variables.PRIVATE_KEY); // START-PRIV KEY
private_key = conf.getString("private_key");
if (!new File(private_key).exists()) { if (!new File(private_key).exists()) {
Logger.error(private_key + " wurde nicht gefunden!"); Logger.error(private_key + " wurde nicht gefunden!");
System.exit(1); System.exit(1);
} }
// END-PRIV KEY
if (cmd.hasOption("p")) { if (cmd.hasOption("p")) {
new Poller(); new Poller();
} else { } else {
@ -78,6 +97,10 @@ public class StartUp {
return private_key; return private_key;
} }
public static Config getConfig() {
return conf;
}
private static void createDatabase() throws SQLException { private static void createDatabase() throws SQLException {
db.executeUpdate( db.executeUpdate(
"CREATE TABLE IF NOT EXISTS server (" + "CREATE TABLE IF NOT EXISTS server (" +

2
start.bat Normal file
View File

@ -0,0 +1,2 @@
@echo off
javaw -jar monitoring.jar --file settings.json