This commit is contained in:
101
main.go
101
main.go
@@ -71,6 +71,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Server
|
// Server
|
||||||
|
http.HandleFunc("/", handleGUI)
|
||||||
http.HandleFunc("/whitelist", handleWhitelist)
|
http.HandleFunc("/whitelist", handleWhitelist)
|
||||||
http.HandleFunc("/check/", handleCheck)
|
http.HandleFunc("/check/", handleCheck)
|
||||||
http.Handle("/metrics", promhttp.Handler())
|
http.Handle("/metrics", promhttp.Handler())
|
||||||
@@ -223,7 +224,13 @@ func handleCheck(w http.ResponseWriter, r *http.Request) {
|
|||||||
http.Error(w, "invalid IP", http.StatusBadRequest)
|
http.Error(w, "invalid IP", http.StatusBadRequest)
|
||||||
return
|
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)
|
matches, err := checkIP(ip, cats)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
http.Error(w, "server error", http.StatusInternalServerError)
|
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")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
_ = json.NewEncoder(w).Encode(v)
|
_ = 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