Improve updatemgr and updates module
This commit is contained in:
123
cmds/updatemgr/convert.go
Normal file
123
cmds/updatemgr/convert.go
Normal file
@@ -0,0 +1,123 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user