Режим разработки: служебные разделы, робот НРД и имитации — только по признаку из ключа лицензии

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
zuevav
2026-09-17 18:15:18 +03:00
parent 698956092b
commit 627dbca6af
22 changed files with 157 additions and 38 deletions
+8 -4
View File
@@ -171,17 +171,21 @@ func LicenseRenew(ctx context.Context, rc *RuntimeConfig) error {
return licenseAccept(rc, r.Token, "продлена")
}
// licenseNeedsRenew — онлайн-ключ, и сутки без успешного продления.
// licenseNeedsRenew — онлайн-ключ и 15 минут без продления: так режим разработки, включённый или
// выключенный на сервере лицензий, доходит до установки быстро. После неудачи — не чаще раза в час.
func licenseNeedsRenew(rc *RuntimeConfig) bool {
s := rc.Snapshot().License
lic, err := verifyLicenseToken(s.Key)
if err != nil || lic.InstallID == "" {
return false
}
return time.Since(s.LastSync) >= 23*time.Hour
if !s.LastOK && !s.LastAttempt.IsZero() && time.Since(s.LastAttempt) < time.Hour && time.Since(s.LastSync) < 23*time.Hour {
return false
}
return time.Since(s.LastSync) >= 15*time.Minute
}
// licenseLoop — раз в час предупреждает о скором окончании лицензии и проверяет, пора ли продлить
// licenseLoop — раз в 5 минут предупреждает о скором окончании лицензии и проверяет, пора ли продлить
// ключ (продление — раз в сутки, при сбое — повтор через час).
func (s *Server) licenseLoop(ctx context.Context) {
ensureInstallID(s.rc)
@@ -192,7 +196,7 @@ func (s *Server) licenseLoop(ctx context.Context) {
return
case <-time.After(wait):
}
wait = time.Hour
wait = 5 * time.Minute
licenseExpiryWarn(s.rc, time.Now())
if !licenseNeedsRenew(s.rc) {
continue