:local keep 3;
:local dir "usb1/backups";
:local prefix "rb5009";
:local exportSensitive false;
:log info ("[USB1_Backup_Rotate] start, keep=" . $keep);
# usb1 + dir checks
:if ([:len [/file find where name="usb1"]] = 0) do={
:log error "[USB1_Backup_Rotate] usb1 not found";
:error "usb1 not found";
};
:if ([:len [/file find where name=$dir]] = 0) do={
:log error ("[USB1_Backup_Rotate] missing dir: " . $dir);
:error "dir missing";
};
# timestamp 20260121_103104
:local d [/system clock get date];
:local t [/system clock get time];
:local stamp ([:pick $d 0 4] . [:pick $d 5 7] . [:pick $d 8 10] . "_" . [:pick $t 0 2] . [:pick $t 3 5] . [:pick $t 6 8]);
:local base ($dir . "/" . $prefix . "_" . $stamp);
# create backup + export
:do { /system backup save name=$base; } on-error={ :log error ("[USB1_Backup_Rotate] backup failed: " . $message); :error "backup failed"; };
:if ($exportSensitive) do={
:do { /export show-sensitive file=$base; } on-error={ :log error ("[USB1_Backup_Rotate] export failed: " . $message); :error "export failed"; };
} else={
:do { /export file=$base; } on-error={ :log error ("[USB1_Backup_Rotate] export failed: " . $message); :error "export failed"; };
};
:log info ("[USB1_Backup_Rotate] created " . $base . ".backup and .rsc");
# ---------- ROTATION: delete oldest SETS by numeric stamp ----------
:local pref ($dir . "/" . $prefix . "_");
:local sufBackup ".backup";
:local sufRsc ".rsc";
:local all [/file find where name~("^" . $dir . "/")];
# count sets by .backup
:local countSets 0;
:foreach f in=$all do={
:local n [/file get $f name];
:if ([:find $n $pref] = 0) do={
:local ln [:len $n];
:local ls [:len $sufBackup];
:if ($ln >= $ls) do={
:if ([:pick $n ($ln - $ls) $ln] = $sufBackup) do={ :set countSets ($countSets + 1); };
};
};
};
:while ($countSets > $keep) do={
:local minStampPart "";
:local minStampNum 0;
:foreach f in=$all do={
:local n [/file get $f name];
:if ([:find $n $pref] = 0) do={
:local ln [:len $n];
:local ls [:len $sufBackup];
:if ($ln >= $ls) do={
:if ([:pick $n ($ln - $ls) $ln] = $sufBackup) do={
# extract STAMP from ".../rb5009_STAMP.backup"
:local baseLen ([:len $pref]);
:local stampPart [:pick $n $baseLen ($ln - $ls)];
# make numeric 20260121103104 from "20260121_103104"
:local stampNum [:tonum ([:pick $stampPart 0 8] . [:pick $stampPart 9 15])];
:if ($minStampPart = "") do={
:set minStampPart $stampPart;
:set minStampNum $stampNum;
} else={
:if ($stampNum < $minStampNum) do={
:set minStampPart $stampPart;
:set minStampNum $stampNum;
};
};
};
};
};
};
:if ($minStampPart = "") do={
:log warning "[USB1_Backup_Rotate] rotate: no .backup found";
:set countSets 0;
} else={
:local delBackup ($pref . $minStampPart . $sufBackup);
:local delRsc ($pref . $minStampPart . $sufRsc);
:log info ("[USB1_Backup_Rotate] rotate delete set " . $minStampPart);
:local bid [/file find where name=$delBackup];
:if ([:len $bid] > 0) do={ /file remove $bid; };
:local rid [/file find where name=$delRsc];
:if ([:len $rid] > 0) do={ /file remove $rid; };
# refresh list + recount
:set all [/file find where name~("^" . $dir . "/")];
:set countSets 0;
:foreach f in=$all do={
:local n [/file get $f name];
:if ([:find $n $pref] = 0) do={
:local ln [:len $n];
:local ls [:len $sufBackup];
:if ($ln >= $ls) do={
:if ([:pick $n ($ln - $ls) $ln] = $sufBackup) do={ :set countSets ($countSets + 1); };
};
};
};
};
};
:log info "[USB1_Backup_Rotate] done";