Export the reviewed allowlisted snapshot from private source commit 07c1655921f21ee5e4fc4d85639d199e8867b17d. This records the Docker Compose activation, schema-compatible rollback, and stateful migration resource findings from Observatory Preview 19 dogfooding. AI-Assisted: OpenAI Codex Signed-off-by: Cole Speelman <crspeelman@gmail.com>
49 lines
1.3 KiB
Go
49 lines
1.3 KiB
Go
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
package transport
|
|
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
|
|
"gamertan.com/tend/internal/deploy"
|
|
"gamertan.com/tend/internal/serverpolicy"
|
|
)
|
|
|
|
func Receive(ctx context.Context, input io.Reader, policy serverpolicy.Policy, manager deploy.Manager) (deploy.Report, error) {
|
|
if err := policy.CheckDirectories(); err != nil {
|
|
return deploy.Report{}, err
|
|
}
|
|
reader := bufio.NewReaderSize(input, maxHeaderBytes+4)
|
|
header, err := ReadHeader(reader)
|
|
if err != nil {
|
|
return deploy.Report{}, err
|
|
}
|
|
service, err := policy.CheckService(header.Service)
|
|
if err != nil {
|
|
return deploy.Report{}, err
|
|
}
|
|
if err = header.Validate(service.Policy.MaxArtifactBytes); err != nil {
|
|
return deploy.Report{}, err
|
|
}
|
|
file, err := os.CreateTemp(policy.IncomingRoot, ".tend-receive-"+header.Service+"-")
|
|
if err != nil {
|
|
return deploy.Report{}, err
|
|
}
|
|
path := file.Name()
|
|
defer os.Remove(path)
|
|
if err = file.Chmod(0o600); err == nil {
|
|
err = CopyArtifact(file, reader, header, service.Policy.MaxArtifactBytes)
|
|
}
|
|
if closeErr := file.Close(); err == nil {
|
|
err = closeErr
|
|
}
|
|
if err != nil {
|
|
return deploy.Report{}, fmt.Errorf("receive artifact: %w", err)
|
|
}
|
|
return manager.Deploy(ctx, service.Config, deploy.Request{Artifact: path, SHA256: header.SHA256, ApprovedSHA256: header.ApprovedSHA256, Activate: header.Activate})
|
|
}
|