This commit is contained in:
101
main.go
101
main.go
@@ -71,6 +71,7 @@ func main() {
|
||||
}
|
||||
|
||||
// Server
|
||||
http.HandleFunc("/", handleGUI)
|
||||
http.HandleFunc("/whitelist", handleWhitelist)
|
||||
http.HandleFunc("/check/", handleCheck)
|
||||
http.Handle("/metrics", promhttp.Handler())
|
||||
@@ -223,7 +224,13 @@ func handleCheck(w http.ResponseWriter, r *http.Request) {
|
||||
http.Error(w, "invalid IP", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
cats := []string{"firehol", "bitwire", "RU", "CN"}
|
||||
|
||||
var cats []string
|
||||
for a, _ := range blocklistURLs {
|
||||
cats = append(cats, a)
|
||||
}
|
||||
|
||||
//cats := []string{"firehol", "bitwire", "RU", "CN"}
|
||||
matches, err := checkIP(ip, cats)
|
||||
if err != nil {
|
||||
http.Error(w, "server error", http.StatusInternalServerError)
|
||||
@@ -303,3 +310,95 @@ func writeJSON(w http.ResponseWriter, v any) {
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
_ = json.NewEncoder(w).Encode(v)
|
||||
}
|
||||
|
||||
func handleGUI(w http.ResponseWriter, r *http.Request) {
|
||||
html := `
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>IP Checker GUI</title>
|
||||
<style>
|
||||
body { font-family: sans-serif; max-width: 600px; margin: auto; padding: 2em; background: #f9fafb; }
|
||||
h1 { font-size: 1.5em; margin-bottom: 1em; }
|
||||
input, button { padding: 0.7em; margin: 0.3em 0; width: 100%; border-radius: 0.4em; border: 1px solid #ccc; }
|
||||
button { background: #2563eb; color: white; border: none; cursor: pointer; }
|
||||
button:hover { background: #1d4ed8; }
|
||||
#result, #metrics, #history { background: white; border: 1px solid #ddd; padding: 1em; border-radius: 0.4em; margin-top: 1em; white-space: pre-wrap; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>IP Checker + Whitelist GUI</h1>
|
||||
<input id="ipInput" type="text" placeholder="Enter IP-Address...">
|
||||
<button onclick="checkIP()">Check IP</button>
|
||||
<button onclick="whitelistIP()">Whitelist IP</button>
|
||||
|
||||
<h2>Ergebnis</h2>
|
||||
<div id="result">No Request</div>
|
||||
|
||||
<h2>Prometheus Metrics</h2>
|
||||
<div id="metrics">Loading...</div>
|
||||
|
||||
<h2>Check History</h2>
|
||||
<div id="history">No history</div>
|
||||
|
||||
<script>
|
||||
async function checkIP() {
|
||||
const ip = document.getElementById('ipInput').value.trim();
|
||||
if (!ip) { alert("Please enter IP!"); return; }
|
||||
const res = await fetch('/check/' + ip);
|
||||
const data = await res.json();
|
||||
document.getElementById('result').innerText = JSON.stringify(data, null, 2);
|
||||
addHistory(ip, data);
|
||||
}
|
||||
|
||||
async function whitelistIP() {
|
||||
const ip = document.getElementById('ipInput').value.trim();
|
||||
if (!ip) { alert("Please enter IP!"); return; }
|
||||
const res = await fetch('/whitelist', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify({ip})
|
||||
});
|
||||
const data = await res.json();
|
||||
document.getElementById('result').innerText = JSON.stringify(data, null, 2);
|
||||
addHistory(ip, data);
|
||||
}
|
||||
|
||||
function addHistory(ip, data) {
|
||||
let history = JSON.parse(localStorage.getItem('ipHistory') || '[]');
|
||||
history.unshift({ip, data, ts: new Date().toLocaleString()});
|
||||
if (history.length > 10) history = history.slice(0, 10);
|
||||
localStorage.setItem('ipHistory', JSON.stringify(history));
|
||||
renderHistory();
|
||||
}
|
||||
|
||||
function renderHistory() {
|
||||
let history = JSON.parse(localStorage.getItem('ipHistory') || '[]');
|
||||
if (history.length === 0) {
|
||||
document.getElementById('history').innerText = 'Nothing checked yet';
|
||||
return;
|
||||
}
|
||||
document.getElementById('history').innerText = history.map(e =>
|
||||
e.ts + ": " + e.ip + " → blocked=" + (e.data.blocked ? "yes" : "no") +
|
||||
(e.data.categories ? " [" + e.data.categories.join(", ") + "]" : "")
|
||||
).join("\n");
|
||||
}
|
||||
|
||||
async function loadMetrics() {
|
||||
const res = await fetch('/metrics');
|
||||
const text = await res.text();
|
||||
const lines = text.split('\n').filter(l => l.includes('ipcheck_'));
|
||||
document.getElementById('metrics').innerText = lines.join('\n') || 'No Data';
|
||||
}
|
||||
|
||||
renderHistory();
|
||||
setInterval(loadMetrics, 3000);
|
||||
loadMetrics();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
`
|
||||
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||
_, _ = w.Write([]byte(html))
|
||||
}
|
||||
|
Reference in New Issue
Block a user