Files
FemaInstaller/internal/deployer/package.go

70 lines
1.8 KiB
Go

package deployer
import (
"archive/tar"
"compress/gzip"
"encoding/json"
"fmt"
"io"
"os"
"path/filepath"
"gitea.unprism.ru/KRBL/FemaDeployer/pkg/config"
)
// DeploymentPackage представляет собой загруженный пакет
type DeploymentPackage struct {
Path string
Manifest *config.Manifest
}
// LoadDeploymentPackage загружает и валидирует пакет развертывания
func LoadDeploymentPackage(path string) (*DeploymentPackage, error) {
file, err := os.Open(path)
if err != nil {
return nil, fmt.Errorf("не удалось открыть файл пакета: %w", err)
}
defer file.Close()
gzr, err := gzip.NewReader(file)
if err != nil {
return nil, fmt.Errorf("не удалось создать gzip reader: %w", err)
}
defer gzr.Close()
tr := tar.NewReader(gzr)
var manifest *config.Manifest
for {
header, err := tr.Next()
if err == io.EOF {
break // Конец архива
}
if err != nil {
return nil, fmt.Errorf("ошибка чтения tar-архива: %w", err)
}
// Ищем manifest.json в корне архива
if header.Typeflag == tar.TypeReg && (filepath.Clean(header.Name) == "manifest.json" || filepath.Clean(header.Name) == "deployment_package/manifest.json") {
manifestData, err := io.ReadAll(tr)
if err != nil {
return nil, fmt.Errorf("не удалось прочитать manifest.json: %w", err)
}
if err := json.Unmarshal(manifestData, &manifest); err != nil {
return nil, fmt.Errorf("ошибка парсинга manifest.json: %w", err)
}
break // Манифест найден, выходим из цикла
}
}
if manifest == nil {
return nil, fmt.Errorf("файл manifest.json не найден в архиве")
}
return &DeploymentPackage{
Path: path,
Manifest: manifest,
}, nil
}