const express = require('express'); const path = require('path'); const fs = require('fs'); const app = express(); const port = 4000; // Ordner-Struktur const logsDir = path.join(__dirname, 'logs'); const certificatesDir = path.join(__dirname, 'resources/docs/certificates'); const galleryDir = path.join(__dirname, 'resources/images/gallery'); // Statische Dateien bereitstellen app.use('/db', express.static(path.join(__dirname, 'database'))); app.use('/styles', express.static(path.join(__dirname, 'resources/stylesheets'))); app.use('/scripts', express.static(path.join(__dirname, 'resources/scripts'))); app.use('/content', express.static(path.join(__dirname, 'resources/content'))); app.use('/docs', express.static(path.join(__dirname, 'resources/docs'))); app.use('/images', express.static(path.join(__dirname, 'resources/images'))); // Helper-Funktion: Deutscher Zeitstempel function getGermanTimestamp(){return new Date().toLocaleString("de-DE",{timeZone:"Europe/Berlin",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).replace(",","")} // Statistik aktualisieren function updateStatistics(e,t,r,i,s){let l=s.getFullYear(),a=path.join(logsDir,`statistics-${l}.log`),n={total:0,referrers:{},devices:{},browsers:{},daily:{},monthly:{}};if(fs.existsSync(a))try{n=JSON.parse(fs.readFileSync(a,"utf8"))}catch(o){console.error("Fehler beim Parsen der Statistikdatei:",o)}let c=s.toISOString().split("T")[0],y=s.toISOString().substring(0,7);n.total++,n.referrers[e]=(n.referrers[e]||0)+1,n.devices[r]=(n.devices[r]||0)+1,n.browsers[i]=(n.browsers[i]||0)+1,n.daily[c]=(n.daily[c]||0)+1,n.monthly[y]=(n.monthly[y]||0)+1,fs.writeFileSync(a,JSON.stringify(n,null,2))} // Alte Logs aufräumen (älter als 6 Monate) function cleanupOldLogs(){let e=new Date;fs.readdir(logsDir,(n,r)=>{if(n)return console.error("Fehler beim Lesen des Logs-Verzeichnisses:",n);r.forEach(n=>{if(/^user-access-\d{2}-\d{4}\.log$/.test(n)){let[r,t]=n.match(/\d+/g).map(Number),l=new Date(t,r-1),s=(e.getFullYear()-l.getFullYear())*12+e.getMonth()-l.getMonth();s>6&&fs.unlink(path.join(logsDir,n),()=>{})}})})} // Dashboard anzeigen app.get("/dashboard", (req, res) => { const filePath = path.join(logsDir, `statistics-${new Date().getFullYear()}.log`); if (!fs.existsSync(filePath)) return res.send("

Keine Statistiken gefunden.

"); const stats = JSON.parse(fs.readFileSync(filePath, 'utf8')); const mostUsed = (obj) => Object.entries(obj).reduce((a, b) => (a[1] > b[1] ? a : b), ["-", 0])[0]; const dailyLabels = Object.keys(stats.daily).map(date => `'${date}'`).join(","); const dailyData = Object.values(stats.daily).join(","); const monthlyLabels = Object.keys(stats.monthly).map(month => `'${month}'`).join(","); const monthlyData = Object.values(stats.monthly).join(","); const referrerTable = Object.entries(stats.referrers) .sort((a, b) => b[1] - a[1]) .map(([ref, count]) => `${ref}${count}`) .join(""); const html = ` Andreas Reimann | Statistik

📊 Website Statistik

Total User Access: ${stats.total}
Most Used Referrer: ${mostUsed(stats.referrers)}
Most Used Device: ${mostUsed(stats.devices)}
Most Used Browser: ${mostUsed(stats.browsers)}
Average Daily Access: ${(stats.total / Object.keys(stats.daily).length).toFixed(2)}
Average Monthly Access: ${(stats.total / Object.keys(stats.monthly).length).toFixed(2)}

Live Referrer-Tabelle

${referrerTable}
ReferrerAnzahl
`; res.send(html); }); // API: Bildergalerie app.get("/get-images",(e,s)=>{fs.readdir(galleryDir,(e,i)=>{if(e)return s.status(500).send("Fehler beim Lesen des Verzeichnisses");let t=i.filter(e=>/\.(jpg|jpeg|png|gif|webp)$/i.test(e));s.json(t)})}); // API: Zertifikate app.get("/get-certificates",(e,t)=>{fs.readdir(certificatesDir,(e,r)=>{if(e)return t.status(500).send("Serverfehler");let i=r.filter(e=>/\.(jpg|jpeg|png|webp)$/i.test(e));t.json(i)})}); // Logging & Interface-Ausgabe app.get("*",(e,r)=>{fs.existsSync(logsDir)||fs.mkdirSync(logsDir);let t=new Date,n=path.join(logsDir,`user-access-${String(t.getMonth()+1).padStart(2,"0")}-${t.getFullYear()}.log`);e.headers["x-forwarded-for"]||e.socket.remoteAddress;let s=e.get("Referer")||"Direct Access",i=e.get("User-Agent")||"Unknown",o=/mobile/i.test(i)?"Mobile":"Desktop",a=i.match(/(Firefox|Chrome|Safari|Opera|Edg|Brave)/i),c=a?a[0]:"Unknown",d=`[\${getGermanTimestamp()}] \${ip} accessed website Referrer: \${referrer} User-Agent: \${userAgent} `;fs.appendFile(n,d,e=>{e&&console.error("Fehler beim Schreiben des Logs:",e)}),updateStatistics(s,i,o,c,t),cleanupOldLogs(),r.sendFile(path.join(__dirname,"interface.html"))}); // Cache-Header deaktivieren app.use((e,a,o)=>{a.setHeader("Cache-Control","no-store, no-cache, must-revalidate, proxy-revalidate"),o()}); app.listen(port,()=>{console.log(`Online on http://localhost:${port}`)});