1
0
Fork 0
mirror of https://github.com/gocsaf/csaf.git synced 2025-12-22 05:40:11 +01:00
gocsaf/cmd/csaf_provider/transaction.go
2021-12-01 19:27:46 +01:00

99 lines
1.9 KiB
Go

package main
import (
"os"
"path/filepath"
"github.com/csaf-poc/csaf_distribution/csaf"
)
func doTransaction(
cfg *config,
t tlp,
fn func(string, *csaf.ProviderMetadata) error,
) error {
wellknown := filepath.Join(cfg.Web, ".well-known", "csaf")
metadata := filepath.Join(wellknown, "provider-metadata.json")
pmd, err := func() (*csaf.ProviderMetadata, error) {
f, err := os.Open(metadata)
if err != nil {
if os.IsNotExist(err) {
return csaf.NewProviderMetadataDomain(cfg.Domain, cfg.modelTLPs()), nil
}
return nil, err
}
defer f.Close()
return csaf.LoadProviderMetadata(f)
}()
if err != nil {
return err
}
webTLP := filepath.Join(wellknown, string(t))
oldDir, err := filepath.EvalSymlinks(webTLP)
if err != nil {
return err
}
folderTLP := filepath.Join(cfg.Folder, string(t))
newDir, err := mkUniqDir(folderTLP)
if err != nil {
return err
}
// Copy old content into new.
if err := deepCopy(newDir, oldDir); err != nil {
os.RemoveAll(newDir)
return err
}
// Work with new folder.
if err := fn(newDir, pmd); err != nil {
os.RemoveAll(newDir)
return err
}
// Write back provider metadata.
newMetaName, newMetaFile, err := mkUniqFile(metadata)
if err != nil {
os.RemoveAll(newDir)
return err
}
if err := pmd.Save(newMetaFile); err != nil {
newMetaFile.Close()
os.Remove(newMetaName)
os.RemoveAll(newDir)
return err
}
if err := newMetaFile.Close(); err != nil {
os.Remove(newMetaName)
os.RemoveAll(newDir)
return err
}
if err := os.Rename(newMetaName, metadata); err != nil {
os.RemoveAll(newDir)
return err
}
// Switch directories.
symlink := filepath.Join(newDir, string(t))
if err := os.Symlink(newDir, symlink); err != nil {
os.RemoveAll(newDir)
return err
}
if err := os.Rename(symlink, webTLP); err != nil {
os.RemoveAll(newDir)
return err
}
return os.RemoveAll(oldDir)
}