- UDP prijemnik (podrazumevano 46465, NE 46464 gde uredjaji slusaju discovery): dnevnik rada sa zaglavljem #TERMINIA, heartbeat JSON, sve ostalo se odbacuje - paket bez zaglavlja (FW < 0.13.4) se vodi kao "nepoznat uredjaj" po izvornoj IP adresi i tako je i oznacen u prikazu - dnevnik u fajlove po uredjaju i danu, rotacija po velicini + tri kvote (starost, po uredjaju, ukupno); otvoren fajl se nikad ne brise - heartbeat u memoriji; interval se meri iz razmaka javljanja, "tih" = 3x interval - web stranica (podrazumevano 127.0.0.1:8081): spisak uredjaja, crveno za tihe, poslednjih N linija sa pretragom, /dnevnik.txt i /api/uredjaji - bez baze i bez spoljnih zavisnosti; ne dira licencni servis, njegovu bazu, rute ni nginx - sanitizacija svega iz paketa (duzine, kontrolni znaci, ime foldera) — bez izlaska iz foldera dnevnika - systemd unit + primer env fajla + README sa uputstvom za pustanje na server - testovi: parsiranje (zaglavlje/JSON/bez zaglavlja/smece), registar, rotacija i kvote, web rute Nije pusteno na server — puštanje radi vlasnik po logger/README.md.
6.0 KiB
Prijemnik dijagnostike sa TERMINIA uređaja
Mali samostalan servis: sluša UDP pakete koje terminal šalje (dnevnik rada i heartbeat), piše ih u fajlove po uređaju i po danu, i prikazuje na jednoj web stranici.
- Nema bazu, nema spoljnih Go zavisnosti (samo standardna biblioteka).
- Ne dira licencni servis — zaseban proces, zaseban port, zaseban systemd unit. Deli samo Go modul (isti repo).
- Ugovor o formatu paketa: ASP repo,
docs/24-servisni-kanal.md.
Šta prima
| Vrsta | Kako se prepoznaje | Šta radi sa njim |
|---|---|---|
| Dnevnik rada (dbg) | čist tekst; prvi red #TERMINIA <naziv> <MAC> <fw> |
linije se upisuju u fajl uređaja |
| Heartbeat | paket počinje sa { (JSON sa "hb":1) |
pamti se u memoriji (naziv, MAC, IP, FW, vreme) |
| Sve ostalo | — | tiho se odbacuje, brojač „odbačeno" na stranici |
Zaglavlje dnevnika postoji tek od FW 0.13.4. Stariji uređaj šalje goli tekst — takav se vodi kao nepoznat uređaj, razvrstava po izvornoj IP adresi i tako je i označen na stranici (ne pravimo se da znamo ko je).
Prijemnik ne odgovara na pakete. Prijem naloga na uređaju nije implementiran i traži potpis (docs/24 §3.2), pa slanja naloga ovde nema.
Web stranica
| Ruta | Šta daje |
|---|---|
/ |
spisak uređaja: naziv, MAC, IP, FW, „poslednji put pre X"; crveno = nije se javio duže od 3× svog intervala |
/uredjaj?k=<ključ>&q=<pretraga>&n=<broj> |
poslednjih N linija dnevnika, sa pretragom po tekstu |
/dnevnik.txt?k=<ključ>&n=&q= |
isto, kao čist tekst (za curl) |
/api/uredjaji |
JSON spisak uređaja (za alate) |
Interval javljanja se meri iz razmaka između dva heartbeat-a; dok ga nema,
koristi se LOGGER_HB_DEFAULT_SEC.
Pokretanje lokalno
cd D:\Terminia\TERMINIA-SOFTWARE\licence-server
go build -o terminia-logger.exe .\logger\cmd\terminia-logger
$env:LOGGER_UDP_PORT="46465"
$env:LOGGER_HTTP_PORT="8081"
$env:LOGGER_DIR="D:\Terminia\TERMINIA-SOFTWARE\licence-server\data\logger"
.\terminia-logger.exe
Zatim otvoriti http://127.0.0.1:8081.
Proba bez uređaja (PowerShell, u drugom prozoru):
$u=New-Object System.Net.Sockets.UdpClient; $u.Connect("127.0.0.1",46465)
function Send($s){ $b=[System.Text.Encoding]::UTF8.GetBytes($s); [void]$u.Send($b,$b.Length) }
Send '{"app":"TERMINIA","name":"TERM-001","mac":"1C:DB:D4:A6:A4:60","ip":"192.168.0.20","fw":"0.13.4","hb":1}'
Send "#TERMINIA TERM-001 1C:DB:D4:A6:A4:60 0.13.4`n[stampac] javio se na 192.168.123.100`n"
$u.Close()
Testovi:
go test ./logger/...
Env promenljive
| Promenljiva | Podrazumevano | Značenje |
|---|---|---|
LOGGER_UDP_PORT |
46465 |
port na koji uređaji šalju. Ne 46464 — tamo uređaji slušaju discovery |
LOGGER_UDP_HOST |
(prazno) | adresa za slušanje; prazno = sve |
LOGGER_HTTP_HOST |
127.0.0.1 |
web sluša samo lokalno jer dnevnik sadrži brojeve karata |
LOGGER_HTTP_PORT |
8081 |
port web pregleda |
LOGGER_TOKEN |
(prazno) | ako je postavljen, web traži ?t=<token> (obavezno ako web nije samo lokalni) |
LOGGER_DIR |
./data/logger |
folder sa dnevnicima |
LOGGER_KEEP_DAYS |
14 |
koliko dana se dnevnici čuvaju |
LOGGER_MAX_FILE_MB |
10 |
preko toga se dnevni fajl rotira (.log.001, .002…) |
LOGGER_MAX_DEVICE_MB |
50 |
kvota po uređaju; preko toga se briše najstarije |
LOGGER_MAX_TOTAL_MB |
1024 |
ukupna kvota za sve uređaje |
LOGGER_MAX_DEVICES |
500 |
koliko uređaja se drži u memoriji |
LOGGER_HB_DEFAULT_SEC |
60 |
pretpostavljeni interval dok se ne izmeri |
Neispravna vrednost = servis se ne pokreće i kaže koja promenljiva ne valja (bolje nego da tiho radi sa pogrešnim podešavanjem).
Šta se upisuje u uređaj
U SPA uređaja: Podešavanja → Servis
| Polje | Vrednost |
|---|---|
svcLogHost |
157.180.119.151:46465 |
| „Šalji dnevnik rada na server" | uključeno |
heartbeat (svcHbSeconds) |
npr. 60 |
Uređaj šalje samo brojčani IP:port — domen se ne može upisati (docs/24 §1).
⚠️ Ovo ide preko interneta u čistom tekstu, a u dnevniku ima brojeva karata. Za trajno praćenje flote predviđen je HTTPS kanal (docs/24 §3); ovaj prijemnik je za dijagnostiku dok se problem lovi.
Puštanje na server (radi vlasnik)
# 1) build na serveru
cd /root/projects/licence-server
git pull
go build -o terminia-logger ./logger/cmd/terminia-logger
# 2) podešavanja
cp logger/deploy/terminia-logger.env.example logger.env
$EDITOR logger.env
# 3) systemd
cp logger/deploy/terminia-logger.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable --now terminia-logger
systemctl status terminia-logger
journalctl -u terminia-logger -f
# 4) firewall — SAMO taj port, UDP
ufw allow 46465/udp
# 5) provera sa strane (ne sme da vrati odgovor, samo da ne pukne)
echo '#TERMINIA PROBA AA:BB:CC:DD:EE:FF 0.13.4
proba veze' | nc -u -w1 157.180.119.151 46465
# 6) pregled (web je vezan za 127.0.0.1) — SSH tunel sa svog racunara:
ssh -L 8081:127.0.0.1:8081 root@157.180.119.151
# pa u pregledacu: http://127.0.0.1:8081
Ako web treba da bude dostupan bez tunela: postaviti LOGGER_TOKEN, staviti
nginx ispred sa TLS-om i lozinkom, i tek onda promeniti LOGGER_HTTP_HOST.
Ne otvarati port 8081 direktno na internet.
Šta ovaj servis ne dira: bazu licence_db, proces licence-server, nginx
konfiguraciju, portove 8090/8091/8092.
Granice i odbrane
- Paket može poslati bilo ko: sve iz paketa je ograničeno po dužini, kontrolni
znaci se izbacuju, a ime foldera se pravi isključivo od belih znakova
(
[A-Za-z0-9_-]) — sadržaj paketa ne može da odluči gde se piše. - Broj uređaja u memoriji je ograničen; kad se granica dostigne, izbacuje se onaj koji se najduže nije javio.
- Dnevnici se brišu po tri pravila redom: starost → kvota po uređaju → ukupna kvota. Fajl koji je trenutno otvoren za pisanje se nikad ne briše.
- Greška pri upisu ne obara prijem — vidi se kao brojač „greške upisa".