mirror of
https://github.com/sipeed/NanoKVM.git
synced 2026-11-09 17:44:43 -06:00
77 lines
1.5 KiB
Go
77 lines
1.5 KiB
Go
package application
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"sync"
|
|
|
|
"NanoKVM-Server/utils"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
var (
|
|
mutex sync.Mutex
|
|
isUpdating bool
|
|
)
|
|
|
|
func acquireUpdateLock() bool {
|
|
mutex.Lock()
|
|
defer mutex.Unlock()
|
|
|
|
if isUpdating {
|
|
return false
|
|
}
|
|
isUpdating = true
|
|
return true
|
|
}
|
|
|
|
func releaseUpdateLock() {
|
|
mutex.Lock()
|
|
defer mutex.Unlock()
|
|
isUpdating = false
|
|
}
|
|
|
|
func installPackage(source string) error {
|
|
dir, err := utils.UnTarGz(source, CacheDir)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to decompress app: %w", err)
|
|
}
|
|
|
|
if err := backupCurrentApp(); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := applyUpdate(dir); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := utils.ChmodRecursively(AppDir, 0o755); err != nil {
|
|
return fmt.Errorf("failed to chmod: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func backupCurrentApp() error {
|
|
if err := os.RemoveAll(BackupDir); err != nil {
|
|
return fmt.Errorf("failed to remove backup: %w", err)
|
|
}
|
|
|
|
if err := utils.MoveFilesRecursively(AppDir, BackupDir); err != nil {
|
|
return fmt.Errorf("failed to backup app: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func applyUpdate(sourceDir string) error {
|
|
if err := utils.MoveFilesRecursively(sourceDir, AppDir); err != nil {
|
|
// Try to restore backup on failure
|
|
if restoreErr := utils.MoveFilesRecursively(BackupDir, AppDir); restoreErr != nil {
|
|
log.Errorf("Failed to restore backup after update failure: %v", restoreErr)
|
|
}
|
|
return fmt.Errorf("failed to move update in place: %w", err)
|
|
}
|
|
return nil
|
|
}
|