70 lines
1.8 KiB
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
|
|
}
|