Загрузка данных


: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";