safing-portmaster/cmds/updatemgr/convert.go
2025-01-21 09:21:56 +01:00

123 lines
3 KiB
Go

package main
import (
"encoding/json"
"fmt"
"path"
"strings"
"time"
"github.com/safing/portmaster/service/updates"
)
func convertV1(indexData []byte, baseURL string, lastUpdate time.Time) (*updates.Index, error) {
// Parse old index.
oldIndex := make(map[string]string)
err := json.Unmarshal(indexData, &oldIndex)
if err != nil {
return nil, fmt.Errorf("failed to parse old v1 index: %w", err)
}
// Create new index.
newIndex := &updates.Index{
Published: lastUpdate,
Artifacts: make([]*updates.Artifact, 0, len(oldIndex)),
}
// Convert all entries.
if err := convertEntries(newIndex, baseURL, oldIndex); err != nil {
return nil, err
}
return newIndex, nil
}
type IndexV2 struct {
Channel string
Published time.Time
Releases map[string]string
}
func convertV2(indexData []byte, baseURL string) (*updates.Index, error) {
// Parse old index.
oldIndex := &IndexV2{}
err := json.Unmarshal(indexData, oldIndex)
if err != nil {
return nil, fmt.Errorf("failed to parse old v2 index: %w", err)
}
// Create new index.
newIndex := &updates.Index{
Published: oldIndex.Published,
Artifacts: make([]*updates.Artifact, 0, len(oldIndex.Releases)),
}
// Convert all entries.
if err := convertEntries(newIndex, baseURL, oldIndex.Releases); err != nil {
return nil, err
}
return newIndex, nil
}
func convertEntries(index *updates.Index, baseURL string, entries map[string]string) error {
entries:
for identifier, version := range entries {
dir, filename := path.Split(identifier)
artifactPath := GetVersionedPath(identifier, version)
// Check if file is to be ignored.
if scanConfig.IsIgnored(artifactPath) {
continue entries
}
// Get the platform.
var platform string
splittedPath := strings.Split(dir, "/")
if len(splittedPath) >= 1 {
platform = splittedPath[0]
if platform == "all" {
platform = ""
}
} else {
continue entries
}
// Create new artifact.
newArtifact := &updates.Artifact{
Filename: filename,
URLs: []string{baseURL + artifactPath},
Platform: platform,
Version: version,
}
// Derive unpack setting.
unpack, err := scanConfig.UnpackSetting(filename)
if err != nil {
return fmt.Errorf("failed to get unpack setting for %s: %w", filename, err)
}
newArtifact.Unpack = unpack
// Add to new index.
index.Artifacts = append(index.Artifacts, newArtifact)
}
return nil
}
// GetVersionedPath combines the identifier and version and returns it as a file path.
func GetVersionedPath(identifier, version string) (versionedPath string) {
identifierPath, filename := path.Split(identifier)
// Split the filename where the version should go.
splittedFilename := strings.SplitN(filename, ".", 2)
// Replace `.` with `-` for the filename format.
transformedVersion := strings.Replace(version, ".", "-", 2)
// Put everything back together and return it.
versionedPath = identifierPath + splittedFilename[0] + "_v" + transformedVersion
if len(splittedFilename) > 1 {
versionedPath += "." + splittedFilename[1]
}
return versionedPath
}