Ein leichtgewichtiges, sicheres Log-Viewer-Backend auf Basis von Mojolicious::Lite. Das Tool stellt Logdateien ueber eine REST-API zur Verfuegung und ist fuer den praxisnahen Admin-Einsatz gedacht.
Kein UI, kein Overengineering, klarer Fokus auf Sicherheit und Stabilitaet.
- REST API (JSON und Text)
- Anzeige mehrerer Logverzeichnisse
- Lesen einzelner Logdateien mit
tail - Limitierung der ausgelesenen Zeilen
- Asynchroner Tail-Aufruf via Subprocess
- IP-basierte Zugriffskontrolle (IPv4 CIDR)
- Optionaler API-Token (Header)
- Schutz gegen Directory Traversal
- UTF-8 saubere Ausgabe
- Sauberes Server-Logging
- Framework: Mojolicious::Lite
- Event Loop: Mojo::IOLoop
- Async Jobs: Mojo::IOLoop->subprocess
- Logging: Mojo::Log
- Konfiguration: JSON
- Authentisierung: IP ACL und optionaler Token
- Ausgabeformate: JSON und text/plain
Das Tool ist zustandslos und eignet sich fuer systemd-Services oder Container.
- Perl (empfohlen >= 5.20)
- Mojolicious
Verwendete Module:
- Mojolicious::Lite
- Mojo::Log
- Mojo::File
- Mojo::Promise
- Mojo::Util
- Mojo::JSON
- Mojo::Date
Keine externen Non-Core-Abhaengigkeiten.
git clone https://github.com/hec1976/logviewer-rest-api.git
cd logviewer-rest-api
chmod +x logviewer-agent.plFalls Mojolicious noch fehlt:
cpanm MojoliciousDie Konfiguration erfolgt ueber eine Datei config.json im gleichen Verzeichnis wie das Script.
{
"listen": "127.0.0.1:3000",
"https": false,
"ssl_cert_file": "",
"ssl_key_file": "",
"logfile": "/var/log/logviewer.log",
"allowed_ips": [
"127.0.0.1",
"192.168.1.0/24"
],
"logdirs": {
"system": {
"path": "/var/log"
},
"mail": {
"path": "/var/log/mail"
}
}
}- Alle Logverzeichnisse werden beim Start aufgeloest (realpath)
- Symlinks werden konsequent abgelehnt
- Zugriff ausserhalb der definierten Logverzeichnisse ist nicht moeglich
Unterstuetzt:
- IPv4 Einzeladressen
- IPv4 CIDR Netze
IPv6 wird aktuell nur als Exact-Match unterstuetzt.
Wenn allowed_ips nicht gesetzt oder leer ist, ist der Zugriff nicht eingeschraenkt.
Das API-Token wird ueber eine Environment Variable gesetzt:
export API_TOKEN="geheim"Der Client muss den Header mitsenden:
X-API-Token: geheimWenn kein Token gesetzt ist, erfolgt kein Token-Check.
GET /
{
"info": "Log-Viewer REST-API",
"version": "1.3",
"api": [
"/logdirs",
"/log/:name",
"/log/:name/*file?lines=2000"
]
}GET /logdirs
{
"ok": 1,
"logdirs": [
{
"name": "system",
"path": "/var/log"
}
]
}GET /log/{name}
{
"ok": 1,
"dir": "system",
"files": [
"syslog",
"messages",
"auth.log"
]
}GET /log/{name}/{file}?lines=2000
Antwort:
- Content-Type: text/plain; charset=UTF-8
- Reiner Tail-Output der Datei
Der Zugriff auf Logdateien erfolgt asynchron ueber
Mojo::IOLoop->subprocess.
Dadurch:
- blockieren keine Worker
- parallele Requests bleiben stabil
- auch groessere Logs sind unkritisch
Empfehlung:
Bei vielen parallelen Zugriffen ist der asynchrone Tail-Aufruf sinnvoll. Fuer den normalen Admin-Betrieb ist die aktuelle Implementierung optimal.
Alle Fehler werden konsistent als JSON zurueckgegeben:
{
"ok": 0,
"error": "Fehlermeldung"
}Verwendete HTTP Status Codes:
- 400 Bad Request
- 401 Unauthorized
- 403 Forbidden
- 404 Not Found
- 500 Internal Server Error
- Logging erfolgt ueber Mojo::Log
- Logfile wird in
config.jsondefiniert - Sicherheitsrelevante Ereignisse werden explizit geloggt
[Unit]
Description=Log Viewer REST API
After=network.target
[Service]
ExecStart=/usr/bin/perl /opt/logviewer/logviewer-agent.pl
WorkingDirectory=/opt/logviewer
Restart=always
Environment=API_TOKEN=geheim
[Install]
WantedBy=multi-user.target