🔥 Sync 2026-05-27 08:43:02

This commit is contained in:
github-actions[bot] committed 2026-05-27 08:43:02 +08:00
1 parent bbd22dd0b2
commit 9a80633c00
19 files changed
+2685 -109

No files matched your search

@@ -1,15 +1,18 @@
#!/bin/sh
# Copyright 2024 Rafał Wabik (IceG) - From eko.one.pl forum
# Copyright 2024-2026 Rafał Wabik (IceG) - From eko.one.pl forum
# Licensed to the GNU General Public License v3.0.
chmod +x /etc/uci-defaults/setup_easyconfig_transfer.sh 2>&1 &
chmod +x /sbin/transfer2cron.sh 2>&1 &
chmod +x /sbin/backup2cron.sh 2>&1 &
chmod +x /usr/bin/easyconfig_statistics.sh 2>&1 &
chmod +x /usr/bin/easyconfig_statistics.uc 2>&1 &
chmod +x /etc/uci-defaults/setup_easyconfig_transfer.sh >/dev/null 2>&1 &
echo "{}" > /tmp/easyconfig_statistics.json
chmod +x /usr/bin/auto_reset_statistics.sh >/dev/null 2>&1 &
rm -rf /tmp/luci-indexcache 2>&1 &
rm -rf /tmp/luci-modulecache/ 2>&1 &
chmod +x /usr/bin/easyconfig_statistics.sh >/dev/null 2>&1 &
chmod +x /usr/bin/easyconfig_statistics.uc >/dev/null 2>&1 &
echo "{}" > /tmp/easyconfig_statistics.json >/dev/null 2>&1 &
mkdir -p /usr/lib/easyconfig >/dev/null 2>&1 &
rm -rf /tmp/luci-indexcache >/dev/null 2>&1 &
rm -rf /tmp/luci-modulecache/ >/dev/null 2>&1 &
exit 0
@@ -24,38 +24,112 @@ MBACKUP=$(uci -q get easyconfig_transfer.traffic.external_backup)
MBACKUPATH=$(uci -q get easyconfig_transfer.traffic.external_path)
EXTERNAL_JSON="$MBACKUPATH/easyconfig_statistics.json"
json_valid() {
local file="$1"
[ -e "$file" ] || return 1
[ -s "$file" ] || return 1
jq -e 'type == "object"' "$file" >/dev/null 2>&1
}
safe_copy() {
local src="$1"
local dst="$2"
if json_valid "$src"; then
cp "$src" "$dst"
return 0
else
logger -t easyconfig_statistics "OSTRZEŻENIE: plik $src zawiera nieprawidłowy JSON, pomijam kopiowanie"
return 1
fi
}
if [ ! -e "$DB" ]; then
if [ "$MBACKUP" = "1" ] && [ -n "$MBACKUPATH" ] && [ -e "$EXTERNAL_JSON" ] && [ -e "$SDB" ]; then
TMP_GZ=/tmp/easyconfig_statistics_gz_tmp.json
zcat "$SDB" > "$TMP_GZ" 2>/dev/null
if [ -e "$TMP_GZ" ]; then
EXT_SIZE=$(wc -c < "$EXTERNAL_JSON")
GZ_SIZE=$(wc -c < "$TMP_GZ")
if [ "$EXT_SIZE" -gt "$GZ_SIZE" ]; then
EXT_VALID=0
GZ_VALID=0
json_valid "$EXTERNAL_JSON" && EXT_VALID=1
json_valid "$TMP_GZ" && GZ_VALID=1
if [ "$EXT_VALID" = "1" ] && [ "$GZ_VALID" = "1" ]; then
EXT_SIZE=$(wc -c < "$EXTERNAL_JSON")
GZ_SIZE=$(wc -c < "$TMP_GZ")
if [ "$EXT_SIZE" -gt "$GZ_SIZE" ]; then
cp "$EXTERNAL_JSON" "$DB"
else
cp "$TMP_GZ" "$DB"
easyconfig_statistics.uc "init" "init" 0 0 0 "" 0
fi
elif [ "$EXT_VALID" = "1" ]; then
logger -t easyconfig_statistics "OSTRZEŻENIE: plik gz zawiera nieprawidłowy JSON, używam zewnętrznej kopii"
cp "$EXTERNAL_JSON" "$DB"
else
elif [ "$GZ_VALID" = "1" ]; then
logger -t easyconfig_statistics "OSTRZEŻENIE: zewnętrzna kopia zawiera nieprawidłowy JSON, używam pliku gz"
cp "$TMP_GZ" "$DB"
easyconfig_statistics.uc "init" "init" 0 0 0 "" 0
else
logger -t easyconfig_statistics "OSTRZEŻENIE: oba źródła zawierają nieprawidłowy JSON, inicjalizuję nową bazę"
mkdir -p $(dirname "$SDB")
echo "{}" > "$DB"
fi
rm -f "$TMP_GZ"
else
cp "$EXTERNAL_JSON" "$DB"
safe_copy "$EXTERNAL_JSON" "$DB" || echo "{}" > "$DB"
fi
elif [ "$MBACKUP" = "1" ] && [ -n "$MBACKUPATH" ] && [ -e "$EXTERNAL_JSON" ]; then
cp "$EXTERNAL_JSON" "$DB"
safe_copy "$EXTERNAL_JSON" "$DB" || echo "{}" > "$DB"
elif [ -e "$SDB" ]; then
zcat "$SDB" > "$DB"
easyconfig_statistics.uc "init" "init" 0 0 0 "" 0
TMP_GZ=/tmp/easyconfig_statistics_gz_tmp.json
zcat "$SDB" > "$TMP_GZ" 2>/dev/null
if json_valid "$TMP_GZ"; then
mv "$TMP_GZ" "$DB"
easyconfig_statistics.uc "init" "init" 0 0 0 "" 0
else
logger -t easyconfig_statistics "OSTRZEŻENIE: plik gz zawiera nieprawidłowy JSON, inicjalizuję nową bazę"
rm -f "$TMP_GZ"
mkdir -p $(dirname "$SDB")
echo "{}" > "$DB"
fi
else
mkdir -p $(dirname "$SDB")
echo "{}" > "$DB"
fi
else
if [ "$MBACKUP" = "1" ] && [ -n "$MBACKUPATH" ] && [ -e "$EXTERNAL_JSON" ]; then
EXT_SIZE=$(wc -c < "$EXTERNAL_JSON")
DB_SIZE=$(wc -c < "$DB")
if [ "$EXT_SIZE" -gt "$DB_SIZE" ]; then
if ! json_valid "$DB"; then
logger -t easyconfig_statistics "OSTRZEŻENIE: bieżący plik $DB jest uszkodzony, próba odtworzenia"
if [ "$MBACKUP" = "1" ] && [ -n "$MBACKUPATH" ] && json_valid "$EXTERNAL_JSON"; then
logger -t easyconfig_statistics "Odtwarzanie z zewnętrznej kopii: $EXTERNAL_JSON"
cp "$EXTERNAL_JSON" "$DB"
elif [ -e "$SDB" ]; then
TMP_GZ=/tmp/easyconfig_statistics_gz_tmp.json
zcat "$SDB" > "$TMP_GZ" 2>/dev/null
if json_valid "$TMP_GZ"; then
logger -t easyconfig_statistics "Odtwarzanie z pliku gz: $SDB"
mv "$TMP_GZ" "$DB"
else
logger -t easyconfig_statistics "BŁĄD: brak poprawnego źródła do odtworzenia, inicjalizuję nową bazę"
rm -f "$TMP_GZ"
echo "{}" > "$DB"
fi
else
logger -t easyconfig_statistics "BŁĄD: brak źródła do odtworzenia, inicjalizuję nową bazę"
echo "{}" > "$DB"
fi
else
if [ "$MBACKUP" = "1" ] && [ -n "$MBACKUPATH" ] && [ -e "$EXTERNAL_JSON" ]; then
if json_valid "$EXTERNAL_JSON"; then
EXT_SIZE=$(wc -c < "$EXTERNAL_JSON")
DB_SIZE=$(wc -c < "$DB")
if [ "$EXT_SIZE" -gt "$DB_SIZE" ]; then
cp "$EXTERNAL_JSON" "$DB"
fi
else
logger -t easyconfig_statistics "OSTRZEŻENIE: zewnętrzna kopia $EXTERNAL_JSON jest uszkodzona, pomijam nadpisanie"
fi
fi
fi
fi
@@ -103,13 +177,21 @@ else
WRITETS=$((NOW - 1))
fi
if [ $WRITETS -le $NOW ]; then
gzip -k "$DB"
mv "$DB.gz" "$SDB"
sync
if json_valid "$DB"; then
gzip -k "$DB"
mv "$DB.gz" "$SDB"
sync
else
logger -t easyconfig_statistics "OSTRZEŻENIE: $DB jest uszkodzony, pomijam zapis do archiwum gz"
fi
fi
if [ "$MBACKUP" = "1" ]; then
sleep 10
cp "$DB" "$MBACKUPATH/easyconfig_statistics.json"
if json_valid "$DB"; then
cp "$DB" "$MBACKUPATH/easyconfig_statistics.json"
else
logger -t easyconfig_statistics "OSTRZEŻENIE: $DB jest uszkodzony, pomijam kopię zewnętrzną"
fi
fi
lock -u $LOCK
@@ -9,9 +9,10 @@
// From eko.one.pl forum
//
import { readfile, writefile } from "fs";
import { readfile, writefile, rename, unlink, error } from "fs";
let filename = `/tmp/easyconfig_statistics.json`;
let filename_tmp = `/tmp/easyconfig_statistics.json.tmp`;
let MAC = shift(ARGV);
let IFNAME = shift(ARGV);
@@ -43,11 +44,49 @@ let day = sprintf("%04d%02d%02d", ts.year, ts.mon, ts.mday);
let hour = sprintf("%02d", ts.hour);
let ts_now = sprintf("%04d%02d%02d%02d%02d", ts.year, ts.mon, ts.mday, ts.hour, ts.min);
function safe_write(data) {
let serialized = sprintf("%J", data);
if (!serialized || length(serialized) < 2) {
warn("easyconfig_statistics.uc: błąd serializacji danych, zapis pominięty\n");
return false;
}
let verify = null;
try { verify = json(serialized); }
catch { verify = null; }
if (verify === null) {
warn("easyconfig_statistics.uc: walidacja JSON nie powiodła się, zapis pominięty\n");
return false;
}
let ret = writefile(filename_tmp, serialized);
if (!ret) {
warn("easyconfig_statistics.uc: nie można zapisać pliku tymczasowego\n");
unlink(filename_tmp);
return false;
}
if (!rename(filename_tmp, filename)) {
warn("easyconfig_statistics.uc: nie można zastąpić pliku docelowego (rename)\n");
unlink(filename_tmp);
return false;
}
return true;
}
let db = {};
let content = readfile(filename);
if (content) {
try { db = json(content); }
catch { db = {}; }
catch {
warn("easyconfig_statistics.uc: uszkodzony JSON w pliku bazy, resetowanie do {}\n");
db = {};
}
if (type(db) != "object" || db === null) {
warn("easyconfig_statistics.uc: nieprawidłowy typ danych w bazie, resetowanie do {}\n");
db = {};
}
}
let tmp = null;
@@ -63,7 +102,7 @@ if (IFNAME == "init") {
}
}
}
writefile(filename, db);
safe_write(db);
exit(0)
}
@@ -71,7 +110,7 @@ if (IFNAME == "delete") {
tmp = db[MAC];
if (tmp) {
delete db[MAC];
writefile(filename, db);
safe_write(db);
}
exit(0)
}
@@ -126,7 +165,6 @@ if (CONNECTED <= 60) {
db[MAC][IFNAME][day].total_tx = total_tx + dtx;
db[MAC][IFNAME][day].total_rx = total_rx + drx;
// Dodaj statystyki godzinowe tylko jeśli był jakiś ruch danych
if (dtx > 0 || drx > 0) {
if (!db[MAC][IFNAME][day].hours[hour]) {
db[MAC][IFNAME][day].hours[hour] = {
@@ -147,5 +185,5 @@ db[MAC][IFNAME].last_rx = RX;
db[MAC][IFNAME].last_seen = ts_now;
db[MAC].last_seen = ts_now;
writefile(filename, db);
safe_write(db);
exit(0);
@@ -18,9 +18,7 @@
"/usr/bin/easyconfig_statistics.uc": [ "exec" ],
"/usr/bin/easyconfig_statistics.sh": [ "exec" ],
"/usr/bin/auto_reset_statistics.sh": [ "exec" ],
"/sbin/transfer2cron.sh": [ "exec" ],
"/sbin/backup2cron.sh": [ "exec" ],
"/sbin/ar2cron.sh": [ "exec" ],
"/etc/init.d/cron restart": [ "exec" ],
"/tmp/easyconfig_statistics.json": [ "read" ],
"/tmp/easyconfig_statistics_gz_tmp.json": [ "read" ],
"/tmp/dhcp.leases": [ "read" ],
@@ -28,6 +26,7 @@
"/usr/lib/easyconfig/easyconfig_statistics.json": [ "read" ],
"/var/lock/easyconfig_statistics.lock": [ "read" ],
"/etc/config/easyconfig_transfer": [ "read" ],
"/etc/crontabs/root": [ "read" ],
"/mnt/easyconfig_statistics.json": [ "read" ]
},
"uci": [ "easyconfig_transfer" ]
@@ -41,9 +40,7 @@
"/usr/bin/easyconfig_statistics.uc": [ "exec" ],
"/usr/bin/easyconfig_statistics.sh": [ "exec" ],
"/usr/bin/auto_reset_statistics.sh": [ "exec" ],
"/sbin/transfer2cron.sh": [ "exec" ],
"/sbin/backup2cron.sh": [ "exec" ],
"/sbin/ar2cron.sh": [ "exec" ],
"/etc/init.d/cron restart": [ "exec" ],
"/tmp/easyconfig_statistics.json": [ "write" ],
"/tmp/easyconfig_statistics.json.gz": [ "write" ],
"/tmp/easyconfig_statistics_gz_tmp.json": [ "write" ],
@@ -51,6 +48,7 @@
"/usr/lib/easyconfig/easyconfig_statistics.json": [ "write" ],
"/var/lock/easyconfig_statistics.lock": [ "write" ],
"/etc/config/easyconfig_transfer": [ "write" ],
"/etc/crontabs/root": [ "write" ],
"/mnt/easyconfig_statistics.json": [ "write" ]
},
"ubus": {