Files
portainer/api/license/sync.go
Dmitry Salakhov e15b908983 Feat(backup): add the ability to backup and restore portainer from file [EE-279] (#204)
* EE-319: backup endpoint (#193)

* feat(backup):
* add an orbiter to block writes while backup
* add backup handler
* add an ability to tar.gz a dir
* add aes encryption support

* EE-320: restore endpoint (#196)

* feat(backup):
* add restore handler
* re-init system state after restore

* feat(backup): Update server to respect readonly lock (#199)

* feat(backup): EE-322 Add backup and restore screen (#198)

Co-authored-by: Simon Meng <simon.meng@portainer.io>

* name archive as portainer-backup_yyyy-mm-dd_hh-mm-ss

* backup custom templates and edge jobs

* restart http and proxy servers after restore to re-init internal state

* feat(backup): EE-322 hide password field if password protect toggle is off

* feat(backup): EE-322 add tooltip for password field of restore backup

* feat(backup): EE-322 wait for backend restart after restoring

* Shutdown background go-routines

* changed restore err message when cannot extract

* fix: symlinks are ignored from backups

* replace single admin check with a restartable monitor (#238)

* clean log

Co-authored-by: Maxime Bajeux <max.bajeux@gmail.com>
Co-authored-by: cong meng <mcpacino@gmail.com>
Co-authored-by: Simon Meng <simon.meng@portainer.io>
2021-04-06 15:41:41 +12:00

62 lines
1.0 KiB
Go

package license
import (
"log"
"time"
"github.com/portainer/liblicense/master"
)
const (
syncInterval = 24 * time.Hour
)
func (service *Service) startSyncLoop() error {
err := service.syncLicenses()
if err != nil {
return err
}
ticker := time.NewTicker(syncInterval)
go (func() {
for {
select {
case <-service.shutdownCtx.Done():
log.Println("[DEBUG] [internal,license] [message: shutting down License service]")
ticker.Stop()
return
case <-ticker.C:
service.syncLicenses()
}
}
})()
return nil
}
func (service *Service) syncLicenses() error {
licenses, err := service.Licenses()
if err != nil {
return err
}
licensesToRemove := []string{}
for _, license := range licenses {
valid, err := master.ValidateLicense(&license)
if err != nil || !valid {
licensesToRemove = append(licensesToRemove, license.LicenseKey)
}
}
for _, licenseKey := range licensesToRemove {
err := service.revokeLicense(licenseKey)
if err != nil {
return err
}
}
return nil
}